diff options
Diffstat (limited to 'src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java')
-rw-r--r-- | src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java b/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java new file mode 100644 index 000000000..547d9e185 --- /dev/null +++ b/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java @@ -0,0 +1,220 @@ +/* + * Copyright (C) 2015 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. + */ +package com.android.launcher3.allapps.search; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.KeyEvent; +import android.view.View; +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.Launcher; +import com.android.launcher3.Utilities; +import com.android.launcher3.allapps.AlphabeticalAppsList; +import com.android.launcher3.discovery.AppDiscoveryItem; +import com.android.launcher3.discovery.AppDiscoveryUpdateState; +import com.android.launcher3.util.ComponentKey; +import com.android.launcher3.util.PackageManagerHelper; + +import java.util.ArrayList; + +/** + * An interface to a search box that AllApps can command. + */ +public class AllAppsSearchBarController + implements TextWatcher, OnEditorActionListener, ExtendedEditText.OnBackKeyListener { + + protected Launcher mLauncher; + protected AlphabeticalAppsList mApps; + protected Callbacks mCb; + protected ExtendedEditText mInput; + protected String mQuery; + + protected DefaultAppSearchAlgorithm mSearchAlgorithm; + protected InputMethodManager mInputMethodManager; + + public void setVisibility(int visibility) { + mInput.setVisibility(visibility); + } + /** + * Sets the references to the apps model and the search result callback. + */ + public final void initialize( + AlphabeticalAppsList apps, ExtendedEditText input, + Launcher launcher, Callbacks cb) { + mApps = apps; + mCb = cb; + mLauncher = launcher; + + mInput = input; + mInput.addTextChangedListener(this); + mInput.setOnEditorActionListener(this); + mInput.setOnBackKeyListener(this); + + mInputMethodManager = (InputMethodManager) + mInput.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + + mSearchAlgorithm = onInitializeSearch(); + + onInitialized(); + } + + /** + * You can override this method to perform custom initialization. + */ + protected void onInitialized() { + } + + /** + * This method will get called when the controller is set. + */ + public DefaultAppSearchAlgorithm onInitializeSearch() { + return new DefaultAppSearchAlgorithm(mApps.getApps()); + } + + @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) { + mQuery = s.toString(); + if (mQuery.isEmpty()) { + mSearchAlgorithm.cancel(true); + mCb.clearSearchResult(); + } else { + mSearchAlgorithm.cancel(false); + mSearchAlgorithm.doSearch(mQuery, mCb); + } + } + + public void refreshSearchResult() { + if (TextUtils.isEmpty(mQuery)) { + return; + } + // If play store continues auto updating an app, we want to show partial result. + mSearchAlgorithm.cancel(false); + mSearchAlgorithm.doSearch(mQuery, mCb); + } + + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + // Skip if it's not the right action + if (actionId != EditorInfo.IME_ACTION_SEARCH) { + return false; + } + + // Skip if the query is empty + String query = v.getText().toString(); + if (query.isEmpty()) { + return false; + } + return mLauncher.startActivitySafely(v, + PackageManagerHelper.getMarketSearchIntent(mLauncher, query), null); + } + + @Override + public boolean onBackKey() { + // Only hide the search field if there is no query + String query = Utilities.trim(mInput.getEditableText().toString()); + if (query.isEmpty()) { + reset(); + return true; + } + return false; + } + + /** + * Resets the search bar state. + */ + public void reset() { + unfocusSearchField(); + mCb.clearSearchResult(); + mInput.setText(""); + mQuery = null; + hideKeyboard(); + } + + protected void hideKeyboard() { + mInputMethodManager.hideSoftInputFromWindow(mInput.getWindowToken(), 0); + } + + protected void unfocusSearchField() { + View nextFocus = mInput.focusSearch(View.FOCUS_DOWN); + if (nextFocus != null) { + nextFocus.requestFocus(); + } + } + + /** + * Focuses the search field to handle key events. + */ + public void focusSearchField() { + mInput.showKeyboard(); + } + + /** + * Returns whether the search field is focused. + */ + public boolean isSearchFieldFocused() { + return mInput.isFocused(); + } + + /** + * Callback for getting search results. + */ + public interface Callbacks { + + /** + * Called when the search is complete. + * + * @param apps sorted list of matching components or null if in case of failure. + */ + void onSearchResult(String query, ArrayList<ComponentKey> apps); + + /** + * Called when the search results should be cleared. + */ + void clearSearchResult(); + + /** + * Called when the app discovery is providing an update of search, which can either be + * START for starting a new discovery, + * UPDATE for providing a new search result, can be called multiple times, + * END for indicating the end of results. + * + * @param app result item if UPDATE, else null + * @param app the update state, START, UPDATE or END + */ + void onAppDiscoverySearchUpdate(@Nullable AppDiscoveryItem app, + @NonNull AppDiscoveryUpdateState state); + } + +}
\ No newline at end of file |