Multiple search ui fixes.

1) Make sure we dont show the spinner animating while the search box is open.
Leads to crazy janky jumpy focus loss.
2) show the search query in the search box when showing results.
Change-Id: I5e8de840e206176645583216353e7510e4029e47
diff --git a/src/com/android/mail/ui/AbstractActivityController.java b/src/com/android/mail/ui/AbstractActivityController.java
index 988001d..1b5cd0e 100644
--- a/src/com/android/mail/ui/AbstractActivityController.java
+++ b/src/com/android/mail/ui/AbstractActivityController.java
@@ -21,8 +21,6 @@
 import android.app.ActionBar.LayoutParams;
 import android.app.Activity;
 import android.app.Dialog;
-import android.app.SearchManager;
-import android.app.SearchableInfo;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.CursorLoader;
@@ -32,18 +30,13 @@
 import android.net.Uri;
 import android.os.AsyncTask;
 import android.os.Bundle;
-import android.os.Handler;
-import android.view.ActionMode;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.MotionEvent;
-import android.view.View;
 import android.widget.LinearLayout;
-import android.widget.SearchView;
-import android.widget.Toast;
 
 import com.android.mail.R;
 import com.android.mail.ConversationListContext;
@@ -54,8 +47,6 @@
 import com.android.mail.providers.Folder;
 import com.android.mail.providers.Settings;
 import com.android.mail.providers.UIProvider;
-import com.android.mail.providers.UIProvider.AccountCapabilities;
-import com.android.mail.providers.UIProvider.LastSyncResult;
 import com.android.mail.ui.AsyncRefreshTask;
 import com.android.mail.utils.LogUtils;
 import com.android.mail.utils.Utils;
@@ -115,16 +106,6 @@
     protected boolean isLoaderInitialized = false;
     private AsyncRefreshTask mAsyncRefreshTask;
 
-    private MenuItem mRefreshItem;
-    private View mRefreshActionView;
-    private boolean mRefreshInProgress;
-    private final Handler mHandler = new Handler();
-    private final Runnable mInvalidateMenu = new Runnable() {
-        @Override
-        public void run() {
-            mActivity.invalidateOptionsMenu();
-        }
-    };
     private final Set<Uri> mCurrentAccountUris = Sets.newHashSet();
     protected Settings mCachedSettings;
 
@@ -287,7 +268,7 @@
     private void setFolder(Folder folder) {
         // Start watching folder for sync status.
         if (folder != null && !folder.equals(mFolder)) {
-            mRefreshInProgress = false;
+            mActionBarView.setRefreshInProgress(false);
             mFolder = folder;
             mActionBarView.setFolder(mFolder);
             mActivity.getLoaderManager().restartLoader(FOLDER_CURSOR_LOADER, null, this);
@@ -348,7 +329,6 @@
         MenuInflater inflater = mActivity.getMenuInflater();
         inflater.inflate(mActionBarView.getOptionsMenuId(), menu);
         mActionBarView.onCreateOptionsMenu(menu);
-        mRefreshItem = menu.findItem(R.id.refresh);
         return true;
     }
 
@@ -399,29 +379,6 @@
         }
     }
 
-    public void onRefreshStarted() {
-        if (!mRefreshInProgress) {
-            mRefreshInProgress = true;
-            mHandler.post(mInvalidateMenu);
-        }
-    }
-
-    public void onRefreshStopped(int status) {
-        if (mRefreshInProgress) {
-            mRefreshInProgress = false;
-            switch (status) {
-                case LastSyncResult.SUCCESS:
-                    break;
-                default:
-                    Context context = mActivity.getActivityContext();
-                    Toast.makeText(context, Utils.getSyncStatusText(context, status),
-                            Toast.LENGTH_LONG).show();
-                    break;
-            }
-            mHandler.post(mInvalidateMenu);
-        }
-    }
-
     @Override
     public void onPrepareDialog(int id, Dialog dialog, Bundle bundle) {
         // TODO(viki): Auto-generated method stub
@@ -430,20 +387,6 @@
 
     @Override
     public boolean onPrepareOptionsMenu(Menu menu) {
-        if (mRefreshInProgress) {
-            if (mRefreshItem != null) {
-                if (mRefreshActionView == null) {
-                    mRefreshItem.setActionView(R.layout.action_bar_indeterminate_progress);
-                    mRefreshActionView = mRefreshItem.getActionView();
-                } else {
-                    mRefreshItem.setActionView(mRefreshActionView);
-                }
-            }
-        } else {
-            if (mRefreshItem != null) {
-                mRefreshItem.setActionView(null);
-            }
-        }
         mActionBarView.prepareOptionsMenu(menu);
         return true;
     }
@@ -581,10 +524,11 @@
                 mAccount = ((Account) intent.getParcelableExtra(Utils.EXTRA_ACCOUNT));
                 Folder searchFolder = Folder.forSearchResults(mAccount, intent
                         .getStringExtra(ConversationListContext.EXTRA_SEARCH_QUERY));
-                setFolder(searchFolder);
                 mConvListContext = ConversationListContext.forSearchQuery(mAccount, searchFolder,
                         Utils.mailSearchQueryForIntent(intent));
+                setFolder(searchFolder);
                 showConversationList(mConvListContext);
+                mActivity.invalidateOptionsMenu();
             }
         }
         // Create the accounts loader; this loads the account switch spinner.
