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