Make tablet search work correctly.

Change-Id: Ib19dcc590fd80aa134aa3afab9989eeac2aec224
diff --git a/res/menu-sw600dp/conversation_list_menu.xml b/res/menu-sw600dp/conversation_list_menu.xml
index 439699b..f741b47 100644
--- a/res/menu-sw600dp/conversation_list_menu.xml
+++ b/res/menu-sw600dp/conversation_list_menu.xml
@@ -24,10 +24,12 @@
         android:icon="@drawable/ic_menu_compose_normal_holo_light"
         android:alphabeticShortcut="@string/trigger_compose_char" />
 
-    <item android:id="@+id/search"
-        android:title="@string/menu_search"
-        android:showAsAction="ifRoom"
-        android:icon="@drawable/ic_menu_search_holo_light"/>
+    <!-- Available only for accounts with SERVER_SEARCH and in a folder
+      that supports FOLDER_SERVER_SEARCH -->
+    <item android:id="@+id/search" android:title="@string/menu_search"
+        android:showAsAction="always|collapseActionView"
+        android:icon="@drawable/ic_menu_search_holo_light"
+        android:actionLayout="@layout/mail_actionbar_searchview" />
 
     <item android:id="@+id/refresh"
         android:title="@string/refresh"
diff --git a/res/menu-sw600dp/conversation_search_results_actions.xml b/res/menu-sw600dp/conversation_search_results_actions.xml
new file mode 100644
index 0000000..6bbaffd
--- /dev/null
+++ b/res/menu-sw600dp/conversation_search_results_actions.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2011 Google Inc.
+     Licensed to The Android Open Source Project.
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item android:id="@+id/compose"
+        android:title="@string/menu_compose"
+        android:showAsAction="always"
+        android:icon="@drawable/ic_menu_compose_normal_holo_light"
+        android:alphabeticShortcut="@string/trigger_compose_char" />
+
+    <item android:id="@+id/search"
+        android:title="@string/menu_search"
+        android:showAsAction="always|collapseActionView"
+        android:icon="@drawable/ic_menu_search_holo_light"
+        android:actionLayout="@layout/mail_actionbar_searchview" />
+
+    <item android:id="@+id/show_all_folders"
+        android:title="@string/show_all_folders"
+        android:showAsAction="ifRoom"
+        android:icon="@drawable/ic_menu_labels_holo_light" />
+
+    <item android:id="@+id/refresh"
+        android:title="@string/refresh"
+        android:showAsAction="ifRoom"
+        android:icon="@drawable/ic_menu_refresh_holo_light"
+        android:alphabeticShortcut="@string/trigger_refresh_char" />
+
+    <item android:id="@+id/settings"
+        android:title="@string/menu_settings"
+        android:showAsAction="never" />
+
+    <item
+        android:id="@+id/help_info_menu_item"
+        android:icon="@android:drawable/ic_menu_help"
+        android:showAsAction="never"
+        android:title="@string/help_and_info" />
+
+    <item
+        android:id="@+id/feedback_menu_item"
+        android:icon="@android:drawable/ic_menu_send"
+        android:showAsAction="never"
+        android:title="@string/feedback" />
+
+</menu>
diff --git a/res/menu/conversation_list_menu.xml b/res/menu/conversation_list_menu.xml
index e7e8e96..a1ef507 100644
--- a/res/menu/conversation_list_menu.xml
+++ b/res/menu/conversation_list_menu.xml
@@ -25,7 +25,7 @@
         android:alphabeticShortcut="@string/trigger_compose_char" />
 
     <!-- Available only for accounts with SERVER_SEARCH and in a folder
-      that suppors FOLDER_SERVER_SEARCH -->
+      that supports FOLDER_SERVER_SEARCH -->
     <item android:id="@+id/search" android:title="@string/menu_search"
     android:showAsAction="always|collapseActionView"
     android:icon="@drawable/ic_menu_search_holo_light"
diff --git a/res/menu/conversation_search_results_actions.xml b/res/menu/conversation_search_results_actions.xml
new file mode 100644
index 0000000..5796491
--- /dev/null
+++ b/res/menu/conversation_search_results_actions.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2011 Google Inc.
+     Licensed to The Android Open Source Project.
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<!-- Copy of conversation_actions -->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <!-- Depends on AccountCapabilities.ARCHIVE -->
+    <item
+        android:id="@+id/y_button"
+        android:title="@string/archive"
+        android:showAsAction="ifRoom"
+        android:icon="@drawable/archive"
+        android:alphabeticShortcut="@string/trigger_y_char" />
+    <!-- Always available -->
+    <item
+        android:id="@+id/delete"
+        android:title="@string/delete"
+        android:showAsAction="ifRoom"
+        android:icon="@drawable/trash" />
+
+    <!-- Always available -->
+    <item
+        android:id="@+id/change_labels"
+        android:title="@string/menu_change_labels"
+        android:showAsAction="ifRoom"
+        android:icon="@drawable/ic_menu_labels_holo_light" />
+
+    <!-- Always available -->
+    <item
+        android:id="@+id/inside_conversation_unread"
+        android:title="@string/mark_unread"
+        android:showAsAction="ifRoom"
+        android:icon="@drawable/ic_menu_mark_unread_holo_light" />
+
+    <!-- Always available -->
+    <item
+        android:id="@+id/mark_important"
+        android:title="@string/mark_important"
+        android:icon="@drawable/ic_email_caret_double" />
+
+    <!-- Always available -->
+    <item
+        android:id="@+id/mark_not_important"
+        android:title="@string/mark_not_important"
+        android:icon="@drawable/ic_email_caret_single"
+        android:visible="false" />
+
+    <!-- Depends on AccountCapabilities.MUTE -->
+    <item
+        android:id="@+id/mute"
+        android:title="@string/mute" />
+    <!-- Depends on AccountCapabilities.REPORT_SPAM -->
+    <item
+        android:id="@+id/report_spam"
+        android:title="@string/report_spam"
+        android:icon="@drawable/ic_spam_normal_holo_light" />
+
+    <!-- Always available -->
+    <item android:id="@+id/settings"
+        android:title="@string/menu_settings" />
+
+    <!-- Always available -->
+    <item
+        android:id="@+id/help_info_menu_item"
+        android:icon="@android:drawable/ic_menu_help"
+        android:title="@string/help_and_info" />
+
+    <!-- Always available -->
+    <item
+        android:id="@+id/feedback_menu_item"
+        android:icon="@android:drawable/ic_menu_send"
+        android:title="@string/feedback" />
+</menu>
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;
         }
     }