summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/allapps/AllAppsSearchBarController.java
diff options
context:
space:
mode:
authorSunny Goyal <sunnygoyal@google.com>2016-01-29 13:14:14 -0800
committerSunny Goyal <sunnygoyal@google.com>2016-02-08 14:55:22 -0800
commit0ac7ede56afebe4401c0636196f5844be573ad68 (patch)
treec4bdfce0b5f788880354845ab51ae293bd608d1b /src/com/android/launcher3/allapps/AllAppsSearchBarController.java
parent0e0498031092488ff166145c12ce36cc0a80c490 (diff)
downloadandroid_packages_apps_Trebuchet-0ac7ede56afebe4401c0636196f5844be573ad68.tar.gz
android_packages_apps_Trebuchet-0ac7ede56afebe4401c0636196f5844be573ad68.tar.bz2
android_packages_apps_Trebuchet-0ac7ede56afebe4401c0636196f5844be573ad68.zip
Merging search bar with all apps
Change-Id: I78577124cd3c05d52669c3e52b0294d6eb1d194d
Diffstat (limited to 'src/com/android/launcher3/allapps/AllAppsSearchBarController.java')
-rw-r--r--src/com/android/launcher3/allapps/AllAppsSearchBarController.java148
1 files changed, 131 insertions, 17 deletions
diff --git a/src/com/android/launcher3/allapps/AllAppsSearchBarController.java b/src/com/android/launcher3/allapps/AllAppsSearchBarController.java
index 2b363c0cb..fdce3895f 100644
--- a/src/com/android/launcher3/allapps/AllAppsSearchBarController.java
+++ b/src/com/android/launcher3/allapps/AllAppsSearchBarController.java
@@ -15,65 +15,179 @@
*/
package com.android.launcher3.allapps;
-import android.content.ComponentName;
+import android.content.Context;
import android.graphics.Rect;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.TextView;
+import android.widget.TextView.OnEditorActionListener;
+import com.android.launcher3.ExtendedEditText;
+import com.android.launcher3.Utilities;
import com.android.launcher3.util.ComponentKey;
import java.util.ArrayList;
+import java.util.List;
/**
* An interface to a search box that AllApps can command.
*/
-public abstract class AllAppsSearchBarController {
+public abstract class AllAppsSearchBarController
+ implements TextWatcher, OnEditorActionListener, ExtendedEditText.OnBackKeyListener {
+ private static final boolean ALLOW_SINGLE_APP_LAUNCH = true;
+
+ protected AllAppsRecyclerView mAppsRecyclerView;
protected AlphabeticalAppsList mApps;
protected Callbacks mCb;
+ protected ExtendedEditText mInput;
+
+ protected DefaultAppSearchAlgorithm mSearchAlgorithm;
+ protected InputMethodManager mInputMethodManager;
/**
* Sets the references to the apps model and the search result callback.
*/
- public final void initialize(AlphabeticalAppsList apps, Callbacks cb) {
+ public final void initialize(
+ AlphabeticalAppsList apps, ExtendedEditText input,
+ AllAppsRecyclerView recycleView, Callbacks cb) {
mApps = apps;
mCb = cb;
- onInitialize();
+ mAppsRecyclerView = recycleView;
+
+ mInput = input;
+ mInput.addTextChangedListener(this);
+ mInput.setOnEditorActionListener(this);
+ mInput.setOnBackKeyListener(this);
+
+ mInputMethodManager = (InputMethodManager)
+ mInput.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
+
+ mSearchAlgorithm = onInitializeSearch();
}
/**
- * To be overridden by subclasses. This method will get called when the controller is set,
- * before getView().
+ * To be overridden by subclasses. This method will get called when the controller is set.
*/
- protected abstract void onInitialize();
+ protected DefaultAppSearchAlgorithm onInitializeSearch() {
+ return null;
+ }
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ // Do nothing
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ // Do nothing
+ }
+
+ @Override
+ public void afterTextChanged(final Editable s) {
+ String query = s.toString();
+ if (query.isEmpty()) {
+ mSearchAlgorithm.cancel(true);
+ mCb.clearSearchResult();
+ } else {
+ mSearchAlgorithm.cancel(false);
+ mSearchAlgorithm.doSearch(query, mCb);
+ }
+ }
+
+ @Override
+ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
+ // Skip if we disallow app-launch-on-enter
+ if (!ALLOW_SINGLE_APP_LAUNCH) {
+ return false;
+ }
+ // Skip if it's not the right action
+ if (actionId != EditorInfo.IME_ACTION_SEARCH) {
+ return false;
+ }
+ // Skip if there are more than one icon
+ if (mApps.getNumFilteredApps() > 1) {
+ return false;
+ }
+ // Otherwise, find the first icon, or fallback to the search-market-view and launch it
+ List<AlphabeticalAppsList.AdapterItem> items = mApps.getAdapterItems();
+ for (int i = 0; i < items.size(); i++) {
+ AlphabeticalAppsList.AdapterItem item = items.get(i);
+ switch (item.viewType) {
+ case AllAppsGridAdapter.ICON_VIEW_TYPE:
+ case AllAppsGridAdapter.SEARCH_MARKET_VIEW_TYPE:
+ mAppsRecyclerView.getChildAt(i).performClick();
+ mInputMethodManager.hideSoftInputFromWindow(mInput.getWindowToken(), 0);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean onBackKey() {
+ // Only hide the search field if there is no query, or if there
+ // are no filtered results
+ String query = Utilities.trim(mInput.getEditableText().toString());
+ if (query.isEmpty() || mApps.hasNoFilteredResults()) {
+ reset();
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Resets the search bar state.
+ */
+ public void reset() {
+ unfocusSearchField();
+ mCb.clearSearchResult();
+ mInput.setText("");
+ mInputMethodManager.hideSoftInputFromWindow(mInput.getWindowToken(), 0);
+ }
+
+ protected void unfocusSearchField() {
+ View nextFocus = mInput.focusSearch(View.FOCUS_DOWN);
+ if (nextFocus != null) {
+ nextFocus.requestFocus();
+ }
+ }
/**
* Returns the search bar view.
* @param parent the parent to attach the search bar view to.
*/
- public abstract View getView(ViewGroup parent);
+ public View getView(ViewGroup parent) {
+ return null;
+ }
/**
* Focuses the search field to handle key events.
*/
- public abstract void focusSearchField();
+ public void focusSearchField() {
+ mInput.requestFocus();
+ mInputMethodManager.showSoftInput(mInput, InputMethodManager.SHOW_IMPLICIT);
+ }
/**
* Returns whether the search field is focused.
*/
- public abstract boolean isSearchFieldFocused();
-
- /**
- * Resets the search bar state.
- */
- public abstract void reset();
+ public boolean isSearchFieldFocused() {
+ return mInput.isFocused();
+ }
/**
* Returns whether the prediction bar should currently be visible depending on the state of
* the search bar.
*/
- @Deprecated
- public abstract boolean shouldShowPredictionBar();
+ public boolean shouldShowPredictionBar() {
+ return false;
+ }
/**
* Callback for getting search results.