Make tablet search work correctly.

Change-Id: Ib19dcc590fd80aa134aa3afab9989eeac2aec224
diff --git a/src/com/android/mail/providers/Folder.java b/src/com/android/mail/providers/Folder.java
index 72e3227..7f1c900 100644
--- a/src/com/android/mail/providers/Folder.java
+++ b/src/com/android/mail/providers/Folder.java
@@ -235,12 +235,14 @@
 
     public static Folder forSearchResults(Account account, String query) {
         Folder searchFolder = new Folder();
-        Builder searchBuilder = account.searchUri.buildUpon();
-        searchBuilder.appendQueryParameter(UIProvider.SearchQueryParameters.QUERY, query);
-        Uri searchUri = searchBuilder.build();
-        searchFolder.uri = SEARCH_RESULTS_URI;
-        searchFolder.conversationListUri = searchUri;
-        searchFolder.refreshUri = searchUri;
+        if (account.searchUri != null) {
+            Builder searchBuilder = account.searchUri.buildUpon();
+            searchBuilder.appendQueryParameter(UIProvider.SearchQueryParameters.QUERY, query);
+            Uri searchUri = searchBuilder.build();
+            searchFolder.uri = SEARCH_RESULTS_URI;
+            searchFolder.conversationListUri = searchUri;
+            searchFolder.refreshUri = searchUri;
+        }
         return searchFolder;
     }
 
diff --git a/src/com/android/mail/ui/AbstractActivityController.java b/src/com/android/mail/ui/AbstractActivityController.java
index 1b5cd0e..03286a1 100644
--- a/src/com/android/mail/ui/AbstractActivityController.java
+++ b/src/com/android/mail/ui/AbstractActivityController.java
@@ -306,10 +306,8 @@
         mResolver = mActivity.getContentResolver();
 
         // All the individual UI components listen for ViewMode changes. This
-        // simplifies the
-        // amount of logic in the AbstractActivityController, but increases the
-        // possibility of
-        // timing-related bugs.
+        // simplifies the amount of logic in the AbstractActivityController, but increases the
+        // possibility of timing-related bugs.
         mViewMode.addListener(this);
         assert (mActionBarView != null);
         mViewMode.addListener(mActionBarView);
@@ -387,7 +385,7 @@
 
     @Override
     public boolean onPrepareOptionsMenu(Menu menu) {
-        mActionBarView.prepareOptionsMenu(menu);
+        mActionBarView.onPrepareOptionsMenu(menu);
         return true;
     }
 
@@ -498,11 +496,13 @@
         if (savedState != null) {
             restoreListContext(savedState);
             mAccount = savedState.getParcelable(SAVED_ACCOUNT);
+            mActionBarView.setAccount(mAccount);
             restartSettingsLoader();
         } else if (intent != null) {
             if (Intent.ACTION_VIEW.equals(intent.getAction())) {
                 if (intent.hasExtra(Utils.EXTRA_ACCOUNT)) {
                     mAccount = ((Account) intent.getParcelableExtra(Utils.EXTRA_ACCOUNT));
+                    mActionBarView.setAccount(mAccount);
                     mActivity.getLoaderManager().restartLoader(ACCOUNT_SETTINGS_LOADER, null, this);
                     mActivity.invalidateOptionsMenu();
                 }
@@ -522,6 +522,7 @@
             } else if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
                 mViewMode.enterSearchResultsListMode();
                 mAccount = ((Account) intent.getParcelableExtra(Utils.EXTRA_ACCOUNT));
+                mActionBarView.setAccount(mAccount);
                 Folder searchFolder = Folder.forSearchResults(mAccount, intent
                         .getStringExtra(ConversationListContext.EXTRA_SEARCH_QUERY));
                 mConvListContext = ConversationListContext.forSearchQuery(mAccount, searchFolder,
diff --git a/src/com/android/mail/ui/ActionBarView.java b/src/com/android/mail/ui/ActionBarView.java
index 97da9b7..c7eea80 100644
--- a/src/com/android/mail/ui/ActionBarView.java
+++ b/src/com/android/mail/ui/ActionBarView.java
@@ -164,7 +164,7 @@
                 // 4: SEARCH_RESULTS_LIST
                 R.menu.conversation_list_search_results_actions,
                 // 5: SEARCH_RESULTS_CONVERSATION
-                R.menu.conversation_actions
+                R.menu.conversation_search_results_actions
         };
         return modeMenu[mMode];
     }
@@ -265,7 +265,7 @@
         item.setVisible(shouldShow);
     }
 
-    public boolean prepareOptionsMenu(Menu menu) {
+    public boolean onPrepareOptionsMenu(Menu menu) {
         // We start out with every option enabled. Based on the current view, we disable actions
         // that are possible.
         if (mSubjectView != null){
@@ -315,16 +315,13 @@
                 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);
-                    }
-                }
+                setPopulatedSearchView();
                 break;
             case ViewMode.SEARCH_RESULTS_CONVERSATION:
                 mActionBar.setDisplayHomeAsUpEnabled(true);
