1014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert/*
2014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert * Copyright (C) 2010 The Android Open Source Project
3014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert *
4014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
5014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert * you may not use this file except in compliance with the License.
6014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert * You may obtain a copy of the License at
7014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert *
8014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert *      http://www.apache.org/licenses/LICENSE-2.0
9014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert *
10014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert * Unless required by applicable law or agreed to in writing, software
11014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
12014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert * See the License for the specific language governing permissions and
14014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert * limitations under the License.
15014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert */
16014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringertpackage com.android.quicksearchbox.ui;
17014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert
18014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringertimport android.content.Context;
19014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringertimport android.util.AttributeSet;
20014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringertimport android.util.Log;
21014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringertimport android.view.inputmethod.CompletionInfo;
22014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringertimport android.view.inputmethod.InputMethodManager;
23014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringertimport android.widget.EditText;
24014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert
25014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert/**
26014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert * The query text field.
27014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert */
28014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringertpublic class QueryTextView extends EditText {
29014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert
30014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert    private static final boolean DBG = false;
31014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert    private static final String TAG = "QSB.QueryTextView";
32014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert
337010c51b51c97fa43d7b24d2158ecbc1d064e0a6Bjorn Bringert    private CommitCompletionListener mCommitCompletionListener;
34014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert
35014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert    public QueryTextView(Context context, AttributeSet attrs, int defStyle) {
36014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert        super(context, attrs, defStyle);
37014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert    }
38014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert
39014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert    public QueryTextView(Context context, AttributeSet attrs) {
40014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert        super(context, attrs);
41014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert    }
42014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert
43014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert    public QueryTextView(Context context) {
44014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert        super(context);
45014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert    }
46014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert
47014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert    /**
48014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert     * Sets the text selection in the query text view.
49014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert     *
50014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert     * @param selectAll If {@code true}, selects the entire query.
51014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert     *        If {@false}, no characters are selected, and the cursor is placed
52014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert     *        at the end of the query.
53014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert     */
54014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert    public void setTextSelection(boolean selectAll) {
55014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert        if (selectAll) {
56014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert            selectAll();
57014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert        } else {
58014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert            setSelection(length());
59014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert        }
60014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert    }
61014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert
62014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert    protected void replaceText(CharSequence text) {
63014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert        clearComposingText();
64014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert        setText(text);
65014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert        setTextSelection(false);
66014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert    }
67014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert
687010c51b51c97fa43d7b24d2158ecbc1d064e0a6Bjorn Bringert    public void setCommitCompletionListener(CommitCompletionListener listener) {
697010c51b51c97fa43d7b24d2158ecbc1d064e0a6Bjorn Bringert        mCommitCompletionListener = listener;
70014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert    }
71014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert
72014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert    private InputMethodManager getInputMethodManager() {
73014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert        return (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
74014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert    }
75014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert
76014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert    public void showInputMethod() {
77014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert        InputMethodManager imm = getInputMethodManager();
78014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert        if (imm != null) {
79014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert            imm.showSoftInput(this, 0);
80014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert        }
81014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert    }
82014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert
83014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert    public void hideInputMethod() {
84014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert        InputMethodManager imm = getInputMethodManager();
85014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert        if (imm != null) {
86014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert            imm.hideSoftInputFromWindow(getWindowToken(), 0);
87014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert        }
88014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert    }
89014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert
90014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert    @Override
91014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert    public void onCommitCompletion(CompletionInfo completion) {
92014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert        if (DBG) Log.d(TAG, "onCommitCompletion(" + completion + ")");
93014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert        hideInputMethod();
94014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert        replaceText(completion.getText());
957010c51b51c97fa43d7b24d2158ecbc1d064e0a6Bjorn Bringert        if (mCommitCompletionListener != null) {
967010c51b51c97fa43d7b24d2158ecbc1d064e0a6Bjorn Bringert            mCommitCompletionListener.onCommitCompletion(completion.getPosition());
97014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert        }
98014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert    }
99014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert
1007010c51b51c97fa43d7b24d2158ecbc1d064e0a6Bjorn Bringert    public interface CommitCompletionListener {
1017010c51b51c97fa43d7b24d2158ecbc1d064e0a6Bjorn Bringert        void onCommitCompletion(int position);
1027010c51b51c97fa43d7b24d2158ecbc1d064e0a6Bjorn Bringert    }
1037010c51b51c97fa43d7b24d2158ecbc1d064e0a6Bjorn Bringert
104014e0d0c0a5102b7cc1c5576a3af25a646731dd0Bjorn Bringert}
105