MaterialSearchActionView.java revision a70ab69fd489a1f10dd75fc84214bd970096ae02
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; 21c6801eb828627c37b8992584767c095dfe11df62Jin Caoimport android.text.Editable; 22c6801eb828627c37b8992584767c095dfe11df62Jin Caoimport android.text.TextWatcher; 23c6801eb828627c37b8992584767c095dfe11df62Jin Caoimport android.util.AttributeSet; 24c6801eb828627c37b8992584767c095dfe11df62Jin Caoimport android.view.KeyEvent; 25c6801eb828627c37b8992584767c095dfe11df62Jin Caoimport android.view.View; 26c6801eb828627c37b8992584767c095dfe11df62Jin Caoimport android.view.inputmethod.EditorInfo; 27c6801eb828627c37b8992584767c095dfe11df62Jin Caoimport android.view.inputmethod.InputMethodManager; 28c6801eb828627c37b8992584767c095dfe11df62Jin Caoimport android.widget.EditText; 29c6801eb828627c37b8992584767c095dfe11df62Jin Caoimport android.widget.ImageView; 30c6801eb828627c37b8992584767c095dfe11df62Jin Caoimport android.widget.LinearLayout; 31c6801eb828627c37b8992584767c095dfe11df62Jin Caoimport android.widget.TextView; 32c6801eb828627c37b8992584767c095dfe11df62Jin Cao 33c6801eb828627c37b8992584767c095dfe11df62Jin Caoimport com.android.mail.R; 34c6801eb828627c37b8992584767c095dfe11df62Jin Cao 35c6801eb828627c37b8992584767c095dfe11df62Jin Cao/** 36c6801eb828627c37b8992584767c095dfe11df62Jin Cao * Custom view for the action bar when search is displayed. 37c6801eb828627c37b8992584767c095dfe11df62Jin Cao */ 38c6801eb828627c37b8992584767c095dfe11df62Jin Caopublic class MaterialSearchActionView extends LinearLayout implements TextWatcher, 39c6801eb828627c37b8992584767c095dfe11df62Jin Cao View.OnClickListener, TextView.OnEditorActionListener { 40c6801eb828627c37b8992584767c095dfe11df62Jin Cao private MaterialSearchViewController mController; 41c6801eb828627c37b8992584767c095dfe11df62Jin Cao private InputMethodManager mImm; 42c6801eb828627c37b8992584767c095dfe11df62Jin Cao private boolean mShowingClose; 43c6801eb828627c37b8992584767c095dfe11df62Jin Cao private boolean mSupportVoice; 44c6801eb828627c37b8992584767c095dfe11df62Jin Cao 45c6801eb828627c37b8992584767c095dfe11df62Jin Cao private View mBackButton; 46c6801eb828627c37b8992584767c095dfe11df62Jin Cao private EditText mQueryText; 47c6801eb828627c37b8992584767c095dfe11df62Jin Cao private ImageView mEndingButton; 48c6801eb828627c37b8992584767c095dfe11df62Jin Cao 49c6801eb828627c37b8992584767c095dfe11df62Jin Cao public MaterialSearchActionView(Context context) { 50c6801eb828627c37b8992584767c095dfe11df62Jin Cao super(context); 51c6801eb828627c37b8992584767c095dfe11df62Jin Cao } 52c6801eb828627c37b8992584767c095dfe11df62Jin Cao 53c6801eb828627c37b8992584767c095dfe11df62Jin Cao public MaterialSearchActionView(Context context, AttributeSet attrs) { 54c6801eb828627c37b8992584767c095dfe11df62Jin Cao super(context, attrs); 55c6801eb828627c37b8992584767c095dfe11df62Jin Cao } 56c6801eb828627c37b8992584767c095dfe11df62Jin Cao 57c6801eb828627c37b8992584767c095dfe11df62Jin Cao // PUBLIC API 58c6801eb828627c37b8992584767c095dfe11df62Jin Cao public void setController(MaterialSearchViewController controller, String initialQuery, 59c6801eb828627c37b8992584767c095dfe11df62Jin Cao boolean supportVoice) { 60c6801eb828627c37b8992584767c095dfe11df62Jin Cao mController = controller; 61c6801eb828627c37b8992584767c095dfe11df62Jin Cao mQueryText.setText(initialQuery); 62c6801eb828627c37b8992584767c095dfe11df62Jin Cao mSupportVoice = supportVoice; 63c6801eb828627c37b8992584767c095dfe11df62Jin Cao } 64c6801eb828627c37b8992584767c095dfe11df62Jin Cao 65c6801eb828627c37b8992584767c095dfe11df62Jin Cao public void clearSearchQuery() { 66c6801eb828627c37b8992584767c095dfe11df62Jin Cao mQueryText.setText(""); 67c6801eb828627c37b8992584767c095dfe11df62Jin Cao } 68c6801eb828627c37b8992584767c095dfe11df62Jin Cao 69c6801eb828627c37b8992584767c095dfe11df62Jin Cao public void focusSearchBar(boolean hasFocus) { 70c6801eb828627c37b8992584767c095dfe11df62Jin Cao if (hasFocus) { 71a70ab69fd489a1f10dd75fc84214bd970096ae02Jin Cao mQueryText.requestFocus(); 72c6801eb828627c37b8992584767c095dfe11df62Jin Cao mImm.showSoftInput(mQueryText, 0); 73c6801eb828627c37b8992584767c095dfe11df62Jin Cao } else { 74c6801eb828627c37b8992584767c095dfe11df62Jin Cao mImm.hideSoftInputFromWindow(mQueryText.getWindowToken(), 0); 75c6801eb828627c37b8992584767c095dfe11df62Jin Cao } 76c6801eb828627c37b8992584767c095dfe11df62Jin Cao } 77c6801eb828627c37b8992584767c095dfe11df62Jin Cao 78c6801eb828627c37b8992584767c095dfe11df62Jin Cao @Override 79c6801eb828627c37b8992584767c095dfe11df62Jin Cao protected void onFinishInflate() { 80c6801eb828627c37b8992584767c095dfe11df62Jin Cao super.onFinishInflate(); 81c6801eb828627c37b8992584767c095dfe11df62Jin Cao 82c6801eb828627c37b8992584767c095dfe11df62Jin Cao mImm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); 83c6801eb828627c37b8992584767c095dfe11df62Jin Cao mBackButton = findViewById(R.id.search_actionbar_back_button); 84c6801eb828627c37b8992584767c095dfe11df62Jin Cao mBackButton.setOnClickListener(this); 85c6801eb828627c37b8992584767c095dfe11df62Jin Cao mQueryText = (EditText) findViewById(R.id.search_actionbar_query_text); 86c6801eb828627c37b8992584767c095dfe11df62Jin Cao mQueryText.addTextChangedListener(this); 87c6801eb828627c37b8992584767c095dfe11df62Jin Cao mQueryText.setOnClickListener(this); 88c6801eb828627c37b8992584767c095dfe11df62Jin Cao mQueryText.setOnEditorActionListener(this); 89c6801eb828627c37b8992584767c095dfe11df62Jin Cao mEndingButton = (ImageView) findViewById(R.id.search_actionbar_ending_button); 90c6801eb828627c37b8992584767c095dfe11df62Jin Cao mEndingButton.setOnClickListener(this); 91c6801eb828627c37b8992584767c095dfe11df62Jin Cao } 92c6801eb828627c37b8992584767c095dfe11df62Jin Cao 93c6801eb828627c37b8992584767c095dfe11df62Jin Cao @Override 94c6801eb828627c37b8992584767c095dfe11df62Jin Cao public void setVisibility(int visibility) { 95c6801eb828627c37b8992584767c095dfe11df62Jin Cao if (visibility != VISIBLE) { 96c6801eb828627c37b8992584767c095dfe11df62Jin Cao mQueryText.setText(""); 97c6801eb828627c37b8992584767c095dfe11df62Jin Cao } 98c6801eb828627c37b8992584767c095dfe11df62Jin Cao super.setVisibility(visibility); 99c6801eb828627c37b8992584767c095dfe11df62Jin Cao } 100c6801eb828627c37b8992584767c095dfe11df62Jin Cao 101c6801eb828627c37b8992584767c095dfe11df62Jin Cao @Override 102c6801eb828627c37b8992584767c095dfe11df62Jin Cao public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { 103c6801eb828627c37b8992584767c095dfe11df62Jin Cao // Only care about onTextChanged 104c6801eb828627c37b8992584767c095dfe11df62Jin Cao } 105c6801eb828627c37b8992584767c095dfe11df62Jin Cao 106c6801eb828627c37b8992584767c095dfe11df62Jin Cao @Override 107c6801eb828627c37b8992584767c095dfe11df62Jin Cao public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { 108c6801eb828627c37b8992584767c095dfe11df62Jin Cao mController.onQueryTextChanged(charSequence.toString()); 109c6801eb828627c37b8992584767c095dfe11df62Jin Cao if (!mSupportVoice || charSequence.length() > 0) { 110c6801eb828627c37b8992584767c095dfe11df62Jin Cao mShowingClose = true; 111c6801eb828627c37b8992584767c095dfe11df62Jin Cao mEndingButton.setImageResource(R.drawable.ic_close_24dp); 112c6801eb828627c37b8992584767c095dfe11df62Jin Cao } else { 113c6801eb828627c37b8992584767c095dfe11df62Jin Cao mShowingClose = false; 114c6801eb828627c37b8992584767c095dfe11df62Jin Cao mEndingButton.setImageResource(R.drawable.ic_mic_24dp); 115c6801eb828627c37b8992584767c095dfe11df62Jin Cao } 116c6801eb828627c37b8992584767c095dfe11df62Jin Cao } 117c6801eb828627c37b8992584767c095dfe11df62Jin Cao 118c6801eb828627c37b8992584767c095dfe11df62Jin Cao @Override 119c6801eb828627c37b8992584767c095dfe11df62Jin Cao public void afterTextChanged(Editable editable) { 120c6801eb828627c37b8992584767c095dfe11df62Jin Cao // Only care about onTextChanged 121c6801eb828627c37b8992584767c095dfe11df62Jin Cao } 122c6801eb828627c37b8992584767c095dfe11df62Jin Cao 123c6801eb828627c37b8992584767c095dfe11df62Jin Cao @Override 124c6801eb828627c37b8992584767c095dfe11df62Jin Cao public void onClick(View view) { 125c6801eb828627c37b8992584767c095dfe11df62Jin Cao if (view == mBackButton) { 126c6801eb828627c37b8992584767c095dfe11df62Jin Cao mController.onSearchCanceled(); 127c6801eb828627c37b8992584767c095dfe11df62Jin Cao mQueryText.setText(""); 128c6801eb828627c37b8992584767c095dfe11df62Jin Cao } else if (view == mEndingButton) { 129c6801eb828627c37b8992584767c095dfe11df62Jin Cao if (mShowingClose) { 130c6801eb828627c37b8992584767c095dfe11df62Jin Cao mQueryText.setText(""); 131c6801eb828627c37b8992584767c095dfe11df62Jin Cao mController.showSearchActionBar( 132c6801eb828627c37b8992584767c095dfe11df62Jin Cao MaterialSearchViewController.SEARCH_VIEW_STATE_VISIBLE); 133c6801eb828627c37b8992584767c095dfe11df62Jin Cao } else { 134c6801eb828627c37b8992584767c095dfe11df62Jin Cao mController.onVoiceSearch(); 135c6801eb828627c37b8992584767c095dfe11df62Jin Cao } 136c6801eb828627c37b8992584767c095dfe11df62Jin Cao } else if (view == mQueryText) { 137c6801eb828627c37b8992584767c095dfe11df62Jin Cao mController.showSearchActionBar(MaterialSearchViewController.SEARCH_VIEW_STATE_VISIBLE); 138c6801eb828627c37b8992584767c095dfe11df62Jin Cao } 139c6801eb828627c37b8992584767c095dfe11df62Jin Cao } 140c6801eb828627c37b8992584767c095dfe11df62Jin Cao 141c6801eb828627c37b8992584767c095dfe11df62Jin Cao @Override 142c6801eb828627c37b8992584767c095dfe11df62Jin Cao public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) { 143c6801eb828627c37b8992584767c095dfe11df62Jin Cao if (actionId == EditorInfo.IME_ACTION_SEARCH) { 144c6801eb828627c37b8992584767c095dfe11df62Jin Cao mController.onSearchPerformed(mQueryText.getText().toString()); 145c6801eb828627c37b8992584767c095dfe11df62Jin Cao } 146c6801eb828627c37b8992584767c095dfe11df62Jin Cao return false; 147c6801eb828627c37b8992584767c095dfe11df62Jin Cao } 148c6801eb828627c37b8992584767c095dfe11df62Jin Cao} 149