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