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 setUp()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 createDataItemsAndCollapse(DataKind kind, ContentValues... values)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 testDataItemCollapsing_genericDataItemFields()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 testDataItemCollapsing_email()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 testDataItemCollapsing_event()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 testDataItemCollapsing_im()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 testDataItemCollapsing_nickname()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 testDataItemCollapsing_note()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 testDataItemCollapsing_organization()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 testDataItemCollapsing_phone()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 testDataItemCollapsing_relation()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 testDataItemCollapsing_sip()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 testDataItemCollapsing_structuredName()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 testDataItemCollapsing_structuredPostal()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 testDataItemCollapsing_website()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