summaryrefslogtreecommitdiffstats
path: root/telephony/java/android/telephony/PhoneNumberFormattingTextWatcher.java
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2009-03-03 19:31:44 -0800
committerThe Android Open Source Project <initial-contribution@android.com>2009-03-03 19:31:44 -0800
commit9066cfe9886ac131c34d59ed0e2d287b0e3c0087 (patch)
treed88beb88001f2482911e3d28e43833b50e4b4e97 /telephony/java/android/telephony/PhoneNumberFormattingTextWatcher.java
parentd83a98f4ce9cfa908f5c54bbd70f03eec07e7553 (diff)
downloadframeworks_base-9066cfe9886ac131c34d59ed0e2d287b0e3c0087.zip
frameworks_base-9066cfe9886ac131c34d59ed0e2d287b0e3c0087.tar.gz
frameworks_base-9066cfe9886ac131c34d59ed0e2d287b0e3c0087.tar.bz2
auto import from //depot/cupcake/@135843
Diffstat (limited to 'telephony/java/android/telephony/PhoneNumberFormattingTextWatcher.java')
-rw-r--r--telephony/java/android/telephony/PhoneNumberFormattingTextWatcher.java98
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
+ }
+}