Handle User Refresh in Edge Cases
Handle the following edge cases when a manual refresh is triggered:
* No connectivity
* Low storage space
* Timeout (sync not started)
Bug: 11241113
Change-Id: I7e8a415642e0a587070df641ca06a9922caa1621
diff --git a/src/com/android/exchange/service/EmailSyncAdapterService.java b/src/com/android/exchange/service/EmailSyncAdapterService.java
index 34cb344..910cdbe 100644
--- a/src/com/android/exchange/service/EmailSyncAdapterService.java
+++ b/src/com/android/exchange/service/EmailSyncAdapterService.java
@@ -45,6 +45,7 @@
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;
@@ -61,6 +62,7 @@
import com.android.exchange.eas.EasOperation;
import com.android.exchange.eas.EasPing;
import com.android.exchange.eas.EasSync;
+import com.android.mail.providers.UIProvider;
import com.android.mail.providers.UIProvider.AccountCapabilities;
import com.android.mail.utils.LogUtils;
@@ -630,6 +632,14 @@
final long[] mailboxIds = Mailbox.getMailboxIdsFromBundle(extras);
final int mailboxType = extras.getInt(Mailbox.SYNC_EXTRA_MAILBOX_TYPE,
Mailbox.TYPE_NONE);
+ final boolean hasCallbackMethod =
+ extras.containsKey(EmailServiceStatus.SYNC_EXTRAS_CALLBACK_METHOD);
+ if (hasCallbackMethod && mailboxIds != null) {
+ for (long mailboxId : mailboxIds) {
+ EmailServiceStatus.syncMailboxStatus(cr, extras, mailboxId,
+ EmailServiceStatus.IN_PROGRESS, 0, UIProvider.LastSyncResult.SUCCESS);
+ }
+ }
// A "full sync" means no specific mailbox or type filter was requested.
final boolean isFullSync = (mailboxIds == null && mailboxType == Mailbox.TYPE_NONE);
@@ -670,10 +680,30 @@
// not affect syncing.
if (mailboxIds != null) {
+ long numIoExceptions = 0;
+ long numAuthExceptions = 0;
// Sync the mailbox that was explicitly requested.
for (final long mailboxId : mailboxIds) {
syncMailbox(context, cr, acct, account, mailboxId, extras, syncResult, null,
true);
+ if (hasCallbackMethod) {
+ final int result;
+ if (syncResult.hasError()) {
+ if (syncResult.stats.numIoExceptions > numIoExceptions) {
+ result = UIProvider.LastSyncResult.CONNECTION_ERROR;
+ numIoExceptions = syncResult.stats.numIoExceptions;
+ } else if (syncResult.stats.numAuthExceptions> numAuthExceptions) {
+ result = UIProvider.LastSyncResult.AUTH_ERROR;
+ numAuthExceptions= syncResult.stats.numAuthExceptions;
+ } else {
+ result = UIProvider.LastSyncResult.INTERNAL_ERROR;
+ }
+ } else {
+ result = UIProvider.LastSyncResult.SUCCESS;
+ }
+ EmailServiceStatus.syncMailboxStatus(
+ cr, extras, mailboxId,EmailServiceStatus.SUCCESS, 0, result);
+ }
}
} else if (!accountOnly) {
// We have to sync multiple folders.