1c6801eb828627c37b8992584767c095dfe11df62Jin Cao/*
2c6801eb828627c37b8992584767c095dfe11df62Jin Cao * Copyright (C) 2014 Google Inc.
3c6801eb828627c37b8992584767c095dfe11df62Jin Cao * Licensed to The Android Open Source Project.
4c6801eb828627c37b8992584767c095dfe11df62Jin Cao *
5c6801eb828627c37b8992584767c095dfe11df62Jin Cao * Licensed under the Apache License, Version 2.0 (the "License");
6c6801eb828627c37b8992584767c095dfe11df62Jin Cao * you may not use this file except in compliance with the License.
7c6801eb828627c37b8992584767c095dfe11df62Jin Cao * You may obtain a copy of the License at
8c6801eb828627c37b8992584767c095dfe11df62Jin Cao *
9c6801eb828627c37b8992584767c095dfe11df62Jin Cao *      http://www.apache.org/licenses/LICENSE-2.0
10c6801eb828627c37b8992584767c095dfe11df62Jin Cao *
11c6801eb828627c37b8992584767c095dfe11df62Jin Cao * Unless required by applicable law or agreed to in writing, software
12c6801eb828627c37b8992584767c095dfe11df62Jin Cao * distributed under the License is distributed on an "AS IS" BASIS,
13c6801eb828627c37b8992584767c095dfe11df62Jin Cao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14c6801eb828627c37b8992584767c095dfe11df62Jin Cao * See the License for the specific language governing permissions and
15c6801eb828627c37b8992584767c095dfe11df62Jin Cao * limitations under the License.
16c6801eb828627c37b8992584767c095dfe11df62Jin Cao */
17c6801eb828627c37b8992584767c095dfe11df62Jin Cao
18c6801eb828627c37b8992584767c095dfe11df62Jin Caopackage com.android.mail.ui;
19c6801eb828627c37b8992584767c095dfe11df62Jin Cao
20c6801eb828627c37b8992584767c095dfe11df62Jin Caoimport android.content.Context;
218ebcda94b7f6c91c2a7c4bbe9d1911ca63b37855Jin Caoimport android.content.res.Resources;
22524ded5f9d27dda75c53d256922a39c867857575Jin Caoimport android.graphics.drawable.ColorDrawable;
23524ded5f9d27dda75c53d256922a39c867857575Jin Caoimport android.graphics.drawable.Drawable;
24524ded5f9d27dda75c53d256922a39c867857575Jin Caoimport android.support.annotation.DrawableRes;
25c6801eb828627c37b8992584767c095dfe11df62Jin Caoimport android.text.Editable;
26c6801eb828627c37b8992584767c095dfe11df62Jin Caoimport android.text.TextWatcher;
27c6801eb828627c37b8992584767c095dfe11df62Jin Caoimport android.util.AttributeSet;
281df2e0375938f6d55e4a9ec07aa4cfe687e76c02Jin Caoimport android.view.ActionMode;
29c6801eb828627c37b8992584767c095dfe11df62Jin Caoimport android.view.KeyEvent;
301df2e0375938f6d55e4a9ec07aa4cfe687e76c02Jin Caoimport android.view.Menu;
311df2e0375938f6d55e4a9ec07aa4cfe687e76c02Jin Caoimport android.view.MenuItem;
32c6801eb828627c37b8992584767c095dfe11df62Jin Caoimport android.view.View;
33524ded5f9d27dda75c53d256922a39c867857575Jin Caoimport android.view.ViewGroup;
34c6801eb828627c37b8992584767c095dfe11df62Jin Caoimport android.view.inputmethod.EditorInfo;
35c6801eb828627c37b8992584767c095dfe11df62Jin Caoimport android.view.inputmethod.InputMethodManager;
36c6801eb828627c37b8992584767c095dfe11df62Jin Caoimport android.widget.EditText;
37c6801eb828627c37b8992584767c095dfe11df62Jin Caoimport android.widget.ImageView;
38c6801eb828627c37b8992584767c095dfe11df62Jin Caoimport android.widget.LinearLayout;
39c6801eb828627c37b8992584767c095dfe11df62Jin Caoimport android.widget.TextView;
40c6801eb828627c37b8992584767c095dfe11df62Jin Cao
41c6801eb828627c37b8992584767c095dfe11df62Jin Caoimport com.android.mail.R;
42524ded5f9d27dda75c53d256922a39c867857575Jin Caoimport com.android.mail.utils.ViewUtils;
43c6801eb828627c37b8992584767c095dfe11df62Jin Cao
44c6801eb828627c37b8992584767c095dfe11df62Jin Cao/**
45c6801eb828627c37b8992584767c095dfe11df62Jin Cao * Custom view for the action bar when search is displayed.
46c6801eb828627c37b8992584767c095dfe11df62Jin Cao */
47c6801eb828627c37b8992584767c095dfe11df62Jin Caopublic class MaterialSearchActionView extends LinearLayout implements TextWatcher,
4864168c6e3a4b770f3d60ef4b7d7a330046e5185eJin Cao        View.OnClickListener, TextView.OnEditorActionListener, View.OnKeyListener {
49ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao    // Dark drawables are used for when the search bar is visible (thus dark icon on light bg).
50ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao    // Light drawables are used when we are showing the default action bar.
51ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao    private Drawable mLightBgDrawable;
52ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao    private Drawable mDarkBgDrawable;
53ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao    private @DrawableRes int mLightBgBackDrawable;
54ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao    private @DrawableRes int mDarkBgBackDrawable;
55ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao    private @DrawableRes int mLightBgClearTextDrawable;
56ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao    private @DrawableRes int mDarkBgClearTextDrawable;
57ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao    private @DrawableRes int mLightBgVoiceDrawable;
58ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao    private @DrawableRes int mDarkBgVoiceDrawable;
59ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao    private int mLightBgTextColor;
60ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao    private int mDarkBgTextColor;
61524ded5f9d27dda75c53d256922a39c867857575Jin Cao
62c6801eb828627c37b8992584767c095dfe11df62Jin Cao    private MaterialSearchViewController mController;
63c6801eb828627c37b8992584767c095dfe11df62Jin Cao    private InputMethodManager mImm;
64c6801eb828627c37b8992584767c095dfe11df62Jin Cao    private boolean mSupportVoice;
65ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao    private boolean mShowingClearButton;
66ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao    private boolean mAlignWithTl;
67c6801eb828627c37b8992584767c095dfe11df62Jin Cao
68524ded5f9d27dda75c53d256922a39c867857575Jin Cao    private ImageView mBackButton;
69c6801eb828627c37b8992584767c095dfe11df62Jin Cao    private EditText mQueryText;
70c6801eb828627c37b8992584767c095dfe11df62Jin Cao    private ImageView mEndingButton;
71c6801eb828627c37b8992584767c095dfe11df62Jin Cao
72c6801eb828627c37b8992584767c095dfe11df62Jin Cao    public MaterialSearchActionView(Context context) {
73524ded5f9d27dda75c53d256922a39c867857575Jin Cao        this(context, null);
74c6801eb828627c37b8992584767c095dfe11df62Jin Cao    }
75c6801eb828627c37b8992584767c095dfe11df62Jin Cao
76c6801eb828627c37b8992584767c095dfe11df62Jin Cao    public MaterialSearchActionView(Context context, AttributeSet attrs) {
77c6801eb828627c37b8992584767c095dfe11df62Jin Cao        super(context, attrs);
78524ded5f9d27dda75c53d256922a39c867857575Jin Cao
79524ded5f9d27dda75c53d256922a39c867857575Jin Cao        final Resources res = getResources();
80ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao        mLightBgDrawable = new ColorDrawable(res.getColor(android.R.color.white));
8154d5b6103887f92c922a4cb31915142e77519abdRohan Shah        mDarkBgDrawable = new ColorDrawable(res.getColor(R.color.primary_color));
82ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao        mLightBgBackDrawable = R.drawable.ic_arrow_back_24dp_with_rtl;
83ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao        mDarkBgBackDrawable = R.drawable.ic_arrow_back_wht_24dp_with_rtl;
84ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao        mLightBgClearTextDrawable = R.drawable.ic_close_24dp;
85ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao        mDarkBgClearTextDrawable = R.drawable.ic_close_wht_24dp;
86ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao        mLightBgVoiceDrawable = R.drawable.ic_mic_24dp;
87375faf0f8cf1d1de1d4aca7b9a7598e168dc9bf3Rohan Shah        mDarkBgVoiceDrawable = R.drawable.ic_mic_wht_24dp;
88ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao        mLightBgTextColor = res.getColor(R.color.search_query_text);
89ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao        mDarkBgTextColor = res.getColor(android.R.color.white);
90c6801eb828627c37b8992584767c095dfe11df62Jin Cao    }
91c6801eb828627c37b8992584767c095dfe11df62Jin Cao
92c6801eb828627c37b8992584767c095dfe11df62Jin Cao    // PUBLIC API
93c6801eb828627c37b8992584767c095dfe11df62Jin Cao    public void setController(MaterialSearchViewController controller, String initialQuery,
94c6801eb828627c37b8992584767c095dfe11df62Jin Cao            boolean supportVoice) {
95c6801eb828627c37b8992584767c095dfe11df62Jin Cao        mController = controller;
96c6801eb828627c37b8992584767c095dfe11df62Jin Cao        mQueryText.setText(initialQuery);
97c6801eb828627c37b8992584767c095dfe11df62Jin Cao        mSupportVoice = supportVoice;
98c6801eb828627c37b8992584767c095dfe11df62Jin Cao    }
99c6801eb828627c37b8992584767c095dfe11df62Jin Cao
100c6801eb828627c37b8992584767c095dfe11df62Jin Cao    public void clearSearchQuery() {
101c6801eb828627c37b8992584767c095dfe11df62Jin Cao        mQueryText.setText("");
102c6801eb828627c37b8992584767c095dfe11df62Jin Cao    }
103c6801eb828627c37b8992584767c095dfe11df62Jin Cao
104c6801eb828627c37b8992584767c095dfe11df62Jin Cao    public void focusSearchBar(boolean hasFocus) {
105c6801eb828627c37b8992584767c095dfe11df62Jin Cao        if (hasFocus) {
106a70ab69fd489a1f10dd75fc84214bd970096ae02Jin Cao            mQueryText.requestFocus();
107c6801eb828627c37b8992584767c095dfe11df62Jin Cao            mImm.showSoftInput(mQueryText, 0);
108c6801eb828627c37b8992584767c095dfe11df62Jin Cao        } else {
109c6801eb828627c37b8992584767c095dfe11df62Jin Cao            mImm.hideSoftInputFromWindow(mQueryText.getWindowToken(), 0);
110c6801eb828627c37b8992584767c095dfe11df62Jin Cao        }
111c6801eb828627c37b8992584767c095dfe11df62Jin Cao    }
112c6801eb828627c37b8992584767c095dfe11df62Jin Cao
113ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao    public void adjustViewForTwoPaneLandscape(boolean alignWithTl, int xEnd) {
114ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao        mAlignWithTl = alignWithTl;
115524ded5f9d27dda75c53d256922a39c867857575Jin Cao        final ViewGroup.LayoutParams params = getLayoutParams();
116ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao        if (alignWithTl) {
117ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao            setBackgroundDrawable(mDarkBgDrawable);
118ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao            mBackButton.setImageResource(mDarkBgBackDrawable);
119ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao            mQueryText.setTextColor(mDarkBgTextColor);
120524ded5f9d27dda75c53d256922a39c867857575Jin Cao
121524ded5f9d27dda75c53d256922a39c867857575Jin Cao            if (ViewUtils.isViewRtl(this)) {
122524ded5f9d27dda75c53d256922a39c867857575Jin Cao                int[] coords = new int[2];
123524ded5f9d27dda75c53d256922a39c867857575Jin Cao                getLocationInWindow(coords);
124524ded5f9d27dda75c53d256922a39c867857575Jin Cao                params.width = coords[0] + getWidth() - xEnd;
125524ded5f9d27dda75c53d256922a39c867857575Jin Cao            } else {
126524ded5f9d27dda75c53d256922a39c867857575Jin Cao                params.width = xEnd;
127524ded5f9d27dda75c53d256922a39c867857575Jin Cao            }
128524ded5f9d27dda75c53d256922a39c867857575Jin Cao        } else {
129ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao            setBackgroundDrawable(mLightBgDrawable);
130ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao            mBackButton.setImageResource(mLightBgBackDrawable);
131ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao            mQueryText.setTextColor(mLightBgTextColor);
132524ded5f9d27dda75c53d256922a39c867857575Jin Cao            params.width = ViewGroup.LayoutParams.MATCH_PARENT;
133524ded5f9d27dda75c53d256922a39c867857575Jin Cao        }
134ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao        setupEndingButton(mQueryText.getText());
135524ded5f9d27dda75c53d256922a39c867857575Jin Cao        setLayoutParams(params);
136524ded5f9d27dda75c53d256922a39c867857575Jin Cao    }
137524ded5f9d27dda75c53d256922a39c867857575Jin Cao
138c6801eb828627c37b8992584767c095dfe11df62Jin Cao    @Override
139c6801eb828627c37b8992584767c095dfe11df62Jin Cao    protected void onFinishInflate() {
140c6801eb828627c37b8992584767c095dfe11df62Jin Cao        super.onFinishInflate();
141c6801eb828627c37b8992584767c095dfe11df62Jin Cao
142c6801eb828627c37b8992584767c095dfe11df62Jin Cao        mImm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
143524ded5f9d27dda75c53d256922a39c867857575Jin Cao        mBackButton = (ImageView) findViewById(R.id.search_actionbar_back_button);
144c6801eb828627c37b8992584767c095dfe11df62Jin Cao        mBackButton.setOnClickListener(this);
145c6801eb828627c37b8992584767c095dfe11df62Jin Cao        mQueryText = (EditText) findViewById(R.id.search_actionbar_query_text);
146c6801eb828627c37b8992584767c095dfe11df62Jin Cao        mQueryText.addTextChangedListener(this);
147c6801eb828627c37b8992584767c095dfe11df62Jin Cao        mQueryText.setOnClickListener(this);
148c6801eb828627c37b8992584767c095dfe11df62Jin Cao        mQueryText.setOnEditorActionListener(this);
14964168c6e3a4b770f3d60ef4b7d7a330046e5185eJin Cao        mQueryText.setOnKeyListener(this);
1501df2e0375938f6d55e4a9ec07aa4cfe687e76c02Jin Cao        // Disable CAB for search edittext
1511df2e0375938f6d55e4a9ec07aa4cfe687e76c02Jin Cao        mQueryText.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
1521df2e0375938f6d55e4a9ec07aa4cfe687e76c02Jin Cao            @Override
1531df2e0375938f6d55e4a9ec07aa4cfe687e76c02Jin Cao            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
1541df2e0375938f6d55e4a9ec07aa4cfe687e76c02Jin Cao                return false;
1551df2e0375938f6d55e4a9ec07aa4cfe687e76c02Jin Cao            }
1561df2e0375938f6d55e4a9ec07aa4cfe687e76c02Jin Cao
1571df2e0375938f6d55e4a9ec07aa4cfe687e76c02Jin Cao            @Override
1581df2e0375938f6d55e4a9ec07aa4cfe687e76c02Jin Cao            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
1591df2e0375938f6d55e4a9ec07aa4cfe687e76c02Jin Cao                return false;
1601df2e0375938f6d55e4a9ec07aa4cfe687e76c02Jin Cao            }
1611df2e0375938f6d55e4a9ec07aa4cfe687e76c02Jin Cao
1621df2e0375938f6d55e4a9ec07aa4cfe687e76c02Jin Cao            @Override
1631df2e0375938f6d55e4a9ec07aa4cfe687e76c02Jin Cao            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
1641df2e0375938f6d55e4a9ec07aa4cfe687e76c02Jin Cao                return false;
1651df2e0375938f6d55e4a9ec07aa4cfe687e76c02Jin Cao            }
1661df2e0375938f6d55e4a9ec07aa4cfe687e76c02Jin Cao
1671df2e0375938f6d55e4a9ec07aa4cfe687e76c02Jin Cao            @Override
1681df2e0375938f6d55e4a9ec07aa4cfe687e76c02Jin Cao            public void onDestroyActionMode(ActionMode mode) {
1691df2e0375938f6d55e4a9ec07aa4cfe687e76c02Jin Cao            }
1701df2e0375938f6d55e4a9ec07aa4cfe687e76c02Jin Cao        });
171c6801eb828627c37b8992584767c095dfe11df62Jin Cao        mEndingButton = (ImageView) findViewById(R.id.search_actionbar_ending_button);
172c6801eb828627c37b8992584767c095dfe11df62Jin Cao        mEndingButton.setOnClickListener(this);
1738ebcda94b7f6c91c2a7c4bbe9d1911ca63b37855Jin Cao        setupEndingButton(mQueryText.getText());
1748ebcda94b7f6c91c2a7c4bbe9d1911ca63b37855Jin Cao    }
1758ebcda94b7f6c91c2a7c4bbe9d1911ca63b37855Jin Cao
1768ebcda94b7f6c91c2a7c4bbe9d1911ca63b37855Jin Cao    private void setupEndingButton(CharSequence currentText) {
1778ebcda94b7f6c91c2a7c4bbe9d1911ca63b37855Jin Cao        final Resources res = getResources();
1788ebcda94b7f6c91c2a7c4bbe9d1911ca63b37855Jin Cao        if (!mSupportVoice || currentText.length() > 0) {
179ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao            if (mAlignWithTl) {
180ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao                mEndingButton.setImageResource(mDarkBgClearTextDrawable);
181ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao            } else {
182ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao                mEndingButton.setImageResource(mLightBgClearTextDrawable);
183ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao            }
1848ebcda94b7f6c91c2a7c4bbe9d1911ca63b37855Jin Cao            mEndingButton.setContentDescription(res.getString(R.string.search_clear_desc));
185ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao            mShowingClearButton = true;
1868ebcda94b7f6c91c2a7c4bbe9d1911ca63b37855Jin Cao        } else {
187ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao            if (mAlignWithTl) {
188ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao                mEndingButton.setImageResource(mDarkBgVoiceDrawable);
189ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao            } else {
190ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao                mEndingButton.setImageResource(mLightBgVoiceDrawable);
191ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao            }
1928ebcda94b7f6c91c2a7c4bbe9d1911ca63b37855Jin Cao            mEndingButton.setContentDescription(res.getString(R.string.search_voice_desc));
193ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao            mShowingClearButton = false;
1948ebcda94b7f6c91c2a7c4bbe9d1911ca63b37855Jin Cao        }
195c6801eb828627c37b8992584767c095dfe11df62Jin Cao    }
196c6801eb828627c37b8992584767c095dfe11df62Jin Cao
197c6801eb828627c37b8992584767c095dfe11df62Jin Cao    @Override
198c6801eb828627c37b8992584767c095dfe11df62Jin Cao    public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
199c6801eb828627c37b8992584767c095dfe11df62Jin Cao        // Only care about onTextChanged
200c6801eb828627c37b8992584767c095dfe11df62Jin Cao    }
201c6801eb828627c37b8992584767c095dfe11df62Jin Cao
202c6801eb828627c37b8992584767c095dfe11df62Jin Cao    @Override
203c6801eb828627c37b8992584767c095dfe11df62Jin Cao    public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
204c6801eb828627c37b8992584767c095dfe11df62Jin Cao        mController.onQueryTextChanged(charSequence.toString());
2058ebcda94b7f6c91c2a7c4bbe9d1911ca63b37855Jin Cao        setupEndingButton(charSequence);
206c6801eb828627c37b8992584767c095dfe11df62Jin Cao    }
207c6801eb828627c37b8992584767c095dfe11df62Jin Cao
208c6801eb828627c37b8992584767c095dfe11df62Jin Cao    @Override
209c6801eb828627c37b8992584767c095dfe11df62Jin Cao    public void afterTextChanged(Editable editable) {
210c6801eb828627c37b8992584767c095dfe11df62Jin Cao        // Only care about onTextChanged
211c6801eb828627c37b8992584767c095dfe11df62Jin Cao    }
212c6801eb828627c37b8992584767c095dfe11df62Jin Cao
213c6801eb828627c37b8992584767c095dfe11df62Jin Cao    @Override
214c6801eb828627c37b8992584767c095dfe11df62Jin Cao    public void onClick(View view) {
215c6801eb828627c37b8992584767c095dfe11df62Jin Cao        if (view == mBackButton) {
216c6801eb828627c37b8992584767c095dfe11df62Jin Cao            mController.onSearchCanceled();
217c6801eb828627c37b8992584767c095dfe11df62Jin Cao        } else if (view == mEndingButton) {
218ef179072bcdee5ff3b8faba8ea0eae6bbb486355Jin Cao            if (mShowingClearButton) {
219c6801eb828627c37b8992584767c095dfe11df62Jin Cao                mQueryText.setText("");
220c6801eb828627c37b8992584767c095dfe11df62Jin Cao                mController.showSearchActionBar(
221c6801eb828627c37b8992584767c095dfe11df62Jin Cao                        MaterialSearchViewController.SEARCH_VIEW_STATE_VISIBLE);
222c6801eb828627c37b8992584767c095dfe11df62Jin Cao            } else {
223c6801eb828627c37b8992584767c095dfe11df62Jin Cao                mController.onVoiceSearch();
224c6801eb828627c37b8992584767c095dfe11df62Jin Cao            }
225c6801eb828627c37b8992584767c095dfe11df62Jin Cao        } else if (view == mQueryText) {
226c6801eb828627c37b8992584767c095dfe11df62Jin Cao            mController.showSearchActionBar(MaterialSearchViewController.SEARCH_VIEW_STATE_VISIBLE);
227c6801eb828627c37b8992584767c095dfe11df62Jin Cao        }
228c6801eb828627c37b8992584767c095dfe11df62Jin Cao    }
229c6801eb828627c37b8992584767c095dfe11df62Jin Cao
230c6801eb828627c37b8992584767c095dfe11df62Jin Cao    @Override
231c6801eb828627c37b8992584767c095dfe11df62Jin Cao    public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) {
232c6801eb828627c37b8992584767c095dfe11df62Jin Cao        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
233c6801eb828627c37b8992584767c095dfe11df62Jin Cao            mController.onSearchPerformed(mQueryText.getText().toString());
234c6801eb828627c37b8992584767c095dfe11df62Jin Cao        }
235c6801eb828627c37b8992584767c095dfe11df62Jin Cao        return false;
236c6801eb828627c37b8992584767c095dfe11df62Jin Cao    }
23764168c6e3a4b770f3d60ef4b7d7a330046e5185eJin Cao
23864168c6e3a4b770f3d60ef4b7d7a330046e5185eJin Cao    @Override
23964168c6e3a4b770f3d60ef4b7d7a330046e5185eJin Cao    public boolean onKey(View v, int keyCode, KeyEvent event) {
24064168c6e3a4b770f3d60ef4b7d7a330046e5185eJin Cao        // Hardware keyboard doesn't represent Enter as Search through imeOptions, so we need to
24164168c6e3a4b770f3d60ef4b7d7a330046e5185eJin Cao        // capture them manually here.
24264168c6e3a4b770f3d60ef4b7d7a330046e5185eJin Cao        if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_ENTER) {
24364168c6e3a4b770f3d60ef4b7d7a330046e5185eJin Cao            mController.onSearchPerformed(mQueryText.getText().toString());
24464168c6e3a4b770f3d60ef4b7d7a330046e5185eJin Cao        }
24564168c6e3a4b770f3d60ef4b7d7a330046e5185eJin Cao        return false;
24664168c6e3a4b770f3d60ef4b7d7a330046e5185eJin Cao    }
247c6801eb828627c37b8992584767c095dfe11df62Jin Cao}
248