DefaultAppSearchController.java revision 4919827990b16ae22595d0b7cb123a875961d9be
1c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/* 2c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Copyright (C) 2015 The Android Open Source Project 3c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * 4c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Licensed under the Apache License, Version 2.0 (the "License"); 5c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * you may not use this file except in compliance with the License. 6c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * You may obtain a copy of the License at 7c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * 8c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * http://www.apache.org/licenses/LICENSE-2.0 9c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * 10c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Unless required by applicable law or agreed to in writing, software 11c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * distributed under the License is distributed on an "AS IS" BASIS, 12c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * See the License for the specific language governing permissions and 14c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * limitations under the License. 15c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 16c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletpackage com.android.launcher3.allapps; 17c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 18c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletimport android.content.Context; 19c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletimport android.text.Editable; 20c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletimport android.text.TextWatcher; 21c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletimport android.view.KeyEvent; 22c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletimport android.view.LayoutInflater; 23c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletimport android.view.View; 24c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletimport android.view.ViewGroup; 25c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletimport android.view.inputmethod.EditorInfo; 26c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletimport android.view.inputmethod.InputMethodManager; 27c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletimport android.widget.TextView; 28c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletimport com.android.launcher3.R; 29c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletimport com.android.launcher3.Utilities; 30c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletimport com.android.launcher3.util.Thunk; 312217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet 322217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletimport java.util.List; 332217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet 342217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet 352217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet/** 362217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet * The default search controller. 372217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet */ 382217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouilletfinal class DefaultAppSearchController extends AllAppsSearchBarController 392217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet implements TextWatcher, TextView.OnEditorActionListener, View.OnClickListener { 4001c19c30a73d4a3ad42ad5630ad790db01a853ccJean-Luc Brouillet 4101c19c30a73d4a3ad42ad5630ad790db01a853ccJean-Luc Brouillet private static final boolean ALLOW_SINGLE_APP_LAUNCH = true; 4201c19c30a73d4a3ad42ad5630ad790db01a853ccJean-Luc Brouillet 432217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet private static final int FADE_IN_DURATION = 175; 442217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet private static final int FADE_OUT_DURATION = 100; 452217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet private static final int SEARCH_TRANSLATION_X_DP = 18; 462217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet 472217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet private final Context mContext; 4801c19c30a73d4a3ad42ad5630ad790db01a853ccJean-Luc Brouillet @Thunk final InputMethodManager mInputMethodManager; 4901c19c30a73d4a3ad42ad5630ad790db01a853ccJean-Luc Brouillet 502217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet private DefaultAppSearchAlgorithm mSearchManager; 5101c19c30a73d4a3ad42ad5630ad790db01a853ccJean-Luc Brouillet 522217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet private ViewGroup mContainerView; 532217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet private View mSearchView; 542217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet @Thunk View mSearchBarContainerView; 552217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet private View mSearchButtonView; 562217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet private View mDismissSearchButtonView; 57247c598d96c2445ab1a4c3a887438ce8c7353c06Jean-Luc Brouillet @Thunk AllAppsSearchEditView mSearchBarEditView; 58c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet @Thunk AllAppsRecyclerView mAppsRecyclerView; 59c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet @Thunk Runnable mFocusRecyclerViewRunnable = new Runnable() { 602217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet @Override 61247c598d96c2445ab1a4c3a887438ce8c7353c06Jean-Luc Brouillet public void run() { 622217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet mAppsRecyclerView.requestFocus(); 6301c19c30a73d4a3ad42ad5630ad790db01a853ccJean-Luc Brouillet } 642217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet }; 65c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 66c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet public DefaultAppSearchController(Context context, ViewGroup containerView, 67c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet AllAppsRecyclerView appsRecyclerView) { 68c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mContext = context; 69c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mInputMethodManager = (InputMethodManager) 70c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mContext.getSystemService(Context.INPUT_METHOD_SERVICE); 71c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mContainerView = containerView; 72c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mAppsRecyclerView = appsRecyclerView; 73c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 74c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 75c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet @Override 76c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet public View getView(ViewGroup parent) { 77c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 78c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mSearchView = inflater.inflate(R.layout.all_apps_search_bar, parent, false); 79c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mSearchView.setOnClickListener(this); 80c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 81c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mSearchButtonView = mSearchView.findViewById(R.id.search_button); 82c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mSearchBarContainerView = mSearchView.findViewById(R.id.search_container); 83c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mDismissSearchButtonView = mSearchBarContainerView.findViewById(R.id.dismiss_search_button); 84c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mDismissSearchButtonView.setOnClickListener(this); 85c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mSearchBarEditView = (AllAppsSearchEditView) 86c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mSearchBarContainerView.findViewById(R.id.search_box_input); 87c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mSearchBarEditView.addTextChangedListener(this); 88c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mSearchBarEditView.setOnEditorActionListener(this); 89c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mSearchBarEditView.setOnBackKeyListener( 90c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet new AllAppsSearchEditView.OnBackKeyListener() { 91c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet @Override 92c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet public void onBackKey() { 93c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Only hide the search field if there is no query, or if there 94c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // are no filtered results 95c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet String query = Utilities.trim( 96c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mSearchBarEditView.getEditableText().toString()); 97c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (query.isEmpty() || mApps.hasNoFilteredResults()) { 98c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet hideSearchField(true, mFocusRecyclerViewRunnable); 99c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 100c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 101c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet }); 102c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return mSearchView; 103c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 104c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 105c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet @Override 106c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet public void focusSearchField() { 107c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mSearchBarEditView.requestFocus(); 108c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet showSearchField(); 109c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 110c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 111c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet @Override 112c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet public boolean isSearchFieldFocused() { 113c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return mSearchBarEditView.isFocused(); 114c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 115c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 116c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet @Override 117c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet protected void onInitialize() { 118c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mSearchManager = new DefaultAppSearchAlgorithm(mApps.getApps()); 119c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 120c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 121c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet @Override 122c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet public void reset() { 123c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet hideSearchField(false, null); 124c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 125c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 126c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet @Override 127c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet public boolean shouldShowPredictionBar() { 128c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Keep showing the prediction bar if the input query is empty 129c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return mSearchBarEditView.getEditableText().toString().isEmpty(); 130c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 131c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 132c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet @Override 133c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet public void onClick(View v) { 134c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (v == mSearchView) { 135c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet showSearchField(); 136c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } else if (v == mDismissSearchButtonView) { 137c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet hideSearchField(true, mFocusRecyclerViewRunnable); 138c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 139c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 140c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 141c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet @Override 142c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet public void beforeTextChanged(CharSequence s, int start, int count, int after) { 143c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Do nothing 144c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 145c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 146c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet @Override 147c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet public void onTextChanged(CharSequence s, int start, int before, int count) { 148c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Do nothing 149c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 150c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 151c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet @Override 152c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet public void afterTextChanged(final Editable s) { 153c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet String query = s.toString(); 154c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (query.isEmpty()) { 155c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mSearchManager.cancel(true); 156c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mCb.clearSearchResult(); 157c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } else { 158c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mSearchManager.cancel(false); 159c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mSearchManager.doSearch(query, mCb); 160c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 161c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 162c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 163c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet @Override 164c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 165c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Skip if we disallow app-launch-on-enter 166c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (!ALLOW_SINGLE_APP_LAUNCH) { 167c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 168c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 169c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Skip if it's not the right action 170c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (actionId != EditorInfo.IME_ACTION_DONE) { 171c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 172c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 173c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Skip if there isn't exactly one item 174c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (mApps.getSize() != 1) { 175c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 176c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 177c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // If there is exactly one icon, then quick-launch it 178c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet List<AlphabeticalAppsList.AdapterItem> items = mApps.getAdapterItems(); 179c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet for (int i = 0; i < items.size(); i++) { 180c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet AlphabeticalAppsList.AdapterItem item = items.get(i); 181c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet if (item.viewType == AllAppsGridAdapter.ICON_VIEW_TYPE) { 182c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mAppsRecyclerView.getChildAt(i).performClick(); 183c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mInputMethodManager.hideSoftInputFromWindow( 184c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mContainerView.getWindowToken(), 0); 185c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return true; 186c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 187c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 188c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet return false; 189c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 190c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 191c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet /** 192c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Focuses the search field. 193c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 194c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet private void showSearchField() { 195c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Show the search bar and focus the search 196c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet final int translationX = Utilities.pxFromDp(SEARCH_TRANSLATION_X_DP, 197c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mContext.getResources().getDisplayMetrics()); 198c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mSearchBarContainerView.setVisibility(View.VISIBLE); 199c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mSearchBarContainerView.setAlpha(0f); 200c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mSearchBarContainerView.setTranslationX(translationX); 201c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mSearchBarContainerView.animate() 202c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet .alpha(1f) 203c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet .translationX(0) 204c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet .setDuration(FADE_IN_DURATION) 205c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet .withLayer() 206c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet .withEndAction(new Runnable() { 207c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet @Override 208c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet public void run() { 209c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mSearchBarEditView.requestFocus(); 210c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mInputMethodManager.showSoftInput(mSearchBarEditView, 211c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet InputMethodManager.SHOW_IMPLICIT); 212c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 213c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet }); 214c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mSearchButtonView.animate() 215c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet .alpha(0f) 216c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet .translationX(-translationX) 217c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet .setDuration(FADE_OUT_DURATION) 218c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet .withLayer(); 219c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet } 220c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 221c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet /** 222c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Unfocuses the search field. 223c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 224c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet @Thunk void hideSearchField(boolean animated, final Runnable postAnimationRunnable) { 225c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mSearchManager.cancel(true); 2264a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet 227c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet final boolean resetTextField = mSearchBarEditView.getText().toString().length() > 0; 22801c19c30a73d4a3ad42ad5630ad790db01a853ccJean-Luc Brouillet final int translationX = Utilities.pxFromDp(SEARCH_TRANSLATION_X_DP, 229c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mContext.getResources().getDisplayMetrics()); 2304a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet if (animated) { 231c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Hide the search bar and focus the recycler view 2324a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet mSearchBarContainerView.animate() 233c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet .alpha(0f) 234c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet .translationX(0) 235c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet .setDuration(FADE_IN_DURATION) 236c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet .withLayer() 237c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet .withEndAction(new Runnable() { 238c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet @Override 239c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet public void run() { 2404a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet mSearchBarContainerView.setVisibility(View.INVISIBLE); 2414a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet if (resetTextField) { 2424a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet mSearchBarEditView.setText(""); 2434a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet } 2444a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet mCb.clearSearchResult(); 2454a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet if (postAnimationRunnable != null) { 2464a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet postAnimationRunnable.run(); 2474a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet } 2484a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet } 249c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet }); 250c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet mSearchButtonView.setTranslationX(-translationX); 2514a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet mSearchButtonView.animate() 2524a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet .alpha(1f) 2534a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet .translationX(0) 254c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet .setDuration(FADE_OUT_DURATION) 255c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet .withLayer(); 2564a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet } else { 2574a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet mSearchBarContainerView.setVisibility(View.INVISIBLE); 2584a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet if (resetTextField) { 2592217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet mSearchBarEditView.setText(""); 2602217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet } 2614a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet mCb.clearSearchResult(); 2624a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet mSearchButtonView.setAlpha(1f); 2634a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet mSearchButtonView.setTranslationX(0f); 2644a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet if (postAnimationRunnable != null) { 2654a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet postAnimationRunnable.run(); 2664a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet } 2674a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet } 2684a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet mInputMethodManager.hideSoftInputFromWindow(mContainerView.getWindowToken(), 0); 2694a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet } 270c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet} 271c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet