AutoCompleteTextView.java revision 7b0b1ed979aa665175bf3952c8902ce13c763ab8
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 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mLastKeyCode = KeyEvent.KEYCODE_UNKNOWN; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mOpenBefore; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Validator mValidator = null; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mBlockCompletion; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private AutoCompleteTextView.ListSelectorHider mHideSelector; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Indicates whether this AutoCompleteTextView is attached to a window or not 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The widget is attached to a window when mAttachCount > 0 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mAttachCount; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AutoCompleteTextView(Context context) { 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, null); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AutoCompleteTextView(Context context, AttributeSet attrs) { 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, attrs, com.android.internal.R.attr.autoCompleteTextViewStyle); 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AutoCompleteTextView(Context context, AttributeSet attrs, int defStyle) { 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs, defStyle); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup = new PopupWindow(context, attrs, 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.attr.autoCompleteTextViewStyle); 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project context.obtainStyledAttributes( 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attrs, com.android.internal.R.styleable.AutoCompleteTextView, defStyle, 0); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mThreshold = a.getInt( 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.styleable.AutoCompleteTextView_completionThreshold, 2); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHintText = a.getText(R.styleable.AutoCompleteTextView_completionHint); 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownListHighlight = a.getDrawable( 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.styleable.AutoCompleteTextView_dropDownSelector); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownVerticalOffset = (int) 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.getDimension(R.styleable.AutoCompleteTextView_dropDownVerticalOffset, 0.0f); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownHorizontalOffset = (int) 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.getDimension(R.styleable.AutoCompleteTextView_dropDownHorizontalOffset, 0.0f); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get the anchor's id now, but the view won't be ready, so wait to actually get the 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // view and store it in mDropDownAnchorView lazily in getDropDownAnchorView later. 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Defaults to NO_ID, in which case the getDropDownAnchorView method will simply return 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this TextView, as a default anchoring point. 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownAnchorId = a.getResourceId(R.styleable.AutoCompleteTextView_dropDownAnchor, 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View.NO_ID); 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For dropdown width, the developer can specify a specific width, or FILL_PARENT 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // (for full screen width) or WRAP_CONTENT (to match the width of the anchored view). 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownWidth = a.getLayoutDimension(R.styleable.AutoCompleteTextView_dropDownWidth, 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ViewGroup.LayoutParams.WRAP_CONTENT); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHintResource = a.getResourceId(R.styleable.AutoCompleteTextView_completionHintView, 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.layout.simple_dropdown_hint); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Always turn on the auto complete input type flag, since it 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // makes no sense to use this widget without it. 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int inputType = getInputType(); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((inputType&EditorInfo.TYPE_MASK_CLASS) 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project == EditorInfo.TYPE_CLASS_TEXT) { 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inputType |= EditorInfo.TYPE_TEXT_FLAG_AUTO_COMPLETE; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setRawInputType(inputType); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setFocusable(true); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addTextChangedListener(new MyWatcher()); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets this to be single line; a separate method so 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * MultiAutoCompleteTextView can skip this. 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* package */ void finishInit() { 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setSingleLine(); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the optional hint text that is displayed at the bottom of the 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the matching list. This can be used as a cue to the user on how to 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * best use the list, or to provide extra information.</p> 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param hint the text to be displayed to the user 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_completionHint 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setCompletionHint(CharSequence hint) { 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHintText = hint; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the current width for the auto-complete drop down list. This can 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be a fixed width, or {@link ViewGroup.LayoutParams#FILL_PARENT} to fill the screen, or 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ViewGroup.LayoutParams#WRAP_CONTENT} to fit the width of its anchor view.</p> 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the width for the drop down list 2147b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 2157b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_dropDownWidth 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getDropDownWidth() { 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDropDownWidth; 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the current width for the auto-complete drop down list. This can 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be a fixed width, or {@link ViewGroup.LayoutParams#FILL_PARENT} to fill the screen, or 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ViewGroup.LayoutParams#WRAP_CONTENT} to fit the width of its anchor view.</p> 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param width the width to use 2277b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 2287b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_dropDownWidth 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDropDownWidth(int width) { 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownWidth = width; 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the id for the view that the auto-complete drop down list is anchored to.</p> 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the view's id, or {@link View#NO_ID} if none specified 2387b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 2397b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_dropDownAnchor 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getDropDownAnchor() { 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDropDownAnchorId; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the view to which the auto-complete drop down list should anchor. The view 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * corresponding to this id will not be loaded until the next time it is needed to avoid 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * loading a view which is not yet instantiated.</p> 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id the id to anchor the drop down list view to 2517b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 2527b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_dropDownAnchor 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDropDownAnchor(int id) { 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownAnchorId = id; 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownAnchorView = null; 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2587b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 2597b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /** 2607b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * <p>Gets the background of the auto-complete drop-down list.</p> 2617b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 2627b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @return the background drawable 2637b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 2647b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @attr ref android.R.styleable#PopupWindow_popupBackground 2657b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 2667b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public Drawable getDropDownBackground() { 2677b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project return mPopup.getBackground(); 2687b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 2697b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 2707b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /** 2717b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * <p>Sets the background of the auto-complete drop-down list.</p> 2727b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 2737b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @param d the drawable to set as the background 2747b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 2757b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @attr ref android.R.styleable#PopupWindow_popupBackground 2767b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 2777b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public void setDropDownBackgroundDrawable(Drawable d) { 2787b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project mPopup.setBackgroundDrawable(d); 2797b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 2807b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 2817b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /** 2827b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * <p>Sets the background of the auto-complete drop-down list.</p> 2837b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 2847b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @param id the id of the drawable to set as the background 2857b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 2867b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @attr ref android.R.styleable#PopupWindow_popupBackground 2877b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 2887b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public void setDropDownBackgroundResource(int id) { 2897b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project mPopup.setBackgroundDrawable(getResources().getDrawable(id)); 2907b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 2917b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 2927b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /** 2937b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * <p>Sets the vertical offset used for the auto-complete drop-down list.</p> 2947b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 2957b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @param offset the vertical offset 2967b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 2977b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public void setDropDownVerticalOffset(int offset) { 2987b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project mDropDownVerticalOffset = offset; 2997b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 3007b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 3017b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /** 3027b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * <p>Gets the vertical offset used for the auto-complete drop-down list.</p> 3037b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3047b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @return the vertical offset 3057b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 3067b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public int getDropDownVerticalOffset() { 3077b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project return mDropDownVerticalOffset; 3087b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 3097b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 3107b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /** 3117b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * <p>Sets the horizontal offset used for the auto-complete drop-down list.</p> 3127b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3137b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @param offset the horizontal offset 3147b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 3157b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public void setDropDownHorizontalOffset(int offset) { 3167b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project mDropDownHorizontalOffset = offset; 3177b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 3187b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 3197b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project /** 3207b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * <p>Gets the horizontal offset used for the auto-complete drop-down list.</p> 3217b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * 3227b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project * @return the horizontal offset 3237b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project */ 3247b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project public int getDropDownHorizontalOffset() { 3257b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project return mDropDownHorizontalOffset; 3267b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project } 3277b0b1ed979aa665175bf3952c8902ce13c763ab8The Android Open Source Project 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the number of characters the user must type before the drop 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * down list is shown.</p> 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the minimum number of characters to type to show the drop down 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setThreshold(int) 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getThreshold() { 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mThreshold; 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Specifies the minimum number of characters the user has to type in the 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * edit box before the drop down list is shown.</p> 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>When <code>threshold</code> is less than or equals 0, a threshold of 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1 is applied.</p> 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param threshold the number of characters to type before the drop down 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is shown 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getThreshold() 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#AutoCompleteTextView_completionThreshold 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setThreshold(int threshold) { 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (threshold <= 0) { 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project threshold = 1; 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mThreshold = threshold; 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the listener that will be notified when the user clicks an item 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the drop down list.</p> 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param l the item click listener 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnItemClickListener(AdapterView.OnItemClickListener l) { 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mItemClickListener = l; 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the listener that will be notified when the user selects an item 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the drop down list.</p> 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param l the item selected listener 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnItemSelectedListener(AdapterView.OnItemSelectedListener l) { 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mItemSelectedListener = l; 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the listener that is notified whenever the user clicks an item 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the drop down list.</p> 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the item click listener 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @deprecated Use {@link #getOnItemClickListener()} intead 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Deprecated 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AdapterView.OnItemClickListener getItemClickListener() { 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mItemClickListener; 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the listener that is notified whenever the user selects an 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * item in the drop down list.</p> 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the item selected listener 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @deprecated Use {@link #getOnItemSelectedListener()} intead 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Deprecated 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AdapterView.OnItemSelectedListener getItemSelectedListener() { 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mItemSelectedListener; 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the listener that is notified whenever the user clicks an item 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the drop down list.</p> 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the item click listener 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AdapterView.OnItemClickListener getOnItemClickListener() { 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mItemClickListener; 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the listener that is notified whenever the user selects an 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * item in the drop down list.</p> 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the item selected listener 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AdapterView.OnItemSelectedListener getOnItemSelectedListener() { 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mItemSelectedListener; 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns a filterable list adapter used for auto completion.</p> 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a data adapter used for auto completion 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ListAdapter getAdapter() { 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAdapter; 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Changes the list of data used for auto completion. The provided list 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * must be a filterable list adapter.</p> 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The caller is still responsible for managing any resources used by the adapter. 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Notably, when the AutoCompleteTextView is closed or released, the adapter is not notified. 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A common case is the use of {@link android.widget.CursorAdapter}, which 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * contains a {@link android.database.Cursor} that must be closed. This can be done 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * automatically (see 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.app.Activity#startManagingCursor(android.database.Cursor) 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * startManagingCursor()}), 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or by manually closing the cursor when the AutoCompleteTextView is dismissed.</p> 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param adapter the adapter holding the auto completion data 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getAdapter() 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.widget.Filterable 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.widget.ListAdapter 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public <T extends ListAdapter & Filterable> void setAdapter(T adapter) { 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAdapter = adapter; 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAdapter != null) { 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //noinspection unchecked 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilter = ((Filterable) mAdapter).getFilter(); 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilter = null; 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDropDownList != null) { 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.setAdapter(mAdapter); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onKeyPreIme(int keyCode, KeyEvent event) { 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isPopupShowing()) { 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // special case for the back key, we do not even try to send it 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to the drop down list but instead, consume it immediately 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (keyCode == KeyEvent.KEYCODE_BACK) { 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissDropDown(); 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.onKeyPreIme(keyCode, event); 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onKeyUp(int keyCode, KeyEvent event) { 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isPopupShowing() && mDropDownList.getSelectedItemPosition() >= 0) { 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean consumed = mDropDownList.onKeyUp(keyCode, event); 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (consumed) { 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (keyCode) { 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if the list accepts the key events and the key event 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // was a click, the text view gets the selected item 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // from the drop down as its content 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case KeyEvent.KEYCODE_ENTER: 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case KeyEvent.KEYCODE_DPAD_CENTER: 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performCompletion(); 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.onKeyUp(keyCode, event); 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onKeyDown(int keyCode, KeyEvent event) { 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // when the drop down is shown, we drive it directly 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isPopupShowing()) { 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the key events are forwarded to the list in the drop down view 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // note that ListView handles space but we don't want that to happen 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // also if selection is not currently in the drop down, then don't 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // let center or enter presses go there since that would cause it 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to select one of its items 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (keyCode != KeyEvent.KEYCODE_SPACE 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (mDropDownList.getSelectedItemPosition() >= 0 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (keyCode != KeyEvent.KEYCODE_ENTER 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && keyCode != KeyEvent.KEYCODE_DPAD_CENTER))) { 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int curIndex = mDropDownList.getSelectedItemPosition(); 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean consumed; 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean below = !mPopup.isAboveAnchor(); 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((below && keyCode == KeyEvent.KEYCODE_DPAD_UP && curIndex <= 0) || 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (!below && keyCode == KeyEvent.KEYCODE_DPAD_DOWN && curIndex >= 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.getAdapter().getCount() - 1)) { 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // When the selection is at the top, we block the key 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // event to prevent focus from moving. 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.hideSelector(); 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.requestLayout(); 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.update(); 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project consumed = mDropDownList.onKeyDown(keyCode, event); 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "Key down: code=" + keyCode + " list consumed=" 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + consumed); 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (consumed) { 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If it handled the key event, then the user is 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // navigating in the list, so we should put it in front. 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED); 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Here's a little trick we need to do to make sure that 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the list view is actually showing its focus indicator, 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // by ensuring it has focus and getting its window out 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // of touch mode. 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.requestFocusFromTouch(); 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.update(); 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (keyCode) { 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // avoid passing the focus from the text view to the 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // next component 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case KeyEvent.KEYCODE_ENTER: 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case KeyEvent.KEYCODE_DPAD_CENTER: 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case KeyEvent.KEYCODE_DPAD_DOWN: 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case KeyEvent.KEYCODE_DPAD_UP: 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (below && keyCode == KeyEvent.KEYCODE_DPAD_DOWN) { 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // when the selection is at the bottom, we block the 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // event to avoid going to the next focusable widget 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Adapter adapter = mDropDownList.getAdapter(); 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (adapter != null && curIndex == adapter.getCount() - 1) { 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (!below && keyCode == KeyEvent.KEYCODE_DPAD_UP && curIndex == 0) { 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch(keyCode) { 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case KeyEvent.KEYCODE_DPAD_DOWN: 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performValidation(); 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastKeyCode = keyCode; 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean handled = super.onKeyDown(keyCode, event); 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastKeyCode = KeyEvent.KEYCODE_UNKNOWN; 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 576c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project if (handled && isPopupShowing() && mDropDownList != null) { 577c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project clearListSelection(); 578c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 579c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return handled; 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns <code>true</code> if the amount of text in the field meets 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or exceeds the {@link #getThreshold} requirement. You can override 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this to impose a different standard for when filtering will be 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * triggered. 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean enoughToFilter() { 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "Enough to filter: len=" + getText().length() 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " threshold=" + mThreshold); 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getText().length() >= mThreshold; 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is used to watch for edits to the text view. Note that we call 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to methods on the auto complete text view class so that we can access 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * private vars without going through thunks. 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class MyWatcher implements TextWatcher { 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void afterTextChanged(Editable s) { 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doAfterTextChanged(); 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void beforeTextChanged(CharSequence s, int start, int count, int after) { 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doBeforeTextChanged(); 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onTextChanged(CharSequence s, int start, int before, int count) { 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void doBeforeTextChanged() { 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBlockCompletion) return; 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // when text is changed, inserted or deleted, we attempt to show 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the drop down 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOpenBefore = isPopupShowing(); 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "before text changed: open=" + mOpenBefore); 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void doAfterTextChanged() { 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBlockCompletion) return; 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if the list was open before the keystroke, but closed afterwards, 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // then something in the keystroke processing (an input filter perhaps) 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // called performCompletion() and we shouldn't do any more processing. 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "after text changed: openBefore=" + mOpenBefore 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " open=" + isPopupShowing()); 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOpenBefore && !isPopupShowing()) { 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the drop down is shown only when a minimum number of characters 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // was typed in the text view 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (enoughToFilter()) { 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFilter != null) { 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performFiltering(getText(), mLastKeyCode); 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // drop down is automatically dismissed when enough characters 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // are deleted from the text view 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissDropDown(); 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFilter != null) { 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilter.filter(null); 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Indicates whether the popup menu is showing.</p> 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the popup menu is showing, false otherwise 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isPopupShowing() { 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPopup.isShowing(); 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Converts the selected item from the drop down list into a sequence 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of character that can be used in the edit box.</p> 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param selectedItem the item selected by the user for completion 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a sequence of characters representing the selected suggestion 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected CharSequence convertSelectionToString(Object selectedItem) { 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFilter.convertResultToString(selectedItem); 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Clear the list selection. This may only be temporary, as user input will often bring 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it back. 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clearListSelection() { 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDropDownList != null) { 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.hideSelector(); 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.requestLayout(); 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the position of the dropdown view selection. 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param position The position to move the selector to. 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setListSelection(int position) { 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPopup.isShowing() && (mDropDownList != null)) { 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.setSelection(position); 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ListView.setSelection() will call requestLayout() 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the position of the dropdown view selection, if there is one. Returns 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ListView#INVALID_POSITION ListView.INVALID_POSITION} if there is no dropdown or if 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * there is no selection. 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the position of the current selection, if there is one, or 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ListView#INVALID_POSITION ListView.INVALID_POSITION} if not. 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see ListView#getSelectedItemPosition() 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getListSelection() { 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPopup.isShowing() && (mDropDownList != null)) { 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDropDownList.getSelectedItemPosition(); 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ListView.INVALID_POSITION; 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 710ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * We're changing the adapter and its views so really, really clear everything out 711ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * @hide - for SearchDialog only 712ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project */ 713ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project public void resetListAndClearViews() { 714ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (mDropDownList != null) { 715ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mDropDownList.resetListAndClearViews(); 716ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 717ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 718ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 719ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project /** 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Starts filtering the content of the drop down list. The filtering 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pattern is the content of the edit box. Subclasses should override this 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method to filter with a different pattern, for instance a substring of 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>text</code>.</p> 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param text the filtering pattern 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param keyCode the last character inserted in the edit box; beware that 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this will be null when text is being added through a soft input method. 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings({ "UnusedDeclaration" }) 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void performFiltering(CharSequence text, int keyCode) { 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFilter.filter(text, this); 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Performs the text completion by converting the selected item from 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the drop down list into a string, replacing the text box's content with 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this string and finally dismissing the drop down menu.</p> 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void performCompletion() { 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performCompletion(null, -1, -1); 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onCommitCompletion(CompletionInfo completion) { 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isPopupShowing()) { 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBlockCompletion = true; 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project replaceText(completion.getText()); 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBlockCompletion = false; 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mItemClickListener != null) { 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final DropDownListView list = mDropDownList; 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Note that we don't have a View here, so we will need to 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // supply null. Hopefully no existing apps crash... 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mItemClickListener.onItemClick(list, null, completion.getPosition(), 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project completion.getId()); 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void performCompletion(View selectedView, int position, long id) { 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isPopupShowing()) { 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object selectedItem; 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (position < 0) { 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project selectedItem = mDropDownList.getSelectedItem(); 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project selectedItem = mAdapter.getItem(position); 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (selectedItem == null) { 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "performCompletion: no selected item"); 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBlockCompletion = true; 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project replaceText(convertSelectionToString(selectedItem)); 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBlockCompletion = false; 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mItemClickListener != null) { 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final DropDownListView list = mDropDownList; 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (selectedView == null || position < 0) { 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project selectedView = list.getSelectedView(); 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project position = list.getSelectedItemPosition(); 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project id = list.getSelectedItemId(); 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mItemClickListener.onItemClick(list, selectedView, position, id); 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissDropDown(); 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Identifies whether the view is currently performing a text completion, so subclasses 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can decide whether to respond to text changed events. 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isPerformingCompletion() { 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBlockCompletion; 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Performs the text completion by replacing the current text by the 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * selected item. Subclasses should override this method to avoid replacing 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the whole content of the edit box.</p> 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param text the selected suggestion in the drop down list 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void replaceText(CharSequence text) { 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setText(text); 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // make sure we keep the caret at the end of the text view 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Editable spannable = getText(); 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Selection.setSelection(spannable, spannable.length()); 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onFilterComplete(int count) { 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAttachCount <= 0) return; 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This checks enoughToFilter() again because filtering requests 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are asynchronous, so the result may come back after enough text 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has since been deleted to make it no longer appropriate 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to filter. 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (count > 0 && enoughToFilter()) { 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasFocus() && hasWindowFocus()) { 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showDropDown(); 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissDropDown(); 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onWindowFocusChanged(boolean hasWindowFocus) { 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onWindowFocusChanged(hasWindowFocus); 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performValidation(); 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!hasWindowFocus) { 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissDropDown(); 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onFocusChanged(focused, direction, previouslyFocusedRect); 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performValidation(); 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!focused) { 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissDropDown(); 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onAttachedToWindow() { 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onAttachedToWindow(); 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAttachCount++; 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onDetachedFromWindow() { 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissDropDown(); 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAttachCount--; 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onDetachedFromWindow(); 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Closes the drop down if present on screen.</p> 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dismissDropDown() { 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputMethodManager imm = InputMethodManager.peekInstance(); 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imm != null) { 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imm.displayCompletions(this, null); 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.dismiss(); 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.setContentView(null); 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList = null; 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean setFrame(int l, int t, int r, int b) { 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean result = super.setFrame(l, t, r, b); 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPopup.isShowing()) { 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.update(this, r - l, -1); 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Used for lazy instantiation of the anchor view from the id we have. If the value of 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The 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 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the default anchoring point.</p> 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private View getDropDownAnchorView() { 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDropDownAnchorView == null && mDropDownAnchorId != View.NO_ID) { 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownAnchorView = getRootView().findViewById(mDropDownAnchorId); 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDropDownAnchorView == null ? this : mDropDownAnchorView; 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Displays the drop down on screen.</p> 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void showDropDown() { 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int height = buildDropDown(); 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPopup.isShowing()) { 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int widthSpec; 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDropDownWidth == ViewGroup.LayoutParams.FILL_PARENT) { 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The call to PopupWindow's update method below can accept -1 for any 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // value you do not want to update. 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project widthSpec = -1; 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (mDropDownWidth == ViewGroup.LayoutParams.WRAP_CONTENT) { 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project widthSpec = getDropDownAnchorView().getWidth(); 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project widthSpec = mDropDownWidth; 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.update(getDropDownAnchorView(), mDropDownHorizontalOffset, 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownVerticalOffset, widthSpec, height); 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDropDownWidth == ViewGroup.LayoutParams.FILL_PARENT) { 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.setWindowLayoutMode(ViewGroup.LayoutParams.FILL_PARENT, 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ViewGroup.LayoutParams.WRAP_CONTENT); 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.setWindowLayoutMode(0, ViewGroup.LayoutParams.WRAP_CONTENT); 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDropDownWidth == ViewGroup.LayoutParams.WRAP_CONTENT) { 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.setWidth(getDropDownAnchorView().getWidth()); 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.setWidth(mDropDownWidth); 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.setHeight(height); 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.setOutsideTouchable(true); 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.setTouchInterceptor(new PopupTouchIntercepter()); 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.showAsDropDown(getDropDownAnchorView(), 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownHorizontalOffset, mDropDownVerticalOffset); 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.setSelection(ListView.INVALID_POSITION); 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.hideSelector(); 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.requestFocus(); 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project post(mHideSelector); 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Builds the popup window's content and returns the height the popup 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should have. Returns -1 when the content already exists.</p> 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the content's height or -1 if content already exists 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int buildDropDown() { 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ViewGroup dropDownView; 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int otherHeights = 0; 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAdapter != null) { 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputMethodManager imm = InputMethodManager.peekInstance(); 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (imm != null) { 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = mAdapter.getCount(); 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 20) N = 20; 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CompletionInfo[] completions = new CompletionInfo[N]; 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object item = mAdapter.getItem(i); 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long id = mAdapter.getItemId(i); 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project completions[i] = new CompletionInfo(id, i, 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project convertSelectionToString(item)); 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imm.displayCompletions(this, completions); 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDropDownList == null) { 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Context context = getContext(); 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHideSelector = new ListSelectorHider(); 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList = new DropDownListView(context); 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.setSelector(mDropDownListHighlight); 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.setAdapter(mAdapter); 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.setVerticalFadingEdgeEnabled(true); 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.setOnItemClickListener(mDropDownItemClickListener); 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.setFocusable(true); 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.setFocusableInTouchMode(true); 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mItemSelectedListener != null) { 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.setOnItemSelectedListener(mItemSelectedListener); 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dropDownView = mDropDownList; 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View hintView = getHintView(context); 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hintView != null) { 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if an hint has been specified, we accomodate more space for it and 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // add a text view in the drop down menu, at the bottom of the list 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LinearLayout hintContainer = new LinearLayout(context); 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hintContainer.setOrientation(LinearLayout.VERTICAL); 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LinearLayout.LayoutParams hintParams = new LinearLayout.LayoutParams( 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ViewGroup.LayoutParams.FILL_PARENT, 0, 1.0f 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ); 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hintContainer.addView(dropDownView, hintParams); 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hintContainer.addView(hintView); 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // measure the hint's height to find how much more vertical space 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we need to add to the drop down's height 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int widthSpec = MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST); 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int heightSpec = MeasureSpec.UNSPECIFIED; 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hintView.measure(widthSpec, heightSpec); 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hintParams = (LinearLayout.LayoutParams) hintView.getLayoutParams(); 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project otherHeights = hintView.getMeasuredHeight() + hintParams.topMargin 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + hintParams.bottomMargin; 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dropDownView = hintContainer; 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.setContentView(dropDownView); 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dropDownView = (ViewGroup) mPopup.getContentView(); 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View view = dropDownView.findViewById(HINT_VIEW_ID); 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (view != null) { 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LinearLayout.LayoutParams hintParams = 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (LinearLayout.LayoutParams) view.getLayoutParams(); 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project otherHeights = view.getMeasuredHeight() + hintParams.topMargin 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + hintParams.bottomMargin; 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Max height available on the screen for a popup anchored to us 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int maxHeight = mPopup.getMaxAvailableHeight(this, mDropDownVerticalOffset); 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //otherHeights += dropDownView.getPaddingTop() + dropDownView.getPaddingBottom(); 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDropDownList.measureHeightOfChildren(MeasureSpec.UNSPECIFIED, 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0, ListView.NO_POSITION, maxHeight - otherHeights, 2) + otherHeights; 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private View getHintView(Context context) { 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mHintText != null && mHintText.length() > 0) { 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final TextView hintView = (TextView) LayoutInflater.from(context).inflate( 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHintResource, null).findViewById(com.android.internal.R.id.text1); 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hintView.setText(mHintText); 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hintView.setId(HINT_VIEW_ID); 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return hintView; 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the validator used to perform text validation. 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param validator The validator used to validate the text entered in this widget. 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getValidator() 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #performValidation() 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setValidator(Validator validator) { 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mValidator = validator; 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the Validator set with {@link #setValidator}, 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or <code>null</code> if it was not set. 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setValidator(android.widget.AutoCompleteTextView.Validator) 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #performValidation() 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Validator getValidator() { 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mValidator; 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If a validator was set on this view and the current string is not valid, 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ask the validator to fix it. 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getValidator() 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setValidator(android.widget.AutoCompleteTextView.Validator) 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void performValidation() { 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mValidator == null) return; 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence text = getText(); 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!TextUtils.isEmpty(text) && !mValidator.isValid(text)) { 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setText(mValidator.fixText(text)); 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the Filter obtained from {@link Filterable#getFilter}, 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or <code>null</code> if {@link #setAdapter} was not called with 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a Filterable. 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected Filter getFilter() { 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFilter; 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class ListSelectorHider implements Runnable { 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDropDownList != null) { 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.hideSelector(); 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDropDownList.requestLayout(); 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class PopupTouchIntercepter implements OnTouchListener { 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onTouch(View v, MotionEvent event) { 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (event.getAction() == MotionEvent.ACTION_DOWN) { 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED); 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopup.update(); 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class DropDownItemClickListener implements AdapterView.OnItemClickListener { 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onItemClick(AdapterView parent, View v, int position, long id) { 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performCompletion(v, position, id); 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Wrapper class for a ListView. This wrapper hijacks the focus to 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * make sure the list uses the appropriate drawables and states when 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * displayed on screen within a drop down. The focus is never actually 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * passed to the drop down; the list only looks focused.</p> 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static class DropDownListView extends ListView { 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Creates a new list view wrapper.</p> 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context this view's context 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DropDownListView(Context context) { 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, null, com.android.internal.R.attr.dropDownListViewStyle); 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Avoids jarring scrolling effect by ensuring that list elements 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * made of a text view fit on a single line.</p> 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param position the item index in the list to get a view for 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the view for the specified item 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected View obtainView(int position) { 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View view = super.obtainView(position); 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (view instanceof TextView) { 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((TextView) view).setHorizontallyScrolling(true); 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return view; 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the top padding of the currently selected view.</p> 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the height of the top padding for the selection 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getSelectionPaddingTop() { 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSelectionTopPadding; 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the bottom padding of the currently selected view.</p> 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the height of the bottom padding for the selection 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getSelectionPaddingBottom() { 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSelectionBottomPadding; 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the focus state in the drop down.</p> 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true always 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasWindowFocus() { 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the focus state in the drop down.</p> 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true always 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isFocused() { 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Returns the focus state in the drop down.</p> 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true always 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasFocus() { 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected int[] onCreateDrawableState(int extraSpace) { 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] res = super.onCreateDrawableState(extraSpace); 1204c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project //noinspection ConstantIfStatement 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder sb = new StringBuilder("Created drawable state: ["); 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<res.length; i++) { 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i > 0) sb.append(", "); 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("0x"); 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(Integer.toHexString(res[i])); 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("]"); 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, sb.toString()); 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This interface is used to make sure that the text entered in this TextView complies to 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a certain format. Since there is no foolproof way to prevent the user from leaving 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this View with an incorrect value in it, all we can do is try to fix it ourselves 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when this happens. 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface Validator { 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Validates the specified text. 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true If the text currently in the text editor is valid. 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #fixText(CharSequence) 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean isValid(CharSequence text); 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Corrects the specified text to make it valid. 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param invalidText A string that doesn't pass validation: isValid(invalidText) 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * returns false 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A string based on invalidText such as invoking isValid() on it returns true. 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isValid(CharSequence) 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence fixText(CharSequence invalidText); 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1248