Home | History | Annotate | Download | only in interactions
      1 /*
      2  * Copyright (C) 2010 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 
     17 package com.android.dialer.interactions;
     18 
     19 import android.content.ContentUris;
     20 import android.content.Context;
     21 import android.content.DialogInterface.OnDismissListener;
     22 import android.content.Intent;
     23 import android.net.Uri;
     24 import android.provider.ContactsContract.CommonDataKinds.Phone;
     25 import android.provider.ContactsContract.CommonDataKinds.SipAddress;
     26 import android.provider.ContactsContract.Contacts;
     27 import android.provider.ContactsContract.Data;
     28 import android.provider.ContactsContract.RawContacts;
     29 import android.test.InstrumentationTestCase;
     30 import android.test.suitebuilder.annotation.SmallTest;
     31 
     32 import com.android.contacts.common.test.mocks.ContactsMockContext;
     33 import com.android.contacts.common.test.mocks.MockContentProvider;
     34 import com.android.contacts.common.test.mocks.MockContentProvider.Query;
     35 import com.android.contacts.common.util.ContactDisplayUtils;
     36 import com.android.dialer.interactions.PhoneNumberInteraction.PhoneItem;
     37 import com.android.dialer.util.TestConstants;
     38 
     39 import java.util.ArrayList;
     40 import java.util.List;
     41 
     42 /**
     43  * Tests for {@link com.android.contacts.common.interactions.PhoneNumberInteraction}.
     44  *
     45  *   adb shell am instrument \
     46  *     -w com.android.dialer.tests/android.test.InstrumentationTestRunner
     47  */
     48 @SmallTest
     49 public class PhoneNumberInteractionTest extends InstrumentationTestCase {
     50     private final static class TestPhoneNumberInteraction extends PhoneNumberInteraction {
     51         private ArrayList<PhoneItem> mPhoneList;
     52 
     53         public TestPhoneNumberInteraction(Context context, int interactionType,
     54                 OnDismissListener dismissListener) {
     55             super(context, interactionType, dismissListener);
     56         }
     57 
     58         @Override
     59         void showDisambiguationDialog(ArrayList<PhoneItem> phoneList) {
     60             this.mPhoneList = phoneList;
     61         }
     62     }
     63 
     64     private ContactsMockContext mContext;
     65     private MockContentProvider mContactsProvider;
     66 
     67     @Override
     68     protected void setUp() throws Exception {
     69         super.setUp();
     70         mContext = new ContactsMockContext(getInstrumentation().getTargetContext());
     71         mContactsProvider = mContext.getContactsProvider();
     72     }
     73 
     74     @Override
     75     protected void tearDown() throws Exception {
     76         mContactsProvider.verify();
     77         super.tearDown();
     78     }
     79 
     80     public void testSendSmsWhenOnlyOneNumberAvailable() {
     81         Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 13);
     82         expectQuery(contactUri)
     83                 .returnRow(1, "123", 0, null, null, Phone.TYPE_HOME, null,
     84                         Phone.CONTENT_ITEM_TYPE, 13);
     85 
     86         TestPhoneNumberInteraction interaction = new TestPhoneNumberInteraction(
     87                 mContext, ContactDisplayUtils.INTERACTION_SMS, null);
     88 
     89         interaction.startInteraction(contactUri);
     90         interaction.getLoader().waitForLoader();
     91 
     92         Intent intent = mContext.getIntentForStartActivity();
     93         assertNotNull(intent);
     94 
     95         assertEquals(Intent.ACTION_SENDTO, intent.getAction());
     96         assertEquals("sms:123", intent.getDataString());
     97     }
     98 
     99     public void testSendSmsWhenDataIdIsProvided() {
    100         Uri dataUri = ContentUris.withAppendedId(Data.CONTENT_URI, 1);
    101         expectQuery(dataUri, true /* isDataUri */ )
    102                 .returnRow(1, "987", 0, null, null, Phone.TYPE_HOME, null,
    103                         Phone.CONTENT_ITEM_TYPE, 1);
    104 
    105         TestPhoneNumberInteraction interaction = new TestPhoneNumberInteraction(
    106                 mContext, ContactDisplayUtils.INTERACTION_SMS, null);
    107 
    108         interaction.startInteraction(dataUri);
    109         interaction.getLoader().waitForLoader();
    110 
    111         Intent intent = mContext.getIntentForStartActivity();
    112         assertNotNull(intent);
    113 
    114         assertEquals(Intent.ACTION_SENDTO, intent.getAction());
    115         assertEquals("sms:987", intent.getDataString());
    116     }
    117 
    118     public void testSendSmsWhenThereIsPrimaryNumber() {
    119         Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 13);
    120         expectQuery(contactUri)
    121                 .returnRow(1, "123", 0, null, null, Phone.TYPE_HOME, null,
    122                         Phone.CONTENT_ITEM_TYPE, 13)
    123                 .returnRow(2, "456", 1, null, null, Phone.TYPE_HOME, null,
    124                         Phone.CONTENT_ITEM_TYPE, 13);
    125 
    126         TestPhoneNumberInteraction interaction = new TestPhoneNumberInteraction(
    127                 mContext, ContactDisplayUtils.INTERACTION_SMS, null);
    128 
    129         interaction.startInteraction(contactUri);
    130         interaction.getLoader().waitForLoader();
    131 
    132         Intent intent = mContext.getIntentForStartActivity();
    133         assertNotNull(intent);
    134 
    135         assertEquals(Intent.ACTION_SENDTO, intent.getAction());
    136         assertEquals("sms:456", intent.getDataString());
    137     }
    138 
    139     public void testShouldCollapseWith() {
    140         PhoneNumberInteraction.PhoneItem phoneItem1 = new PhoneNumberInteraction.PhoneItem();
    141         PhoneNumberInteraction.PhoneItem phoneItem2 = new PhoneNumberInteraction.PhoneItem();
    142 
    143         phoneItem1.phoneNumber = "123";
    144         phoneItem2.phoneNumber = "123";
    145 
    146         assertTrue(phoneItem1.shouldCollapseWith(phoneItem2, mContext));
    147 
    148         phoneItem1.phoneNumber = "123";
    149         phoneItem2.phoneNumber = "456";
    150 
    151         assertFalse(phoneItem1.shouldCollapseWith(phoneItem2, mContext));
    152 
    153         phoneItem1.phoneNumber = "123#,123";
    154         phoneItem2.phoneNumber = "123#,456";
    155 
    156         assertFalse(phoneItem1.shouldCollapseWith(phoneItem2, mContext));
    157     }
    158 
    159     public void testCallNumberWhenThereAreDuplicates() {
    160         Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 13);
    161         expectQuery(contactUri)
    162                 .returnRow(1, "123", 0, null, null, Phone.TYPE_HOME, null,
    163                         Phone.CONTENT_ITEM_TYPE, 13)
    164                 .returnRow(2, "123", 0, null, null, Phone.TYPE_WORK, null,
    165                         Phone.CONTENT_ITEM_TYPE, 13);
    166 
    167         TestPhoneNumberInteraction interaction = new TestPhoneNumberInteraction(
    168                 mContext, ContactDisplayUtils.INTERACTION_CALL, null);
    169 
    170         interaction.startInteraction(contactUri);
    171         interaction.getLoader().waitForLoader();
    172 
    173         Intent intent = mContext.getIntentForStartActivity();
    174         assertNotNull(intent);
    175 
    176         assertEquals(TestConstants.CALL_INTENT_ACTION, intent.getAction());
    177         assertEquals("tel:123", intent.getDataString());
    178     }
    179 
    180     public void testCallWithSip() {
    181         Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 13);
    182         expectQuery(contactUri)
    183                 .returnRow(1, "example (at) example.com", 0, null, null, Phone.TYPE_HOME, null,
    184                         SipAddress.CONTENT_ITEM_TYPE, 13);
    185         TestPhoneNumberInteraction interaction = new TestPhoneNumberInteraction(
    186                 mContext, ContactDisplayUtils.INTERACTION_CALL, null);
    187 
    188         interaction.startInteraction(contactUri);
    189         interaction.getLoader().waitForLoader();
    190 
    191         Intent intent = mContext.getIntentForStartActivity();
    192         assertNotNull(intent);
    193 
    194         assertEquals(TestConstants.CALL_INTENT_ACTION, intent.getAction());
    195         assertEquals("sip:example%40example.com", intent.getDataString());
    196     }
    197 
    198     public void testShowDisambigDialogForCalling() {
    199         Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, 13);
    200         expectQuery(contactUri)
    201                 .returnRow(1, "123", 0, "account", null, Phone.TYPE_HOME, "label",
    202                         Phone.CONTENT_ITEM_TYPE, 13)
    203                 .returnRow(2, "456", 0, null, null, Phone.TYPE_WORK, null,
    204                         Phone.CONTENT_ITEM_TYPE, 13);
    205 
    206         TestPhoneNumberInteraction interaction = new TestPhoneNumberInteraction(
    207                 mContext, ContactDisplayUtils.INTERACTION_CALL, null);
    208 
    209         interaction.startInteraction(contactUri);
    210         interaction.getLoader().waitForLoader();
    211 
    212         List<PhoneItem> items = interaction.mPhoneList;
    213         assertNotNull(items);
    214         assertEquals(2, items.size());
    215 
    216         PhoneItem item = items.get(0);
    217         assertEquals(1, item.id);
    218         assertEquals("123", item.phoneNumber);
    219         assertEquals("account", item.accountType);
    220         assertEquals(Phone.TYPE_HOME, item.type);
    221         assertEquals("label", item.label);
    222     }
    223 
    224     private Query expectQuery(Uri contactUri) {
    225         return expectQuery(contactUri, false);
    226     }
    227 
    228     private Query expectQuery(Uri uri, boolean isDataUri) {
    229         final Uri dataUri;
    230         if (isDataUri) {
    231             dataUri = uri;
    232         } else {
    233             dataUri = Uri.withAppendedPath(uri, Contacts.Data.CONTENT_DIRECTORY);
    234         }
    235         return mContactsProvider
    236                 .expectQuery(dataUri)
    237                 .withProjection(
    238                         Phone._ID,
    239                         Phone.NUMBER,
    240                         Phone.IS_SUPER_PRIMARY,
    241                         RawContacts.ACCOUNT_TYPE,
    242                         RawContacts.DATA_SET,
    243                         Phone.TYPE,
    244                         Phone.LABEL,
    245                         Phone.MIMETYPE,
    246                         Phone.CONTACT_ID)
    247                 .withSelection("mimetype IN ('vnd.android.cursor.item/phone_v2',"
    248                         + " 'vnd.android.cursor.item/sip_address') AND data1 NOT NULL");
    249     }
    250 }
    251