Write sync status and time to provider.

Also delete some uses of old callback mechanism since
those are currently unused.

Bug: 9842867
Bug: 8548657
Change-Id: I851205204c9d700998acee8575f096202b9f1140
diff --git a/src/com/android/exchange/service/EasSyncHandler.java b/src/com/android/exchange/service/EasSyncHandler.java
index afcb8b0..de7e294 100644
--- a/src/com/android/exchange/service/EasSyncHandler.java
+++ b/src/com/android/exchange/service/EasSyncHandler.java
@@ -10,7 +10,6 @@
 import com.android.emailcommon.TrafficFlags;
 import com.android.emailcommon.provider.Account;
 import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.service.EmailServiceStatus;
 import com.android.exchange.CommandStatusException;
 import com.android.exchange.Eas;
 import com.android.exchange.EasResponse;
@@ -354,18 +353,4 @@
             // TODO: Signal caller that it probably wants to sync again.
         }
     }
-
-    // Communication with the application.
-
-    // TODO: Consider bringing the EmailServiceStatus functions here?
-    /**
-     * Convenience wrapper to {@link EmailServiceStatus#syncMailboxStatus}.
-     * @param statusCode
-     * @param progress
-     */
-    protected void syncMailboxStatus(final int statusCode, final int progress) {
-        EmailServiceStatus.syncMailboxStatus(mContentResolver, mSyncExtras, mMailbox.mId,
-                statusCode, progress);
-    }
-
 }
diff --git a/src/com/android/exchange/service/EmailSyncAdapterService.java b/src/com/android/exchange/service/EmailSyncAdapterService.java
index 6e0361a..0394b0b 100644
--- a/src/com/android/exchange/service/EmailSyncAdapterService.java
+++ b/src/com/android/exchange/service/EmailSyncAdapterService.java
@@ -19,6 +19,7 @@
 import android.content.AbstractThreadedSyncAdapter;
 import android.content.ContentProviderClient;
 import android.content.ContentResolver;
+import android.content.ContentValues;
 import android.content.Context;
 import android.content.Intent;
 import android.content.SyncResult;
@@ -34,7 +35,6 @@
 import com.android.emailcommon.provider.EmailContent.AccountColumns;
 import com.android.emailcommon.provider.HostAuth;
 import com.android.emailcommon.provider.Mailbox;
-import com.android.emailcommon.service.EmailServiceStatus;
 import com.android.emailcommon.service.IEmailService;
 import com.android.emailcommon.service.IEmailServiceCallback;
 import com.android.emailcommon.service.SearchParams;
@@ -531,7 +531,7 @@
                         try {
                             while (c.moveToNext()) {
                                 syncMailbox(context, cr, acct, account, c.getLong(0), extras,
-                                        syncResult);
+                                        syncResult, false);
                             }
                         } finally {
                             c.close();
@@ -540,13 +540,7 @@
                 }
             } else {
                 // Sync the mailbox that was explicitly requested.
-                if (!syncMailbox(context, cr, acct, account, mailboxId, extras, syncResult)) {
-                    // We can't sync this mailbox, so just send the expected UI callbacks.
-                    EmailServiceStatus.syncMailboxStatus(cr, extras, mailboxId,
-                            EmailServiceStatus.IN_PROGRESS, 0);
-                    EmailServiceStatus.syncMailboxStatus(cr, extras, mailboxId,
-                            EmailServiceStatus.SUCCESS, 0);
-                }
+                syncMailbox(context, cr, acct, account, mailboxId, extras, syncResult, true);
             }
 
             // Clean up the bookkeeping, including restarting ping if necessary.
@@ -557,25 +551,53 @@
             // 2) syncResult can contain useful info.
         }
 
+        /**
+         * Update the mailbox's sync status with the provider and, if we're finished with the sync,
+         * write the last sync time as well.
+         * @param context Our {@link Context}.
+         * @param mailbox The mailbox whose sync status to update.
+         * @param cv A {@link ContentValues} object to use for updating the provider.
+         * @param syncStatus The status for the current sync.
+         */
+        private void updateMailbox(final Context context, final Mailbox mailbox,
+                final ContentValues cv, final int syncStatus) {
+            cv.put(Mailbox.UI_SYNC_STATUS, syncStatus);
+            if (syncStatus == EmailContent.SYNC_STATUS_NONE) {
+                cv.put(Mailbox.SYNC_TIME, System.currentTimeMillis());
+            }
+            mailbox.update(context, cv);
+        }
+
         private boolean syncMailbox(final Context context, final ContentResolver cr,
                 final android.accounts.Account acct, final Account account, final long mailboxId,
-                final Bundle extras, final SyncResult syncResult) {
+                final Bundle extras, final SyncResult syncResult, final boolean isMailboxSync) {
             final Mailbox mailbox = Mailbox.restoreMailboxWithId(context, mailboxId);
             if (mailbox == null) {
                 return false;
             }
 
+            final ContentValues cv = new ContentValues(2);
+            // Non-mailbox syncs are whole account syncs initiated by the AccountManager and are
+            // treated as background syncs.
+            // TODO: Push will be treated as "user" syncs, and probably should be background.
+            final int syncStatus = isMailboxSync ?
+                    EmailContent.SYNC_STATUS_USER : EmailContent.SYNC_STATUS_BACKGROUND;
+
             if (mailbox.mType == Mailbox.TYPE_OUTBOX) {
                 final EasOutboxSyncHandler outboxSyncHandler =
                         new EasOutboxSyncHandler(context, account, mailbox);
+                updateMailbox(context, mailbox, cv, syncStatus);
                 outboxSyncHandler.performSync();
+                updateMailbox(context, mailbox, cv, EmailContent.SYNC_STATUS_NONE);
             } else {
                 final EasSyncHandler syncHandler = EasSyncHandler.getEasSyncHandler(context, cr,
                         acct, account, mailbox, extras, syncResult);
                 if (syncHandler == null) {
                     return false;
                 }
+                updateMailbox(context, mailbox, cv, syncStatus);
                 syncHandler.performSync();
+                updateMailbox(context, mailbox, cv, EmailContent.SYNC_STATUS_NONE);
             }
             return true;
         }