AutoCompleteTextView.java revision ddf9856c7de043674d9ede006aefc7769879a4b8
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; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.Editable; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.Selection; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextWatcher; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MotionEvent; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.CompletionInfo; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputMethodManager; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.EditorInfo; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.R; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>An editable text view that shows completion suggestions automatically 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * while the user is typing. The list of suggestions is displayed in a drop 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * down menu from which the user can choose an item to replace the content 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the edit box with.</p> 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The drop down can be dismissed at any time by pressing the back key or, 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if no item is selected in the drop down, by pressing the enter/dpad center 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * key.</p> 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The list of suggestions is obtained from a data adapter and appears 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * only after a given number of characters defined by 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getThreshold() the threshold}.</p> 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The following code snippet shows how to create a text view which suggests 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * various countries names while the user is typing:</p> 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint"> 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * public class CountriesActivity extends Activity { 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * protected void onCreate(Bundle icicle) { 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * super.onCreate(icicle); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * setContentView(R.layout.countries); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android.R.layout.simple_dropdown_item_1line, COUNTRIES); 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * AutoCompleteTextView textView = (AutoCompleteTextView) 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * findViewById(R.id.countries_list); 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * textView.setAdapter(adapter); 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * } 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * private static final String[] COUNTRIES = new String[] { 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "Belgium", "France", "Italy", "Germany", "Spain" 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * } 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre> 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_completionHint 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_completionThreshold 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_completionHintView 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_dropDownSelector 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_dropDownAnchor 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_dropDownWidth 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class AutoCompleteTextView extends EditText implements Filter.FilterListener { 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final boolean DEBUG = false; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final String TAG = "AutoCompleteTextView"; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int HINT_VIEW_ID = 0x17; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private CharSequence mHintText; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mHintResource; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ListAdapter mAdapter; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Filter mFilter; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mThreshold; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PopupWindow mPopup; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private DropDownListView mDropDownList; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mDropDownVerticalOffset; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mDropDownHorizontalOffset; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mDropDownAnchorId; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private View mDropDownAnchorView; // view is retrieved lazily from id once needed 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mDropDownWidth; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mDropDownListHighlight; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private AdapterView.OnItemClickListener mItemClickListener; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private AdapterView.OnItemSelectedListener mItemSelectedListener; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final DropDownItemClickListener mDropDownItemClickListener = 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new DropDownItemClickListener(); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 113875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen private boolean mDropDownAlwaysVisible = false; 114875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 115875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen private boolean mDropDownDismissedOnCompletion = true; 116875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mLastKeyCode = KeyEvent.KEYCODE_UNKNOWN; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mOpenBefore; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Validator mValidator = null; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mBlockCompletion; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private AutoCompleteTextView.ListSelectorHider mHideSelector; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Indicates whether this AutoCompleteTextView is attached to a window or not 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The widget is attached to a window when mAttachCount > 0 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mAttachCount; 129ddf9856c7de043674d9ede006aefc7769879a4b8Mike LeBeau 13098e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen private AutoCompleteTextView.PassThroughClickListener mPassThroughClickListener; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AutoCompleteTextView(Context context) { 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, null); 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AutoCompleteTextView(Context context, AttributeSet attrs) { 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, attrs, com.android.internal.R.attr.autoCompleteTextViewStyle); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AutoCompleteTextView(Context context, AttributeSet attrs, int defStyle) { 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs, defStyle); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup = new PopupWindow(context, attrs, 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.attr.autoCompleteTextViewStyle); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project context.obtainStyledAttributes( 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attrs, com.android.internal.R.styleable.AutoCompleteTextView, defStyle, 0); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mThreshold = a.getInt( 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.styleable.AutoCompleteTextView_completionThreshold, 2); 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHintText = a.getText(R.styleable.AutoCompleteTextView_completionHint); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownListHighlight = a.getDrawable( 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.styleable.AutoCompleteTextView_dropDownSelector); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownVerticalOffset = (int) 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.getDimension(R.styleable.AutoCompleteTextView_dropDownVerticalOffset, 0.0f); 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownHorizontalOffset = (int) 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.getDimension(R.styleable.AutoCompleteTextView_dropDownHorizontalOffset, 0.0f); 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get the anchor's id now, but the view won't be ready, so wait to actually get the 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // view and store it in mDropDownAnchorView lazily in getDropDownAnchorView later. 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Defaults to NO_ID, in which case the getDropDownAnchorView method will simply return 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this TextView, as a default anchoring point. 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownAnchorId = a.getResourceId(R.styleable.AutoCompleteTextView_dropDownAnchor, 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View.NO_ID); 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For dropdown width, the developer can specify a specific width, or FILL_PARENT 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // (for full screen width) or WRAP_CONTENT (to match the width of the anchored view). 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownWidth = a.getLayoutDimension(R.styleable.AutoCompleteTextView_dropDownWidth, 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ViewGroup.LayoutParams.WRAP_CONTENT); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHintResource = a.getResourceId(R.styleable.AutoCompleteTextView_completionHintView, 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.layout.simple_dropdown_hint); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Always turn on the auto complete input type flag, since it 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // makes no sense to use this widget without it. 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int inputType = getInputType(); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((inputType&EditorInfo.TYPE_MASK_CLASS) 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project == EditorInfo.TYPE_CLASS_TEXT) { 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inputType |= EditorInfo.TYPE_TEXT_FLAG_AUTO_COMPLETE; 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setRawInputType(inputType); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setFocusable(true); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addTextChangedListener(new MyWatcher()); 191ddf9856c7de043674d9ede006aefc7769879a4b8Mike LeBeau 19298e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen mPassThroughClickListener = new PassThroughClickListener(); 19398e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen super.setOnClickListener(mPassThroughClickListener); 19498e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen } 19598e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen 19698e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen @Override 19798e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen public void setOnClickListener(OnClickListener listener) { 19898e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen mPassThroughClickListener.mWrapped = listener; 19998e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen } 20098e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen 20198e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen /** 20298e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen * Private hook into the on click event, dispatched from {@link PassThroughClickListener} 20398e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen */ 20498e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen private void onClickImpl() { 20598e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen // if drop down should always visible, bring it back in front of the soft 20698e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen // keyboard when the user touches the text field 20798e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen if (mDropDownAlwaysVisible 20898e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen && mPopup.isShowing() 20998e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen && mPopup.getInputMethodMode() == PopupWindow.INPUT_METHOD_NOT_NEEDED) { 21098e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); 21198acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau showDropDown(); 21298e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen } 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets this to be single line; a separate method so 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * MultiAutoCompleteTextView can skip this. 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* package */ void finishInit() { 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setSingleLine(); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the optional hint text that is displayed at the bottom of the 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the matching list. This can be used as a cue to the user on how to 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * best use the list, or to provide extra information.</p> 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param hint the text to be displayed to the user 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_completionHint 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setCompletionHint(CharSequence hint) { 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHintText = hint; 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the current width for the auto-complete drop down list. This can 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be a fixed width, or {@link ViewGroup.LayoutParams#FILL_PARENT} to fill the screen, or 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ViewGroup.LayoutParams#WRAP_CONTENT} to fit the width of its anchor view.</p> 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the width for the drop down list 2427b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 2437b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_dropDownWidth 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getDropDownWidth() { 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDropDownWidth; 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the current width for the auto-complete drop down list. This can 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be a fixed width, or {@link ViewGroup.LayoutParams#FILL_PARENT} to fill the screen, or 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ViewGroup.LayoutParams#WRAP_CONTENT} to fit the width of its anchor view.</p> 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param width the width to use 2557b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 2567b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_dropDownWidth 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDropDownWidth(int width) { 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownWidth = width; 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the id for the view that the auto-complete drop down list is anchored to.</p> 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the view's id, or {@link View#NO_ID} if none specified 2667b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 2677b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_dropDownAnchor 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getDropDownAnchor() { 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDropDownAnchorId; 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the view to which the auto-complete drop down list should anchor. The view 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * corresponding to this id will not be loaded until the next time it is needed to avoid 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * loading a view which is not yet instantiated.</p> 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id the id to anchor the drop down list view to 2797b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 2807b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_dropDownAnchor 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDropDownAnchor(int id) { 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownAnchorId = id; 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownAnchorView = null; 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2867b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 2877b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /** 2887b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * <p>Gets the background of the auto-complete drop-down list.</p> 2897b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 2907b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @return the background drawable 2917b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 2927b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @attr ref android.R.styleable#PopupWindow_popupBackground 2937b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 2947b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public Drawable getDropDownBackground() { 2957b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project return mPopup.getBackground(); 2967b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 2977b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 2987b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /** 2997b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * <p>Sets the background of the auto-complete drop-down list.</p> 3007b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3017b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @param d the drawable to set as the background 3027b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3037b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @attr ref android.R.styleable#PopupWindow_popupBackground 3047b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 3057b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public void setDropDownBackgroundDrawable(Drawable d) { 3067b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project mPopup.setBackgroundDrawable(d); 3077b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 3087b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 3097b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /** 3107b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * <p>Sets the background of the auto-complete drop-down list.</p> 3117b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3127b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @param id the id of the drawable to set as the background 3137b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3147b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @attr ref android.R.styleable#PopupWindow_popupBackground 3157b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 3167b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public void setDropDownBackgroundResource(int id) { 3177b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project mPopup.setBackgroundDrawable(getResources().getDrawable(id)); 3187b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 3197b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 3207b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /** 3217b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * <p>Sets the vertical offset used for the auto-complete drop-down list.</p> 3227b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3237b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @param offset the vertical offset 3247b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 3257b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public void setDropDownVerticalOffset(int offset) { 3267b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project mDropDownVerticalOffset = offset; 3277b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 3287b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 3297b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /** 3307b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * <p>Gets the vertical offset used for the auto-complete drop-down list.</p> 3317b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3327b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @return the vertical offset 3337b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 3347b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public int getDropDownVerticalOffset() { 3357b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project return mDropDownVerticalOffset; 3367b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 3377b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 3387b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /** 3397b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * <p>Sets the horizontal offset used for the auto-complete drop-down list.</p> 3407b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3417b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @param offset the horizontal offset 3427b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 3437b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public void setDropDownHorizontalOffset(int offset) { 3447b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project mDropDownHorizontalOffset = offset; 3457b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 3467b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 3477b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /** 3487b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * <p>Gets the horizontal offset used for the auto-complete drop-down list.</p> 3497b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3507b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @return the horizontal offset 3517b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 3527b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public int getDropDownHorizontalOffset() { 3537b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project return mDropDownHorizontalOffset; 3547b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 3558f080ec4292be02fad9896260bbd3cf5461f9399The Android Open Source Project 356bff1389c9ab4442a6e278cf84ce37eadad21a9a1The Android Open Source Project /** 357875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <p>Sets the animation style of the auto-complete drop-down list.</p> 358875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 359875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <p>If the drop-down is showing, calling this method will take effect only 360875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * the next time the drop-down is shown.</p> 361875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 362875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @param animationStyle animation style to use when the drop-down appears 363875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * and disappears. Set to -1 for the default animation, 0 for no 364875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * animation, or a resource identifier for an explicit animation. 365875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 366875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @hide Pending API council approval 367875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 368875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public void setDropDownAnimationStyle(int animationStyle) { 369875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen mPopup.setAnimationStyle(animationStyle); 370875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 373875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * <p>Returns the animation style that is used when the drop-down list appears and disappears 374875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * </p> 375875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 376875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @return the animation style that is used when the drop-down list appears and disappears 377875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 378875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @hide Pending API council approval 379875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 380875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public int getDropDownAnimationStyle() { 381875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen return mPopup.getAnimationStyle(); 382875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 383875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 384875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 385875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @return Whether the drop-down is visible as long as there is {@link #enoughToFilter()} 386875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 387875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @hide Pending API council approval 388875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 389875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public boolean isDropDownAlwaysVisible() { 390875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen return mDropDownAlwaysVisible; 391875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 392875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 393875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 394875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Sets whether the drop-down should remain visible as long as there is there is 395875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * {@link #enoughToFilter()}. This is useful if an unknown number of results are expected 396875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * to show up in the adapter sometime in the future. 397875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 398875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * The drop-down will occupy the entire screen below {@link #getDropDownAnchor} regardless 399875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * of the size or content of the list. {@link #getDropDownBackground()} will fill any space 400875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * that is not used by the list. 401875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 402875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @param dropDownAlwaysVisible Whether to keep the drop-down visible. 403875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 404875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @hide Pending API council approval 405875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 406875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public void setDropDownAlwaysVisible(boolean dropDownAlwaysVisible) { 407875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen mDropDownAlwaysVisible = dropDownAlwaysVisible; 408875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 409875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 410875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 411875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Checks whether the drop-down is dismissed when a suggestion is clicked. 412875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 413875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @hide Pending API council approval 414875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 415875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public boolean isDropDownDismissedOnCompletion() { 416875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen return mDropDownDismissedOnCompletion; 417875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 418875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 419875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 420875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Sets whether the drop-down is dismissed when a suggestion is clicked. This is 421875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * true by default. 422875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 423875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @param dropDownDismissedOnCompletion Whether to dismiss the drop-down. 424875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 425875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @hide Pending API council approval 426875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 427875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public void setDropDownDismissedOnCompletion(boolean dropDownDismissedOnCompletion) { 428875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen mDropDownDismissedOnCompletion = dropDownDismissedOnCompletion; 429875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 430875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the number of characters the user must type before the drop 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * down list is shown.</p> 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the minimum number of characters to type to show the drop down 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setThreshold(int) 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getThreshold() { 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mThreshold; 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Specifies the minimum number of characters the user has to type in the 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * edit box before the drop down list is shown.</p> 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>When <code>threshold</code> is less than or equals 0, a threshold of 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1 is applied.</p> 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param threshold the number of characters to type before the drop down 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is shown 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getThreshold() 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_completionThreshold 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setThreshold(int threshold) { 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (threshold <= 0) { 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project threshold = 1; 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mThreshold = threshold; 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the listener that will be notified when the user clicks an item 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the drop down list.</p> 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param l the item click listener 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnItemClickListener(AdapterView.OnItemClickListener l) { 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mItemClickListener = l; 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the listener that will be notified when the user selects an item 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the drop down list.</p> 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param l the item selected listener 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnItemSelectedListener(AdapterView.OnItemSelectedListener l) { 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mItemSelectedListener = l; 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the listener that is notified whenever the user clicks an item 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the drop down list.</p> 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the item click listener 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @deprecated Use {@link #getOnItemClickListener()} intead 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Deprecated 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AdapterView.OnItemClickListener getItemClickListener() { 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mItemClickListener; 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the listener that is notified whenever the user selects an 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * item in the drop down list.</p> 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the item selected listener 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @deprecated Use {@link #getOnItemSelectedListener()} intead 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Deprecated 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AdapterView.OnItemSelectedListener getItemSelectedListener() { 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mItemSelectedListener; 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the listener that is notified whenever the user clicks an item 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the drop down list.</p> 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the item click listener 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AdapterView.OnItemClickListener getOnItemClickListener() { 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mItemClickListener; 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the listener that is notified whenever the user selects an 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * item in the drop down list.</p> 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the item selected listener 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AdapterView.OnItemSelectedListener getOnItemSelectedListener() { 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mItemSelectedListener; 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns a filterable list adapter used for auto completion.</p> 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a data adapter used for auto completion 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ListAdapter getAdapter() { 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAdapter; 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Changes the list of data used for auto completion. The provided list 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * must be a filterable list adapter.</p> 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The caller is still responsible for managing any resources used by the adapter. 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Notably, when the AutoCompleteTextView is closed or released, the adapter is not notified. 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A common case is the use of {@link android.widget.CursorAdapter}, which 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * contains a {@link android.database.Cursor} that must be closed. This can be done 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * automatically (see 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#startManagingCursor(android.database.Cursor) 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * startManagingCursor()}), 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or by manually closing the cursor when the AutoCompleteTextView is dismissed.</p> 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param adapter the adapter holding the auto completion data 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getAdapter() 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.widget.Filterable 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.widget.ListAdapter 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public <T extends ListAdapter & Filterable> void setAdapter(T adapter) { 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAdapter = adapter; 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAdapter != null) { 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //noinspection unchecked 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilter = ((Filterable) mAdapter).getFilter(); 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilter = null; 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDropDownList != null) { 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.setAdapter(mAdapter); 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onKeyPreIme(int keyCode, KeyEvent event) { 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isPopupShowing()) { 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // special case for the back key, we do not even try to send it 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to the drop down list but instead, consume it immediately 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (keyCode == KeyEvent.KEYCODE_BACK) { 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissDropDown(); 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.onKeyPreIme(keyCode, event); 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onKeyUp(int keyCode, KeyEvent event) { 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isPopupShowing() && mDropDownList.getSelectedItemPosition() >= 0) { 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean consumed = mDropDownList.onKeyUp(keyCode, event); 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (consumed) { 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (keyCode) { 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if the list accepts the key events and the key event 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // was a click, the text view gets the selected item 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // from the drop down as its content 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case KeyEvent.KEYCODE_ENTER: 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case KeyEvent.KEYCODE_DPAD_CENTER: 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performCompletion(); 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.onKeyUp(keyCode, event); 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onKeyDown(int keyCode, KeyEvent event) { 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // when the drop down is shown, we drive it directly 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isPopupShowing()) { 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the key events are forwarded to the list in the drop down view 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // note that ListView handles space but we don't want that to happen 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // also if selection is not currently in the drop down, then don't 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // let center or enter presses go there since that would cause it 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to select one of its items 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (keyCode != KeyEvent.KEYCODE_SPACE 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (mDropDownList.getSelectedItemPosition() >= 0 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (keyCode != KeyEvent.KEYCODE_ENTER 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && keyCode != KeyEvent.KEYCODE_DPAD_CENTER))) { 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int curIndex = mDropDownList.getSelectedItemPosition(); 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean consumed; 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean below = !mPopup.isAboveAnchor(); 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((below && keyCode == KeyEvent.KEYCODE_DPAD_UP && curIndex <= 0) || 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (!below && keyCode == KeyEvent.KEYCODE_DPAD_DOWN && curIndex >= 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.getAdapter().getCount() - 1)) { 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // When the selection is at the top, we block the key 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // event to prevent focus from moving. 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.hideSelector(); 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.requestLayout(); 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.update(); 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project consumed = mDropDownList.onKeyDown(keyCode, event); 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "Key down: code=" + keyCode + " list consumed=" 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + consumed); 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (consumed) { 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If it handled the key event, then the user is 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // navigating in the list, so we should put it in front. 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED); 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Here's a little trick we need to do to make sure that 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the list view is actually showing its focus indicator, 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // by ensuring it has focus and getting its window out 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // of touch mode. 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.requestFocusFromTouch(); 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.update(); 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (keyCode) { 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // avoid passing the focus from the text view to the 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // next component 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case KeyEvent.KEYCODE_ENTER: 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case KeyEvent.KEYCODE_DPAD_CENTER: 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case KeyEvent.KEYCODE_DPAD_DOWN: 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case KeyEvent.KEYCODE_DPAD_UP: 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (below && keyCode == KeyEvent.KEYCODE_DPAD_DOWN) { 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // when the selection is at the bottom, we block the 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // event to avoid going to the next focusable widget 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Adapter adapter = mDropDownList.getAdapter(); 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (adapter != null && curIndex == adapter.getCount() - 1) { 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (!below && keyCode == KeyEvent.KEYCODE_DPAD_UP && curIndex == 0) { 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch(keyCode) { 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case KeyEvent.KEYCODE_DPAD_DOWN: 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performValidation(); 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastKeyCode = keyCode; 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean handled = super.onKeyDown(keyCode, event); 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastKeyCode = KeyEvent.KEYCODE_UNKNOWN; 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project if (handled && isPopupShowing() && mDropDownList != null) { 680c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project clearListSelection(); 681c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 682c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return handled; 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns <code>true</code> if the amount of text in the field meets 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or exceeds the {@link #getThreshold} requirement. You can override 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this to impose a different standard for when filtering will be 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * triggered. 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean enoughToFilter() { 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "Enough to filter: len=" + getText().length() 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " threshold=" + mThreshold); 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getText().length() >= mThreshold; 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is used to watch for edits to the text view. Note that we call 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to methods on the auto complete text view class so that we can access 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * private vars without going through thunks. 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class MyWatcher implements TextWatcher { 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void afterTextChanged(Editable s) { 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doAfterTextChanged(); 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void beforeTextChanged(CharSequence s, int start, int count, int after) { 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doBeforeTextChanged(); 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onTextChanged(CharSequence s, int start, int before, int count) { 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void doBeforeTextChanged() { 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBlockCompletion) return; 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // when text is changed, inserted or deleted, we attempt to show 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the drop down 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOpenBefore = isPopupShowing(); 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "before text changed: open=" + mOpenBefore); 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void doAfterTextChanged() { 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBlockCompletion) return; 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if the list was open before the keystroke, but closed afterwards, 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // then something in the keystroke processing (an input filter perhaps) 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // called performCompletion() and we shouldn't do any more processing. 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "after text changed: openBefore=" + mOpenBefore 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " open=" + isPopupShowing()); 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOpenBefore && !isPopupShowing()) { 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the drop down is shown only when a minimum number of characters 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // was typed in the text view 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (enoughToFilter()) { 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFilter != null) { 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performFiltering(getText(), mLastKeyCode); 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // drop down is automatically dismissed when enough characters 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // are deleted from the text view 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissDropDown(); 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFilter != null) { 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilter.filter(null); 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Indicates whether the popup menu is showing.</p> 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the popup menu is showing, false otherwise 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isPopupShowing() { 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPopup.isShowing(); 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Converts the selected item from the drop down list into a sequence 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of character that can be used in the edit box.</p> 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param selectedItem the item selected by the user for completion 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a sequence of characters representing the selected suggestion 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected CharSequence convertSelectionToString(Object selectedItem) { 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFilter.convertResultToString(selectedItem); 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Clear the list selection. This may only be temporary, as user input will often bring 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it back. 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clearListSelection() { 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDropDownList != null) { 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.hideSelector(); 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.requestLayout(); 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the position of the dropdown view selection. 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param position The position to move the selector to. 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setListSelection(int position) { 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPopup.isShowing() && (mDropDownList != null)) { 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.setSelection(position); 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ListView.setSelection() will call requestLayout() 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the position of the dropdown view selection, if there is one. Returns 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ListView#INVALID_POSITION ListView.INVALID_POSITION} if there is no dropdown or if 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * there is no selection. 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the position of the current selection, if there is one, or 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ListView#INVALID_POSITION ListView.INVALID_POSITION} if not. 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see ListView#getSelectedItemPosition() 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getListSelection() { 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPopup.isShowing() && (mDropDownList != null)) { 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDropDownList.getSelectedItemPosition(); 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ListView.INVALID_POSITION; 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()) { 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBlockCompletion = true; 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project replaceText(completion.getText()); 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBlockCompletion = false; 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mItemClickListener != null) { 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final DropDownListView list = mDropDownList; 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Note that we don't have a View here, so we will need to 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // supply null. Hopefully no existing apps crash... 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mItemClickListener.onItemClick(list, null, completion.getPosition(), 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project completion.getId()); 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void performCompletion(View selectedView, int position, long id) { 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isPopupShowing()) { 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object selectedItem; 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (position < 0) { 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project selectedItem = mDropDownList.getSelectedItem(); 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project selectedItem = mAdapter.getItem(position); 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (selectedItem == null) { 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "performCompletion: no selected item"); 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBlockCompletion = true; 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project replaceText(convertSelectionToString(selectedItem)); 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBlockCompletion = false; 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mItemClickListener != null) { 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final DropDownListView list = mDropDownList; 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (selectedView == null || position < 0) { 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project selectedView = list.getSelectedView(); 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project position = list.getSelectedItemPosition(); 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project id = list.getSelectedItemId(); 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mItemClickListener.onItemClick(list, selectedView, position, id); 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 882875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen if (mDropDownDismissedOnCompletion) { 883875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen dismissDropDown(); 884875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Identifies whether the view is currently performing a text completion, so subclasses 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can decide whether to respond to text changed events. 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isPerformingCompletion() { 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBlockCompletion; 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 896875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Like {@link #setText(CharSequence)}, except that it can disable filtering. 897875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 898875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @param filter If <code>false</code>, no filtering will be performed 899875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * as a result of this call. 900875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 901875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @hide Pending API council approval. 902875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 903875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public void setText(CharSequence text, boolean filter) { 904875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen if (filter) { 905875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen setText(text); 906875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } else { 907875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen mBlockCompletion = true; 908875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen setText(text); 909875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen mBlockCompletion = false; 910875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 911875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 912875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 913875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 914875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Like {@link #setTextKeepState(CharSequence)}, except that it can disable filtering. 915875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 916875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @param filter If <code>false</code>, no filtering will be performed 917875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * as a result of this call. 918875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 919875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @hide Pending API council approval. 920875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 921875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public void setTextKeepState(CharSequence text, boolean filter) { 922875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen if (filter) { 923875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen setTextKeepState(text); 924875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } else { 925875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen mBlockCompletion = true; 926875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen setTextKeepState(text); 927875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen mBlockCompletion = false; 928875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 929875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 930875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 931875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Performs the text completion by replacing the current text by the 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * selected item. Subclasses should override this method to avoid replacing 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the whole content of the edit box.</p> 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param text the selected suggestion in the drop down list 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void replaceText(CharSequence text) { 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setText(text); 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // make sure we keep the caret at the end of the text view 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Editable spannable = getText(); 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Selection.setSelection(spannable, spannable.length()); 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 945875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** {@inheritDoc} */ 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onFilterComplete(int count) { 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAttachCount <= 0) return; 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This checks enoughToFilter() again because filtering requests 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are asynchronous, so the result may come back after enough text 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has since been deleted to make it no longer appropriate 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to filter. 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 956875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen if ((count > 0 || mDropDownAlwaysVisible) && enoughToFilter()) { 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasFocus() && hasWindowFocus()) { 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showDropDown(); 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissDropDown(); 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onWindowFocusChanged(boolean hasWindowFocus) { 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onWindowFocusChanged(hasWindowFocus); 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performValidation(); 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!hasWindowFocus) { 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissDropDown(); 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onFocusChanged(focused, direction, previouslyFocusedRect); 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performValidation(); 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!focused) { 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissDropDown(); 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onAttachedToWindow() { 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onAttachedToWindow(); 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAttachCount++; 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onDetachedFromWindow() { 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissDropDown(); 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAttachCount--; 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onDetachedFromWindow(); 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Closes the drop down if present on screen.</p> 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dismissDropDown() { 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputMethodManager imm = InputMethodManager.peekInstance(); 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imm != null) { 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imm.displayCompletions(this, null); 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.dismiss(); 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.setContentView(null); 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList = null; 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean setFrame(int l, int t, int r, int b) { 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean result = super.setFrame(l, t, r, b); 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPopup.isShowing()) { 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.update(this, r - l, -1); 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Used for lazy instantiation of the anchor view from the id we have. If the value of 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the id is NO_ID or we can't find a view for the given id, we return this TextView as 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the default anchoring point.</p> 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private View getDropDownAnchorView() { 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDropDownAnchorView == null && mDropDownAnchorId != View.NO_ID) { 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownAnchorView = getRootView().findViewById(mDropDownAnchorId); 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDropDownAnchorView == null ? this : mDropDownAnchorView; 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Displays the drop down on screen.</p> 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void showDropDown() { 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int height = buildDropDown(); 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPopup.isShowing()) { 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int widthSpec; 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDropDownWidth == ViewGroup.LayoutParams.FILL_PARENT) { 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The call to PopupWindow's update method below can accept -1 for any 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // value you do not want to update. 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project widthSpec = -1; 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (mDropDownWidth == ViewGroup.LayoutParams.WRAP_CONTENT) { 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project widthSpec = getDropDownAnchorView().getWidth(); 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project widthSpec = mDropDownWidth; 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.update(getDropDownAnchorView(), mDropDownHorizontalOffset, 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownVerticalOffset, widthSpec, height); 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDropDownWidth == ViewGroup.LayoutParams.FILL_PARENT) { 1052875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen mPopup.setWindowLayoutMode(ViewGroup.LayoutParams.FILL_PARENT, 0); 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1054875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen mPopup.setWindowLayoutMode(0, 0); 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDropDownWidth == ViewGroup.LayoutParams.WRAP_CONTENT) { 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.setWidth(getDropDownAnchorView().getWidth()); 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.setWidth(mDropDownWidth); 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.setHeight(height); 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); 1063bff1389c9ab4442a6e278cf84ce37eadad21a9a1The Android Open Source Project mPopup.setOutsideTouchable(true); 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.setTouchInterceptor(new PopupTouchIntercepter()); 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.showAsDropDown(getDropDownAnchorView(), 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownHorizontalOffset, mDropDownVerticalOffset); 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.setSelection(ListView.INVALID_POSITION); 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.hideSelector(); 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.requestFocus(); 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project post(mHideSelector); 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Builds the popup window's content and returns the height the popup 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should have. Returns -1 when the content already exists.</p> 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the content's height or -1 if content already exists 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int buildDropDown() { 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ViewGroup dropDownView; 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int otherHeights = 0; 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAdapter != null) { 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputMethodManager imm = InputMethodManager.peekInstance(); 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imm != null) { 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = mAdapter.getCount(); 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 20) N = 20; 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CompletionInfo[] completions = new CompletionInfo[N]; 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object item = mAdapter.getItem(i); 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long id = mAdapter.getItemId(i); 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project completions[i] = new CompletionInfo(id, i, 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project convertSelectionToString(item)); 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imm.displayCompletions(this, completions); 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDropDownList == null) { 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Context context = getContext(); 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHideSelector = new ListSelectorHider(); 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList = new DropDownListView(context); 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.setSelector(mDropDownListHighlight); 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.setAdapter(mAdapter); 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.setVerticalFadingEdgeEnabled(true); 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.setOnItemClickListener(mDropDownItemClickListener); 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.setFocusable(true); 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.setFocusableInTouchMode(true); 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mItemSelectedListener != null) { 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.setOnItemSelectedListener(mItemSelectedListener); 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dropDownView = mDropDownList; 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View hintView = getHintView(context); 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hintView != null) { 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if an hint has been specified, we accomodate more space for it and 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // add a text view in the drop down menu, at the bottom of the list 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LinearLayout hintContainer = new LinearLayout(context); 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hintContainer.setOrientation(LinearLayout.VERTICAL); 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LinearLayout.LayoutParams hintParams = new LinearLayout.LayoutParams( 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ViewGroup.LayoutParams.FILL_PARENT, 0, 1.0f 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ); 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hintContainer.addView(dropDownView, hintParams); 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hintContainer.addView(hintView); 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // measure the hint's height to find how much more vertical space 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we need to add to the drop down's height 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int widthSpec = MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST); 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int heightSpec = MeasureSpec.UNSPECIFIED; 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hintView.measure(widthSpec, heightSpec); 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hintParams = (LinearLayout.LayoutParams) hintView.getLayoutParams(); 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project otherHeights = hintView.getMeasuredHeight() + hintParams.topMargin 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + hintParams.bottomMargin; 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dropDownView = hintContainer; 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.setContentView(dropDownView); 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dropDownView = (ViewGroup) mPopup.getContentView(); 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View view = dropDownView.findViewById(HINT_VIEW_ID); 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (view != null) { 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LinearLayout.LayoutParams hintParams = 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (LinearLayout.LayoutParams) view.getLayoutParams(); 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project otherHeights = view.getMeasuredHeight() + hintParams.topMargin 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + hintParams.bottomMargin; 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 115798acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau // Max height available on the screen for a popup. If this AutoCompleteTextView has 115898acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau // the dropDownAlwaysVisible attribute, and the input method is not currently required, 115998acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau // we then we ask for the height ignoring any bottom decorations like the input method. 116098acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau // Otherwise we respect the input method. 116198acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau boolean ignoreBottomDecorations = mDropDownAlwaysVisible && 116298acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau mPopup.getInputMethodMode() == PopupWindow.INPUT_METHOD_NOT_NEEDED; 116398acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau final int maxHeight = mPopup.getMaxAvailableHeight( 116498acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau getDropDownAnchorView(), mDropDownVerticalOffset, ignoreBottomDecorations); 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1166875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen final int measuredHeight = mDropDownList.measureHeightOfChildren(MeasureSpec.UNSPECIFIED, 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0, ListView.NO_POSITION, maxHeight - otherHeights, 2) + otherHeights; 1168875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 1169875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen return mDropDownAlwaysVisible ? maxHeight : measuredHeight; 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private View getHintView(Context context) { 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mHintText != null && mHintText.length() > 0) { 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final TextView hintView = (TextView) LayoutInflater.from(context).inflate( 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHintResource, null).findViewById(com.android.internal.R.id.text1); 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hintView.setText(mHintText); 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hintView.setId(HINT_VIEW_ID); 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return hintView; 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the validator used to perform text validation. 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param validator The validator used to validate the text entered in this widget. 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getValidator() 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #performValidation() 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setValidator(Validator validator) { 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mValidator = validator; 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the Validator set with {@link #setValidator}, 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or <code>null</code> if it was not set. 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setValidator(android.widget.AutoCompleteTextView.Validator) 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #performValidation() 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Validator getValidator() { 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mValidator; 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If a validator was set on this view and the current string is not valid, 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ask the validator to fix it. 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getValidator() 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setValidator(android.widget.AutoCompleteTextView.Validator) 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void performValidation() { 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mValidator == null) return; 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence text = getText(); 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!TextUtils.isEmpty(text) && !mValidator.isValid(text)) { 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setText(mValidator.fixText(text)); 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the Filter obtained from {@link Filterable#getFilter}, 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or <code>null</code> if {@link #setAdapter} was not called with 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a Filterable. 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected Filter getFilter() { 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFilter; 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class ListSelectorHider implements Runnable { 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDropDownList != null) { 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.hideSelector(); 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.requestLayout(); 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class PopupTouchIntercepter implements OnTouchListener { 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onTouch(View v, MotionEvent event) { 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (event.getAction() == MotionEvent.ACTION_DOWN) { 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED); 124698acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau showDropDown(); 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class DropDownItemClickListener implements AdapterView.OnItemClickListener { 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onItemClick(AdapterView parent, View v, int position, long id) { 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performCompletion(v, position, id); 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Wrapper class for a ListView. This wrapper hijacks the focus to 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * make sure the list uses the appropriate drawables and states when 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * displayed on screen within a drop down. The focus is never actually 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * passed to the drop down; the list only looks focused.</p> 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static class DropDownListView extends ListView { 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Creates a new list view wrapper.</p> 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context this view's context 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DropDownListView(Context context) { 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, null, com.android.internal.R.attr.dropDownListViewStyle); 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Avoids jarring scrolling effect by ensuring that list elements 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * made of a text view fit on a single line.</p> 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param position the item index in the list to get a view for 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the view for the specified item 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected View obtainView(int position) { 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View view = super.obtainView(position); 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (view instanceof TextView) { 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((TextView) view).setHorizontallyScrolling(true); 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return view; 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the top padding of the currently selected view.</p> 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the height of the top padding for the selection 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getSelectionPaddingTop() { 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSelectionTopPadding; 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the bottom padding of the currently selected view.</p> 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the height of the bottom padding for the selection 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getSelectionPaddingBottom() { 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSelectionBottomPadding; 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the focus state in the drop down.</p> 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true always 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasWindowFocus() { 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the focus state in the drop down.</p> 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true always 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isFocused() { 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the focus state in the drop down.</p> 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true always 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasFocus() { 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected int[] onCreateDrawableState(int extraSpace) { 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] res = super.onCreateDrawableState(extraSpace); 1342c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project //noinspection ConstantIfStatement 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder sb = new StringBuilder("Created drawable state: ["); 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<res.length; i++) { 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i > 0) sb.append(", "); 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("0x"); 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(Integer.toHexString(res[i])); 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("]"); 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, sb.toString()); 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This interface is used to make sure that the text entered in this TextView complies to 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a certain format. Since there is no foolproof way to prevent the user from leaving 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this View with an incorrect value in it, all we can do is try to fix it ourselves 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when this happens. 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface Validator { 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Validates the specified text. 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true If the text currently in the text editor is valid. 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #fixText(CharSequence) 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean isValid(CharSequence text); 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Corrects the specified text to make it valid. 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param invalidText A string that doesn't pass validation: isValid(invalidText) 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * returns false 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A string based on invalidText such as invoking isValid() on it returns true. 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isValid(CharSequence) 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence fixText(CharSequence invalidText); 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1385ddf9856c7de043674d9ede006aefc7769879a4b8Mike LeBeau 138698e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen /** 138798e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen * Allows us a private hook into the on click event without preventing users from setting 138898e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen * their own click listener. 138998e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen */ 139098e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen private class PassThroughClickListener implements OnClickListener { 139198e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen 139298e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen private View.OnClickListener mWrapped; 139398e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen 139498e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen /** {@inheritDoc} */ 139598e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen public void onClick(View v) { 139698e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen onClickImpl(); 139798e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen 139898e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen if (mWrapped != null) mWrapped.onClick(v); 139998e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen } 140098e333f551a4bf2ebb50bb97a2a56b14bfdcd74bKarl Rosaen } 1401ddf9856c7de043674d9ede006aefc7769879a4b8Mike LeBeau 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1403