AutoCompleteTextView.java revision be2c4f92a990ca48ad6ede252343dd9574dfe505
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.widget; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunneimport com.android.internal.R; 20be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray; 236a67810228d02e75446d55c4c353275c87e9e769Romain Guyimport android.database.DataSetObserver; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.Editable; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.Selection; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextWatcher; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup; 36374aaaed32daa8482d98ec16988b2b51547f035dRomain Guyimport android.view.WindowManager; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.CompletionInfo; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.EditorInfo; 39c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powellimport android.view.inputmethod.InputMethodManager; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>An editable text view that shows completion suggestions automatically 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * while the user is typing. The list of suggestions is displayed in a drop 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * down menu from which the user can choose an item to replace the content 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the edit box with.</p> 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The drop down can be dismissed at any time by pressing the back key or, 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if no item is selected in the drop down, by pressing the enter/dpad center 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * key.</p> 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The list of suggestions is obtained from a data adapter and appears 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * only after a given number of characters defined by 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getThreshold() the threshold}.</p> 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The following code snippet shows how to create a text view which suggests 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * various countries names while the user is typing:</p> 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"> 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public class CountriesActivity extends Activity { 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * protected void onCreate(Bundle icicle) { 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * super.onCreate(icicle); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * setContentView(R.layout.countries); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android.R.layout.simple_dropdown_item_1line, COUNTRIES); 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * AutoCompleteTextView textView = (AutoCompleteTextView) 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * findViewById(R.id.countries_list); 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * textView.setAdapter(adapter); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * } 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * private static final String[] COUNTRIES = new String[] { 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "Belgium", "France", "Italy", "Germany", "Spain" 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * } 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre> 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7841ec65355bd6ded652769725b276d47c54a0d913Scott Main * <p>See the <a href="{@docRoot}resources/tutorials/views/hello-autocomplete.html">Auto Complete 7941ec65355bd6ded652769725b276d47c54a0d913Scott Main * tutorial</a>.</p> 8041ec65355bd6ded652769725b276d47c54a0d913Scott Main * 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_completionHint 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_completionThreshold 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_completionHintView 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_dropDownSelector 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_dropDownAnchor 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_dropDownWidth 87e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * @attr ref android.R.styleable#AutoCompleteTextView_dropDownHeight 88aa1c6311d6d900261bcd9f3b0986b6c0394af07aRomain Guy * @attr ref android.R.styleable#AutoCompleteTextView_dropDownVerticalOffset 89aa1c6311d6d900261bcd9f3b0986b6c0394af07aRomain Guy * @attr ref android.R.styleable#AutoCompleteTextView_dropDownHorizontalOffset 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class AutoCompleteTextView extends EditText implements Filter.FilterListener { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG = false; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final String TAG = "AutoCompleteTextView"; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private CharSequence mHintText; 96c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell private TextView mHintView; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mHintResource; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ListAdapter mAdapter; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Filter mFilter; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mThreshold; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 103c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell private ListPopupWindow mPopup; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mDropDownAnchorId; 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private AdapterView.OnItemClickListener mItemClickListener; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private AdapterView.OnItemSelectedListener mItemSelectedListener; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 109875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen private boolean mDropDownDismissedOnCompletion = true; 110875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mLastKeyCode = KeyEvent.KEYCODE_UNKNOWN; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mOpenBefore; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Validator mValidator = null; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 116be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne // Set to true when text is set directly and no filtering shall be performed 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mBlockCompletion; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1196a67810228d02e75446d55c4c353275c87e9e769Romain Guy private PassThroughClickListener mPassThroughClickListener; 1206a67810228d02e75446d55c4c353275c87e9e769Romain Guy private PopupDataSetObserver mObserver; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AutoCompleteTextView(Context context) { 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, null); 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AutoCompleteTextView(Context context, AttributeSet attrs) { 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, attrs, com.android.internal.R.attr.autoCompleteTextViewStyle); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AutoCompleteTextView(Context context, AttributeSet attrs, int defStyle) { 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs, defStyle); 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 133c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup = new ListPopupWindow(context, attrs, 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.attr.autoCompleteTextViewStyle); 135374aaaed32daa8482d98ec16988b2b51547f035dRomain Guy mPopup.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); 136c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setPromptPosition(ListPopupWindow.POSITION_PROMPT_BELOW); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project context.obtainStyledAttributes( 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attrs, com.android.internal.R.styleable.AutoCompleteTextView, defStyle, 0); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mThreshold = a.getInt( 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.styleable.AutoCompleteTextView_completionThreshold, 2); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 145c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setListSelector(a.getDrawable(R.styleable.AutoCompleteTextView_dropDownSelector)); 146c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setVerticalOffset((int) 147c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell a.getDimension(R.styleable.AutoCompleteTextView_dropDownVerticalOffset, 0.0f)); 148c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setHorizontalOffset((int) 149c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell a.getDimension(R.styleable.AutoCompleteTextView_dropDownHorizontalOffset, 0.0f)); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get the anchor's id now, but the view won't be ready, so wait to actually get the 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // view and store it in mDropDownAnchorView lazily in getDropDownAnchorView later. 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Defaults to NO_ID, in which case the getDropDownAnchorView method will simply return 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this TextView, as a default anchoring point. 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownAnchorId = a.getResourceId(R.styleable.AutoCompleteTextView_dropDownAnchor, 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View.NO_ID); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 158980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy // For dropdown width, the developer can specify a specific width, or MATCH_PARENT 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // (for full screen width) or WRAP_CONTENT (to match the width of the anchored view). 160c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setWidth(a.getLayoutDimension( 161c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell R.styleable.AutoCompleteTextView_dropDownWidth, 162c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell ViewGroup.LayoutParams.WRAP_CONTENT)); 163c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setHeight(a.getLayoutDimension( 164c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell R.styleable.AutoCompleteTextView_dropDownHeight, 165c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell ViewGroup.LayoutParams.WRAP_CONTENT)); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHintResource = a.getResourceId(R.styleable.AutoCompleteTextView_completionHintView, 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.layout.simple_dropdown_hint); 169c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell 170c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setOnItemClickListener(new DropDownItemClickListener()); 171c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell setCompletionHint(a.getText(R.styleable.AutoCompleteTextView_completionHint)); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Always turn on the auto complete input type flag, since it 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // makes no sense to use this widget without it. 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int inputType = getInputType(); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((inputType&EditorInfo.TYPE_MASK_CLASS) 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project == EditorInfo.TYPE_CLASS_TEXT) { 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inputType |= EditorInfo.TYPE_TEXT_FLAG_AUTO_COMPLETE; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setRawInputType(inputType); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setFocusable(true); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addTextChangedListener(new MyWatcher()); 187ddf9856c7de043674d9ede006aefc7769879a4b8Mike LeBeau 18898e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen mPassThroughClickListener = new PassThroughClickListener(); 18998e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen super.setOnClickListener(mPassThroughClickListener); 19098e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen } 19198e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen 19298e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen @Override 19398e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen public void setOnClickListener(OnClickListener listener) { 19498e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen mPassThroughClickListener.mWrapped = listener; 19598e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen } 19698e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen 19798e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen /** 19898e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen * Private hook into the on click event, dispatched from {@link PassThroughClickListener} 19998e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen */ 20098e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen private void onClickImpl() { 201d25eb35b6b80b6f8065ab39b1cf1abb1fd801234Amith Yamasani // If the dropdown is showing, bring the keyboard to the front 202d25eb35b6b80b6f8065ab39b1cf1abb1fd801234Amith Yamasani // when the user touches the text field. 203d25eb35b6b80b6f8065ab39b1cf1abb1fd801234Amith Yamasani if (mPopup.isShowing()) { 204d25eb35b6b80b6f8065ab39b1cf1abb1fd801234Amith Yamasani ensureImeVisible(true); 20598e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen } 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the optional hint text that is displayed at the bottom of the 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the matching list. This can be used as a cue to the user on how to 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * best use the list, or to provide extra information.</p> 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param hint the text to be displayed to the user 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_completionHint 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setCompletionHint(CharSequence hint) { 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHintText = hint; 219c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell if (hint != null) { 220c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell if (mHintView == null) { 221c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell final TextView hintView = (TextView) LayoutInflater.from(getContext()).inflate( 222c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mHintResource, null).findViewById(com.android.internal.R.id.text1); 223c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell hintView.setText(mHintText); 224c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mHintView = hintView; 225c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setPromptView(hintView); 226c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell } else { 227c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mHintView.setText(hint); 228c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell } 229c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell } else { 230c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setPromptView(null); 231c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mHintView = null; 232c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell } 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the current width for the auto-complete drop down list. This can 237980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * be a fixed width, or {@link ViewGroup.LayoutParams#MATCH_PARENT} to fill the screen, or 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ViewGroup.LayoutParams#WRAP_CONTENT} to fit the width of its anchor view.</p> 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the width for the drop down list 2417b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 2427b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_dropDownWidth 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getDropDownWidth() { 245c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell return mPopup.getWidth(); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the current width for the auto-complete drop down list. This can 250980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * be a fixed width, or {@link ViewGroup.LayoutParams#MATCH_PARENT} to fill the screen, or 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ViewGroup.LayoutParams#WRAP_CONTENT} to fit the width of its anchor view.</p> 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param width the width to use 2547b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 2557b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_dropDownWidth 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDropDownWidth(int width) { 258c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setWidth(width); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 260e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy 261e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy /** 262e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * <p>Returns the current height for the auto-complete drop down list. This can 263980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * be a fixed height, or {@link ViewGroup.LayoutParams#MATCH_PARENT} to fill 264e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * the screen, or {@link ViewGroup.LayoutParams#WRAP_CONTENT} to fit the height 265e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * of the drop down's content.</p> 266e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * 267e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * @return the height for the drop down list 268e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * 269e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * @attr ref android.R.styleable#AutoCompleteTextView_dropDownHeight 270e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy */ 271e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy public int getDropDownHeight() { 272c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell return mPopup.getHeight(); 273e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy } 274e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy 275e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy /** 276e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * <p>Sets the current height for the auto-complete drop down list. This can 277980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * be a fixed height, or {@link ViewGroup.LayoutParams#MATCH_PARENT} to fill 278e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * the screen, or {@link ViewGroup.LayoutParams#WRAP_CONTENT} to fit the height 279e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * of the drop down's content.</p> 280e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * 281e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * @param height the height to use 282e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * 283e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * @attr ref android.R.styleable#AutoCompleteTextView_dropDownHeight 284e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy */ 285e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy public void setDropDownHeight(int height) { 286c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setHeight(height); 287e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy } 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the id for the view that the auto-complete drop down list is anchored to.</p> 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the view's id, or {@link View#NO_ID} if none specified 2937b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 2947b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_dropDownAnchor 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getDropDownAnchor() { 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDropDownAnchorId; 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the view to which the auto-complete drop down list should anchor. The view 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * corresponding to this id will not be loaded until the next time it is needed to avoid 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * loading a view which is not yet instantiated.</p> 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id the id to anchor the drop down list view to 3067b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3077b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_dropDownAnchor 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDropDownAnchor(int id) { 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownAnchorId = id; 311c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setAnchorView(null); 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3137b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 3147b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /** 3157b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * <p>Gets the background of the auto-complete drop-down list.</p> 3167b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3177b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @return the background drawable 3187b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3197b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @attr ref android.R.styleable#PopupWindow_popupBackground 3207b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 3217b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public Drawable getDropDownBackground() { 3227b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project return mPopup.getBackground(); 3237b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 3247b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 3257b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /** 3267b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * <p>Sets the background of the auto-complete drop-down list.</p> 3277b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3287b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @param d the drawable to set as the background 3297b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3307b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @attr ref android.R.styleable#PopupWindow_popupBackground 3317b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 3327b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public void setDropDownBackgroundDrawable(Drawable d) { 3337b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project mPopup.setBackgroundDrawable(d); 3347b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 3357b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 3367b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /** 3377b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * <p>Sets the background of the auto-complete drop-down list.</p> 3387b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3397b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @param id the id of the drawable to set as the background 3407b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3417b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @attr ref android.R.styleable#PopupWindow_popupBackground 3427b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 3437b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public void setDropDownBackgroundResource(int id) { 3447b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project mPopup.setBackgroundDrawable(getResources().getDrawable(id)); 3457b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 3467b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 3477b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /** 3487b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * <p>Sets the vertical offset used for the auto-complete drop-down list.</p> 3497b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3507b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @param offset the vertical offset 3517b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 3527b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public void setDropDownVerticalOffset(int offset) { 353c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setVerticalOffset(offset); 3547b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 3557b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 3567b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /** 3577b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * <p>Gets the vertical offset used for the auto-complete drop-down list.</p> 3587b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3597b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @return the vertical offset 3607b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 3617b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public int getDropDownVerticalOffset() { 362c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell return mPopup.getVerticalOffset(); 3637b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 3647b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 3657b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /** 3667b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * <p>Sets the horizontal offset used for the auto-complete drop-down list.</p> 3677b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3687b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @param offset the horizontal offset 3697b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 3707b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public void setDropDownHorizontalOffset(int offset) { 371c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setHorizontalOffset(offset); 3727b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 3737b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 3747b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /** 3757b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * <p>Gets the horizontal offset used for the auto-complete drop-down list.</p> 3767b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3777b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @return the horizontal offset 3787b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 3797b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public int getDropDownHorizontalOffset() { 380c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell return mPopup.getHorizontalOffset(); 3817b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 3828f080ec4292be02fad9896260bbd3cf5461f9399The Android Open Source Project 383bff1389c9ab4442a6e278cf84ce37eadad21a9a1The Android Open Source Project /** 384875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <p>Sets the animation style of the auto-complete drop-down list.</p> 385875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 386875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <p>If the drop-down is showing, calling this method will take effect only 387875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * the next time the drop-down is shown.</p> 388875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 389875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @param animationStyle animation style to use when the drop-down appears 390875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * and disappears. Set to -1 for the default animation, 0 for no 391875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * animation, or a resource identifier for an explicit animation. 392875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 393875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @hide Pending API council approval 394875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 395875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public void setDropDownAnimationStyle(int animationStyle) { 396875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen mPopup.setAnimationStyle(animationStyle); 397875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 400875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <p>Returns the animation style that is used when the drop-down list appears and disappears 401875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * </p> 402875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 403875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @return the animation style that is used when the drop-down list appears and disappears 404875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 405875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @hide Pending API council approval 406875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 407875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public int getDropDownAnimationStyle() { 408875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen return mPopup.getAnimationStyle(); 409875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 410875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 411875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 412875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @return Whether the drop-down is visible as long as there is {@link #enoughToFilter()} 413875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 414875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @hide Pending API council approval 415875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 416875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public boolean isDropDownAlwaysVisible() { 417c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell return mPopup.isDropDownAlwaysVisible(); 418875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 419875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 420875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 421875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Sets whether the drop-down should remain visible as long as there is there is 422875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * {@link #enoughToFilter()}. This is useful if an unknown number of results are expected 423875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * to show up in the adapter sometime in the future. 424875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 425875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * The drop-down will occupy the entire screen below {@link #getDropDownAnchor} regardless 426875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * of the size or content of the list. {@link #getDropDownBackground()} will fill any space 427875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * that is not used by the list. 428875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 429875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @param dropDownAlwaysVisible Whether to keep the drop-down visible. 430875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 431875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @hide Pending API council approval 432875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 433875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public void setDropDownAlwaysVisible(boolean dropDownAlwaysVisible) { 434c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setDropDownAlwaysVisible(dropDownAlwaysVisible); 435875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 436875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 437875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 438875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Checks whether the drop-down is dismissed when a suggestion is clicked. 439875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 440875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @hide Pending API council approval 441875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 442875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public boolean isDropDownDismissedOnCompletion() { 443875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen return mDropDownDismissedOnCompletion; 444875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 4456a67810228d02e75446d55c4c353275c87e9e769Romain Guy 446875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 447875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Sets whether the drop-down is dismissed when a suggestion is clicked. This is 448875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * true by default. 449875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 450875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @param dropDownDismissedOnCompletion Whether to dismiss the drop-down. 451875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 452875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @hide Pending API council approval 453875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 454875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public void setDropDownDismissedOnCompletion(boolean dropDownDismissedOnCompletion) { 455875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen mDropDownDismissedOnCompletion = dropDownDismissedOnCompletion; 456875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 457875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the number of characters the user must type before the drop 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * down list is shown.</p> 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the minimum number of characters to type to show the drop down 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setThreshold(int) 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getThreshold() { 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mThreshold; 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Specifies the minimum number of characters the user has to type in the 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * edit box before the drop down list is shown.</p> 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>When <code>threshold</code> is less than or equals 0, a threshold of 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1 is applied.</p> 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param threshold the number of characters to type before the drop down 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is shown 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getThreshold() 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_completionThreshold 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setThreshold(int threshold) { 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (threshold <= 0) { 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project threshold = 1; 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mThreshold = threshold; 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the listener that will be notified when the user clicks an item 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the drop down list.</p> 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param l the item click listener 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnItemClickListener(AdapterView.OnItemClickListener l) { 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mItemClickListener = l; 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the listener that will be notified when the user selects an item 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the drop down list.</p> 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param l the item selected listener 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnItemSelectedListener(AdapterView.OnItemSelectedListener l) { 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mItemSelectedListener = l; 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the listener that is notified whenever the user clicks an item 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the drop down list.</p> 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the item click listener 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @deprecated Use {@link #getOnItemClickListener()} intead 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Deprecated 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AdapterView.OnItemClickListener getItemClickListener() { 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mItemClickListener; 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the listener that is notified whenever the user selects an 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * item in the drop down list.</p> 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the item selected listener 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @deprecated Use {@link #getOnItemSelectedListener()} intead 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Deprecated 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AdapterView.OnItemSelectedListener getItemSelectedListener() { 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mItemSelectedListener; 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the listener that is notified whenever the user clicks an item 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the drop down list.</p> 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the item click listener 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AdapterView.OnItemClickListener getOnItemClickListener() { 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mItemClickListener; 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the listener that is notified whenever the user selects an 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * item in the drop down list.</p> 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the item selected listener 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AdapterView.OnItemSelectedListener getOnItemSelectedListener() { 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mItemSelectedListener; 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns a filterable list adapter used for auto completion.</p> 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a data adapter used for auto completion 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ListAdapter getAdapter() { 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAdapter; 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Changes the list of data used for auto completion. The provided list 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * must be a filterable list adapter.</p> 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The caller is still responsible for managing any resources used by the adapter. 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Notably, when the AutoCompleteTextView is closed or released, the adapter is not notified. 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A common case is the use of {@link android.widget.CursorAdapter}, which 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * contains a {@link android.database.Cursor} that must be closed. This can be done 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * automatically (see 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#startManagingCursor(android.database.Cursor) 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * startManagingCursor()}), 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or by manually closing the cursor when the AutoCompleteTextView is dismissed.</p> 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param adapter the adapter holding the auto completion data 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getAdapter() 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.widget.Filterable 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.widget.ListAdapter 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public <T extends ListAdapter & Filterable> void setAdapter(T adapter) { 5876a67810228d02e75446d55c4c353275c87e9e769Romain Guy if (mObserver == null) { 5886a67810228d02e75446d55c4c353275c87e9e769Romain Guy mObserver = new PopupDataSetObserver(); 5896a67810228d02e75446d55c4c353275c87e9e769Romain Guy } else if (mAdapter != null) { 5906a67810228d02e75446d55c4c353275c87e9e769Romain Guy mAdapter.unregisterDataSetObserver(mObserver); 5916a67810228d02e75446d55c4c353275c87e9e769Romain Guy } 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAdapter = adapter; 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAdapter != null) { 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //noinspection unchecked 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilter = ((Filterable) mAdapter).getFilter(); 5966a67810228d02e75446d55c4c353275c87e9e769Romain Guy adapter.registerDataSetObserver(mObserver); 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilter = null; 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 601c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setAdapter(mAdapter); 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onKeyPreIme(int keyCode, KeyEvent event) { 6068d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn if (keyCode == KeyEvent.KEYCODE_BACK && isPopupShowing() 607c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell && !mPopup.isDropDownAlwaysVisible()) { 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // special case for the back key, we do not even try to send it 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to the drop down list but instead, consume it immediately 6102beee4d11084f7b96dda6e335da0ebc08214dfb7Romain Guy if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) { 611b3ea92235c9ccc1ff295839a8f324dcd1c83dd6fJeff Brown KeyEvent.DispatcherState state = getKeyDispatcherState(); 612b3ea92235c9ccc1ff295839a8f324dcd1c83dd6fJeff Brown if (state != null) { 613b3ea92235c9ccc1ff295839a8f324dcd1c83dd6fJeff Brown state.startTracking(event, this); 614b3ea92235c9ccc1ff295839a8f324dcd1c83dd6fJeff Brown } 6158d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn return true; 6164eb3efc8b270d2569fd813546f85add92e7f0ab0Bjorn Bringert } else if (event.getAction() == KeyEvent.ACTION_UP) { 617b3ea92235c9ccc1ff295839a8f324dcd1c83dd6fJeff Brown KeyEvent.DispatcherState state = getKeyDispatcherState(); 618b3ea92235c9ccc1ff295839a8f324dcd1c83dd6fJeff Brown if (state != null) { 619b3ea92235c9ccc1ff295839a8f324dcd1c83dd6fJeff Brown state.handleUpEvent(event); 620b3ea92235c9ccc1ff295839a8f324dcd1c83dd6fJeff Brown } 6214eb3efc8b270d2569fd813546f85add92e7f0ab0Bjorn Bringert if (event.isTracking() && !event.isCanceled()) { 6224eb3efc8b270d2569fd813546f85add92e7f0ab0Bjorn Bringert dismissDropDown(); 6234eb3efc8b270d2569fd813546f85add92e7f0ab0Bjorn Bringert return true; 6244eb3efc8b270d2569fd813546f85add92e7f0ab0Bjorn Bringert } 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.onKeyPreIme(keyCode, event); 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onKeyUp(int keyCode, KeyEvent event) { 632c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell boolean consumed = mPopup.onKeyUp(keyCode, event); 633c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell if (consumed) { 634c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell switch (keyCode) { 635c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell // if the list accepts the key events and the key event 636c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell // was a click, the text view gets the selected item 637c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell // from the drop down as its content 638c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell case KeyEvent.KEYCODE_ENTER: 639c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell case KeyEvent.KEYCODE_DPAD_CENTER: 6404e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown case KeyEvent.KEYCODE_TAB: 6414e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown if (event.hasNoModifiers()) { 6424e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown performCompletion(); 6434e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown } 644c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell return true; 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.onKeyUp(keyCode, event); 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onKeyDown(int keyCode, KeyEvent event) { 652c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell if (mPopup.onKeyDown(keyCode, event)) { 653c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell return true; 654c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell } 655c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell 656c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell if (!isPopupShowing()) { 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch(keyCode) { 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case KeyEvent.KEYCODE_DPAD_DOWN: 6594e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown if (event.hasNoModifiers()) { 6604e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown performValidation(); 6614e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown } 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastKeyCode = keyCode; 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean handled = super.onKeyDown(keyCode, event); 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastKeyCode = KeyEvent.KEYCODE_UNKNOWN; 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell if (handled && isPopupShowing()) { 670c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project clearListSelection(); 671c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 672c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return handled; 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns <code>true</code> if the amount of text in the field meets 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or exceeds the {@link #getThreshold} requirement. You can override 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this to impose a different standard for when filtering will be 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * triggered. 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean enoughToFilter() { 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "Enough to filter: len=" + getText().length() 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " threshold=" + mThreshold); 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getText().length() >= mThreshold; 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is used to watch for edits to the text view. Note that we call 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to methods on the auto complete text view class so that we can access 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * private vars without going through thunks. 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class MyWatcher implements TextWatcher { 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void afterTextChanged(Editable s) { 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doAfterTextChanged(); 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void beforeTextChanged(CharSequence s, int start, int count, int after) { 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doBeforeTextChanged(); 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onTextChanged(CharSequence s, int start, int before, int count) { 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void doBeforeTextChanged() { 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBlockCompletion) return; 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // when text is changed, inserted or deleted, we attempt to show 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the drop down 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOpenBefore = isPopupShowing(); 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "before text changed: open=" + mOpenBefore); 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void doAfterTextChanged() { 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBlockCompletion) return; 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if the list was open before the keystroke, but closed afterwards, 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // then something in the keystroke processing (an input filter perhaps) 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // called performCompletion() and we shouldn't do any more processing. 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "after text changed: openBefore=" + mOpenBefore 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " open=" + isPopupShowing()); 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOpenBefore && !isPopupShowing()) { 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 725be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne updateList(); 726be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne } 727be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne 728be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne private void updateList() { 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the drop down is shown only when a minimum number of characters 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // was typed in the text view 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (enoughToFilter()) { 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFilter != null) { 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performFiltering(getText(), mLastKeyCode); 734c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell buildImeCompletions(); 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // drop down is automatically dismissed when enough characters 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // are deleted from the text view 739c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell if (!mPopup.isDropDownAlwaysVisible()) dismissDropDown(); 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFilter != null) { 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilter.filter(null); 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Indicates whether the popup menu is showing.</p> 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the popup menu is showing, false otherwise 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isPopupShowing() { 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPopup.isShowing(); 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Converts the selected item from the drop down list into a sequence 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of character that can be used in the edit box.</p> 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param selectedItem the item selected by the user for completion 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a sequence of characters representing the selected suggestion 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected CharSequence convertSelectionToString(Object selectedItem) { 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFilter.convertResultToString(selectedItem); 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Clear the list selection. This may only be temporary, as user input will often bring 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it back. 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clearListSelection() { 772c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.clearListSelection(); 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the position of the dropdown view selection. 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param position The position to move the selector to. 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setListSelection(int position) { 781c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setSelection(position); 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the position of the dropdown view selection, if there is one. Returns 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ListView#INVALID_POSITION ListView.INVALID_POSITION} if there is no dropdown or if 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * there is no selection. 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the position of the current selection, if there is one, or 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ListView#INVALID_POSITION ListView.INVALID_POSITION} if not. 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see ListView#getSelectedItemPosition() 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getListSelection() { 795c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell return mPopup.getSelectedItemPosition(); 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 797ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 798ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project /** 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Starts filtering the content of the drop down list. The filtering 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pattern is the content of the edit box. Subclasses should override this 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method to filter with a different pattern, for instance a substring of 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>text</code>.</p> 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param text the filtering pattern 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param keyCode the last character inserted in the edit box; beware that 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this will be null when text is being added through a soft input method. 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings({ "UnusedDeclaration" }) 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void performFiltering(CharSequence text, int keyCode) { 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilter.filter(text, this); 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Performs the text completion by converting the selected item from 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the drop down list into a string, replacing the text box's content with 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this string and finally dismissing the drop down menu.</p> 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void performCompletion() { 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performCompletion(null, -1, -1); 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onCommitCompletion(CompletionInfo completion) { 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isPopupShowing()) { 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBlockCompletion = true; 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project replaceText(completion.getText()); 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBlockCompletion = false; 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.performItemClick(completion.getPosition()); 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void performCompletion(View selectedView, int position, long id) { 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isPopupShowing()) { 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object selectedItem; 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (position < 0) { 837c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell selectedItem = mPopup.getSelectedItem(); 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project selectedItem = mAdapter.getItem(position); 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (selectedItem == null) { 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "performCompletion: no selected item"); 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBlockCompletion = true; 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project replaceText(convertSelectionToString(selectedItem)); 848be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne mBlockCompletion = false; 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mItemClickListener != null) { 851c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell final ListPopupWindow list = mPopup; 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (selectedView == null || position < 0) { 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project selectedView = list.getSelectedView(); 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project position = list.getSelectedItemPosition(); 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project id = list.getSelectedItemId(); 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 858c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mItemClickListener.onItemClick(list.getListView(), selectedView, position, id); 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 862c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell if (mDropDownDismissedOnCompletion && !mPopup.isDropDownAlwaysVisible()) { 863875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen dismissDropDown(); 864875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Identifies whether the view is currently performing a text completion, so subclasses 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can decide whether to respond to text changed events. 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isPerformingCompletion() { 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBlockCompletion; 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 876875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Like {@link #setText(CharSequence)}, except that it can disable filtering. 877875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 878875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @param filter If <code>false</code>, no filtering will be performed 879875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * as a result of this call. 880875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 881875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @hide Pending API council approval. 882875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 883875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public void setText(CharSequence text, boolean filter) { 884875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen if (filter) { 885875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen setText(text); 886875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } else { 887875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen mBlockCompletion = true; 888875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen setText(text); 889875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen mBlockCompletion = false; 890875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 891875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 8926a67810228d02e75446d55c4c353275c87e9e769Romain Guy 893875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Performs the text completion by replacing the current text by the 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * selected item. Subclasses should override this method to avoid replacing 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the whole content of the edit box.</p> 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param text the selected suggestion in the drop down list 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void replaceText(CharSequence text) { 901c1d2748d442f06a7266be04b9e9c7d20609ad5ccDaisuke Miyakawa clearComposingText(); 902c1d2748d442f06a7266be04b9e9c7d20609ad5ccDaisuke Miyakawa 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setText(text); 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // make sure we keep the caret at the end of the text view 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Editable spannable = getText(); 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Selection.setSelection(spannable, spannable.length()); 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** {@inheritDoc} */ 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onFilterComplete(int count) { 911be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne updateDropDownForFilter(count, true); 9124f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy } 9134f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy 914be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne private void updateDropDownForFilter(int count, boolean forceShow) { 91550145bc883909c4b1533894a2b947eed21312514Bjorn Bringert // Not attached to window, don't update drop-down 91650145bc883909c4b1533894a2b947eed21312514Bjorn Bringert if (getWindowVisibility() == View.GONE) return; 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This checks enoughToFilter() again because filtering requests 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are asynchronous, so the result may come back after enough text 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has since been deleted to make it no longer appropriate 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to filter. 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 925c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell final boolean dropDownAlwaysVisible = mPopup.isDropDownAlwaysVisible(); 926c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell if ((count > 0 || dropDownAlwaysVisible) && enoughToFilter()) { 927be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne if (hasFocus() && hasWindowFocus() && (forceShow || isPopupShowing())) { 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showDropDown(); 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 930c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell } else if (!dropDownAlwaysVisible) { 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissDropDown(); 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onWindowFocusChanged(boolean hasWindowFocus) { 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onWindowFocusChanged(hasWindowFocus); 938c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell if (!hasWindowFocus && !mPopup.isDropDownAlwaysVisible()) { 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissDropDown(); 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 94443c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy protected void onDisplayHint(int hint) { 94543c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy super.onDisplayHint(hint); 94643c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy switch (hint) { 94743c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy case INVISIBLE: 948c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell if (!mPopup.isDropDownAlwaysVisible()) { 94943c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy dismissDropDown(); 95043c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy } 95143c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy break; 95243c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy } 95343c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy } 95443c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy 95543c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy @Override 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onFocusChanged(focused, direction, previouslyFocusedRect); 958280c753ae30502a7ffa3648a2152b2b784327277Evan Millar // Perform validation if the view is losing focus. 959280c753ae30502a7ffa3648a2152b2b784327277Evan Millar if (!focused) { 960280c753ae30502a7ffa3648a2152b2b784327277Evan Millar performValidation(); 961280c753ae30502a7ffa3648a2152b2b784327277Evan Millar } 962c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell if (!focused && !mPopup.isDropDownAlwaysVisible()) { 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissDropDown(); 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onAttachedToWindow() { 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onAttachedToWindow(); 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onDetachedFromWindow() { 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissDropDown(); 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onDetachedFromWindow(); 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Closes the drop down if present on screen.</p> 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dismissDropDown() { 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputMethodManager imm = InputMethodManager.peekInstance(); 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imm != null) { 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imm.displayCompletions(this, null); 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.dismiss(); 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9903e141685003939a9addce21ba2492ea3a8aebee6Romain Guy protected boolean setFrame(final int l, int t, final int r, int b) { 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean result = super.setFrame(l, t, r, b); 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPopup.isShowing()) { 9943e141685003939a9addce21ba2492ea3a8aebee6Romain Guy showDropDown(); 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1001fef8d3e4d8f6f46c098d04b3a57409c947ec1c75Satish Sampath * Issues a runnable to show the dropdown as soon as possible. 10021b1a6e406c4233b309baee85e14f5a563ca63c48Satish Sampath * 1003ffe3ecf2b1ee04288008758c0f60ae22238797c1Mike LeBeau * @hide internal used only by SearchDialog 1004fef8d3e4d8f6f46c098d04b3a57409c947ec1c75Satish Sampath */ 1005fef8d3e4d8f6f46c098d04b3a57409c947ec1c75Satish Sampath public void showDropDownAfterLayout() { 1006c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.postShow(); 1007fef8d3e4d8f6f46c098d04b3a57409c947ec1c75Satish Sampath } 1008ffe3ecf2b1ee04288008758c0f60ae22238797c1Mike LeBeau 1009ffe3ecf2b1ee04288008758c0f60ae22238797c1Mike LeBeau /** 1010ffe3ecf2b1ee04288008758c0f60ae22238797c1Mike LeBeau * Ensures that the drop down is not obscuring the IME. 1011d25eb35b6b80b6f8065ab39b1cf1abb1fd801234Amith Yamasani * @param visible whether the ime should be in front. If false, the ime is pushed to 1012d25eb35b6b80b6f8065ab39b1cf1abb1fd801234Amith Yamasani * the background. 1013ffe3ecf2b1ee04288008758c0f60ae22238797c1Mike LeBeau * @hide internal used only here and SearchDialog 1014ffe3ecf2b1ee04288008758c0f60ae22238797c1Mike LeBeau */ 1015d25eb35b6b80b6f8065ab39b1cf1abb1fd801234Amith Yamasani public void ensureImeVisible(boolean visible) { 1016d25eb35b6b80b6f8065ab39b1cf1abb1fd801234Amith Yamasani mPopup.setInputMethodMode(visible 1017c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell ? ListPopupWindow.INPUT_METHOD_NEEDED : ListPopupWindow.INPUT_METHOD_NOT_NEEDED); 1018ffe3ecf2b1ee04288008758c0f60ae22238797c1Mike LeBeau showDropDown(); 1019ffe3ecf2b1ee04288008758c0f60ae22238797c1Mike LeBeau } 1020fef8d3e4d8f6f46c098d04b3a57409c947ec1c75Satish Sampath 1021fef8d3e4d8f6f46c098d04b3a57409c947ec1c75Satish Sampath /** 1022003ad48380fe90556da408fedba7dfc1a37790b9Bjorn Bringert * @hide internal used only here and SearchDialog 1023003ad48380fe90556da408fedba7dfc1a37790b9Bjorn Bringert */ 1024003ad48380fe90556da408fedba7dfc1a37790b9Bjorn Bringert public boolean isInputMethodNotNeeded() { 1025c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell return mPopup.getInputMethodMode() == ListPopupWindow.INPUT_METHOD_NOT_NEEDED; 1026003ad48380fe90556da408fedba7dfc1a37790b9Bjorn Bringert } 1027003ad48380fe90556da408fedba7dfc1a37790b9Bjorn Bringert 1028003ad48380fe90556da408fedba7dfc1a37790b9Bjorn Bringert /** 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Displays the drop down on screen.</p> 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void showDropDown() { 1032c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell if (mPopup.getAnchorView() == null) { 1033c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell if (mDropDownAnchorId != View.NO_ID) { 1034c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setAnchorView(getRootView().findViewById(mDropDownAnchorId)); 1035e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy } else { 1036c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setAnchorView(this); 1037e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy } 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1039c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.show(); 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1041d4760d77e7e8ab66af0307dcae39e0a8e9d90a14Mike LeBeau 1042d4760d77e7e8ab66af0307dcae39e0a8e9d90a14Mike LeBeau /** 1043d4760d77e7e8ab66af0307dcae39e0a8e9d90a14Mike LeBeau * Forces outside touches to be ignored. Normally if {@link #isDropDownAlwaysVisible()} is 1044d4760d77e7e8ab66af0307dcae39e0a8e9d90a14Mike LeBeau * false, we allow outside touch to dismiss the dropdown. If this is set to true, then we 1045d4760d77e7e8ab66af0307dcae39e0a8e9d90a14Mike LeBeau * ignore outside touch even when the drop down is not set to always visible. 1046d4760d77e7e8ab66af0307dcae39e0a8e9d90a14Mike LeBeau * 1047d4760d77e7e8ab66af0307dcae39e0a8e9d90a14Mike LeBeau * @hide used only by SearchDialog 1048d4760d77e7e8ab66af0307dcae39e0a8e9d90a14Mike LeBeau */ 1049d4760d77e7e8ab66af0307dcae39e0a8e9d90a14Mike LeBeau public void setForceIgnoreOutsideTouch(boolean forceIgnoreOutsideTouch) { 1050c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setForceIgnoreOutsideTouch(forceIgnoreOutsideTouch); 1051d4760d77e7e8ab66af0307dcae39e0a8e9d90a14Mike LeBeau } 1052c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell 1053c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell private void buildImeCompletions() { 10544f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy final ListAdapter adapter = mAdapter; 10554f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy if (adapter != null) { 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputMethodManager imm = InputMethodManager.peekInstance(); 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imm != null) { 10584f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy final int count = Math.min(adapter.getCount(), 20); 10594f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy CompletionInfo[] completions = new CompletionInfo[count]; 10604f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy int realCount = 0; 10614f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy 10624f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy for (int i = 0; i < count; i++) { 10634f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy if (adapter.isEnabled(i)) { 10644f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy realCount++; 10654f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy Object item = adapter.getItem(i); 10664f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy long id = adapter.getItemId(i); 10674f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy completions[i] = new CompletionInfo(id, i, 10684f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy convertSelectionToString(item)); 10694f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy } 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10714f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy 10724f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy if (realCount != count) { 10734f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy CompletionInfo[] tmp = new CompletionInfo[realCount]; 10744f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy System.arraycopy(completions, 0, tmp, 0, realCount); 10754f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy completions = tmp; 10764f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy } 10774f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imm.displayCompletions(this, completions); 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the validator used to perform text validation. 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param validator The validator used to validate the text entered in this widget. 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getValidator() 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #performValidation() 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setValidator(Validator validator) { 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mValidator = validator; 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the Validator set with {@link #setValidator}, 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or <code>null</code> if it was not set. 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setValidator(android.widget.AutoCompleteTextView.Validator) 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #performValidation() 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Validator getValidator() { 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mValidator; 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If a validator was set on this view and the current string is not valid, 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ask the validator to fix it. 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getValidator() 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setValidator(android.widget.AutoCompleteTextView.Validator) 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void performValidation() { 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mValidator == null) return; 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence text = getText(); 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!TextUtils.isEmpty(text) && !mValidator.isValid(text)) { 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setText(mValidator.fixText(text)); 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the Filter obtained from {@link Filterable#getFilter}, 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or <code>null</code> if {@link #setAdapter} was not called with 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a Filterable. 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected Filter getFilter() { 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFilter; 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class DropDownItemClickListener implements AdapterView.OnItemClickListener { 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onItemClick(AdapterView parent, View v, int position, long id) { 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performCompletion(v, position, id); 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This interface is used to make sure that the text entered in this TextView complies to 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a certain format. Since there is no foolproof way to prevent the user from leaving 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this View with an incorrect value in it, all we can do is try to fix it ourselves 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when this happens. 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface Validator { 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Validates the specified text. 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true If the text currently in the text editor is valid. 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #fixText(CharSequence) 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean isValid(CharSequence text); 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Corrects the specified text to make it valid. 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param invalidText A string that doesn't pass validation: isValid(invalidText) 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * returns false 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A string based on invalidText such as invoking isValid() on it returns true. 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isValid(CharSequence) 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence fixText(CharSequence invalidText); 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1166ddf9856c7de043674d9ede006aefc7769879a4b8Mike LeBeau 116798e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen /** 116898e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen * Allows us a private hook into the on click event without preventing users from setting 116998e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen * their own click listener. 117098e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen */ 117198e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen private class PassThroughClickListener implements OnClickListener { 117298e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen 117398e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen private View.OnClickListener mWrapped; 117498e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen 117598e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen /** {@inheritDoc} */ 117698e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen public void onClick(View v) { 117798e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen onClickImpl(); 117898e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen 117998e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen if (mWrapped != null) mWrapped.onClick(v); 118098e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen } 118198e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen } 11826a67810228d02e75446d55c4c353275c87e9e769Romain Guy 11836a67810228d02e75446d55c4c353275c87e9e769Romain Guy private class PopupDataSetObserver extends DataSetObserver { 11846a67810228d02e75446d55c4c353275c87e9e769Romain Guy @Override 11856a67810228d02e75446d55c4c353275c87e9e769Romain Guy public void onChanged() { 1186c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell if (mAdapter != null) { 11874f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy // If the popup is not showing already, showing it will cause 11884f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy // the list of data set observers attached to the adapter to 11894f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy // change. We can't do it from here, because we are in the middle 1190be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne // of iterating through the list of observers. 11914f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy post(new Runnable() { 11924f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy public void run() { 11937254afd4c275dec243d4825f8f68c815ced1342cKenny Root final ListAdapter adapter = mAdapter; 11947254afd4c275dec243d4825f8f68c815ced1342cKenny Root if (adapter != null) { 1195be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne // This will re-layout, thus resetting mDataChanged, so that the 1196be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne // listView click listener stays responsive 1197be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne updateDropDownForFilter(adapter.getCount(), false); 11987254afd4c275dec243d4825f8f68c815ced1342cKenny Root } 11994f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy } 12004f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy }); 12016a67810228d02e75446d55c4c353275c87e9e769Romain Guy } 12026a67810228d02e75446d55c4c353275c87e9e769Romain Guy } 12036a67810228d02e75446d55c4c353275c87e9e769Romain Guy } 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1205