19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 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.telephony;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19e713576292fc72086de47066981b86ad2f27ab0fShaopeng Jiaimport com.android.i18n.phonenumbers.AsYouTypeFormatter;
20e713576292fc72086de47066981b86ad2f27ab0fShaopeng Jiaimport com.android.i18n.phonenumbers.PhoneNumberUtil;
21ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao
22ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Taoimport android.telephony.PhoneNumberUtils;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.Editable;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.Selection;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextWatcher;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Locale;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
305ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn * Watches a {@link android.widget.TextView} and if a phone number is entered
315ddd127d5a38d80c0d8087d1770f41f61f84f048Dianne Hackborn * will format it.
32ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao * <p>
33ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao * Stop formatting when the user
34ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao * <ul>
35ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao * <li>Inputs non-dialable characters</li>
36ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao * <li>Removes the separator in the middle of string.</li>
37ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao * </ul>
38ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao * <p>
39ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao * The formatting will be restarted once the text is cleared.
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class PhoneNumberFormattingTextWatcher implements TextWatcher {
42ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    /**
43ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao     * One or more characters were removed from the end.
44ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao     */
45ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    private final static int STATE_REMOVE_LAST = 0;
46ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao
47ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    /**
48ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao     * One or more characters were appended.
49ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao     */
50ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    private final static int STATE_APPEND = 1;
51ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao
52ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    /**
53ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao     * One or more digits were changed in the beginning or the middle of text.
54ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao     */
55ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    private final static int STATE_MODIFY_DIGITS = 2;
56ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao
57ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    /**
58ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao     * The changes other than the above.
59ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao     */
60ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    private final static int STATE_OTHER = 3;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    /**
63ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao     * The state of this change could be one value of the above
64ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao     */
65ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    private int mState;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
67ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    /**
68ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao     * Indicates the change was caused by ourselves.
69ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao     */
70ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    private boolean mSelfChange = false;
71ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao
72ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    /**
73ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao     * Indicates the formatting has been stopped.
74ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao     */
75ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    private boolean mStopFormatting;
76ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao
77ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    private AsYouTypeFormatter mFormatter;
78ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao
79ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    /**
80ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao     * The formatting is based on the current system locale and future locale changes
81ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao     * may not take effect on this instance.
82ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao     */
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PhoneNumberFormattingTextWatcher() {
841e80299bd4761df8328be15476ca88f2d1f9b1d8Bai Tao        this(Locale.getDefault().getCountry());
85ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    }
86ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao
87ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    /**
88ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao     * The formatting is based on the given <code>countryCode</code>.
89ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao     *
90ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao     * @param countryCode the ISO 3166-1 two-letter country code that indicates the country/region
91ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao     * where the phone number is being entered.
92ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao     *
93ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao     * @hide
94ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao     */
95ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    public PhoneNumberFormattingTextWatcher(String countryCode) {
961e80299bd4761df8328be15476ca88f2d1f9b1d8Bai Tao        if (countryCode == null) throw new IllegalArgumentException();
97ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        mFormatter = PhoneNumberUtil.getInstance().getAsYouTypeFormatter(countryCode);
98ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    }
99ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao
100ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    public void beforeTextChanged(CharSequence s, int start, int count,
101ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            int after) {
102ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        if (mSelfChange || mStopFormatting) {
103ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            return;
104ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        }
105ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        if (count == 0 && s.length() == start) {
106ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            // Append one or more new chars
107ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            mState = STATE_APPEND;
108ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        } else if (after == 0 && start + count == s.length() && count > 0) {
109ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            // Remove one or more chars from the end of string.
110ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            mState = STATE_REMOVE_LAST;
111ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        } else if (count > 0 && !hasSeparator(s, start, count)) {
112ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            // Remove the dialable chars in the begin or middle of text.
113ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            mState = STATE_MODIFY_DIGITS;
114ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        } else {
115ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            mState = STATE_OTHER;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
119ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    public void onTextChanged(CharSequence s, int start, int before, int count) {
120ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        if (mSelfChange || mStopFormatting) {
121ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            return;
122ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        }
123ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        if (mState == STATE_OTHER) {
124ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            if (count > 0 && !hasSeparator(s, start, count)) {
125ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao                // User inserted the dialable characters in the middle of text.
126ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao                mState = STATE_MODIFY_DIGITS;
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
128ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        }
129ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        // Check whether we should stop formatting.
130ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        if (mState == STATE_APPEND && count > 0 && hasSeparator(s, start, count)) {
131ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            // User appended the non-dialable character, stop formatting.
132ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            stopFormatting();
133ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        } else if (mState == STATE_OTHER) {
134ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            // User must insert or remove the non-dialable characters in the begin or middle of
1351e80299bd4761df8328be15476ca88f2d1f9b1d8Bai Tao            // number, stop formatting.
136ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            stopFormatting();
137ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        }
138ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    }
13904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
140ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    public synchronized void afterTextChanged(Editable s) {
141ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        if (mStopFormatting) {
142ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            // Restart the formatting when all texts were clear.
143ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            mStopFormatting = !(s.length() == 0);
144ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            return;
145ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        }
146ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        if (mSelfChange) {
147ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            // Ignore the change caused by s.replace().
148ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            return;
149ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        }
150ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        String formatted = reformat(s, Selection.getSelectionEnd(s));
151ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        if (formatted != null) {
152ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            int rememberedPos = mFormatter.getRememberedPosition();
153ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            mSelfChange = true;
154ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            s.replace(0, s.length(), formatted, 0, formatted.length());
155ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            // The text could be changed by other TextWatcher after we changed it. If we found the
156ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            // text is not the one we were expecting, just give up calling setSelection().
157ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            if (formatted.equals(s.toString())) {
158ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao                Selection.setSelection(s, rememberedPos);
159ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            }
160ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            mSelfChange = false;
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
164ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    /**
165ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao     * Generate the formatted number by ignoring all non-dialable chars and stick the cursor to the
166ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao     * nearest dialable char to the left. For instance, if the number is  (650) 123-45678 and '4' is
167ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao     * removed then the cursor should be behind '3' instead of '-'.
168ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao     */
169ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    private String reformat(CharSequence s, int cursor) {
170ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        // The index of char to the leftward of the cursor.
171ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        int curIndex = cursor - 1;
172ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        String formatted = null;
173ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        mFormatter.clear();
174ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        char lastNonSeparator = 0;
175ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        boolean hasCursor = false;
176ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        int len = s.length();
177ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        for (int i = 0; i < len; i++) {
178ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            char c = s.charAt(i);
179ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            if (PhoneNumberUtils.isNonSeparator(c)) {
180ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao                if (lastNonSeparator != 0) {
181ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao                    formatted = getFormattedNumber(lastNonSeparator, hasCursor);
182ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao                    hasCursor = false;
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
184ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao                lastNonSeparator = c;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
186ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            if (i == curIndex) {
187ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao                hasCursor = true;
188ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            }
189ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        }
190ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        if (lastNonSeparator != 0) {
191ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            formatted = getFormattedNumber(lastNonSeparator, hasCursor);
19204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        }
193ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        return formatted;
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
196ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    private String getFormattedNumber(char lastNonSeparator, boolean hasCursor) {
197ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        return hasCursor ? mFormatter.inputDigitAndRememberPosition(lastNonSeparator)
198ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao                : mFormatter.inputDigit(lastNonSeparator);
199ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    }
200ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao
201ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    private void stopFormatting() {
202ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        mStopFormatting = true;
203ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        mFormatter.clear();
204ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    }
205ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao
206ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao    private boolean hasSeparator(final CharSequence s, final int start, final int count) {
207ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        for (int i = start; i < start + count; i++) {
208ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            char c = s.charAt(i);
209ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            if (!PhoneNumberUtils.isNonSeparator(c)) {
210ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao                return true;
211ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao            }
212ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        }
213ef4fd8e12e1928b1e9cdc03378bb1185d9e05cbeBai Tao        return false;
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
216