19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 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.view.KeyEvent; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.Editable; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.InputFilter; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.Selection; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.Spannable; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.Spanned; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextWatcher; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.method.DialerKeyListener; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.method.KeyListener; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.method.TextKeyListener; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class DialerFilter extends RelativeLayout 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DialerFilter(Context context) { 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context); 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DialerFilter(Context context, AttributeSet attrs) { 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs); 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onFinishInflate() { 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onFinishInflate(); 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Setup the filter view 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputFilters = new InputFilter[] { new InputFilter.AllCaps() }; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHint = (EditText) findViewById(com.android.internal.R.id.hint); 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mHint == null) { 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalStateException("DialerFilter must have a child EditText named hint"); 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHint.setFilters(mInputFilters); 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLetters = mHint; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLetters.setKeyListener(TextKeyListener.getInstance()); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLetters.setMovementMethod(null); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLetters.setFocusable(false); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Setup the digits view 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPrimary = (EditText) findViewById(com.android.internal.R.id.primary); 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPrimary == null) { 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalStateException("DialerFilter must have a child EditText named primary"); 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPrimary.setFilters(mInputFilters); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDigits = mPrimary; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDigits.setKeyListener(DialerKeyListener.getInstance()); 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDigits.setMovementMethod(null); 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDigits.setFocusable(false); 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Look for an icon 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIcon = (ImageView) findViewById(com.android.internal.R.id.icon); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Setup focus & highlight for this view 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setFocusable(true); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // XXX Force the mode to QWERTY for now, since 12-key isn't supported 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIsQwerty = true; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMode(DIGITS_AND_LETTERS); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Only show the icon view when focused, if there is one. 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onFocusChanged(focused, direction, previouslyFocusedRect); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIcon != null) { 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIcon.setVisibility(focused ? View.VISIBLE : View.GONE); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isQwertyKeyboard() { 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIsQwerty; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onKeyDown(int keyCode, KeyEvent event) { 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean handled = false; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (keyCode) { 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case KeyEvent.KEYCODE_DPAD_UP: 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case KeyEvent.KEYCODE_DPAD_DOWN: 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case KeyEvent.KEYCODE_DPAD_LEFT: 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case KeyEvent.KEYCODE_DPAD_RIGHT: 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case KeyEvent.KEYCODE_ENTER: 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case KeyEvent.KEYCODE_DPAD_CENTER: 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case KeyEvent.KEYCODE_DEL: 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (mMode) { 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DIGITS_AND_LETTERS: 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project handled = mDigits.onKeyDown(keyCode, event); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project handled &= mLetters.onKeyDown(keyCode, event); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DIGITS_AND_LETTERS_NO_DIGITS: 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project handled = mLetters.onKeyDown(keyCode, event); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mLetters.getText().length() == mDigits.getText().length()) { 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMode(DIGITS_AND_LETTERS); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DIGITS_AND_LETTERS_NO_LETTERS: 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDigits.getText().length() == mLetters.getText().length()) { 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLetters.onKeyDown(keyCode, event); 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMode(DIGITS_AND_LETTERS); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project handled = mDigits.onKeyDown(keyCode, event); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DIGITS_ONLY: 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project handled = mDigits.onKeyDown(keyCode, event); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case LETTERS_ONLY: 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project handled = mLetters.onKeyDown(keyCode, event); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //mIsQwerty = msg.getKeyIsQwertyKeyboard(); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (mMode) { 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DIGITS_AND_LETTERS: 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project handled = mLetters.onKeyDown(keyCode, event); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pass this throw so the shift state is correct (for example, 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // on a standard QWERTY keyboard, * and 8 are on the same key) 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (KeyEvent.isModifierKey(keyCode)) { 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDigits.onKeyDown(keyCode, event); 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project handled = true; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Only check to see if the digit is valid if the key is a printing key 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // in the TextKeyListener. This prevents us from hiding the digits 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // line when keys like UP and DOWN are hit. 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // XXX note that KEYCODE_TAB is special-cased here for 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // devices that share tab and 0 on a single key. 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean isPrint = event.isPrintingKey(); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isPrint || keyCode == KeyEvent.KEYCODE_SPACE 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || keyCode == KeyEvent.KEYCODE_TAB) { 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char c = event.getMatch(DialerKeyListener.CHARACTERS); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c != 0) { 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project handled &= mDigits.onKeyDown(keyCode, event); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMode(DIGITS_AND_LETTERS_NO_DIGITS); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DIGITS_AND_LETTERS_NO_LETTERS: 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DIGITS_ONLY: 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project handled = mDigits.onKeyDown(keyCode, event); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DIGITS_AND_LETTERS_NO_DIGITS: 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case LETTERS_ONLY: 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project handled = mLetters.onKeyDown(keyCode, event); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!handled) { 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.onKeyDown(keyCode, event); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onKeyUp(int keyCode, KeyEvent event) { 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean a = mLetters.onKeyUp(keyCode, event); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean b = mDigits.onKeyUp(keyCode, event); 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a || b; 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getMode() { 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMode; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Change the mode of the widget. 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param newMode The mode to switch to. 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setMode(int newMode) { 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (newMode) { 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DIGITS_AND_LETTERS: 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project makeDigitsPrimary(); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLetters.setVisibility(View.VISIBLE); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDigits.setVisibility(View.VISIBLE); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DIGITS_ONLY: 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project makeDigitsPrimary(); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLetters.setVisibility(View.GONE); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDigits.setVisibility(View.VISIBLE); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case LETTERS_ONLY: 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project makeLettersPrimary(); 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLetters.setVisibility(View.VISIBLE); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDigits.setVisibility(View.GONE); 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DIGITS_AND_LETTERS_NO_LETTERS: 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project makeDigitsPrimary(); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLetters.setVisibility(View.INVISIBLE); 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDigits.setVisibility(View.VISIBLE); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DIGITS_AND_LETTERS_NO_DIGITS: 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project makeLettersPrimary(); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLetters.setVisibility(View.VISIBLE); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDigits.setVisibility(View.INVISIBLE); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int oldMode = mMode; 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMode = newMode; 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onModeChange(oldMode, newMode); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void makeLettersPrimary() { 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPrimary == mDigits) { 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project swapPrimaryAndHint(true); 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void makeDigitsPrimary() { 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPrimary == mLetters) { 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project swapPrimaryAndHint(false); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void swapPrimaryAndHint(boolean makeLettersPrimary) { 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Editable lettersText = mLetters.getText(); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Editable digitsText = mDigits.getText(); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project KeyListener lettersInput = mLetters.getKeyListener(); 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project KeyListener digitsInput = mDigits.getKeyListener(); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (makeLettersPrimary) { 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLetters = mPrimary; 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDigits = mHint; 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLetters = mHint; 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDigits = mPrimary; 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLetters.setKeyListener(lettersInput); 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLetters.setText(lettersText); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lettersText = mLetters.getText(); 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Selection.setSelection(lettersText, lettersText.length()); 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDigits.setKeyListener(digitsInput); 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDigits.setText(digitsText); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project digitsText = mDigits.getText(); 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Selection.setSelection(digitsText, digitsText.length()); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Reset the filters 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPrimary.setFilters(mInputFilters); 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHint.setFilters(mInputFilters); 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence getLetters() { 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mLetters.getVisibility() == View.VISIBLE) { 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLetters.getText(); 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ""; 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence getDigits() { 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDigits.getVisibility() == View.VISIBLE) { 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDigits.getText(); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ""; 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence getFilterText() { 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMode != DIGITS_ONLY) { 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getLetters(); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getDigits(); 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void append(String text) { 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (mMode) { 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DIGITS_AND_LETTERS: 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDigits.getText().append(text); 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLetters.getText().append(text); 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DIGITS_AND_LETTERS_NO_LETTERS: 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DIGITS_ONLY: 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDigits.getText().append(text); 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DIGITS_AND_LETTERS_NO_DIGITS: 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case LETTERS_ONLY: 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLetters.getText().append(text); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Clears both the digits and the filter text. 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clearText() { 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Editable text; 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text = mLetters.getText(); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text.clear(); 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text = mDigits.getText(); 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text.clear(); 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Reset the mode based on the hardware type 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIsQwerty) { 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMode(DIGITS_AND_LETTERS); 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMode(DIGITS_ONLY); 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setLettersWatcher(TextWatcher watcher) { 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence text = mLetters.getText(); 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Spannable span = (Spannable)text; 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project span.setSpan(watcher, 0, text.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDigitsWatcher(TextWatcher watcher) { 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence text = mDigits.getText(); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Spannable span = (Spannable)text; 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project span.setSpan(watcher, 0, text.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setFilterWatcher(TextWatcher watcher) { 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMode != DIGITS_ONLY) { 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setLettersWatcher(watcher); 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setDigitsWatcher(watcher); 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeFilterWatcher(TextWatcher watcher) { 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Spannable text; 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMode != DIGITS_ONLY) { 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text = mLetters.getText(); 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text = mDigits.getText(); 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text.removeSpan(watcher); 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called right after the mode changes to give subclasses the option to 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * restyle, etc. 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onModeChange(int oldMode, int newMode) { 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** This mode has both lines */ 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int DIGITS_AND_LETTERS = 1; 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** This mode is when after starting in {@link #DIGITS_AND_LETTERS} mode the filter 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has removed all possibility of the digits matching, leaving only the letters line */ 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int DIGITS_AND_LETTERS_NO_DIGITS = 2; 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** This mode is when after starting in {@link #DIGITS_AND_LETTERS} mode the filter 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has removed all possibility of the letters matching, leaving only the digits line */ 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int DIGITS_AND_LETTERS_NO_LETTERS = 3; 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** This mode has only the digits line */ 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int DIGITS_ONLY = 4; 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** This mode has only the letters line */ 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int LETTERS_ONLY = 5; 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EditText mLetters; 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EditText mDigits; 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EditText mPrimary; 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EditText mHint; 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputFilter mInputFilters[]; 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ImageView mIcon; 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mMode; 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mIsQwerty; 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 418