@@ -742,10 +686,10 @@
                 data.moveToFirst();
                 Folder folder = new Folder(data);
                 if (folder.isSyncInProgress()) {
-                    onRefreshStarted();
+                    mActionBarView.onRefreshStarted();
                 } else {
                     // Stop the spinner here.
-                    onRefreshStopped(folder.lastSyncResult);
+                    mActionBarView.onRefreshStopped(folder.lastSyncResult);
                 }
                 LogUtils.v(LOG_TAG, "FOLDER STATUS = " + folder.syncStatus);
             }
diff --git a/src/com/android/mail/ui/ActionBarView.java b/src/com/android/mail/ui/ActionBarView.java
index 13b5312..5a5527b 100644
--- a/src/com/android/mail/ui/ActionBarView.java
+++ b/src/com/android/mail/ui/ActionBarView.java
@@ -23,6 +23,7 @@
 import android.app.ActionBar.OnNavigationListener;
 import android.content.Context;
 import android.os.Bundle;
+import android.os.Handler;
 import android.util.AttributeSet;
 import android.view.Menu;
 import android.view.MenuItem;
@@ -30,7 +31,6 @@
 import android.widget.LinearLayout;
 import android.widget.SearchView;
 import android.widget.SearchView.OnQueryTextListener;
-import android.widget.SpinnerAdapter;
 import android.widget.TextView;
 import android.widget.Toast;
 
@@ -39,7 +39,9 @@
 import com.android.mail.ConversationListContext;
 import com.android.mail.providers.Account;
 import com.android.mail.providers.UIProvider.AccountCapabilities;
+import com.android.mail.providers.UIProvider.LastSyncResult;
 import com.android.mail.providers.Folder;
+import com.android.mail.utils.Utils;
 
 /**
  * View to manage the various states of the Mail Action Bar
@@ -83,7 +85,6 @@
         void stopActionBarStatusCursorLoader(String account);
     }
 
-    private String[] mAccountNames;
     private ActionBar mActionBar;
     private RestrictedActivity mActivity;
     private ActivityController mCallback;
@@ -104,6 +105,17 @@
     private TextView mSubjectView;
     private SearchView mSearchWidget;
     private MenuItem mHelpItem;
+    private MenuItem mRefreshItem;
+    private View mRefreshActionView;
+    private boolean mRefreshInProgress;
+
+    private final Handler mHandler = new Handler();
+    private final Runnable mInvalidateMenu = new Runnable() {
+        @Override
+        public void run() {
+            mActivity.invalidateOptionsMenu();
+        }
+    };
 
     public ActionBarView(Context context) {
         this(context, null);
@@ -122,9 +134,9 @@
         if (mMode == ViewMode.UNKNOWN) {
             return false;
         }
-        MenuItem search = menu.findItem(R.id.search);
-        if (search != null) {
-            mSearchWidget = (SearchView) search.getActionView();
+        mSearch = menu.findItem(R.id.search);
+        if (mSearch != null) {
+            mSearchWidget = (SearchView) mSearch.getActionView();
             SearchManager searchManager = (SearchManager) mActivity.getActivityContext()
                     .getSystemService(Context.SEARCH_SERVICE);
             if (searchManager != null) {
@@ -134,6 +146,7 @@
             }
         }
         mHelpItem = menu.findItem(R.id.help_info_menu_item);
+        mRefreshItem = menu.findItem(R.id.refresh);
         return true;
     }
 
@@ -204,6 +217,7 @@
      * account that is currently being displayed.
      */
     public void setAccount(Account account) {
+        mAccount = account;
         mSpinner.setCurrentAccount(account);
         mSpinner.notifyDataSetChanged();
     }
@@ -245,16 +259,10 @@
         mActivity.invalidateOptionsMenu();
     }
 
