Allow access to global search by pressing the hard search button again
within in-app search. If within in-app search and toggled out to global
search, pressing the hard search button will take the user *back* into
in-app search too.
diff --git a/core/java/android/app/SearchDialog.java b/core/java/android/app/SearchDialog.java
index 4fb17c7..cd44277 100644
--- a/core/java/android/app/SearchDialog.java
+++ b/core/java/android/app/SearchDialog.java
@@ -111,6 +111,10 @@
private boolean mGlobalSearchMode;
private Context mActivityContext;
+ // Values we store to allow user to toggle between in-app search and global search.
+ private ComponentName mStoredComponentName;
+ private Bundle mStoredAppSearchData;
+
// stack of previous searchables, to support the BACK key after
// SearchManager.INTENT_ACTION_CHANGE_SEARCH_SOURCE.
// The top of the stack (= previous searchable) is the last element of the list,
@@ -228,20 +232,70 @@
return true;
}
+ // Reset any stored values from last time dialog was shown.
+ mStoredComponentName = null;
+ mStoredAppSearchData = null;
+
+ return doShow(initialQuery, selectInitialQuery, componentName, appSearchData, globalSearch);
+ }
+
+
+ /**
+ * Called in response to a press of the hard search button in
+ * {@link #onKeyDown(int, KeyEvent)}, this method toggles between in-app
+ * search and global search when relevant.
+ *
+ * If pressed within an in-app search context, this switches the search dialog out to
+ * global search. If pressed within a global search context that was originally an in-app
+ * search context, this switches back to the in-app search context. If pressed within a
+ * global search context that has no original in-app search context (e.g., global search
+ * from Home), this does nothing.
+ *
+ * @return false if we wanted to toggle context but could not do so successfully, true
+ * in all other cases
+ */
+ private boolean toggleGlobalSearch() {
+ String currentSearchText = mSearchAutoComplete.getText().toString();
+ if (!mGlobalSearchMode) {
+ mStoredComponentName = mLaunchComponent;
+ mStoredAppSearchData = mAppSearchData;
+ return doShow(currentSearchText, false, null, mAppSearchData, true);
+ } else {
+ if (mStoredComponentName != null) {
+ // This means we should toggle *back* to an in-app search context from
+ // global search.
+ return doShow(currentSearchText, false, mStoredComponentName,
+ mStoredAppSearchData, false);
+ } else {
+ return true;
+ }
+ }
+ }
+
+ /**
+ * Does the rest of the work required to show the search dialog. Called by both
+ * {@link #show(String, boolean, ComponentName, Bundle, boolean)} and
+ * {@link #toggleGlobalSearch()}.
+ *
+ * @return true if search dialog showed, false if not
+ */
+ private boolean doShow(String initialQuery, boolean selectInitialQuery,
+ ComponentName componentName, Bundle appSearchData,
+ boolean globalSearch) {
// set up the searchable and show the dialog
if (!show(componentName, appSearchData, globalSearch)) {
return false;
}
-
+
// finally, load the user's initial text (which may trigger suggestions)
setUserQuery(initialQuery);
if (selectInitialQuery) {
mSearchAutoComplete.selectAll();
}
-
+
return true;
}
-
+
/**
* Sets up the search dialog and shows it.
*
@@ -650,14 +704,11 @@
return true;
}
- // search or cancel on search key
if (keyCode == KeyEvent.KEYCODE_SEARCH) {
- if (!mSearchAutoComplete.isEmpty()) {
- launchQuerySearch();
- } else {
- cancel();
- }
- return true;
+ // If the search key is pressed, toggle between global and in-app search. If we are
+ // currently doing global search and there is no in-app search context to toggle to,
+ // just don't do anything.
+ return toggleGlobalSearch();
}
// if it's an action specified by the searchable activity, launch the