Prevent spurious Waiting from being shown

Now the account can represent the state that it hasn't been initialized
when it can't give a definitive answer about whether a sync is required.

The Compose Activity and Widget selection activity still will show
the wait activity if the account is not fully initialized

But the Abstract activity controller will only show the wait fragment
when the account object has been initialized enough to give a definitive
answer about whether sync is needed

Bug: 7090741
Change-Id: I5e68f074418983b759f0e8a96fb08b65e81406e8
diff --git a/src/com/android/mail/compose/ComposeActivity.java b/src/com/android/mail/compose/ComposeActivity.java
index 4e8d032..6e9cd9b 100644
--- a/src/com/android/mail/compose/ComposeActivity.java
+++ b/src/com/android/mail/compose/ComposeActivity.java
@@ -16,7 +16,6 @@
 
 package com.android.mail.compose;
 
-import android.animation.LayoutTransition;
 import android.app.ActionBar;
 import android.app.ActionBar.OnNavigationListener;
 import android.app.Activity;
@@ -24,7 +23,6 @@
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.Fragment;
-import android.app.FragmentManager;
 import android.app.FragmentTransaction;
 import android.app.LoaderManager;
 import android.content.ContentResolver;
@@ -76,7 +74,6 @@
 import com.android.mail.providers.Account;
 import com.android.mail.providers.Address;
 import com.android.mail.providers.Attachment;
-import com.android.mail.providers.Folder;
 import com.android.mail.providers.MailAppProvider;
 import com.android.mail.providers.Message;
 import com.android.mail.providers.MessageModification;
@@ -97,8 +94,6 @@
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 
-import org.json.JSONException;
-
 import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
 import java.util.ArrayList;
