diff options
Diffstat (limited to 'telephony/java/android/telephony/PhoneNumberFormattingTextWatcher.java')
-rw-r--r-- | telephony/java/android/telephony/PhoneNumberFormattingTextWatcher.java | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/telephony/java/android/telephony/PhoneNumberFormattingTextWatcher.java b/telephony/java/android/telephony/PhoneNumberFormattingTextWatcher.java new file mode 100644 index 0000000..0bc6c04 --- /dev/null +++ b/telephony/java/android/telephony/PhoneNumberFormattingTextWatcher.java @@ -0,0 +1,98 @@ +/* + * 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 + } +} |