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;
}
}