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