+                if (Utils.useTabletUI(mActivity.getActivityContext())) {
+                    setPopulatedSearchView();
+                }
                 break;
             case ViewMode.FOLDER_LIST:
                 break;
@@ -332,6 +329,16 @@
         return false;
     }
 
+    private void setPopulatedSearchView() {
+        if (mSearch != null) {
+            mSearch.expandActionView();
+            ConversationListContext context = mCallback.getCurrentListContext();
+            if (context != null) {
+                mSearchWidget.setQuery(context.searchQuery, false);
+            }
+        }
+    }
+
     public void removeBackButton() {
         if (mActionBar == null) {
             return;
diff --git a/src/com/android/mail/ui/ActivityController.java b/src/com/android/mail/ui/ActivityController.java
index 69781fb..e024bd9 100644
--- a/src/com/android/mail/ui/ActivityController.java
+++ b/src/com/android/mail/ui/ActivityController.java
@@ -239,4 +239,10 @@
      * @return
      */
     Settings getSettings();
+
+    /**
+     * Returns whether the first conversation in the conversation list should be
+     * automatically selected and shown.
+     */
+    boolean shouldShowFirstConversation();
 }
diff --git a/src/com/android/mail/ui/ControllableActivity.java b/src/com/android/mail/ui/ControllableActivity.java
index 5f8f860..5e4ffd0 100644
--- a/src/com/android/mail/ui/ControllableActivity.java
+++ b/src/com/android/mail/ui/ControllableActivity.java
@@ -76,4 +76,10 @@
      * @return
      */
     FolderChangeListener getFolderChangeListener();
+
+    /**
+     * Returns whether the first conversation in the conversation list should be
+     * automatically selected and shown.
+     */
+    boolean shouldShowFirstConversation();
 }
diff --git a/src/com/android/mail/ui/ConversationListFragment.java b/src/com/android/mail/ui/ConversationListFragment.java
index 12afa26..8734ce1 100644
--- a/src/com/android/mail/ui/ConversationListFragment.java
+++ b/src/com/android/mail/ui/ConversationListFragment.java
@@ -524,6 +524,13 @@
         mListAdapter.swapCursor(mConversationListCursor);
         mConversationListCursor.addListener(this);
         updateSearchResultHeader(data != null ? data.getCount() : 0);
+        if (mActivity.shouldShowFirstConversation()) {
+            if (mConversationListCursor.getCount() > 0) {
+                mConversationListCursor.moveToPosition(0);
+                getListView().setItemChecked(0, true);
+                mCallbacks.onConversationSelected(new Conversation(mConversationListCursor));
+            }
+        }
     }
 
     @Override
diff --git a/src/com/android/mail/ui/FolderSelectionActivity.java b/src/com/android/mail/ui/FolderSelectionActivity.java
index 7df84c9..d59690b 100644
--- a/src/com/android/mail/ui/FolderSelectionActivity.java
+++ b/src/com/android/mail/ui/FolderSelectionActivity.java
@@ -273,4 +273,9 @@
     public boolean onSearchRequested(String query) {
         return false;
     }
+
+    @Override
+    public boolean shouldShowFirstConversation() {
+        return false;
+    }
 }
diff --git a/src/com/android/mail/ui/MailActivity.java b/src/com/android/mail/ui/MailActivity.java
index 5b3663e..b069221 100644
--- a/src/com/android/mail/ui/MailActivity.java
+++ b/src/com/android/mail/ui/MailActivity.java
@@ -255,4 +255,9 @@
     public Settings getSettings() {
         return mController.getSettings();
     }
+
+    @Override
+    public boolean shouldShowFirstConversation() {
+        return mController.shouldShowFirstConversation();
+    }
 }
diff --git a/src/com/android/mail/ui/OnePaneController.java b/src/com/android/mail/ui/OnePaneController.java
index e655b27..57616d8 100644
--- a/src/com/android/mail/ui/OnePaneController.java
+++ b/src/com/android/mail/ui/OnePaneController.java
@@ -266,4 +266,9 @@
                 FragmentManager.POP_BACK_STACK_INCLUSIVE);
         resetActionBarIcon();
     }
+
+    @Override
+    public boolean shouldShowFirstConversation() {
+        return false;
+    }
 }
diff --git a/src/com/android/mail/ui/TwoPaneController.java b/src/com/android/mail/ui/TwoPaneController.java
index 36e49bd..2c2650b 100644
--- a/src/com/android/mail/ui/TwoPaneController.java
+++ b/src/com/android/mail/ui/TwoPaneController.java
@@ -52,7 +52,11 @@
      */
     private void initializeConversationListFragment(boolean show) {
         if (show) {
-            mViewMode.enterConversationListMode();
+            if (mConvListContext != null && mConvListContext.isSearchResult()) {
+                mViewMode.enterSearchResultsListMode();
+            } else {
+                mViewMode.enterConversationListMode();
+            }
         }
         renderConversationList();
     }
