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