@@ -409,7 +404,7 @@
             // If none of the accounts are syncing, setup a watcher.
             boolean anySyncing = false;
             for (Account a : mAccounts) {
-                if (a.isAccountIntialized()) {
+                if (a.isAccountReady()) {
                     anySyncing = true;
                     break;
                 }
@@ -2851,7 +2846,7 @@
                     ArrayList<Account> initializedAccounts = new ArrayList<Account>();
                     do {
                         account = new Account(data);
-                        if (account.isAccountIntialized()) {
+                        if (account.isAccountReady()) {
                             initializedAccounts.add(account);
                         }
                         accounts.add(account);
diff --git a/src/com/android/mail/providers/Account.java b/src/com/android/mail/providers/Account.java
index a2bc3af..87a4d09 100644
--- a/src/com/android/mail/providers/Account.java
+++ b/src/com/android/mail/providers/Account.java
@@ -408,8 +408,21 @@
         return (capabilities & capability) != 0;
     }
 
-    public boolean isAccountIntialized() {
-        return (syncStatus & SyncStatus.INITIAL_SYNC_NEEDED) != SyncStatus.INITIAL_SYNC_NEEDED;
+    public boolean isAccountSyncRequired() {
+        return (syncStatus & SyncStatus.INITIAL_SYNC_NEEDED) == SyncStatus.INITIAL_SYNC_NEEDED;
+    }
+
+    public boolean isAccountInitializationRequired() {
+        return (syncStatus & SyncStatus.ACCOUNT_INITIALIZATION_REQUIRED) ==
+                SyncStatus.ACCOUNT_INITIALIZATION_REQUIRED;
+    }
+
+    /**
+     * Returns true when when the UI provider has indicated that the account has been initialized,
+     * and sync is not required.
+     */
+    public boolean isAccountReady() {
+        return !isAccountInitializationRequired() && !isAccountSyncRequired();
     }
 
     @Override
diff --git a/src/com/android/mail/providers/UIProvider.java b/src/com/android/mail/providers/UIProvider.java
index 4f1cb43..e28d6a5 100644
--- a/src/com/android/mail/providers/UIProvider.java
+++ b/src/com/android/mail/providers/UIProvider.java
@@ -73,6 +73,10 @@
          * Gmail account.
          */
         public static final int MANUAL_SYNC_REQUIRED = 1<<4;
+        /**
+         * Account initialization is required.
+         */
+        public static final int ACCOUNT_INITIALIZATION_REQUIRED = 1<<5;
 
         public static boolean isSyncInProgress(int syncStatus) {
             return 0 != (syncStatus & (BACKGROUND_SYNC |
diff --git a/src/com/android/mail/ui/AbstractActivityController.java b/src/com/android/mail/ui/AbstractActivityController.java
index 17646e0..dcfec6d 100644
--- a/src/com/android/mail/ui/AbstractActivityController.java
+++ b/src/com/android/mail/ui/AbstractActivityController.java
@@ -52,13 +52,11 @@
 import android.view.MenuItem;
 import android.view.MotionEvent;
 import android.view.View;
-import android.widget.ListView;
 import android.widget.Toast;
 
 import com.android.mail.ConversationListContext;
 import com.android.mail.R;
 import com.android.mail.browse.ConversationCursor;
-import com.android.mail.browse.ConversationItemView;
 import com.android.mail.browse.ConversationPagerController;
 import com.android.mail.browse.ConversationCursor.ConversationOperation;
 import com.android.mail.browse.MessageCursor.ConversationMessage;
@@ -1853,19 +1851,23 @@
                             mAccountObservers.notifyChanged();
                         }
 
-                        // Got an update for the current account
-                        final boolean inWaitingMode = inWaitMode();
-                        if (!updatedAccount.isAccountIntialized() && !inWaitingMode) {
-                            // Transition to waiting mode
-                            showWaitForInitialization();
-                        } else if (updatedAccount.isAccountIntialized()) {
-                            if (inWaitingMode) {
-                                // Dismiss waiting mode
-                                hideWaitForInitialization();
+                        // We only want to enter or exit waiting mode if the account has been
+                        // initialized
+                        if (!updatedAccount.isAccountInitializationRequired()) {
+                            // Got an update for the current account
+                            final boolean inWaitingMode = inWaitMode();
+                            if (updatedAccount.isAccountSyncRequired() && !inWaitingMode) {
+                                // Transition to waiting mode
+                                showWaitForInitialization();
+                            } else if (!updatedAccount.isAccountSyncRequired()) {
+                                if (inWaitingMode) {
+                                    // Dismiss waiting mode
+                                    hideWaitForInitialization();
+                                }
+                            } else if (updatedAccount.isAccountSyncRequired() && inWaitingMode) {
+                                // Update the WaitFragment's account object
+                                updateWaitMode();
                             }
-                        } else if (!updatedAccount.isAccountIntialized() && inWaitingMode) {
-                            // Update the WaitFragment's account object
-                            updateWaitMode();
                         }
                     } else {
                         LogUtils.e(LOG_TAG, "Got update for account: %s with current account: %s",
diff --git a/src/com/android/mail/ui/MailboxSelectionActivity.java b/src/com/android/mail/ui/MailboxSelectionActivity.java
index 5db9113..aed02ae 100644
--- a/src/com/android/mail/ui/MailboxSelectionActivity.java
+++ b/src/com/android/mail/ui/MailboxSelectionActivity.java
@@ -20,7 +20,6 @@
 import com.android.mail.providers.MailAppProvider;
 import com.android.mail.providers.UIProvider;
 import com.android.mail.utils.LogTag;
-import com.android.mail.utils.LogUtils;
 
 import java.util.ArrayList;
 
@@ -364,7 +363,7 @@
             ArrayList<Account> initializedAccounts = new ArrayList<Account>();
             do {
                 account = new Account(data);
-                if (account.isAccountIntialized()) {
+                if (account.isAccountReady()) {
                     initializedAccounts.add(account);
                 }
                 accounts.add(account);
diff --git a/src/com/android/mail/utils/AccountUtils.java b/src/com/android/mail/utils/AccountUtils.java
index 0db885d..7f7e5e4 100644
--- a/src/com/android/mail/utils/AccountUtils.java
+++ b/src/com/android/mail/utils/AccountUtils.java
@@ -18,9 +18,6 @@
 import com.android.mail.providers.Account;
 import com.android.mail.providers.MailAppProvider;
 import com.android.mail.providers.UIProvider;
-import com.android.mail.providers.UIProvider.SyncStatus;
-
-import android.accounts.AccountManagerCallback;
 
 import android.content.ContentResolver;
 import android.content.Context;
@@ -82,7 +79,7 @@
             if (accountsCursor != null) {
                 while (accountsCursor.moveToNext()) {
                     account = new Account(accountsCursor);
-                    if (account.isAccountIntialized()) {
+                    if (!account.isAccountSyncRequired()) {
                         accounts.add(account);
                     }
                 }