Home | History | Annotate | Download | only in dataitem
      1 /*
      2  * Copyright (C) 2014 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.contacts.model.dataitem;
     17 
     18 import android.content.ContentValues;
     19 import android.provider.ContactsContract.CommonDataKinds.Email;
     20 import android.provider.ContactsContract.CommonDataKinds.Event;
     21 import android.provider.ContactsContract.CommonDataKinds.Im;
     22 import android.provider.ContactsContract.CommonDataKinds.Nickname;
     23 import android.provider.ContactsContract.CommonDataKinds.Note;
     24 import android.provider.ContactsContract.CommonDataKinds.Organization;
     25 import android.provider.ContactsContract.CommonDataKinds.Phone;
     26 import android.provider.ContactsContract.CommonDataKinds.Relation;
     27 import android.provider.ContactsContract.CommonDataKinds.SipAddress;
     28 import android.provider.ContactsContract.CommonDataKinds.StructuredName;
     29 import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
     30 import android.provider.ContactsContract.CommonDataKinds.Website;
     31 import android.provider.ContactsContract.Contacts.Data;
     32 import android.provider.ContactsContract.Contacts.Entity;
     33 import android.test.AndroidTestCase;
     34 import android.test.suitebuilder.annotation.SmallTest;
     35 
     36 import com.android.contacts.Collapser;
     37 import com.android.contacts.model.account.AccountType.EditType;
     38 import com.android.contacts.model.account.BaseAccountType;
     39 import com.android.contacts.model.account.GoogleAccountType;
     40 
     41 import java.util.ArrayList;
     42 import java.util.List;
     43 
     44 /**
     45  * Test case for {@link DataItem}.
     46  */
     47 @SmallTest
     48 public class DataItemTests extends AndroidTestCase {
     49 
     50     private ContentValues mValues1;
     51     private ContentValues mValues2;
     52     private ContentValues mValues3;
     53     private ContentValues mValues4;
     54     private GoogleAccountType mGoogleAccountType;
     55 
     56     @Override
     57     protected void setUp() {
     58         mValues1 = new ContentValues();
     59         mValues2 = new ContentValues();
     60         mValues3 = new ContentValues();
     61         mValues4 = new ContentValues();
     62 
     63         mValues1.put(Data._ID, 1);
     64         mValues2.put(Data._ID, 2);
     65         mValues3.put(Data._ID, 3);
     66         mValues4.put(Data._ID, 4);
     67 
     68         mGoogleAccountType = new GoogleAccountType(getContext(), "packageName");
     69     }
     70 
     71     private List<DataItem> createDataItemsAndCollapse(DataKind kind, ContentValues... values) {
     72         final List<DataItem> dataList = new ArrayList<>(values.length);
     73         for (ContentValues value : values) {
     74             final DataItem data = DataItem.createFrom(value);
     75             data.setDataKind(kind);
     76             dataList.add(data);
     77         }
     78         Collapser.collapseList(dataList, getContext());
     79         return dataList;
     80     }
     81 
     82     public void testDataItemCollapsing_genericDataItemFields() {
     83         mValues1.put(Data.IS_SUPER_PRIMARY, 1);
     84         mValues2.put(Data.IS_PRIMARY, 0);
     85 
     86         mValues1.put(Entity.TIMES_USED, 5);
     87         mValues2.put(Entity.TIMES_USED, 4);
     88 
     89         mValues1.put(Entity.LAST_TIME_USED, 555);
     90         mValues2.put(Entity.LAST_TIME_USED, 999);
     91 
     92         final DataKind kind = new DataKind("test.mimetype", 0, 0, false);
     93         kind.actionBody = new BaseAccountType.SimpleInflater(0);
     94         kind.typeList = new ArrayList<>();
     95         kind.typeList.add(new EditType(1, -1));
     96         kind.typeList.add(new EditType(2, -1));
     97         kind.typeColumn = Data.DATA2;
     98 
     99         mValues1.put(kind.typeColumn, 2);
    100         mValues2.put(kind.typeColumn, 1);
    101 
    102         final List<DataItem> dataList = createDataItemsAndCollapse(kind, mValues1, mValues2);
    103 
    104         assertEquals(1, dataList.size());
    105         assertEquals(true, dataList.get(0).isSuperPrimary());
    106         assertEquals(true, dataList.get(0).isPrimary());
    107         assertEquals(9, (int) dataList.get(0).getTimesUsed());
    108         assertEquals(999L, (long) dataList.get(0).getLastTimeUsed());
    109         assertEquals(1, dataList.get(0).getKindTypeColumn(kind));
    110     }
    111 
    112     public void testDataItemCollapsing_email() {
    113         final String email1 = "email1 (at) google.com";
    114         final String email2 = "email2 (at) google.com";
    115 
    116         mValues1.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
    117         mValues2.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
    118         mValues3.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
    119 
    120         mValues1.put(Email.ADDRESS, email1);
    121         mValues2.put(Email.ADDRESS, email1);
    122         mValues3.put(Email.ADDRESS, email2);
    123 
    124         mValues1.put(Email.TYPE, Email.TYPE_MOBILE);
    125         mValues2.put(Email.TYPE, Email.TYPE_HOME);
    126         mValues3.put(Email.TYPE, Email.TYPE_WORK);
    127 
    128         final DataKind kind = mGoogleAccountType.getKindForMimetype(Email.CONTENT_ITEM_TYPE);
    129 
    130         final List<DataItem> dataList =
    131                 createDataItemsAndCollapse(kind, mValues1, mValues2, mValues3);
    132 
    133         assertEquals(2, dataList.size());
    134         assertEquals(email1, ((EmailDataItem) dataList.get(0)).getAddress());
    135         assertEquals(email2, ((EmailDataItem) dataList.get(1)).getAddress());
    136         assertEquals(Math.min(Email.TYPE_MOBILE, Email.TYPE_HOME),
    137                 ((EmailDataItem) dataList.get(0)).getKindTypeColumn(kind));
    138     }
    139 
    140     public void testDataItemCollapsing_event() {
    141         final String date1 = "2014-01-01";
    142         final String date2 = "2014-02-02";
    143         final String customLabel1 = "custom label1";
    144         final String customLabel2 = "custom label2";
    145 
    146         mValues1.put(Data.MIMETYPE, Event.CONTENT_ITEM_TYPE);
    147         mValues2.put(Data.MIMETYPE, Event.CONTENT_ITEM_TYPE);
    148         mValues3.put(Data.MIMETYPE, Event.CONTENT_ITEM_TYPE);
    149         mValues4.put(Data.MIMETYPE, Event.CONTENT_ITEM_TYPE);
    150 
    151         mValues1.put(Event.START_DATE, date1);
    152         mValues2.put(Event.START_DATE, date1);
    153         mValues3.put(Event.START_DATE, date1);
    154         mValues4.put(Event.START_DATE, date2);
    155 
    156         mValues1.put(Event.TYPE, Event.TYPE_CUSTOM);
    157         mValues2.put(Event.TYPE, Event.TYPE_CUSTOM);
    158         mValues3.put(Event.TYPE, Event.TYPE_CUSTOM);
    159         mValues4.put(Event.TYPE, Event.TYPE_ANNIVERSARY);
    160 
    161         mValues1.put(Event.LABEL, customLabel1);
    162         mValues2.put(Event.LABEL, customLabel1);
    163         mValues3.put(Event.LABEL, customLabel2);
    164 
    165         final DataKind kind = mGoogleAccountType.getKindForMimetype(Event.CONTENT_ITEM_TYPE);
    166 
    167         final List<DataItem> dataList =
    168                 createDataItemsAndCollapse(kind, mValues1, mValues2, mValues3, mValues4);
    169 
    170         assertEquals(3, dataList.size());
    171         assertEquals(customLabel1, ((EventDataItem) dataList.get(0)).getLabel());
    172         assertEquals(customLabel2, ((EventDataItem) dataList.get(1)).getLabel());
    173         assertEquals(date2, ((EventDataItem) dataList.get(2)).getStartDate());
    174     }
    175 
    176     public void testDataItemCollapsing_im() {
    177         final String address1 = "address 1";
    178         final String address2 = "address 2";
    179         final String customProtocol1 = "custom 1";
    180         final String customProtocol2 = "custom 2";
    181 
    182         mValues1.put(Data.MIMETYPE, Im.CONTENT_ITEM_TYPE);
    183         mValues2.put(Data.MIMETYPE, Im.CONTENT_ITEM_TYPE);
    184         mValues3.put(Data.MIMETYPE, Im.CONTENT_ITEM_TYPE);
    185         mValues4.put(Data.MIMETYPE, Im.CONTENT_ITEM_TYPE);
    186 
    187         mValues1.put(Im.DATA, address1);
    188         mValues2.put(Im.DATA, address1);
    189         mValues3.put(Im.DATA, address1);
    190         mValues4.put(Im.DATA, address2);
    191 
    192         mValues1.put(Im.PROTOCOL, Im.PROTOCOL_CUSTOM);
    193         mValues2.put(Im.PROTOCOL, Im.PROTOCOL_CUSTOM);
    194         mValues3.put(Im.PROTOCOL, Im.PROTOCOL_CUSTOM);
    195         mValues4.put(Im.PROTOCOL, Im.PROTOCOL_AIM);
    196 
    197         mValues1.put(Im.CUSTOM_PROTOCOL, customProtocol1);
    198         mValues2.put(Im.CUSTOM_PROTOCOL, customProtocol1);
    199         mValues3.put(Im.CUSTOM_PROTOCOL, customProtocol2);
    200 
    201         final DataKind kind = mGoogleAccountType.getKindForMimetype(Im.CONTENT_ITEM_TYPE);
    202 
    203         final List<DataItem> dataList =
    204                 createDataItemsAndCollapse(kind, mValues1, mValues2, mValues3, mValues4);
    205 
    206         assertEquals(3, dataList.size());
    207         assertEquals(address1, ((ImDataItem) dataList.get(0)).getData());
    208         assertEquals(address1, ((ImDataItem) dataList.get(1)).getData());
    209         assertEquals(address2, ((ImDataItem) dataList.get(2)).getData());
    210 
    211         assertEquals(customProtocol1, ((ImDataItem) dataList.get(0)).getCustomProtocol());
    212         assertEquals(customProtocol2, ((ImDataItem) dataList.get(1)).getCustomProtocol());
    213         assertEquals(Im.PROTOCOL_AIM, (int) ((ImDataItem) dataList.get(2)).getProtocol());
    214     }
    215 
    216     public void testDataItemCollapsing_nickname() {
    217         final String nickname1 = "nickname 1";
    218         final String nickname2 = "nickname 2";
    219 
    220         mValues1.put(Data.MIMETYPE, Nickname.CONTENT_ITEM_TYPE);
    221         mValues2.put(Data.MIMETYPE, Nickname.CONTENT_ITEM_TYPE);
    222         mValues3.put(Data.MIMETYPE, Nickname.CONTENT_ITEM_TYPE);
    223 
    224         mValues1.put(Nickname.NAME, nickname1);
    225         mValues2.put(Nickname.NAME, nickname1);
    226         mValues3.put(Nickname.NAME, nickname2);
    227 
    228         final DataKind kind = mGoogleAccountType.getKindForMimetype(Nickname.CONTENT_ITEM_TYPE);
    229 
    230         final List<DataItem> dataList =
    231                 createDataItemsAndCollapse(kind, mValues1, mValues2, mValues3);
    232 
    233         assertEquals(2, dataList.size());
    234         assertEquals(nickname1, ((NicknameDataItem) dataList.get(0)).getName());
    235         assertEquals(nickname2, ((NicknameDataItem) dataList.get(1)).getName());
    236     }
    237 
    238     public void testDataItemCollapsing_note() {
    239         final String note1 = "note 1";
    240         final String note2 = "note 2";
    241 
    242         mValues1.put(Data.MIMETYPE, Note.CONTENT_ITEM_TYPE);
    243         mValues2.put(Data.MIMETYPE, Note.CONTENT_ITEM_TYPE);
    244         mValues3.put(Data.MIMETYPE, Note.CONTENT_ITEM_TYPE);
    245 
    246         mValues1.put(Note.NOTE, note1);
    247         mValues2.put(Note.NOTE, note1);
    248         mValues3.put(Note.NOTE, note2);
    249 
    250         DataKind kind = mGoogleAccountType.getKindForMimetype(Note.CONTENT_ITEM_TYPE);
    251 
    252         final List<DataItem> dataList =
    253                 createDataItemsAndCollapse(kind, mValues1, mValues2, mValues3);
    254 
    255         assertEquals(2, dataList.size());
    256         assertEquals(note1, ((NoteDataItem) dataList.get(0)).getNote());
    257         assertEquals(note2, ((NoteDataItem) dataList.get(1)).getNote());
    258     }
    259 
    260     public void testDataItemCollapsing_organization() {
    261         final String company1 = "company1";
    262         final String company2 = "company2";
    263         final String title1 = "title1";
    264         final String title2 = "title2";
    265 
    266         mValues1.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE);
    267         mValues2.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE);
    268         mValues3.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE);
    269         mValues4.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE);
    270 
    271         mValues1.put(Organization.COMPANY, company1);
    272         mValues2.put(Organization.COMPANY, company1);
    273         mValues3.put(Organization.COMPANY, company1);
    274         mValues4.put(Organization.COMPANY, company2);
    275 
    276         mValues1.put(Organization.TITLE, title1);
    277         mValues2.put(Organization.TITLE, title1);
    278         mValues3.put(Organization.TITLE, title2);
    279         mValues4.put(Organization.TITLE, title1);
    280 
    281         final DataKind kind =
    282                 mGoogleAccountType.getKindForMimetype(Organization.CONTENT_ITEM_TYPE);
    283 
    284         final List<DataItem> dataList =
    285                 createDataItemsAndCollapse(kind, mValues1, mValues2, mValues3, mValues4);
    286 
    287         assertEquals(3, dataList.size());
    288         assertEquals(company1, ((OrganizationDataItem) dataList.get(0)).getCompany());
    289         assertEquals(company1, ((OrganizationDataItem) dataList.get(1)).getCompany());
    290         assertEquals(company2, ((OrganizationDataItem) dataList.get(2)).getCompany());
    291 
    292         assertEquals(title1, ((OrganizationDataItem) dataList.get(0)).getTitle());
    293         assertEquals(title2, ((OrganizationDataItem) dataList.get(1)).getTitle());
    294     }
    295 
    296     public void testDataItemCollapsing_phone() {
    297         final String phone1 = "111-111-1111";
    298         final String phone1a = "1111111111";
    299         final String phone2 = "222-222-2222";
    300 
    301         mValues1.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
    302         mValues2.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
    303         mValues3.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
    304 
    305         mValues1.put(Phone.NUMBER, phone1);
    306         mValues2.put(Phone.NUMBER, phone1a);
    307         mValues3.put(Phone.NUMBER, phone2);
    308 
    309         mValues1.put(Phone.TYPE, Phone.TYPE_MOBILE);
    310         mValues2.put(Phone.TYPE, Phone.TYPE_HOME);
    311         mValues3.put(Phone.TYPE, Phone.TYPE_WORK);
    312 
    313         final DataKind kind = mGoogleAccountType.getKindForMimetype(Phone.CONTENT_ITEM_TYPE);
    314 
    315         final List<DataItem> dataList =
    316                 createDataItemsAndCollapse(kind, mValues1, mValues2, mValues3);
    317         assertEquals(2, dataList.size());
    318         assertEquals(phone1, ((PhoneDataItem) dataList.get(0)).getNumber());
    319         assertEquals(phone2, ((PhoneDataItem) dataList.get(1)).getNumber());
    320         assertEquals(Phone.TYPE_MOBILE,
    321                 ((PhoneDataItem) dataList.get(0)).getKindTypeColumn(kind));
    322     }
    323 
    324     public void testDataItemCollapsing_relation() {
    325         final String name1 = "name1";
    326         final String name2 = "name2";
    327         final String customRelation1 = "custom relation 1";
    328         final String customRelation2 = "custom relation 2";
    329 
    330         mValues1.put(Data.MIMETYPE, Relation.CONTENT_ITEM_TYPE);
    331         mValues2.put(Data.MIMETYPE, Relation.CONTENT_ITEM_TYPE);
    332         mValues3.put(Data.MIMETYPE, Relation.CONTENT_ITEM_TYPE);
    333         mValues4.put(Data.MIMETYPE, Relation.CONTENT_ITEM_TYPE);
    334 
    335         mValues1.put(Relation.NAME, name1);
    336         mValues2.put(Relation.NAME, name1);
    337         mValues3.put(Relation.NAME, name1);
    338         mValues4.put(Relation.NAME, name2);
    339 
    340         mValues1.put(Relation.TYPE, Relation.TYPE_CUSTOM);
    341         mValues2.put(Relation.TYPE, Relation.TYPE_CUSTOM);
    342         mValues3.put(Relation.TYPE, Relation.TYPE_CUSTOM);
    343         mValues4.put(Relation.TYPE, Relation.TYPE_BROTHER);
    344 
    345         mValues1.put(Relation.LABEL, customRelation1);
    346         mValues2.put(Relation.LABEL, customRelation1);
    347         mValues3.put(Relation.LABEL, customRelation2);
    348 
    349         final DataKind kind = mGoogleAccountType.getKindForMimetype(Relation.CONTENT_ITEM_TYPE);
    350 
    351         final List<DataItem> dataList =
    352                 createDataItemsAndCollapse(kind, mValues1, mValues2, mValues3, mValues4);
    353 
    354         assertEquals(3, dataList.size());
    355         assertEquals(name1, ((RelationDataItem) dataList.get(0)).getName());
    356         assertEquals(name2, ((RelationDataItem) dataList.get(2)).getName());
    357 
    358         assertEquals(customRelation1, ((RelationDataItem) dataList.get(0)).getLabel());
    359         assertEquals(customRelation2, ((RelationDataItem) dataList.get(1)).getLabel());
    360     }
    361 
    362     public void testDataItemCollapsing_sip() {
    363         final String sip1 = "sip 1";
    364         final String sip2 = "sip 2";
    365 
    366         mValues1.put(Data.MIMETYPE, SipAddress.CONTENT_ITEM_TYPE);
    367         mValues2.put(Data.MIMETYPE, SipAddress.CONTENT_ITEM_TYPE);
    368         mValues3.put(Data.MIMETYPE, SipAddress.CONTENT_ITEM_TYPE);
    369 
    370         mValues1.put(SipAddress.SIP_ADDRESS, sip1);
    371         mValues2.put(SipAddress.SIP_ADDRESS, sip1);
    372         mValues3.put(SipAddress.SIP_ADDRESS, sip2);
    373 
    374         mValues1.put(SipAddress.TYPE, SipAddress.TYPE_WORK);
    375         mValues2.put(SipAddress.TYPE, SipAddress.TYPE_HOME);
    376         mValues3.put(SipAddress.TYPE, SipAddress.TYPE_WORK);
    377 
    378         final DataKind kind = mGoogleAccountType.getKindForMimetype(SipAddress.CONTENT_ITEM_TYPE);
    379 
    380         final List<DataItem> dataList =
    381                 createDataItemsAndCollapse(kind, mValues1, mValues2, mValues3);
    382 
    383         assertEquals(2, dataList.size());
    384         assertEquals(sip1, ((SipAddressDataItem) dataList.get(0)).getSipAddress());
    385         assertEquals(sip2, ((SipAddressDataItem) dataList.get(1)).getSipAddress());
    386     }
    387 
    388     public void testDataItemCollapsing_structuredName() {
    389         final String displayName1 = "Display Name 1";
    390         final String displayName2 = "Display Name 2";
    391 
    392         mValues1.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
    393         mValues2.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
    394         mValues3.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
    395 
    396         mValues1.put(StructuredName.DISPLAY_NAME, displayName1);
    397         mValues2.put(StructuredName.DISPLAY_NAME, displayName1);
    398         mValues3.put(StructuredName.DISPLAY_NAME, displayName2);
    399 
    400         final DataKind kind =
    401                 mGoogleAccountType.getKindForMimetype(StructuredName.CONTENT_ITEM_TYPE);
    402 
    403         final List<DataItem> dataList =
    404                 createDataItemsAndCollapse(kind, mValues1, mValues2, mValues3);
    405 
    406         assertEquals(2, dataList.size());
    407         assertEquals(displayName1, ((StructuredNameDataItem) dataList.get(0)).getDisplayName());
    408         assertEquals(displayName2, ((StructuredNameDataItem) dataList.get(1)).getDisplayName());
    409     }
    410 
    411     public void testDataItemCollapsing_structuredPostal() {
    412         final String formattedAddress1 = "Formatted Address 1";
    413         final String formattedAddress2 = "Formatted Address 2";
    414 
    415         mValues1.put(Data.MIMETYPE, StructuredPostal.CONTENT_ITEM_TYPE);
    416         mValues2.put(Data.MIMETYPE, StructuredPostal.CONTENT_ITEM_TYPE);
    417         mValues3.put(Data.MIMETYPE, StructuredPostal.CONTENT_ITEM_TYPE);
    418 
    419         mValues1.put(StructuredPostal.FORMATTED_ADDRESS, formattedAddress1);
    420         mValues2.put(StructuredPostal.FORMATTED_ADDRESS, formattedAddress1);
    421         mValues3.put(StructuredPostal.FORMATTED_ADDRESS, formattedAddress2);
    422 
    423         final DataKind kind =
    424                 mGoogleAccountType.getKindForMimetype(StructuredPostal.CONTENT_ITEM_TYPE);
    425 
    426         final List<DataItem> dataList =
    427                 createDataItemsAndCollapse(kind, mValues1, mValues2, mValues3);
    428 
    429         assertEquals(2, dataList.size());
    430         assertEquals(formattedAddress1,
    431                 ((StructuredPostalDataItem) dataList.get(0)).getFormattedAddress());
    432         assertEquals(formattedAddress2,
    433                 ((StructuredPostalDataItem) dataList.get(1)).getFormattedAddress());
    434     }
    435 
    436     public void testDataItemCollapsing_website() {
    437         final String url1 = "www.url1.com";
    438         final String url2 = "www.url2.com";
    439 
    440         mValues1.put(Data.MIMETYPE, Website.CONTENT_ITEM_TYPE);
    441         mValues2.put(Data.MIMETYPE, Website.CONTENT_ITEM_TYPE);
    442         mValues3.put(Data.MIMETYPE, Website.CONTENT_ITEM_TYPE);
    443 
    444         mValues1.put(Website.URL, url1);
    445         mValues2.put(Website.URL, url1);
    446         mValues3.put(Website.URL, url2);
    447 
    448         final DataKind kind = mGoogleAccountType.getKindForMimetype(Website.CONTENT_ITEM_TYPE);
    449 
    450         final List<DataItem> dataList =
    451                 createDataItemsAndCollapse(kind, mValues1, mValues2, mValues3);
    452 
    453         assertEquals(2, dataList.size());
    454         assertEquals(url1, ((WebsiteDataItem) dataList.get(0)).getUrl());
    455         assertEquals(url2, ((WebsiteDataItem) dataList.get(1)).getUrl());
    456     }
    457 }
    458