/* * 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 } }