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