@@ -149,7 +153,13 @@
 
     @Override
     public void showConversation(Conversation conversation) {
-        mViewMode.enterConversationMode();
+        int mode = mViewMode.getMode();
+        if (mode == ViewMode.SEARCH_RESULTS_LIST || mode == ViewMode.SEARCH_RESULTS_CONVERSATION) {
+            mViewMode.enterSearchResultsConversationMode();
+            unhideConversationList();
+        } else {
+            mViewMode.enterConversationMode();
+        }
         Fragment convFragment = ConversationViewFragment.newInstance(mAccount, conversation);
         FragmentTransaction fragmentTransaction = mActivity.getFragmentManager().beginTransaction();
         fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
@@ -161,11 +171,12 @@
      * Show the conversation list if it can be shown in the current orientation.
      * @return true if the conversation list was shown
      */
-    private boolean unhideConversationList(){
+    private boolean unhideConversationList() {
         // Find if the conversation list can be shown
-        final boolean isConversationListShowable =
-                (mViewMode.getMode() == ViewMode.CONVERSATION &&
-                mLayout.isConversationListCollapsible());
+        int mode = mViewMode.getMode();
+        final boolean isConversationListShowable = (mode == ViewMode.CONVERSATION
+                && mLayout.isConversationListCollapsible()
+                || (mode == ViewMode.SEARCH_RESULTS_CONVERSATION));
         if (isConversationListShowable) {
             return mLayout.uncollapseList();
         }
@@ -191,6 +202,12 @@
             } else {
                 mActivity.onBackPressed();
             }
+        } else if (mode == ViewMode.SEARCH_RESULTS_CONVERSATION) {
+            if (!mLayout.isConversationListVisible()) {
+                unhideConversationList();
+            } else {
+                mActivity.finish();
+            }
         } else if (mode == ViewMode.SEARCH_RESULTS_LIST) {
             mActivity.finish();
         }
@@ -211,11 +228,14 @@
     protected void popView(boolean preventClose) {
         // If the user is in search query entry mode, or the user is viewing search results, exit
         // the mode.
-        if (mConvListContext != null && mConvListContext.isSearchResult()) {
+        int mode = mViewMode.getMode();
+        if (mode == ViewMode.SEARCH_RESULTS_LIST) {
             mActivity.finish();
         } else if (mViewMode.getMode() == ViewMode.CONVERSATION) {
             // Go to conversation list.
             mViewMode.enterConversationListMode();
+        } else if (mode == ViewMode.SEARCH_RESULTS_CONVERSATION) {
+            mViewMode.enterSearchResultsListMode();
         } else {
             // There is nothing else to pop off the stack.
             if (!preventClose) {
@@ -223,4 +243,9 @@
             }
         }
     }
+
+    @Override
+    public boolean shouldShowFirstConversation() {
+        return mConvListContext != null && mConvListContext.isSearchResult();
+    }
 }
diff --git a/src/com/android/mail/ui/TwoPaneLayout.java b/src/com/android/mail/ui/TwoPaneLayout.java
index ec8dfa5..f6240ea 100644
--- a/src/com/android/mail/ui/TwoPaneLayout.java
+++ b/src/com/android/mail/ui/TwoPaneLayout.java
@@ -290,7 +290,9 @@
     private int computeConversationListWidth(int totalWidth) {
         switch (currentMode) {
             case ViewMode.CONVERSATION_LIST:
+            case ViewMode.SEARCH_RESULTS_LIST:
                 return totalWidth - computeFolderListWidth();
+            case ViewMode.SEARCH_RESULTS_CONVERSATION:
             case ViewMode.CONVERSATION:
                 return (int) (totalWidth * sScaledConversationListWeight);
         }
@@ -609,10 +611,12 @@
         }
 
         switch (currentMode) {
+            case ViewMode.SEARCH_RESULTS_LIST:
             case ViewMode.CONVERSATION_LIST:
                 setFolderListWidth(computeFolderListWidth());
                 break;
 
+            case ViewMode.SEARCH_RESULTS_CONVERSATION:
             case ViewMode.CONVERSATION:
                 final int conversationListWidth = computeConversationListWidth(w);
                 setConversationListWidth(conversationListWidth);
@@ -657,18 +661,16 @@
             mOutstandingAnimator.cancel();
         }
         switch (currentMode) {
+            case ViewMode.SEARCH_RESULTS_CONVERSATION:
             case ViewMode.CONVERSATION:
                 enterConversationMode();
                 break;
+            case ViewMode.SEARCH_RESULTS_LIST:
             case ViewMode.CONVERSATION_LIST:
                 enterConversationListMode();
                 break;
             case ViewMode.FOLDER_LIST:
                 break;
-            case ViewMode.SEARCH_RESULTS_LIST:
-            case ViewMode.SEARCH_RESULTS_CONVERSATION:
-                // Show search results here
-                break;
         }
     }