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