AutoCompleteTextView.java revision c27cc01f6abf8564dc9b7b6cd7f2a12a347f725d
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 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray; 216a67810228d02e75446d55c4c353275c87e9e769Romain Guyimport android.database.DataSetObserver; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.Editable; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.Selection; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextWatcher; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup; 34374aaaed32daa8482d98ec16988b2b51547f035dRomain Guyimport android.view.WindowManager; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.CompletionInfo; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.EditorInfo; 37c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powellimport android.view.inputmethod.InputMethodManager; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39688df79243762923f6cd34f767cb2f690b11a48cGilles Debunneimport com.android.internal.R; 40688df79243762923f6cd34f767cb2f690b11a48cGilles Debunne 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 95348e69cfabec21ccfbe708df06f0a7ea541a3053Adam Powell static final int EXPAND_MAX = 3; 96348e69cfabec21ccfbe708df06f0a7ea541a3053Adam Powell 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private CharSequence mHintText; 98c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell private TextView mHintView; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mHintResource; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ListAdapter mAdapter; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Filter mFilter; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mThreshold; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 105c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell private ListPopupWindow mPopup; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mDropDownAnchorId; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private AdapterView.OnItemClickListener mItemClickListener; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private AdapterView.OnItemSelectedListener mItemSelectedListener; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 111875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen private boolean mDropDownDismissedOnCompletion = true; 112875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mLastKeyCode = KeyEvent.KEYCODE_UNKNOWN; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mOpenBefore; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Validator mValidator = null; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 118be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne // Set to true when text is set directly and no filtering shall be performed 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mBlockCompletion; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1214a74dbc3f2221af99f94b4f514b8291a16ae3661Gilles Debunne // When set, an update in the underlying adapter will update the result list popup. 1224a74dbc3f2221af99f94b4f514b8291a16ae3661Gilles Debunne // Set to false when the list is hidden to prevent asynchronous updates to popup the list again. 1234a74dbc3f2221af99f94b4f514b8291a16ae3661Gilles Debunne private boolean mPopupCanBeUpdated = true; 1244a74dbc3f2221af99f94b4f514b8291a16ae3661Gilles Debunne 1256a67810228d02e75446d55c4c353275c87e9e769Romain Guy private PassThroughClickListener mPassThroughClickListener; 1266a67810228d02e75446d55c4c353275c87e9e769Romain Guy private PopupDataSetObserver mObserver; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AutoCompleteTextView(Context context) { 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, null); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AutoCompleteTextView(Context context, AttributeSet attrs) { 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, attrs, com.android.internal.R.attr.autoCompleteTextViewStyle); 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AutoCompleteTextView(Context context, AttributeSet attrs, int defStyle) { 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs, defStyle); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 139c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup = new ListPopupWindow(context, attrs, 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.attr.autoCompleteTextViewStyle); 141374aaaed32daa8482d98ec16988b2b51547f035dRomain Guy mPopup.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); 142c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setPromptPosition(ListPopupWindow.POSITION_PROMPT_BELOW); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project context.obtainStyledAttributes( 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attrs, com.android.internal.R.styleable.AutoCompleteTextView, defStyle, 0); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mThreshold = a.getInt( 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.styleable.AutoCompleteTextView_completionThreshold, 2); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 151c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setListSelector(a.getDrawable(R.styleable.AutoCompleteTextView_dropDownSelector)); 152c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setVerticalOffset((int) 153c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell a.getDimension(R.styleable.AutoCompleteTextView_dropDownVerticalOffset, 0.0f)); 154c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setHorizontalOffset((int) 155c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell a.getDimension(R.styleable.AutoCompleteTextView_dropDownHorizontalOffset, 0.0f)); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get the anchor's id now, but the view won't be ready, so wait to actually get the 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // view and store it in mDropDownAnchorView lazily in getDropDownAnchorView later. 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Defaults to NO_ID, in which case the getDropDownAnchorView method will simply return 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this TextView, as a default anchoring point. 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownAnchorId = a.getResourceId(R.styleable.AutoCompleteTextView_dropDownAnchor, 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View.NO_ID); 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 164980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy // For dropdown width, the developer can specify a specific width, or MATCH_PARENT 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // (for full screen width) or WRAP_CONTENT (to match the width of the anchored view). 166c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setWidth(a.getLayoutDimension( 167c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell R.styleable.AutoCompleteTextView_dropDownWidth, 168c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell ViewGroup.LayoutParams.WRAP_CONTENT)); 169c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setHeight(a.getLayoutDimension( 170c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell R.styleable.AutoCompleteTextView_dropDownHeight, 171c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell ViewGroup.LayoutParams.WRAP_CONTENT)); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHintResource = a.getResourceId(R.styleable.AutoCompleteTextView_completionHintView, 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.layout.simple_dropdown_hint); 175c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell 176c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setOnItemClickListener(new DropDownItemClickListener()); 177c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell setCompletionHint(a.getText(R.styleable.AutoCompleteTextView_completionHint)); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Always turn on the auto complete input type flag, since it 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // makes no sense to use this widget without it. 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int inputType = getInputType(); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((inputType&EditorInfo.TYPE_MASK_CLASS) 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project == EditorInfo.TYPE_CLASS_TEXT) { 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inputType |= EditorInfo.TYPE_TEXT_FLAG_AUTO_COMPLETE; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setRawInputType(inputType); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setFocusable(true); 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addTextChangedListener(new MyWatcher()); 193ddf9856c7de043674d9ede006aefc7769879a4b8Mike LeBeau 19498e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen mPassThroughClickListener = new PassThroughClickListener(); 19598e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen super.setOnClickListener(mPassThroughClickListener); 19698e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen } 19798e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen 19898e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen @Override 19998e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen public void setOnClickListener(OnClickListener listener) { 20098e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen mPassThroughClickListener.mWrapped = listener; 20198e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen } 20298e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen 20398e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen /** 20498e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen * Private hook into the on click event, dispatched from {@link PassThroughClickListener} 20598e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen */ 20698e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen private void onClickImpl() { 207d25eb35b6b80b6f8065ab39b1cf1abb1fd801234Amith Yamasani // If the dropdown is showing, bring the keyboard to the front 208d25eb35b6b80b6f8065ab39b1cf1abb1fd801234Amith Yamasani // when the user touches the text field. 209711734a2f8d7529df0ed1bce36da651fc835c144Gilles Debunne if (isPopupShowing()) { 210d25eb35b6b80b6f8065ab39b1cf1abb1fd801234Amith Yamasani ensureImeVisible(true); 21198e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen } 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the optional hint text that is displayed at the bottom of the 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the matching list. This can be used as a cue to the user on how to 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * best use the list, or to provide extra information.</p> 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param hint the text to be displayed to the user 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_completionHint 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setCompletionHint(CharSequence hint) { 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHintText = hint; 225c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell if (hint != null) { 226c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell if (mHintView == null) { 227c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell final TextView hintView = (TextView) LayoutInflater.from(getContext()).inflate( 228c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mHintResource, null).findViewById(com.android.internal.R.id.text1); 229c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell hintView.setText(mHintText); 230c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mHintView = hintView; 231c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setPromptView(hintView); 232c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell } else { 233c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mHintView.setText(hint); 234c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell } 235c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell } else { 236c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setPromptView(null); 237c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mHintView = null; 238c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell } 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the current width for the auto-complete drop down list. This can 243980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * be a fixed width, or {@link ViewGroup.LayoutParams#MATCH_PARENT} to fill the screen, or 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ViewGroup.LayoutParams#WRAP_CONTENT} to fit the width of its anchor view.</p> 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the width for the drop down list 2477b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 2487b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_dropDownWidth 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getDropDownWidth() { 251c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell return mPopup.getWidth(); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the current width for the auto-complete drop down list. This can 256980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * be a fixed width, or {@link ViewGroup.LayoutParams#MATCH_PARENT} to fill the screen, or 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ViewGroup.LayoutParams#WRAP_CONTENT} to fit the width of its anchor view.</p> 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param width the width to use 2607b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 2617b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_dropDownWidth 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDropDownWidth(int width) { 264c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setWidth(width); 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 266e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy 267e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy /** 268e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * <p>Returns the current height for the auto-complete drop down list. This can 269980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * be a fixed height, or {@link ViewGroup.LayoutParams#MATCH_PARENT} to fill 270e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * the screen, or {@link ViewGroup.LayoutParams#WRAP_CONTENT} to fit the height 271e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * of the drop down's content.</p> 272e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * 273e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * @return the height for the drop down list 274e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * 275e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * @attr ref android.R.styleable#AutoCompleteTextView_dropDownHeight 276e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy */ 277e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy public int getDropDownHeight() { 278c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell return mPopup.getHeight(); 279e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy } 280e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy 281e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy /** 282e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * <p>Sets the current height for the auto-complete drop down list. This can 283980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * be a fixed height, or {@link ViewGroup.LayoutParams#MATCH_PARENT} to fill 284e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * the screen, or {@link ViewGroup.LayoutParams#WRAP_CONTENT} to fit the height 285e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * of the drop down's content.</p> 286e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * 287e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * @param height the height to use 288e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * 289e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * @attr ref android.R.styleable#AutoCompleteTextView_dropDownHeight 290e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy */ 291e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy public void setDropDownHeight(int height) { 292c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setHeight(height); 293e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy } 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the id for the view that the auto-complete drop down list is anchored to.</p> 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the view's id, or {@link View#NO_ID} if none specified 2997b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3007b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_dropDownAnchor 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getDropDownAnchor() { 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDropDownAnchorId; 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the view to which the auto-complete drop down list should anchor. The view 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * corresponding to this id will not be loaded until the next time it is needed to avoid 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * loading a view which is not yet instantiated.</p> 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id the id to anchor the drop down list view to 3127b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3137b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_dropDownAnchor 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDropDownAnchor(int id) { 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownAnchorId = id; 317c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setAnchorView(null); 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3197b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 3207b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /** 3217b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * <p>Gets the background of the auto-complete drop-down list.</p> 3227b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3237b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @return the background drawable 3247b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3257b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @attr ref android.R.styleable#PopupWindow_popupBackground 3267b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 3277b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public Drawable getDropDownBackground() { 3287b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project return mPopup.getBackground(); 3297b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 3307b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 3317b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /** 3327b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * <p>Sets the background of the auto-complete drop-down list.</p> 3337b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3347b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @param d the drawable to set as the background 3357b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3367b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @attr ref android.R.styleable#PopupWindow_popupBackground 3377b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 3387b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public void setDropDownBackgroundDrawable(Drawable d) { 3397b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project mPopup.setBackgroundDrawable(d); 3407b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 3417b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 3427b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /** 3437b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * <p>Sets the background of the auto-complete drop-down list.</p> 3447b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3457b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @param id the id of the drawable to set as the background 3467b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3477b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @attr ref android.R.styleable#PopupWindow_popupBackground 3487b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 3497b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public void setDropDownBackgroundResource(int id) { 3507b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project mPopup.setBackgroundDrawable(getResources().getDrawable(id)); 3517b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 3527b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 3537b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /** 3547b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * <p>Sets the vertical offset used for the auto-complete drop-down list.</p> 3557b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3567b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @param offset the vertical offset 3577b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 3587b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public void setDropDownVerticalOffset(int offset) { 359c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setVerticalOffset(offset); 3607b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 3617b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 3627b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /** 3637b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * <p>Gets the vertical offset used for the auto-complete drop-down list.</p> 3647b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3657b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @return the vertical offset 3667b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 3677b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public int getDropDownVerticalOffset() { 368c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell return mPopup.getVerticalOffset(); 3697b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 3707b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 3717b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /** 3727b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * <p>Sets the horizontal offset used for the auto-complete drop-down list.</p> 3737b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3747b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @param offset the horizontal offset 3757b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 3767b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public void setDropDownHorizontalOffset(int offset) { 377c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setHorizontalOffset(offset); 3787b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 3797b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 3807b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /** 3817b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * <p>Gets the horizontal offset used for the auto-complete drop-down list.</p> 3827b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3837b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @return the horizontal offset 3847b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 3857b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public int getDropDownHorizontalOffset() { 386c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell return mPopup.getHorizontalOffset(); 3877b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 3888f080ec4292be02fad9896260bbd3cf5461f9399The Android Open Source Project 389bff1389c9ab4442a6e278cf84ce37eadad21a9a1The Android Open Source Project /** 390875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <p>Sets the animation style of the auto-complete drop-down list.</p> 391875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 392875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <p>If the drop-down is showing, calling this method will take effect only 393875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * the next time the drop-down is shown.</p> 394875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 395875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @param animationStyle animation style to use when the drop-down appears 396875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * and disappears. Set to -1 for the default animation, 0 for no 397875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * animation, or a resource identifier for an explicit animation. 398875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 399875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @hide Pending API council approval 400875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 401875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public void setDropDownAnimationStyle(int animationStyle) { 402875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen mPopup.setAnimationStyle(animationStyle); 403875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 406875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <p>Returns the animation style that is used when the drop-down list appears and disappears 407875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * </p> 408875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 409875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @return the animation style that is used when the drop-down list appears and disappears 410875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 411875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @hide Pending API council approval 412875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 413875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public int getDropDownAnimationStyle() { 414875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen return mPopup.getAnimationStyle(); 415875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 416875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 417875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 418875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @return Whether the drop-down is visible as long as there is {@link #enoughToFilter()} 419875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 420875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @hide Pending API council approval 421875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 422875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public boolean isDropDownAlwaysVisible() { 423c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell return mPopup.isDropDownAlwaysVisible(); 424875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 425875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 426875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 427875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Sets whether the drop-down should remain visible as long as there is there is 428875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * {@link #enoughToFilter()}. This is useful if an unknown number of results are expected 429875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * to show up in the adapter sometime in the future. 430875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 431875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * The drop-down will occupy the entire screen below {@link #getDropDownAnchor} regardless 432875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * of the size or content of the list. {@link #getDropDownBackground()} will fill any space 433875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * that is not used by the list. 434875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 435875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @param dropDownAlwaysVisible Whether to keep the drop-down visible. 436875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 437875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @hide Pending API council approval 438875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 439875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public void setDropDownAlwaysVisible(boolean dropDownAlwaysVisible) { 440c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setDropDownAlwaysVisible(dropDownAlwaysVisible); 441875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 442875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 443875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 444875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Checks whether the drop-down is dismissed when a suggestion is clicked. 445875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 446875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @hide Pending API council approval 447875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 448875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public boolean isDropDownDismissedOnCompletion() { 449875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen return mDropDownDismissedOnCompletion; 450875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 4516a67810228d02e75446d55c4c353275c87e9e769Romain Guy 452875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 453875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Sets whether the drop-down is dismissed when a suggestion is clicked. This is 454875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * true by default. 455875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 456875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @param dropDownDismissedOnCompletion Whether to dismiss the drop-down. 457875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 458875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @hide Pending API council approval 459875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 460875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public void setDropDownDismissedOnCompletion(boolean dropDownDismissedOnCompletion) { 461875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen mDropDownDismissedOnCompletion = dropDownDismissedOnCompletion; 462875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 463875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the number of characters the user must type before the drop 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * down list is shown.</p> 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the minimum number of characters to type to show the drop down 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setThreshold(int) 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getThreshold() { 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mThreshold; 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Specifies the minimum number of characters the user has to type in the 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * edit box before the drop down list is shown.</p> 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>When <code>threshold</code> is less than or equals 0, a threshold of 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1 is applied.</p> 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param threshold the number of characters to type before the drop down 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is shown 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getThreshold() 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_completionThreshold 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setThreshold(int threshold) { 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (threshold <= 0) { 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project threshold = 1; 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mThreshold = threshold; 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the listener that will be notified when the user clicks an item 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the drop down list.</p> 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param l the item click listener 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnItemClickListener(AdapterView.OnItemClickListener l) { 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mItemClickListener = l; 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the listener that will be notified when the user selects an item 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the drop down list.</p> 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param l the item selected listener 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnItemSelectedListener(AdapterView.OnItemSelectedListener l) { 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mItemSelectedListener = l; 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the listener that is notified whenever the user clicks an item 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the drop down list.</p> 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the item click listener 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @deprecated Use {@link #getOnItemClickListener()} intead 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Deprecated 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AdapterView.OnItemClickListener getItemClickListener() { 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mItemClickListener; 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the listener that is notified whenever the user selects an 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * item in the drop down list.</p> 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the item selected listener 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @deprecated Use {@link #getOnItemSelectedListener()} intead 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Deprecated 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AdapterView.OnItemSelectedListener getItemSelectedListener() { 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mItemSelectedListener; 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the listener that is notified whenever the user clicks an item 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the drop down list.</p> 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the item click listener 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AdapterView.OnItemClickListener getOnItemClickListener() { 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mItemClickListener; 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the listener that is notified whenever the user selects an 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * item in the drop down list.</p> 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the item selected listener 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AdapterView.OnItemSelectedListener getOnItemSelectedListener() { 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mItemSelectedListener; 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns a filterable list adapter used for auto completion.</p> 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a data adapter used for auto completion 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ListAdapter getAdapter() { 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAdapter; 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Changes the list of data used for auto completion. The provided list 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * must be a filterable list adapter.</p> 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The caller is still responsible for managing any resources used by the adapter. 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Notably, when the AutoCompleteTextView is closed or released, the adapter is not notified. 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A common case is the use of {@link android.widget.CursorAdapter}, which 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * contains a {@link android.database.Cursor} that must be closed. This can be done 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * automatically (see 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#startManagingCursor(android.database.Cursor) 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * startManagingCursor()}), 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or by manually closing the cursor when the AutoCompleteTextView is dismissed.</p> 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param adapter the adapter holding the auto completion data 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getAdapter() 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.widget.Filterable 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.widget.ListAdapter 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public <T extends ListAdapter & Filterable> void setAdapter(T adapter) { 5936a67810228d02e75446d55c4c353275c87e9e769Romain Guy if (mObserver == null) { 5946a67810228d02e75446d55c4c353275c87e9e769Romain Guy mObserver = new PopupDataSetObserver(); 5956a67810228d02e75446d55c4c353275c87e9e769Romain Guy } else if (mAdapter != null) { 5966a67810228d02e75446d55c4c353275c87e9e769Romain Guy mAdapter.unregisterDataSetObserver(mObserver); 5976a67810228d02e75446d55c4c353275c87e9e769Romain Guy } 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAdapter = adapter; 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAdapter != null) { 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //noinspection unchecked 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilter = ((Filterable) mAdapter).getFilter(); 6026a67810228d02e75446d55c4c353275c87e9e769Romain Guy adapter.registerDataSetObserver(mObserver); 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilter = null; 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 607c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setAdapter(mAdapter); 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onKeyPreIme(int keyCode, KeyEvent event) { 6128d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn if (keyCode == KeyEvent.KEYCODE_BACK && isPopupShowing() 613c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell && !mPopup.isDropDownAlwaysVisible()) { 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // special case for the back key, we do not even try to send it 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to the drop down list but instead, consume it immediately 6162beee4d11084f7b96dda6e335da0ebc08214dfb7Romain Guy if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) { 617b3ea92235c9ccc1ff295839a8f324dcd1c83dd6fJeff Brown KeyEvent.DispatcherState state = getKeyDispatcherState(); 618b3ea92235c9ccc1ff295839a8f324dcd1c83dd6fJeff Brown if (state != null) { 619b3ea92235c9ccc1ff295839a8f324dcd1c83dd6fJeff Brown state.startTracking(event, this); 620b3ea92235c9ccc1ff295839a8f324dcd1c83dd6fJeff Brown } 6218d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn return true; 6224eb3efc8b270d2569fd813546f85add92e7f0ab0Bjorn Bringert } else if (event.getAction() == KeyEvent.ACTION_UP) { 623b3ea92235c9ccc1ff295839a8f324dcd1c83dd6fJeff Brown KeyEvent.DispatcherState state = getKeyDispatcherState(); 624b3ea92235c9ccc1ff295839a8f324dcd1c83dd6fJeff Brown if (state != null) { 625b3ea92235c9ccc1ff295839a8f324dcd1c83dd6fJeff Brown state.handleUpEvent(event); 626b3ea92235c9ccc1ff295839a8f324dcd1c83dd6fJeff Brown } 6274eb3efc8b270d2569fd813546f85add92e7f0ab0Bjorn Bringert if (event.isTracking() && !event.isCanceled()) { 6284eb3efc8b270d2569fd813546f85add92e7f0ab0Bjorn Bringert dismissDropDown(); 6294eb3efc8b270d2569fd813546f85add92e7f0ab0Bjorn Bringert return true; 6304eb3efc8b270d2569fd813546f85add92e7f0ab0Bjorn Bringert } 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.onKeyPreIme(keyCode, event); 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onKeyUp(int keyCode, KeyEvent event) { 638c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell boolean consumed = mPopup.onKeyUp(keyCode, event); 639c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell if (consumed) { 640c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell switch (keyCode) { 641c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell // if the list accepts the key events and the key event 642c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell // was a click, the text view gets the selected item 643c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell // from the drop down as its content 644c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell case KeyEvent.KEYCODE_ENTER: 645c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell case KeyEvent.KEYCODE_DPAD_CENTER: 6464e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown case KeyEvent.KEYCODE_TAB: 6474e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown if (event.hasNoModifiers()) { 6484e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown performCompletion(); 6494e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown } 650c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell return true; 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 653a4a5758b5f51834f7555ec909e8188c432fc5dc4Gilles Debunne 654a4a5758b5f51834f7555ec909e8188c432fc5dc4Gilles Debunne if (isPopupShowing() && keyCode == KeyEvent.KEYCODE_TAB && event.hasNoModifiers()) { 655a4a5758b5f51834f7555ec909e8188c432fc5dc4Gilles Debunne performCompletion(); 656a4a5758b5f51834f7555ec909e8188c432fc5dc4Gilles Debunne return true; 657a4a5758b5f51834f7555ec909e8188c432fc5dc4Gilles Debunne } 658a4a5758b5f51834f7555ec909e8188c432fc5dc4Gilles Debunne 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.onKeyUp(keyCode, event); 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onKeyDown(int keyCode, KeyEvent event) { 664c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell if (mPopup.onKeyDown(keyCode, event)) { 665c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell return true; 666c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell } 667c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell 668c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell if (!isPopupShowing()) { 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch(keyCode) { 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case KeyEvent.KEYCODE_DPAD_DOWN: 6714e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown if (event.hasNoModifiers()) { 6724e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown performValidation(); 6734e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown } 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 677a4a5758b5f51834f7555ec909e8188c432fc5dc4Gilles Debunne if (isPopupShowing() && keyCode == KeyEvent.KEYCODE_TAB && event.hasNoModifiers()) { 678a4a5758b5f51834f7555ec909e8188c432fc5dc4Gilles Debunne return true; 679a4a5758b5f51834f7555ec909e8188c432fc5dc4Gilles Debunne } 680a4a5758b5f51834f7555ec909e8188c432fc5dc4Gilles Debunne 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastKeyCode = keyCode; 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean handled = super.onKeyDown(keyCode, event); 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastKeyCode = KeyEvent.KEYCODE_UNKNOWN; 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 685c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell if (handled && isPopupShowing()) { 686c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project clearListSelection(); 687c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 688c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return handled; 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns <code>true</code> if the amount of text in the field meets 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or exceeds the {@link #getThreshold} requirement. You can override 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this to impose a different standard for when filtering will be 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * triggered. 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean enoughToFilter() { 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "Enough to filter: len=" + getText().length() 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " threshold=" + mThreshold); 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getText().length() >= mThreshold; 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is used to watch for edits to the text view. Note that we call 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to methods on the auto complete text view class so that we can access 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * private vars without going through thunks. 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class MyWatcher implements TextWatcher { 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void afterTextChanged(Editable s) { 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doAfterTextChanged(); 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void beforeTextChanged(CharSequence s, int start, int count, int after) { 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doBeforeTextChanged(); 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onTextChanged(CharSequence s, int start, int before, int count) { 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void doBeforeTextChanged() { 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBlockCompletion) return; 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // when text is changed, inserted or deleted, we attempt to show 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the drop down 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOpenBefore = isPopupShowing(); 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "before text changed: open=" + mOpenBefore); 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void doAfterTextChanged() { 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBlockCompletion) return; 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if the list was open before the keystroke, but closed afterwards, 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // then something in the keystroke processing (an input filter perhaps) 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // called performCompletion() and we shouldn't do any more processing. 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "after text changed: openBefore=" + mOpenBefore 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " open=" + isPopupShowing()); 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOpenBefore && !isPopupShowing()) { 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the drop down is shown only when a minimum number of characters 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // was typed in the text view 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (enoughToFilter()) { 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFilter != null) { 7454a74dbc3f2221af99f94b4f514b8291a16ae3661Gilles Debunne mPopupCanBeUpdated = true; 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performFiltering(getText(), mLastKeyCode); 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // drop down is automatically dismissed when enough characters 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // are deleted from the text view 7514a74dbc3f2221af99f94b4f514b8291a16ae3661Gilles Debunne if (!mPopup.isDropDownAlwaysVisible()) { 7524a74dbc3f2221af99f94b4f514b8291a16ae3661Gilles Debunne dismissDropDown(); 7534a74dbc3f2221af99f94b4f514b8291a16ae3661Gilles Debunne } 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFilter != null) { 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilter.filter(null); 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Indicates whether the popup menu is showing.</p> 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the popup menu is showing, false otherwise 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isPopupShowing() { 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPopup.isShowing(); 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Converts the selected item from the drop down list into a sequence 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of character that can be used in the edit box.</p> 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param selectedItem the item selected by the user for completion 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a sequence of characters representing the selected suggestion 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected CharSequence convertSelectionToString(Object selectedItem) { 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFilter.convertResultToString(selectedItem); 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Clear the list selection. This may only be temporary, as user input will often bring 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it back. 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clearListSelection() { 786c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.clearListSelection(); 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the position of the dropdown view selection. 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param position The position to move the selector to. 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setListSelection(int position) { 795c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setSelection(position); 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the position of the dropdown view selection, if there is one. Returns 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ListView#INVALID_POSITION ListView.INVALID_POSITION} if there is no dropdown or if 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * there is no selection. 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the position of the current selection, if there is one, or 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ListView#INVALID_POSITION ListView.INVALID_POSITION} if not. 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see ListView#getSelectedItemPosition() 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getListSelection() { 809c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell return mPopup.getSelectedItemPosition(); 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 811ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 812ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project /** 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Starts filtering the content of the drop down list. The filtering 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pattern is the content of the edit box. Subclasses should override this 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method to filter with a different pattern, for instance a substring of 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>text</code>.</p> 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param text the filtering pattern 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param keyCode the last character inserted in the edit box; beware that 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this will be null when text is being added through a soft input method. 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings({ "UnusedDeclaration" }) 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void performFiltering(CharSequence text, int keyCode) { 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilter.filter(text, this); 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Performs the text completion by converting the selected item from 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the drop down list into a string, replacing the text box's content with 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this string and finally dismissing the drop down menu.</p> 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void performCompletion() { 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performCompletion(null, -1, -1); 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onCommitCompletion(CompletionInfo completion) { 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isPopupShowing()) { 839c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.performItemClick(completion.getPosition()); 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void performCompletion(View selectedView, int position, long id) { 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isPopupShowing()) { 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object selectedItem; 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (position < 0) { 847c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell selectedItem = mPopup.getSelectedItem(); 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project selectedItem = mAdapter.getItem(position); 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (selectedItem == null) { 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "performCompletion: no selected item"); 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBlockCompletion = true; 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project replaceText(convertSelectionToString(selectedItem)); 858be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne mBlockCompletion = false; 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mItemClickListener != null) { 861c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell final ListPopupWindow list = mPopup; 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (selectedView == null || position < 0) { 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project selectedView = list.getSelectedView(); 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project position = list.getSelectedItemPosition(); 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project id = list.getSelectedItemId(); 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 868c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mItemClickListener.onItemClick(list.getListView(), selectedView, position, id); 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 872c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell if (mDropDownDismissedOnCompletion && !mPopup.isDropDownAlwaysVisible()) { 873875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen dismissDropDown(); 874875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Identifies whether the view is currently performing a text completion, so subclasses 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can decide whether to respond to text changed events. 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isPerformingCompletion() { 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBlockCompletion; 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 886875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Like {@link #setText(CharSequence)}, except that it can disable filtering. 887875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 888875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @param filter If <code>false</code>, no filtering will be performed 889875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * as a result of this call. 890875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 891875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @hide Pending API council approval. 892875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 893875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public void setText(CharSequence text, boolean filter) { 894875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen if (filter) { 895875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen setText(text); 896875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } else { 897875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen mBlockCompletion = true; 898875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen setText(text); 899875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen mBlockCompletion = false; 900875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 901875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 9026a67810228d02e75446d55c4c353275c87e9e769Romain Guy 903875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Performs the text completion by replacing the current text by the 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * selected item. Subclasses should override this method to avoid replacing 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the whole content of the edit box.</p> 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param text the selected suggestion in the drop down list 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void replaceText(CharSequence text) { 911c1d2748d442f06a7266be04b9e9c7d20609ad5ccDaisuke Miyakawa clearComposingText(); 912c1d2748d442f06a7266be04b9e9c7d20609ad5ccDaisuke Miyakawa 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setText(text); 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // make sure we keep the caret at the end of the text view 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Editable spannable = getText(); 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Selection.setSelection(spannable, spannable.length()); 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** {@inheritDoc} */ 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onFilterComplete(int count) { 9214a74dbc3f2221af99f94b4f514b8291a16ae3661Gilles Debunne updateDropDownForFilter(count); 9224f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy } 9234f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy 9244a74dbc3f2221af99f94b4f514b8291a16ae3661Gilles Debunne private void updateDropDownForFilter(int count) { 92550145bc883909c4b1533894a2b947eed21312514Bjorn Bringert // Not attached to window, don't update drop-down 92650145bc883909c4b1533894a2b947eed21312514Bjorn Bringert if (getWindowVisibility() == View.GONE) return; 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This checks enoughToFilter() again because filtering requests 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are asynchronous, so the result may come back after enough text 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has since been deleted to make it no longer appropriate 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to filter. 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 935c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell final boolean dropDownAlwaysVisible = mPopup.isDropDownAlwaysVisible(); 936d513e9746f09611db6478e368207ac7b112a253dGilles Debunne final boolean enoughToFilter = enoughToFilter(); 937d513e9746f09611db6478e368207ac7b112a253dGilles Debunne if ((count > 0 || dropDownAlwaysVisible) && enoughToFilter) { 9384a74dbc3f2221af99f94b4f514b8291a16ae3661Gilles Debunne if (hasFocus() && hasWindowFocus() && mPopupCanBeUpdated) { 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showDropDown(); 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9414a74dbc3f2221af99f94b4f514b8291a16ae3661Gilles Debunne } else if (!dropDownAlwaysVisible && isPopupShowing()) { 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissDropDown(); 9434a74dbc3f2221af99f94b4f514b8291a16ae3661Gilles Debunne // When the filter text is changed, the first update from the adapter may show an empty 9444a74dbc3f2221af99f94b4f514b8291a16ae3661Gilles Debunne // count (when the query is being performed on the network). Future updates when some 9454a74dbc3f2221af99f94b4f514b8291a16ae3661Gilles Debunne // content has been retrieved should still be able to update the list. 9464a74dbc3f2221af99f94b4f514b8291a16ae3661Gilles Debunne mPopupCanBeUpdated = true; 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onWindowFocusChanged(boolean hasWindowFocus) { 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onWindowFocusChanged(hasWindowFocus); 953c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell if (!hasWindowFocus && !mPopup.isDropDownAlwaysVisible()) { 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissDropDown(); 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 95943c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy protected void onDisplayHint(int hint) { 96043c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy super.onDisplayHint(hint); 96143c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy switch (hint) { 96243c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy case INVISIBLE: 963c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell if (!mPopup.isDropDownAlwaysVisible()) { 96443c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy dismissDropDown(); 96543c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy } 96643c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy break; 96743c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy } 96843c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy } 96943c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy 97043c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy @Override 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onFocusChanged(focused, direction, previouslyFocusedRect); 973280c753ae30502a7ffa3648a2152b2b784327277Evan Millar // Perform validation if the view is losing focus. 974280c753ae30502a7ffa3648a2152b2b784327277Evan Millar if (!focused) { 975280c753ae30502a7ffa3648a2152b2b784327277Evan Millar performValidation(); 976280c753ae30502a7ffa3648a2152b2b784327277Evan Millar } 977c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell if (!focused && !mPopup.isDropDownAlwaysVisible()) { 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissDropDown(); 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onAttachedToWindow() { 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onAttachedToWindow(); 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onDetachedFromWindow() { 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissDropDown(); 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onDetachedFromWindow(); 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Closes the drop down if present on screen.</p> 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dismissDropDown() { 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputMethodManager imm = InputMethodManager.peekInstance(); 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imm != null) { 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imm.displayCompletions(this, null); 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.dismiss(); 10024a74dbc3f2221af99f94b4f514b8291a16ae3661Gilles Debunne mPopupCanBeUpdated = false; 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10063e141685003939a9addce21ba2492ea3a8aebee6Romain Guy protected boolean setFrame(final int l, int t, final int r, int b) { 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean result = super.setFrame(l, t, r, b); 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1009711734a2f8d7529df0ed1bce36da651fc835c144Gilles Debunne if (isPopupShowing()) { 10103e141685003939a9addce21ba2492ea3a8aebee6Romain Guy showDropDown(); 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1017fef8d3e4d8f6f46c098d04b3a57409c947ec1c75Satish Sampath * Issues a runnable to show the dropdown as soon as possible. 10181b1a6e406c4233b309baee85e14f5a563ca63c48Satish Sampath * 1019ffe3ecf2b1ee04288008758c0f60ae22238797c1Mike LeBeau * @hide internal used only by SearchDialog 1020fef8d3e4d8f6f46c098d04b3a57409c947ec1c75Satish Sampath */ 1021fef8d3e4d8f6f46c098d04b3a57409c947ec1c75Satish Sampath public void showDropDownAfterLayout() { 1022c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.postShow(); 1023fef8d3e4d8f6f46c098d04b3a57409c947ec1c75Satish Sampath } 1024ffe3ecf2b1ee04288008758c0f60ae22238797c1Mike LeBeau 1025ffe3ecf2b1ee04288008758c0f60ae22238797c1Mike LeBeau /** 1026ffe3ecf2b1ee04288008758c0f60ae22238797c1Mike LeBeau * Ensures that the drop down is not obscuring the IME. 1027d25eb35b6b80b6f8065ab39b1cf1abb1fd801234Amith Yamasani * @param visible whether the ime should be in front. If false, the ime is pushed to 1028d25eb35b6b80b6f8065ab39b1cf1abb1fd801234Amith Yamasani * the background. 1029ffe3ecf2b1ee04288008758c0f60ae22238797c1Mike LeBeau * @hide internal used only here and SearchDialog 1030ffe3ecf2b1ee04288008758c0f60ae22238797c1Mike LeBeau */ 1031d25eb35b6b80b6f8065ab39b1cf1abb1fd801234Amith Yamasani public void ensureImeVisible(boolean visible) { 1032d25eb35b6b80b6f8065ab39b1cf1abb1fd801234Amith Yamasani mPopup.setInputMethodMode(visible 1033c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell ? ListPopupWindow.INPUT_METHOD_NEEDED : ListPopupWindow.INPUT_METHOD_NOT_NEEDED); 1034c27cc01f6abf8564dc9b7b6cd7f2a12a347f725dRomain Guy if (mPopup.isDropDownAlwaysVisible() || (mFilter != null && enoughToFilter())) { 1035c27cc01f6abf8564dc9b7b6cd7f2a12a347f725dRomain Guy showDropDown(); 1036c27cc01f6abf8564dc9b7b6cd7f2a12a347f725dRomain Guy } 1037ffe3ecf2b1ee04288008758c0f60ae22238797c1Mike LeBeau } 1038fef8d3e4d8f6f46c098d04b3a57409c947ec1c75Satish Sampath 1039fef8d3e4d8f6f46c098d04b3a57409c947ec1c75Satish Sampath /** 1040003ad48380fe90556da408fedba7dfc1a37790b9Bjorn Bringert * @hide internal used only here and SearchDialog 1041003ad48380fe90556da408fedba7dfc1a37790b9Bjorn Bringert */ 1042003ad48380fe90556da408fedba7dfc1a37790b9Bjorn Bringert public boolean isInputMethodNotNeeded() { 1043c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell return mPopup.getInputMethodMode() == ListPopupWindow.INPUT_METHOD_NOT_NEEDED; 1044003ad48380fe90556da408fedba7dfc1a37790b9Bjorn Bringert } 1045003ad48380fe90556da408fedba7dfc1a37790b9Bjorn Bringert 1046003ad48380fe90556da408fedba7dfc1a37790b9Bjorn Bringert /** 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Displays the drop down on screen.</p> 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void showDropDown() { 1050d513e9746f09611db6478e368207ac7b112a253dGilles Debunne buildImeCompletions(); 1051d513e9746f09611db6478e368207ac7b112a253dGilles Debunne 1052c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell if (mPopup.getAnchorView() == null) { 1053c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell if (mDropDownAnchorId != View.NO_ID) { 1054c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setAnchorView(getRootView().findViewById(mDropDownAnchorId)); 1055e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy } else { 1056c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setAnchorView(this); 1057e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy } 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1059711734a2f8d7529df0ed1bce36da651fc835c144Gilles Debunne if (!isPopupShowing()) { 1060711734a2f8d7529df0ed1bce36da651fc835c144Gilles Debunne // Make sure the list does not obscure the IME when shown for the first time. 1061711734a2f8d7529df0ed1bce36da651fc835c144Gilles Debunne mPopup.setInputMethodMode(ListPopupWindow.INPUT_METHOD_NEEDED); 1062348e69cfabec21ccfbe708df06f0a7ea541a3053Adam Powell mPopup.setListItemExpandMax(EXPAND_MAX); 1063711734a2f8d7529df0ed1bce36da651fc835c144Gilles Debunne } 1064c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.show(); 1065348e69cfabec21ccfbe708df06f0a7ea541a3053Adam Powell mPopup.getListView().setOverScrollMode(View.OVER_SCROLL_ALWAYS); 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1067d513e9746f09611db6478e368207ac7b112a253dGilles Debunne 1068d4760d77e7e8ab66af0307dcae39e0a8e9d90a14Mike LeBeau /** 1069d4760d77e7e8ab66af0307dcae39e0a8e9d90a14Mike LeBeau * Forces outside touches to be ignored. Normally if {@link #isDropDownAlwaysVisible()} is 1070d4760d77e7e8ab66af0307dcae39e0a8e9d90a14Mike LeBeau * false, we allow outside touch to dismiss the dropdown. If this is set to true, then we 1071d4760d77e7e8ab66af0307dcae39e0a8e9d90a14Mike LeBeau * ignore outside touch even when the drop down is not set to always visible. 1072d4760d77e7e8ab66af0307dcae39e0a8e9d90a14Mike LeBeau * 1073d4760d77e7e8ab66af0307dcae39e0a8e9d90a14Mike LeBeau * @hide used only by SearchDialog 1074d4760d77e7e8ab66af0307dcae39e0a8e9d90a14Mike LeBeau */ 1075d4760d77e7e8ab66af0307dcae39e0a8e9d90a14Mike LeBeau public void setForceIgnoreOutsideTouch(boolean forceIgnoreOutsideTouch) { 1076c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell mPopup.setForceIgnoreOutsideTouch(forceIgnoreOutsideTouch); 1077d4760d77e7e8ab66af0307dcae39e0a8e9d90a14Mike LeBeau } 1078d513e9746f09611db6478e368207ac7b112a253dGilles Debunne 1079c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell private void buildImeCompletions() { 10804f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy final ListAdapter adapter = mAdapter; 10814f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy if (adapter != null) { 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputMethodManager imm = InputMethodManager.peekInstance(); 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imm != null) { 10844f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy final int count = Math.min(adapter.getCount(), 20); 10854f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy CompletionInfo[] completions = new CompletionInfo[count]; 10864f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy int realCount = 0; 10874f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy 10884f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy for (int i = 0; i < count; i++) { 10894f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy if (adapter.isEnabled(i)) { 10904f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy Object item = adapter.getItem(i); 10914f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy long id = adapter.getItemId(i); 1092f0d3b7ff72511c9f6b9bf228e5b14ba6a2e35f34Gilles Debunne completions[realCount] = new CompletionInfo(id, realCount, 1093f0d3b7ff72511c9f6b9bf228e5b14ba6a2e35f34Gilles Debunne convertSelectionToString(item)); 1094f0d3b7ff72511c9f6b9bf228e5b14ba6a2e35f34Gilles Debunne realCount++; 10954f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy } 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10974f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy 10984f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy if (realCount != count) { 10994f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy CompletionInfo[] tmp = new CompletionInfo[realCount]; 11004f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy System.arraycopy(completions, 0, tmp, 0, realCount); 11014f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy completions = tmp; 11024f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy } 11034f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imm.displayCompletions(this, completions); 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the validator used to perform text validation. 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param validator The validator used to validate the text entered in this widget. 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getValidator() 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #performValidation() 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setValidator(Validator validator) { 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mValidator = validator; 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the Validator set with {@link #setValidator}, 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or <code>null</code> if it was not set. 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setValidator(android.widget.AutoCompleteTextView.Validator) 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #performValidation() 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Validator getValidator() { 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mValidator; 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If a validator was set on this view and the current string is not valid, 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ask the validator to fix it. 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getValidator() 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setValidator(android.widget.AutoCompleteTextView.Validator) 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void performValidation() { 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mValidator == null) return; 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence text = getText(); 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!TextUtils.isEmpty(text) && !mValidator.isValid(text)) { 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setText(mValidator.fixText(text)); 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the Filter obtained from {@link Filterable#getFilter}, 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or <code>null</code> if {@link #setAdapter} was not called with 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a Filterable. 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected Filter getFilter() { 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFilter; 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class DropDownItemClickListener implements AdapterView.OnItemClickListener { 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onItemClick(AdapterView parent, View v, int position, long id) { 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performCompletion(v, position, id); 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This interface is used to make sure that the text entered in this TextView complies to 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a certain format. Since there is no foolproof way to prevent the user from leaving 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this View with an incorrect value in it, all we can do is try to fix it ourselves 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when this happens. 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface Validator { 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Validates the specified text. 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true If the text currently in the text editor is valid. 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #fixText(CharSequence) 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean isValid(CharSequence text); 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Corrects the specified text to make it valid. 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param invalidText A string that doesn't pass validation: isValid(invalidText) 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * returns false 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A string based on invalidText such as invoking isValid() on it returns true. 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isValid(CharSequence) 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence fixText(CharSequence invalidText); 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1192ddf9856c7de043674d9ede006aefc7769879a4b8Mike LeBeau 119398e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen /** 119498e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen * Allows us a private hook into the on click event without preventing users from setting 119598e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen * their own click listener. 119698e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen */ 119798e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen private class PassThroughClickListener implements OnClickListener { 119898e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen 119998e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen private View.OnClickListener mWrapped; 120098e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen 120198e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen /** {@inheritDoc} */ 120298e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen public void onClick(View v) { 120398e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen onClickImpl(); 120498e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen 120598e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen if (mWrapped != null) mWrapped.onClick(v); 120698e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen } 120798e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen } 12086a67810228d02e75446d55c4c353275c87e9e769Romain Guy 12096a67810228d02e75446d55c4c353275c87e9e769Romain Guy private class PopupDataSetObserver extends DataSetObserver { 12106a67810228d02e75446d55c4c353275c87e9e769Romain Guy @Override 12116a67810228d02e75446d55c4c353275c87e9e769Romain Guy public void onChanged() { 1212c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell if (mAdapter != null) { 12134f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy // If the popup is not showing already, showing it will cause 12144f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy // the list of data set observers attached to the adapter to 12154f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy // change. We can't do it from here, because we are in the middle 1216be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne // of iterating through the list of observers. 12174f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy post(new Runnable() { 12184f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy public void run() { 12197254afd4c275dec243d4825f8f68c815ced1342cKenny Root final ListAdapter adapter = mAdapter; 12207254afd4c275dec243d4825f8f68c815ced1342cKenny Root if (adapter != null) { 1221be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne // This will re-layout, thus resetting mDataChanged, so that the 1222be2c4f92a990ca48ad6ede252343dd9574dfe505Gilles Debunne // listView click listener stays responsive 12234a74dbc3f2221af99f94b4f514b8291a16ae3661Gilles Debunne updateDropDownForFilter(adapter.getCount()); 12247254afd4c275dec243d4825f8f68c815ced1342cKenny Root } 12254f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy } 12264f43ae09d2cb0cce2b9e794f1b80f7198333c94bRomain Guy }); 12276a67810228d02e75446d55c4c353275c87e9e769Romain Guy } 12286a67810228d02e75446d55c4c353275c87e9e769Romain Guy } 12296a67810228d02e75446d55c4c353275c87e9e769Romain Guy } 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1231