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