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