| /* |
| * Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package android.telephony; |
| |
| import android.text.Editable; |
| import android.text.Selection; |
| import android.text.TextWatcher; |
| import android.widget.TextView; |
| |
| import java.util.Locale; |
| |
| /** |
| * Watches a {@link TextView} and if a phone number is entered will format it using |
| * {@link PhoneNumberUtils#formatNumber(Editable, int)}. The formatting is based on |
| * the current system locale when this object is created and future locale changes |
| * may not take effect on this instance. |
| */ |
| public class PhoneNumberFormattingTextWatcher implements TextWatcher { |
| |
| static private int sFormatType; |
| static private Locale sCachedLocale; |
| private boolean mFormatting; |
| private boolean mDeletingHyphen; |
| private int mHyphenStart; |
| private boolean mDeletingBackward; |
| |
| public PhoneNumberFormattingTextWatcher() { |
| if (sCachedLocale == null || sCachedLocale != Locale.getDefault()) { |
| sCachedLocale = Locale.getDefault(); |
| sFormatType = PhoneNumberUtils.getFormatTypeForLocale(sCachedLocale); |
| } |
| } |
| |
| public synchronized void afterTextChanged(Editable text) { |
| // Make sure to ignore calls to afterTextChanged caused by the work done below |
| if (!mFormatting) { |
| mFormatting = true; |
| |
| // If deleting the hyphen, also delete the char before or after that |
| if (mDeletingHyphen && mHyphenStart > 0) { |
| if (mDeletingBackward) { |
| if (mHyphenStart - 1 < text.length()) { |
| text.delete(mHyphenStart - 1, mHyphenStart); |
| } |
| } else if (mHyphenStart < text.length()) { |
| text.delete(mHyphenStart, mHyphenStart + 1); |
| } |
| } |
| |
| PhoneNumberUtils.formatNumber(text, sFormatType); |
| |
| mFormatting = false; |
| } |
| } |
| |
| public void beforeTextChanged(CharSequence s, int start, int count, int after) { |
| // Check if the user is deleting a hyphen |
| if (!mFormatting) { |
| // Make sure user is deleting one char, without a selection |
| final int selStart = Selection.getSelectionStart(s); |
| final int selEnd = Selection.getSelectionEnd(s); |
| if (s.length() > 1 // Can delete another character |
| && count == 1 // Deleting only one character |
| && after == 0 // Deleting |
| && s.charAt(start) == '-' // a hyphen |
| && selStart == selEnd) { // no selection |
| mDeletingHyphen = true; |
| mHyphenStart = start; |
| // Check if the user is deleting forward or backward |
| if (selStart == start + 1) { |
| mDeletingBackward = true; |
| } else { |
| mDeletingBackward = false; |
| } |
| } else { |
| mDeletingHyphen = false; |
| } |
| } |
| } |
| |
| public void onTextChanged(CharSequence s, int start, int before, int count) { |
| // Does nothing |
| } |
| } |