-    /**
-     * If shouldSetView is true, then the view is made visible, otherwise its visiblity is View.GONE
-     * @param view the view whose visibility is modified
-     * @param shouldSetView if true, the view is made visible, GONE otherwise
-     */
-    private void setVisibility(int resourceId, boolean shouldSetView) {
-        final View view = findViewById(resourceId);
-        assert (view != null);
-        final int visibility = shouldSetView ? View.VISIBLE : View.GONE;
-        view.setVisibility(visibility);
+    private void setVisibility(Menu menu, int itemId, boolean shouldShow) {
+        final MenuItem item = menu.findItem(itemId);
+        assert (item != null);
+        item.setVisible(shouldShow);
     }
 
     public boolean prepareOptionsMenu(Menu menu) {
@@ -266,37 +274,53 @@
         if (mFolderView != null){
             mFolderView.setVisibility(GONE);
         }
-        if (mAccount == null) {
-            return false;
-        }
 
+        if (mRefreshInProgress) {
+            if (mRefreshItem != null) {
+                if (mRefreshActionView == null) {
+                    mRefreshItem.setActionView(R.layout.action_bar_indeterminate_progress);
+                    mRefreshActionView = mRefreshItem.getActionView();
+                } else {
+                    mRefreshItem.setActionView(mRefreshActionView);
+                }
+            }
+        } else {
+            if (mRefreshItem != null) {
+                mRefreshItem.setActionView(null);
+            }
+        }
         if (mHelpItem != null) {
             mHelpItem.setVisible(mAccount != null
                     && mAccount.supportsCapability(AccountCapabilities.HELP_CONTENT));
         }
-        switch (mMode){
+        switch (mMode) {
             case ViewMode.UNKNOWN:
-                if (mSearch != null){
+                if (mSearch != null) {
                     mSearch.collapseActionView();
                 }
                 break;
             case ViewMode.CONVERSATION_LIST:
                 // Show compose, search, labels, and sync based on the account
                 // The only option that needs to be disabled is search
-                setVisibility(R.id.search, mAccount.supportsCapability(
-                        AccountCapabilities.FOLDER_SERVER_SEARCH));
+                setVisibility(menu, R.id.search,
+                        mAccount.supportsCapability(AccountCapabilities.FOLDER_SERVER_SEARCH));
                 break;
             case ViewMode.CONVERSATION:
-                setVisibility(R.id.y_button, mAccount.supportsCapability(
-                        AccountCapabilities.ARCHIVE));
-                setVisibility(R.id.report_spam, mAccount.supportsCapability(
-                        AccountCapabilities.REPORT_SPAM));
-                setVisibility(R.id.mute, mAccount.supportsCapability(AccountCapabilities.MUTE));
+                setVisibility(menu, R.id.y_button,
+                        mAccount.supportsCapability(AccountCapabilities.ARCHIVE));
+                setVisibility(menu, R.id.report_spam,
+                        mAccount.supportsCapability(AccountCapabilities.REPORT_SPAM));
+                setVisibility(menu, R.id.mute,
+                        mAccount.supportsCapability(AccountCapabilities.MUTE));
                 break;
             case ViewMode.SEARCH_RESULTS_LIST:
                 mActionBar.setDisplayHomeAsUpEnabled(true);
                 if (mSearch != null) {
                     mSearch.expandActionView();
+                    ConversationListContext context = mCallback.getCurrentListContext();
+                    if (context != null) {
+                        mSearchWidget.setQuery(context.searchQuery, false);
+                    }
                 }
                 break;
             case ViewMode.SEARCH_RESULTS_CONVERSATION:
@@ -339,4 +363,33 @@
         // TODO Auto-generated method stub
         return false;
     }
+
+    public boolean setRefreshInProgress(boolean inProgress) {
+        if (inProgress != mRefreshInProgress) {
+            mRefreshInProgress = inProgress;
+            if (mSearch == null || !mSearch.isActionViewExpanded()) {
+                mHandler.post(mInvalidateMenu);
+            }
+            return true;
+        }
+        return false;
+    }
+
+    public void onRefreshStarted() {
+        setRefreshInProgress(true);
+    }
+
+    public void onRefreshStopped(int status) {
+        if (setRefreshInProgress(false)) {
+            switch (status) {
+                case LastSyncResult.SUCCESS:
+                    break;
+                default:
+                    Context context = mActivity.getActivityContext();
+                    Toast.makeText(context, Utils.getSyncStatusText(context, status),
+                            Toast.LENGTH_LONG).show();
+                    break;
+            }
+        }
+    }
 }