Handle provisioning errors in sync.

Bug: 10930585
Change-Id: Ieb6f0bdd22c6cfb2bb440a2109fb86b31a1ee24e
diff --git a/src/com/android/exchange/eas/EasOperation.java b/src/com/android/exchange/eas/EasOperation.java
index 414fcb8..9119dbd 100644
--- a/src/com/android/exchange/eas/EasOperation.java
+++ b/src/com/android/exchange/eas/EasOperation.java
@@ -101,7 +101,8 @@
     protected final long mAccountId;
     private final EasServerConnection mConnection;
 
-    private EasOperation(final Context context, final long accountId,
+    // TODO: Make this private again when EasSyncHandler is converted to be a subclass.
+    protected EasOperation(final Context context, final long accountId,
             final EasServerConnection connection) {
         mContext = context;
         mAccountId = accountId;
diff --git a/src/com/android/exchange/eas/EasProvision.java b/src/com/android/exchange/eas/EasProvision.java
index cad2565..16f5733 100644
--- a/src/com/android/exchange/eas/EasProvision.java
+++ b/src/com/android/exchange/eas/EasProvision.java
@@ -16,6 +16,7 @@
 
 package com.android.exchange.eas;
 
+import android.content.Context;
 import android.content.SyncResult;
 
 import com.android.emailcommon.provider.Policy;
@@ -25,6 +26,7 @@
 import com.android.exchange.adapter.ProvisionParser;
 import com.android.exchange.adapter.Serializer;
 import com.android.exchange.adapter.Tags;
+import com.android.exchange.service.EasServerConnection;
 import com.android.mail.utils.LogUtils;
 
 import org.apache.http.HttpEntity;
@@ -89,6 +91,16 @@
      */
     private int mPhase;
 
+    // TODO: Temporary until EasSyncHandler converts to EasOperation.
+    public EasProvision(final Context context, final long accountId,
+            final EasServerConnection connection) {
+        super(context, accountId, connection);
+        mPolicy = null;
+        mPolicyKey = null;
+        mStatus = null;
+        mPhase = 0;
+    }
+
     public EasProvision(final EasOperation parentOperation) {
         super(parentOperation);
         mPolicy = null;
diff --git a/src/com/android/exchange/service/EasSyncHandler.java b/src/com/android/exchange/service/EasSyncHandler.java
index 57782c4..5e77b45 100644
--- a/src/com/android/exchange/service/EasSyncHandler.java
+++ b/src/com/android/exchange/service/EasSyncHandler.java
@@ -33,6 +33,7 @@
 import com.android.exchange.adapter.Parser;
 import com.android.exchange.adapter.Serializer;
 import com.android.exchange.adapter.Tags;
+import com.android.exchange.eas.EasProvision;
 import com.android.mail.utils.LogUtils;
 
 import org.apache.http.HttpStatus;
@@ -343,8 +344,14 @@
             } else {
                 LogUtils.e(TAG, "Sync failed with Status: " + code);
                 if (resp.isProvisionError()) {
-                    syncResult.stats.numAuthExceptions++;
-                    return SYNC_RESULT_FAILED; // TODO: Handle SyncStatus.FAILURE_SECURITY;
+                    final EasProvision provision = new EasProvision(mContext, mAccount.mId, this);
+                    if (provision.provision(syncResult, mAccount.mId)) {
+                        // We handled the provisioning error, so loop.
+                        result = SYNC_RESULT_MORE_AVAILABLE;
+                    } else {
+                        syncResult.stats.numAuthExceptions++;
+                        return SYNC_RESULT_FAILED; // TODO: Handle SyncStatus.FAILURE_SECURITY;
+                    }
                 } else if (resp.isAuthError()) {
                     syncResult.stats.numAuthExceptions++;
                     return SYNC_RESULT_FAILED; // TODO: Handle SyncStatus.FAILURE_LOGIN;