10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/* 20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2008 The Android Open Source Project 30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License. 60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at 70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software 110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and 140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License. 150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 160825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony; 170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 180825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.PhoneNumberFormattingTextWatcher; 190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.test.AndroidTestCase; 208fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajanimport android.test.suitebuilder.annotation.SmallTest; 210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.text.Editable; 220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.text.Selection; 230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.text.SpannableStringBuilder; 240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.text.TextWatcher; 250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 268fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajanimport org.junit.Test; 278fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan 280825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class PhoneNumberWatcherTest extends AndroidTestCase { 298fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testAppendChars() { 310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville final String multiChars = "65012345"; 320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville final String formatted1 = "(650) 123-45"; 330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextWatcher textWatcher = getTextWatcher(); 340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SpannableStringBuilder number = new SpannableStringBuilder(); 350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Append more than one chars 360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.beforeTextChanged(number, 0, 0, multiChars.length()); 370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville number.append(multiChars); 380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Selection.setSelection(number, number.length()); 390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.onTextChanged(number, 0, 0, number.length()); 400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.afterTextChanged(number); 410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(formatted1, number.toString()); 420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(formatted1.length(), Selection.getSelectionEnd(number)); 430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Append one chars 440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville final char appendChar = '6'; 450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville final String formatted2 = "(650) 123-456"; 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int len = number.length(); 470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.beforeTextChanged(number, number.length(), 0, 1); 480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville number.append(appendChar); 490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Selection.setSelection(number, number.length()); 500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.onTextChanged(number, len, 0, 1); 510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.afterTextChanged(number); 520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(formatted2, number.toString()); 530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(formatted2.length(), Selection.getSelectionEnd(number)); 540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 568fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testRemoveLastChars() { 580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville final String init = "65012345678"; 590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville final String result1 = "(650) 123-4567"; 600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextWatcher textWatcher = getTextWatcher(); 610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Remove the last char. 620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SpannableStringBuilder number = new SpannableStringBuilder(init); 630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int len = number.length(); 640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.beforeTextChanged(number, len - 1, 1, 0); 650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville number.delete(len - 1, len); 660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Selection.setSelection(number, number.length()); 670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.onTextChanged(number, number.length() - 1, 1, 0); 680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.afterTextChanged(number); 690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(result1, number.toString()); 700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(result1.length(), Selection.getSelectionEnd(number)); 710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Remove last 5 chars 720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville final String result2 = "650-123"; 730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.beforeTextChanged(number, number.length() - 4, 4, 0); 740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville number.delete(number.length() - 5, number.length()); 750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Selection.setSelection(number, number.length()); 760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.onTextChanged(number, number.length(), 4, 0); 770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.afterTextChanged(number); 780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(result2, number.toString()); 790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(result2.length(), Selection.getSelectionEnd(number)); 800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 828fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testInsertChars() { 840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville final String init = "650-23"; 850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville final String expected1 = "650-123"; 860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextWatcher textWatcher = getTextWatcher(); 870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Insert one char 890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SpannableStringBuilder number = new SpannableStringBuilder(init); 900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.beforeTextChanged(number, 3, 0, 1); 910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville number.insert(3, "1"); // 6501-23 920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Selection.setSelection(number, 4); // make the cursor at right of 1 930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.onTextChanged(number, 3, 0, 1); 940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.afterTextChanged(number); 950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(expected1, number.toString()); 960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // the cursor should still at the right of '1' 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(5, Selection.getSelectionEnd(number)); 980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Insert multiple chars 1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville final String expected2 = "(650) 145-6723"; 1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.beforeTextChanged(number, 5, 0, 4); 1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville number.insert(5, "4567"); // change to 650-1456723 1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Selection.setSelection(number, 9); // the cursor is at the right of '7'. 1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.onTextChanged(number, 7, 0, 4); 1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.afterTextChanged(number); 1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(expected2, number.toString()); 1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // the cursor should be still at the right of '7' 1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(12, Selection.getSelectionEnd(number)); 1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1118fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testStopFormatting() { 1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville final String init = "(650) 123"; 1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville final String expected1 = "(650) 123 4"; 1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextWatcher textWatcher = getTextWatcher(); 1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Append space 1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SpannableStringBuilder number = new SpannableStringBuilder(init); 1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.beforeTextChanged(number, 9, 0, 2); 1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville number.insert(9, " 4"); // (6501) 23 4 1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Selection.setSelection(number, number.length()); // make the cursor at right of 4 1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.onTextChanged(number, 9, 0, 2); 1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.afterTextChanged(number); 1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(expected1, number.toString()); 1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // the cursor should still at the right of '1' 1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(expected1.length(), Selection.getSelectionEnd(number)); 1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Delete a ')' 1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville final String expected2 ="(650 123"; 1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher = getTextWatcher(); 1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville number = new SpannableStringBuilder(init); 1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.beforeTextChanged(number, 4, 1, 0); 1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville number.delete(4, 5); // (6501 23 4 1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Selection.setSelection(number, 5); // make the cursor at right of 1 1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.onTextChanged(number, 4, 1, 0); 1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.afterTextChanged(number); 1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(expected2, number.toString()); 1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // the cursor should still at the right of '1' 1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(5, Selection.getSelectionEnd(number)); 1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Insert a hyphen 1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville final String expected3 ="(650) 12-3"; 1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher = getTextWatcher(); 1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville number = new SpannableStringBuilder(init); 1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.beforeTextChanged(number, 8, 0, 1); 1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville number.insert(8, "-"); // (650) 12-3 1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Selection.setSelection(number, 9); // make the cursor at right of - 1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.onTextChanged(number, 8, 0, 1); 1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.afterTextChanged(number); 1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(expected3, number.toString()); 1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // the cursor should still at the right of '-' 1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(9, Selection.getSelectionEnd(number)); 1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1558fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testRestartFormatting() { 1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville final String init = "(650) 123"; 1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville final String expected1 = "(650) 123 4"; 1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextWatcher textWatcher = getTextWatcher(); 1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Append space 1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SpannableStringBuilder number = new SpannableStringBuilder(init); 1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.beforeTextChanged(number, 9, 0, 2); 1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville number.insert(9, " 4"); // (650) 123 4 1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Selection.setSelection(number, number.length()); // make the cursor at right of 4 1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.onTextChanged(number, 9, 0, 2); 1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.afterTextChanged(number); 1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(expected1, number.toString()); 1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // the cursor should still at the right of '4' 1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(expected1.length(), Selection.getSelectionEnd(number)); 1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Clear the current string, and start formatting again. 1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int len = number.length(); 1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.beforeTextChanged(number, 0, len, 0); 1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville number.delete(0, len); 1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.onTextChanged(number, 0, len, 0); 1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.afterTextChanged(number); 1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville final String expected2 = "650-1234"; 1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville number = new SpannableStringBuilder(init); 1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.beforeTextChanged(number, 9, 0, 1); 1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville number.insert(9, "4"); // (650) 1234 1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Selection.setSelection(number, number.length()); // make the cursor at right of 4 1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.onTextChanged(number, 9, 0, 1); 1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.afterTextChanged(number); 1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(expected2, number.toString()); 1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // the cursor should still at the right of '4' 1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(expected2.length(), Selection.getSelectionEnd(number)); 1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1918fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testTextChangedByOtherTextWatcher() { 1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville final TextWatcher cleanupTextWatcher = new TextWatcher() { 1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void afterTextChanged(Editable s) { 1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville s.clear(); 1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void beforeTextChanged(CharSequence s, int start, int count, 2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int after) { 2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void onTextChanged(CharSequence s, int start, int before, 2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int count) { 2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville }; 2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville final String init = "(650) 123"; 2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville final String expected1 = ""; 2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextWatcher textWatcher = getTextWatcher(); 2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SpannableStringBuilder number = new SpannableStringBuilder(init); 2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.beforeTextChanged(number, 5, 0, 1); 2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville number.insert(5, "4"); // (6504) 123 2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Selection.setSelection(number, 5); // make the cursor at right of 4 2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.onTextChanged(number, 5, 0, 1); 2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville number.setSpan(cleanupTextWatcher, 0, number.length(), 0); 2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.afterTextChanged(number); 2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(expected1, number.toString()); 2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Test the case where some other component is auto-completing what the user is typing 2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 2268fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testAutoCompleteWithFormattedNumber() { 2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String init = "650-1"; 2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String expected = "+1-650-123-4567"; // Different formatting than ours 2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville testReplacement(init, expected, expected); 2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Test the case where some other component is auto-completing what the user is typing 2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 2368fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testAutoCompleteWithFormattedNameAndNumber() { 2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String init = "650-1"; 2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String expected = "Test User <650-123-4567>"; 2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville testReplacement(init, expected, expected); 2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Test the case where some other component is auto-completing what the user is typing 2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 2468fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testAutoCompleteWithNumericNameAndNumber() { 2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String init = "650"; 2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String expected = "2nd Test User <650-123-4567>"; 2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville testReplacement(init, expected, expected); 2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Test the case where some other component is auto-completing what the user is typing 2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 2568fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testAutoCompleteWithUnformattedNumber() { 2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String init = "650-1"; 2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String expected = "6501234567"; 2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville testReplacement(init, expected, expected); 2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Test the case where some other component is auto-completing what the user is typing, where 2650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * the deleted text doesn't have any formatting and neither does the replacement text: in this 2660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * case the replacement text should be formatted by the PhoneNumberFormattingTextWatcher. 2670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 2688fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testAutoCompleteUnformattedWithUnformattedNumber() { 2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String init = "650"; 2710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String replacement = "6501234567"; 2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String expected = "(650) 123-4567"; 2730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville testReplacement(init, replacement, expected); 2740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String init2 = "650"; 2760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String replacement2 = "16501234567"; 2770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String expected2 = "1 650-123-4567"; 2780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville testReplacement(init2, replacement2, expected2); 2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Helper method for testing replacing the entire string with another string 2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param init The initial string 2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param expected 2850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 2860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private void testReplacement(String init, String replacement, String expected) { 2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextWatcher textWatcher = getTextWatcher(); 2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SpannableStringBuilder number = new SpannableStringBuilder(init); 2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Replace entire text with the given values 2920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.beforeTextChanged(number, 0, init.length(), replacement.length()); 2930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville number.replace(0, init.length(), replacement, 0, replacement.length()); 2940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Selection.setSelection(number, replacement.length()); // move the cursor to the end 2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.onTextChanged(number, 0, init.length(), replacement.length()); 2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textWatcher.afterTextChanged(number); 2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(expected, number.toString()); 2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // the cursor should be still at the end 3000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(expected.length(), Selection.getSelectionEnd(number)); 3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3038fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan @Test @SmallTest 3040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private TextWatcher getTextWatcher() { 3050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return new PhoneNumberFormattingTextWatcher("US"); 3060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 308