Handle errors on ping

b/11030802
We now handle server errors > 100.

Change-Id: I7103035fb43e708b0dabd87266e8fb8ad92d069f
diff --git a/src/com/android/exchange/CommandStatusException.java b/src/com/android/exchange/CommandStatusException.java
index 53f3ecd..ccfa542 100644
--- a/src/com/android/exchange/CommandStatusException.java
+++ b/src/com/android/exchange/CommandStatusException.java
@@ -33,6 +33,8 @@
 
     public static class CommandStatus {
 
+        public static final int STATUS_MAX = 177;
+
         // Fatal user/provisioning issues (put on security hold)
         public static final int USER_DISABLED_FOR_SYNC = 126;
         public static final int USERS_DISABLED_FOR_SYNC = 127;
diff --git a/src/com/android/exchange/adapter/PingParser.java b/src/com/android/exchange/adapter/PingParser.java
index 0c9dbc7..4134884 100644
--- a/src/com/android/exchange/adapter/PingParser.java
+++ b/src/com/android/exchange/adapter/PingParser.java
@@ -16,6 +16,7 @@
 
 package com.android.exchange.adapter;
 
+import com.android.exchange.CommandStatusException.CommandStatus;
 import com.android.exchange.Eas;
 import com.android.mail.utils.LogUtils;
 
@@ -193,7 +194,7 @@
         while (nextTag(START_DOCUMENT) != END_DOCUMENT) {
             if (tag == Tags.PING_STATUS) {
                 mPingStatus = getValue("Status", mPingStatus, STATUS_EXPIRED,
-                        STATUS_SERVER_ERROR);
+                        CommandStatus.STATUS_MAX);
             } else if (tag == Tags.PING_MAX_FOLDERS) {
                 mMaxFolders = getValue("MaxFolders", mMaxFolders);
             } else if (tag == Tags.PING_FOLDERS) {
diff --git a/src/com/android/exchange/eas/EasPing.java b/src/com/android/exchange/eas/EasPing.java
index 73f75ba..07c62de 100644
--- a/src/com/android/exchange/eas/EasPing.java
+++ b/src/com/android/exchange/eas/EasPing.java
@@ -29,6 +29,7 @@
 import com.android.emailcommon.provider.EmailContent.AccountColumns;
 import com.android.emailcommon.provider.EmailContent.MailboxColumns;
 import com.android.emailcommon.provider.Mailbox;
+import com.android.exchange.CommandStatusException.CommandStatus;
 import com.android.exchange.Eas;
 import com.android.exchange.EasResponse;
 import com.android.exchange.adapter.PingParser;
@@ -228,6 +229,43 @@
             case PingParser.STATUS_SERVER_ERROR:
                 LogUtils.i(TAG, "Server error for account %d", mAccountId);
                 break;
+            case CommandStatus.SERVER_ERROR_RETRY:
+                // Try again later.
+                LogUtils.i(TAG, "Retryable server error for account %d", mAccountId);
+                return RESULT_RESTART;
+
+            // These errors should not happen.
+            case CommandStatus.USER_DISABLED_FOR_SYNC:
+            case CommandStatus.USERS_DISABLED_FOR_SYNC:
+            case CommandStatus.USER_ON_LEGACY_SERVER_CANT_SYNC:
+            case CommandStatus.DEVICE_QUARANTINED:
+            case CommandStatus.ACCESS_DENIED:
+            case CommandStatus.USER_ACCOUNT_DISABLED:
+            case CommandStatus.NOT_PROVISIONABLE_PARTIAL:
+            case CommandStatus.NOT_PROVISIONABLE_LEGACY_DEVICE:
+            case CommandStatus.TOO_MANY_PARTNERSHIPS:
+                LogUtils.e(TAG, "Unexpected error %d on ping", pingStatus);
+                return RESULT_AUTHENTICATION_ERROR;
+
+            // These errors should not happen.
+            case CommandStatus.SYNC_STATE_NOT_FOUND:
+            case CommandStatus.SYNC_STATE_LOCKED:
+            case CommandStatus.SYNC_STATE_CORRUPT:
+            case CommandStatus.SYNC_STATE_EXISTS:
+            case CommandStatus.SYNC_STATE_INVALID:
+            case CommandStatus.NEEDS_PROVISIONING_WIPE:
+            case CommandStatus.NEEDS_PROVISIONING:
+            case CommandStatus.NEEDS_PROVISIONING_REFRESH:
+            case CommandStatus.NEEDS_PROVISIONING_INVALID:
+            case CommandStatus.WTF_INVALID_COMMAND:
+            case CommandStatus.WTF_INVALID_PROTOCOL:
+            case CommandStatus.WTF_DEVICE_CLAIMS_EXTERNAL_MANAGEMENT:
+            case CommandStatus.WTF_UNKNOWN_ITEM_TYPE:
+            case CommandStatus.WTF_REQUIRES_PROXY_WITHOUT_SSL:
+            case CommandStatus.ITEM_NOT_FOUND:
+                LogUtils.e(TAG, "Unexpected error %d on ping", pingStatus);
+                return RESULT_OTHER_FAILURE;
+
             default:
                 break;
         }
diff --git a/src/com/android/exchange/service/EasServerConnection.java b/src/com/android/exchange/service/EasServerConnection.java
index 7275e24..b5abe82 100644
--- a/src/com/android/exchange/service/EasServerConnection.java
+++ b/src/com/android/exchange/service/EasServerConnection.java
@@ -176,6 +176,7 @@
             HttpConnectionParams.setSoTimeout(params, (int)(timeout));
             HttpConnectionParams.setSocketBufferSize(params, 8192);
             mClient = new DefaultHttpClient(getClientConnectionManager(), params) {
+                @Override
                 protected BasicHttpProcessor createHttpProcessor() {
                     final BasicHttpProcessor processor = super.createHttpProcessor();
                     processor.addRequestInterceptor(new CurlLogger());
diff --git a/src/com/android/exchange/service/EmailSyncAdapterService.java b/src/com/android/exchange/service/EmailSyncAdapterService.java
index 26a3144..4e1eab5 100644
--- a/src/com/android/exchange/service/EmailSyncAdapterService.java
+++ b/src/com/android/exchange/service/EmailSyncAdapterService.java
@@ -539,7 +539,7 @@
         public void onPerformSync(final android.accounts.Account acct, final Bundle extras,
                 final String authority, final ContentProviderClient provider,
                 final SyncResult syncResult) {
-            LogUtils.i(TAG, "performSync: %s, %s", acct.toString(), extras.toString());
+            LogUtils.i(TAG, "onPerformSync: %s, %s", acct.toString(), extras.toString());
             TempDirectory.setTempDirectory(EmailSyncAdapterService.this);
 
             // TODO: Perform any connectivity checks, bail early if we don't have proper network