Home | History | Annotate | Download | only in telephony
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 package com.android.internal.telephony;
     17 
     18 import android.telephony.PhoneNumberFormattingTextWatcher;
     19 import android.test.AndroidTestCase;
     20 import android.text.Editable;
     21 import android.text.Selection;
     22 import android.text.SpannableStringBuilder;
     23 import android.text.TextWatcher;
     24 
     25 public class PhoneNumberWatcherTest extends AndroidTestCase {
     26     public void testAppendChars() {
     27         final String multiChars = "65012345";
     28         final String formatted1 = "(650) 123-45";
     29         TextWatcher textWatcher = getTextWatcher();
     30         SpannableStringBuilder number = new SpannableStringBuilder();
     31         // Append more than one chars
     32         textWatcher.beforeTextChanged(number, 0, 0, multiChars.length());
     33         number.append(multiChars);
     34         Selection.setSelection(number, number.length());
     35         textWatcher.onTextChanged(number, 0, 0, number.length());
     36         textWatcher.afterTextChanged(number);
     37         assertEquals(formatted1, number.toString());
     38         assertEquals(formatted1.length(), Selection.getSelectionEnd(number));
     39         // Append one chars
     40         final char appendChar = '6';
     41         final String formatted2 = "(650) 123-456";
     42         int len = number.length();
     43         textWatcher.beforeTextChanged(number, number.length(), 0, 1);
     44         number.append(appendChar);
     45         Selection.setSelection(number, number.length());
     46         textWatcher.onTextChanged(number, len, 0, 1);
     47         textWatcher.afterTextChanged(number);
     48         assertEquals(formatted2, number.toString());
     49         assertEquals(formatted2.length(), Selection.getSelectionEnd(number));
     50     }
     51 
     52     public void testRemoveLastChars() {
     53         final String init = "65012345678";
     54         final String result1 = "(650) 123-4567";
     55         TextWatcher textWatcher = getTextWatcher();
     56         // Remove the last char.
     57         SpannableStringBuilder number = new SpannableStringBuilder(init);
     58         int len = number.length();
     59         textWatcher.beforeTextChanged(number, len - 1, 1, 0);
     60         number.delete(len - 1, len);
     61         Selection.setSelection(number, number.length());
     62         textWatcher.onTextChanged(number, number.length() - 1, 1, 0);
     63         textWatcher.afterTextChanged(number);
     64         assertEquals(result1, number.toString());
     65         assertEquals(result1.length(), Selection.getSelectionEnd(number));
     66         // Remove last 5 chars
     67         final String result2 = "650-123";
     68         textWatcher.beforeTextChanged(number, number.length() - 4, 4, 0);
     69         number.delete(number.length() - 5, number.length());
     70         Selection.setSelection(number, number.length());
     71         textWatcher.onTextChanged(number, number.length(), 4, 0);
     72         textWatcher.afterTextChanged(number);
     73         assertEquals(result2, number.toString());
     74         assertEquals(result2.length(), Selection.getSelectionEnd(number));
     75     }
     76 
     77     public void testInsertChars() {
     78         final String init = "650-23";
     79         final String expected1 = "650-123";
     80         TextWatcher textWatcher = getTextWatcher();
     81 
     82         // Insert one char
     83         SpannableStringBuilder number = new SpannableStringBuilder(init);
     84         textWatcher.beforeTextChanged(number, 3, 0, 1);
     85         number.insert(3, "1"); // 6501-23
     86         Selection.setSelection(number, 4); // make the cursor at right of 1
     87         textWatcher.onTextChanged(number, 3, 0, 1);
     88         textWatcher.afterTextChanged(number);
     89         assertEquals(expected1, number.toString());
     90         // the cursor should still at the right of '1'
     91         assertEquals(5, Selection.getSelectionEnd(number));
     92 
     93         // Insert multiple chars
     94         final String expected2 = "(650) 145-6723";
     95         textWatcher.beforeTextChanged(number, 5, 0, 4);
     96         number.insert(5, "4567"); // change to 650-1456723
     97         Selection.setSelection(number, 9); // the cursor is at the right of '7'.
     98         textWatcher.onTextChanged(number, 7, 0, 4);
     99         textWatcher.afterTextChanged(number);
    100         assertEquals(expected2, number.toString());
    101         // the cursor should be still at the right of '7'
    102         assertEquals(12, Selection.getSelectionEnd(number));
    103     }
    104 
    105     public void testStopFormatting() {
    106         final String init = "(650) 123";
    107         final String expected1 = "(650) 123 4";
    108         TextWatcher textWatcher = getTextWatcher();
    109 
    110         // Append space
    111         SpannableStringBuilder number = new SpannableStringBuilder(init);
    112         textWatcher.beforeTextChanged(number, 9, 0, 2);
    113         number.insert(9, " 4"); // (6501) 23 4
    114         Selection.setSelection(number, number.length()); // make the cursor at right of 4
    115         textWatcher.onTextChanged(number, 9, 0, 2);
    116         textWatcher.afterTextChanged(number);
    117         assertEquals(expected1, number.toString());
    118         // the cursor should still at the right of '1'
    119         assertEquals(expected1.length(), Selection.getSelectionEnd(number));
    120 
    121         // Delete a ')'
    122         final String expected2 ="(650 123";
    123         textWatcher = getTextWatcher();
    124         number = new SpannableStringBuilder(init);
    125         textWatcher.beforeTextChanged(number, 4, 1, 0);
    126         number.delete(4, 5); // (6501 23 4
    127         Selection.setSelection(number, 5); // make the cursor at right of 1
    128         textWatcher.onTextChanged(number, 4, 1, 0);
    129         textWatcher.afterTextChanged(number);
    130         assertEquals(expected2, number.toString());
    131         // the cursor should still at the right of '1'
    132         assertEquals(5, Selection.getSelectionEnd(number));
    133 
    134         // Insert a hyphen
    135         final String expected3 ="(650) 12-3";
    136         textWatcher = getTextWatcher();
    137         number = new SpannableStringBuilder(init);
    138         textWatcher.beforeTextChanged(number, 8, 0, 1);
    139         number.insert(8, "-"); // (650) 12-3
    140         Selection.setSelection(number, 9); // make the cursor at right of -
    141         textWatcher.onTextChanged(number, 8, 0, 1);
    142         textWatcher.afterTextChanged(number);
    143         assertEquals(expected3, number.toString());
    144         // the cursor should still at the right of '-'
    145         assertEquals(9, Selection.getSelectionEnd(number));
    146     }
    147 
    148     public void testRestartFormatting() {
    149         final String init = "(650) 123";
    150         final String expected1 = "(650) 123 4";
    151         TextWatcher textWatcher = getTextWatcher();
    152 
    153         // Append space
    154         SpannableStringBuilder number = new SpannableStringBuilder(init);
    155         textWatcher.beforeTextChanged(number, 9, 0, 2);
    156         number.insert(9, " 4"); // (650) 123 4
    157         Selection.setSelection(number, number.length()); // make the cursor at right of 4
    158         textWatcher.onTextChanged(number, 9, 0, 2);
    159         textWatcher.afterTextChanged(number);
    160         assertEquals(expected1, number.toString());
    161         // the cursor should still at the right of '4'
    162         assertEquals(expected1.length(), Selection.getSelectionEnd(number));
    163 
    164         // Clear the current string, and start formatting again.
    165         int len = number.length();
    166         textWatcher.beforeTextChanged(number, 0, len, 0);
    167         number.delete(0, len);
    168         textWatcher.onTextChanged(number, 0, len, 0);
    169         textWatcher.afterTextChanged(number);
    170 
    171         final String expected2 = "650-1234";
    172         number = new SpannableStringBuilder(init);
    173         textWatcher.beforeTextChanged(number, 9, 0, 1);
    174         number.insert(9, "4"); // (650) 1234
    175         Selection.setSelection(number, number.length()); // make the cursor at right of 4
    176         textWatcher.onTextChanged(number, 9, 0, 1);
    177         textWatcher.afterTextChanged(number);
    178         assertEquals(expected2, number.toString());
    179         // the cursor should still at the right of '4'
    180         assertEquals(expected2.length(), Selection.getSelectionEnd(number));
    181     }
    182 
    183     public void testTextChangedByOtherTextWatcher() {
    184         final TextWatcher cleanupTextWatcher = new TextWatcher() {
    185             @Override
    186             public void afterTextChanged(Editable s) {
    187                 s.clear();
    188             }
    189 
    190             @Override
    191             public void beforeTextChanged(CharSequence s, int start, int count,
    192                     int after) {
    193             }
    194 
    195             @Override
    196             public void onTextChanged(CharSequence s, int start, int before,
    197                     int count) {
    198             }
    199         };
    200         final String init = "(650) 123";
    201         final String expected1 = "";
    202         TextWatcher textWatcher = getTextWatcher();
    203 
    204         SpannableStringBuilder number = new SpannableStringBuilder(init);
    205         textWatcher.beforeTextChanged(number, 5, 0, 1);
    206         number.insert(5, "4"); // (6504) 123
    207         Selection.setSelection(number, 5); // make the cursor at right of 4
    208         textWatcher.onTextChanged(number, 5, 0, 1);
    209         number.setSpan(cleanupTextWatcher, 0, number.length(), 0);
    210         textWatcher.afterTextChanged(number);
    211         assertEquals(expected1, number.toString());
    212     }
    213 
    214     /**
    215      * Test the case where some other component is auto-completing what the user is typing
    216      */
    217     public void testAutoCompleteWithFormattedNumber() {
    218         String init = "650-1";
    219         String expected = "+1-650-123-4567"; // Different formatting than ours
    220         testReplacement(init, expected, expected);
    221     }
    222 
    223     /**
    224      * Test the case where some other component is auto-completing what the user is typing
    225      */
    226     public void testAutoCompleteWithFormattedNameAndNumber() {
    227         String init = "650-1";
    228         String expected = "Test User <650-123-4567>";
    229         testReplacement(init, expected, expected);
    230     }
    231 
    232     /**
    233      * Test the case where some other component is auto-completing what the user is typing
    234      */
    235     public void testAutoCompleteWithNumericNameAndNumber() {
    236         String init = "650";
    237         String expected = "2nd Test User <650-123-4567>";
    238         testReplacement(init, expected, expected);
    239     }
    240 
    241     /**
    242      * Test the case where some other component is auto-completing what the user is typing
    243      */
    244     public void testAutoCompleteWithUnformattedNumber() {
    245         String init = "650-1";
    246         String expected = "6501234567";
    247         testReplacement(init, expected, expected);
    248     }
    249 
    250     /**
    251      * Test the case where some other component is auto-completing what the user is typing, where
    252      * the deleted text doesn't have any formatting and neither does the replacement text: in this
    253      * case the replacement text should be formatted by the PhoneNumberFormattingTextWatcher.
    254      */
    255     public void testAutoCompleteUnformattedWithUnformattedNumber() {
    256         String init = "650";
    257         String replacement = "6501234567";
    258         String expected = "(650) 123-4567";
    259         testReplacement(init, replacement, expected);
    260 
    261         String init2 = "650";
    262         String replacement2 = "16501234567";
    263         String expected2 = "1 650-123-4567";
    264         testReplacement(init2, replacement2, expected2);
    265     }
    266 
    267     /**
    268      * Helper method for testing replacing the entire string with another string
    269      * @param init The initial string
    270      * @param expected
    271      */
    272     private void testReplacement(String init, String replacement, String expected) {
    273         TextWatcher textWatcher = getTextWatcher();
    274 
    275         SpannableStringBuilder number = new SpannableStringBuilder(init);
    276 
    277         // Replace entire text with the given values
    278         textWatcher.beforeTextChanged(number, 0, init.length(), replacement.length());
    279         number.replace(0, init.length(), replacement, 0, replacement.length());
    280         Selection.setSelection(number, replacement.length()); // move the cursor to the end
    281         textWatcher.onTextChanged(number, 0, init.length(), replacement.length());
    282         textWatcher.afterTextChanged(number);
    283 
    284         assertEquals(expected, number.toString());
    285         // the cursor should be still at the end
    286         assertEquals(expected.length(), Selection.getSelectionEnd(number));
    287     }
    288 
    289     private TextWatcher getTextWatcher() {
    290         return new PhoneNumberFormattingTextWatcher("US");
    291     }
    292 }
    293