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 */
16package com.android.contacts.model.dataitem;
17
18import android.content.ContentValues;
19import android.provider.ContactsContract.CommonDataKinds.Email;
20import android.provider.ContactsContract.CommonDataKinds.Event;
21import android.provider.ContactsContract.CommonDataKinds.Im;
22import android.provider.ContactsContract.CommonDataKinds.Nickname;
23import android.provider.ContactsContract.CommonDataKinds.Note;
24import android.provider.ContactsContract.CommonDataKinds.Organization;
25import android.provider.ContactsContract.CommonDataKinds.Phone;
26import android.provider.ContactsContract.CommonDataKinds.Relation;
27import android.provider.ContactsContract.CommonDataKinds.SipAddress;
28import android.provider.ContactsContract.CommonDataKinds.StructuredName;
29import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
30import android.provider.ContactsContract.CommonDataKinds.Website;
31import android.provider.ContactsContract.Contacts.Data;
32import android.provider.ContactsContract.Contacts.Entity;
33import android.test.AndroidTestCase;
34import android.test.suitebuilder.annotation.SmallTest;
35
36import com.android.contacts.Collapser;
37import com.android.contacts.model.account.AccountType.EditType;
38import com.android.contacts.model.account.BaseAccountType;
39import com.android.contacts.model.account.GoogleAccountType;
40
41import java.util.ArrayList;
42import java.util.List;
43
44/**
45 * Test case for {@link DataItem}.
46 */
47@SmallTest
48public 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@google.com";
114        final String email2 = "email2@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