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.text.method; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.InputType; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.Spanned; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.SpannableStringBuilder; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For digits-only text entry 27405bc51c5dc73846a4abdc325cd234eb2d37469fJean Chalard * <p></p> 28405bc51c5dc73846a4abdc325cd234eb2d37469fJean Chalard * As for all implementations of {@link KeyListener}, this class is only concerned 29405bc51c5dc73846a4abdc325cd234eb2d37469fJean Chalard * with hardware keyboards. Software input methods have no obligation to trigger 30405bc51c5dc73846a4abdc325cd234eb2d37469fJean Chalard * the methods in this class. 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class DigitsKeyListener extends NumberKeyListener 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private char[] mAccepted; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mSign; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mDecimal; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int SIGN = 1; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int DECIMAL = 2; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected char[] getAcceptedChars() { 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAccepted; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The characters that are used. 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see KeyEvent#getMatch 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getAcceptedChars 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final char[][] CHARACTERS = new char[][] { 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }, 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-' }, 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.' }, 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '.' }, 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Allocates a DigitsKeyListener that accepts the digits 0 through 9. 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DigitsKeyListener() { 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(false, false); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Allocates a DigitsKeyListener that accepts the digits 0 through 9, 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * plus the minus sign (only at the beginning) and/or decimal point 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (only one per field) if specified. 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DigitsKeyListener(boolean sign, boolean decimal) { 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSign = sign; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDecimal = decimal; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int kind = (sign ? SIGN : 0) | (decimal ? DECIMAL : 0); 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAccepted = CHARACTERS[kind]; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a DigitsKeyListener that accepts the digits 0 through 9. 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static DigitsKeyListener getInstance() { 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getInstance(false, false); 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a DigitsKeyListener that accepts the digits 0 through 9, 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * plus the minus sign (only at the beginning) and/or decimal point 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (only one per field) if specified. 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static DigitsKeyListener getInstance(boolean sign, boolean decimal) { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int kind = (sign ? SIGN : 0) | (decimal ? DECIMAL : 0); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sInstance[kind] != null) 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sInstance[kind]; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sInstance[kind] = new DigitsKeyListener(sign, decimal); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sInstance[kind]; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a DigitsKeyListener that accepts only the characters 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that appear in the specified String. Note that not all characters 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * may be available on every keyboard. 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static DigitsKeyListener getInstance(String accepted) { 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: do we need a cache of these to avoid allocating? 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DigitsKeyListener dim = new DigitsKeyListener(); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dim.mAccepted = new char[accepted.length()]; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project accepted.getChars(0, accepted.length(), dim.mAccepted, 0); 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return dim; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getInputType() { 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int contentType = InputType.TYPE_CLASS_NUMBER; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSign) { 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project contentType |= InputType.TYPE_NUMBER_FLAG_SIGNED; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDecimal) { 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project contentType |= InputType.TYPE_NUMBER_FLAG_DECIMAL; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return contentType; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence filter(CharSequence source, int start, int end, 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Spanned dest, int dstart, int dend) { 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence out = super.filter(source, start, end, dest, dstart, dend); 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSign == false && mDecimal == false) { 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return out; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (out != null) { 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source = out; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project start = 0; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project end = out.length(); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int sign = -1; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int decimal = -1; 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int dlen = dest.length(); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Find out if the existing text has '-' or '.' characters. 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < dstart; i++) { 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char c = dest.charAt(i); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c == '-') { 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sign = i; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (c == '.') { 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project decimal = i; 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = dend; i < dlen; i++) { 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char c = dest.charAt(i); 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c == '-') { 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ""; // Nothing can be inserted in front of a '-'. 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (c == '.') { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project decimal = i; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If it does, we must strip them out from the source. 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * In addition, '-' must be the very first character, 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and nothing can be inserted before an existing '-'. 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Go in reverse order so the offsets are stable. 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SpannableStringBuilder stripped = null; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = end - 1; i >= start; i--) { 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char c = source.charAt(i); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean strip = false; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c == '-') { 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i != start || dstart != 0) { 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project strip = true; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (sign >= 0) { 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project strip = true; 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sign = i; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (c == '.') { 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (decimal >= 0) { 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project strip = true; 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project decimal = i; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strip) { 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (end == start + 1) { 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ""; // Only one character, and it was stripped. 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (stripped == null) { 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stripped = new SpannableStringBuilder(source, start, end); 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stripped.delete(i - start, i + 1 - start); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (stripped != null) { 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return stripped; 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (out != null) { 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return out; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static DigitsKeyListener[] sInstance = new DigitsKeyListener[4]; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 223