15ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee/* 25ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Copyright (C) 2009 The Android Open Source Project 35ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * 45ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Licensed under the Apache License, Version 2.0 (the "License"); 55ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * you may not use this file except in compliance with the License. 65ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * You may obtain a copy of the License at 75ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * 85ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * http://www.apache.org/licenses/LICENSE-2.0 95ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * 105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Unless required by applicable law or agreed to in writing, software 115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * distributed under the License is distributed on an "AS IS" BASIS, 125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * See the License for the specific language governing permissions and 145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * limitations under the License. 155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee */ 165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leepackage com.android.contacts.common; 185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport static android.content.ContentProviderOperation.TYPE_DELETE; 205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport static android.content.ContentProviderOperation.TYPE_INSERT; 215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport static android.content.ContentProviderOperation.TYPE_UPDATE; 225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.content.ContentProviderOperation; 245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.content.ContentValues; 255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.net.Uri; 265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.os.Bundle; 275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract; 285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.CommonDataKinds.Email; 295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.CommonDataKinds.Event; 305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.CommonDataKinds.Im; 315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.CommonDataKinds.Organization; 325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.CommonDataKinds.Phone; 335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.CommonDataKinds.StructuredName; 345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.CommonDataKinds.StructuredPostal; 355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.Data; 365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.Intents.Insert; 375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.RawContacts; 385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.test.AndroidTestCase; 395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.test.suitebuilder.annotation.LargeTest; 405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.AccountTypeManager; 425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.RawContact; 435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.RawContactDelta; 445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.ValuesDelta; 455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.RawContactDeltaList; 465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.RawContactModifier; 475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.account.AccountType; 485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.account.AccountType.EditType; 495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.account.ExchangeAccountType; 505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.account.GoogleAccountType; 515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.dataitem.DataKind; 525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.test.mocks.ContactsMockContext; 535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.test.mocks.MockAccountTypeManager; 545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.test.mocks.MockContentProvider; 555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.google.common.collect.Lists; 565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport java.util.ArrayList; 585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport java.util.List; 595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee/** 615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Tests for {@link RawContactModifier} to verify that {@link AccountType} 625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * constraints are being enforced correctly. 635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee */ 645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee@LargeTest 655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leepublic class RawContactModifierTests extends AndroidTestCase { 665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public static final String TAG = "EntityModifierTests"; 675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public static final long VER_FIRST = 100; 695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee private static final long TEST_ID = 4; 715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee private static final String TEST_PHONE = "218-555-1212"; 725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee private static final String TEST_NAME = "Adam Young"; 735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee private static final String TEST_NAME2 = "Breanne Duren"; 745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee private static final String TEST_IM = "example@example.com"; 755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee private static final String TEST_POSTAL = "1600 Amphitheatre Parkway"; 765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee private static final String TEST_ACCOUNT_NAME = "unittest@example.com"; 785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee private static final String TEST_ACCOUNT_TYPE = "com.example.unittest"; 795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee private static final String EXCHANGE_ACCT_TYPE = "com.android.exchange"; 815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee @Override 835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void setUp() { 845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mContext = getContext(); 855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public static class MockContactsSource extends AccountType { 885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee MockContactsSource() { 905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee try { 915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee this.accountType = TEST_ACCOUNT_TYPE; 925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final DataKind nameKind = new DataKind(StructuredName.CONTENT_ITEM_TYPE, 945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee R.string.nameLabelsGroup, -1, true); 955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee nameKind.typeOverallMax = 1; 965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee addKind(nameKind); 975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Phone allows maximum 2 home, 1 work, and unlimited other, with 995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // constraint of 5 numbers maximum. 1005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final DataKind phoneKind = new DataKind( 1015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee Phone.CONTENT_ITEM_TYPE, -1, 10, true); 1025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee phoneKind.typeOverallMax = 5; 1045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee phoneKind.typeColumn = Phone.TYPE; 1055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee phoneKind.typeList = Lists.newArrayList(); 1065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee phoneKind.typeList.add(new EditType(Phone.TYPE_HOME, -1).setSpecificMax(2)); 1075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee phoneKind.typeList.add(new EditType(Phone.TYPE_WORK, -1).setSpecificMax(1)); 1085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee phoneKind.typeList.add(new EditType(Phone.TYPE_FAX_WORK, -1).setSecondary(true)); 1095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee phoneKind.typeList.add(new EditType(Phone.TYPE_OTHER, -1)); 1105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee phoneKind.fieldList = Lists.newArrayList(); 1125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee phoneKind.fieldList.add(new EditField(Phone.NUMBER, -1, -1)); 1135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee phoneKind.fieldList.add(new EditField(Phone.LABEL, -1, -1)); 1145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee addKind(phoneKind); 1165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Email is unlimited 1185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final DataKind emailKind = new DataKind(Email.CONTENT_ITEM_TYPE, -1, 10, true); 1195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee emailKind.typeOverallMax = -1; 1205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee emailKind.fieldList = Lists.newArrayList(); 1215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee emailKind.fieldList.add(new EditField(Email.DATA, -1, -1)); 1225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee addKind(emailKind); 1235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // IM is only one 1255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final DataKind imKind = new DataKind(Im.CONTENT_ITEM_TYPE, -1, 10, true); 1265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee imKind.typeOverallMax = 1; 1275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee imKind.fieldList = Lists.newArrayList(); 1285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee imKind.fieldList.add(new EditField(Im.DATA, -1, -1)); 1295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee addKind(imKind); 1305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Organization is only one 1325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final DataKind orgKind = new DataKind(Organization.CONTENT_ITEM_TYPE, -1, 10, true); 1335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee orgKind.typeOverallMax = 1; 1345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee orgKind.fieldList = Lists.newArrayList(); 1355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee orgKind.fieldList.add(new EditField(Organization.COMPANY, -1, -1)); 1365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee orgKind.fieldList.add(new EditField(Organization.TITLE, -1, -1)); 1375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee addKind(orgKind); 1385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } catch (DefinitionException e) { 1395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee throw new RuntimeException(e); 1405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 1415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 1425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee @Override 1445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public boolean isGroupMembershipEditable() { 1455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return false; 1465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 1475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee @Override 1495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public boolean areContactsWritable() { 1505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return true; 1515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 1525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 1535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee /** 1555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Build a {@link AccountType} that has various odd constraints for 1565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * testing purposes. 1575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee */ 1585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee protected AccountType getAccountType() { 1595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return new MockContactsSource(); 1605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 1615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee /** 1635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Build {@link AccountTypeManager} instance. 1645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee */ 1655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee protected AccountTypeManager getAccountTypes(AccountType... types) { 1665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return new MockAccountTypeManager(types, null); 1675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 1685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee /** 1705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Build an {@link RawContact} with the requested set of phone numbers. 1715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee */ 1725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee protected RawContactDelta getRawContact(Long existingId, ContentValues... entries) { 1735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentValues contact = new ContentValues(); 1745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee if (existingId != null) { 1755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee contact.put(RawContacts._ID, existingId); 1765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 1775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee contact.put(RawContacts.ACCOUNT_NAME, TEST_ACCOUNT_NAME); 1785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee contact.put(RawContacts.ACCOUNT_TYPE, TEST_ACCOUNT_TYPE); 1795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final RawContact before = new RawContact(contact); 1815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee for (ContentValues values : entries) { 1825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee before.addDataItemValues(values); 1835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 1845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee return RawContactDelta.fromBefore(before); 1855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 1865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee /** 1885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Assert this {@link List} contains the given {@link Object}. 1895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee */ 1905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee protected void assertContains(List<?> list, Object object) { 1915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertTrue("Missing expected value", list.contains(object)); 1925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 1935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 1945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee /** 1955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Assert this {@link List} does not contain the given {@link Object}. 1965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee */ 1975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee protected void assertNotContains(List<?> list, Object object) { 1985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertFalse("Contained unexpected value", list.contains(object)); 1995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 2005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee /** 2025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Insert various rows to test 2035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * {@link RawContactModifier#getValidTypes(RawContactDelta, DataKind, EditType)} 2045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee */ 2055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testValidTypes() { 2065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Build a source and pull specific types 2075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final AccountType source = getAccountType(); 2085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final DataKind kindPhone = source.getKindForMimetype(Phone.CONTENT_ITEM_TYPE); 2095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final EditType typeHome = RawContactModifier.getType(kindPhone, Phone.TYPE_HOME); 2105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final EditType typeWork = RawContactModifier.getType(kindPhone, Phone.TYPE_WORK); 2115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final EditType typeOther = RawContactModifier.getType(kindPhone, Phone.TYPE_OTHER); 2125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee List<EditType> validTypes; 2145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Add first home, first work 2165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final RawContactDelta state = getRawContact(TEST_ID); 2175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.insertChild(state, kindPhone, typeHome); 2185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.insertChild(state, kindPhone, typeWork); 2195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Expecting home, other 2215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee validTypes = RawContactModifier.getValidTypes(state, kindPhone, null); 2225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertContains(validTypes, typeHome); 2235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertNotContains(validTypes, typeWork); 2245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertContains(validTypes, typeOther); 2255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Add second home 2275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.insertChild(state, kindPhone, typeHome); 2285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Expecting other 2305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee validTypes = RawContactModifier.getValidTypes(state, kindPhone, null); 2315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertNotContains(validTypes, typeHome); 2325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertNotContains(validTypes, typeWork); 2335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertContains(validTypes, typeOther); 2345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Add third and fourth home (invalid, but possible) 2365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.insertChild(state, kindPhone, typeHome); 2375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.insertChild(state, kindPhone, typeHome); 2385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Expecting none 2405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee validTypes = RawContactModifier.getValidTypes(state, kindPhone, null); 2415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertNotContains(validTypes, typeHome); 2425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertNotContains(validTypes, typeWork); 2435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertNotContains(validTypes, typeOther); 2445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 2455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee /** 2475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Test {@link RawContactModifier#canInsert(RawContactDelta, DataKind)} by 2485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * inserting various rows. 2495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee */ 2505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testCanInsert() { 2515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Build a source and pull specific types 2525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final AccountType source = getAccountType(); 2535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final DataKind kindPhone = source.getKindForMimetype(Phone.CONTENT_ITEM_TYPE); 2545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final EditType typeHome = RawContactModifier.getType(kindPhone, Phone.TYPE_HOME); 2555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final EditType typeWork = RawContactModifier.getType(kindPhone, Phone.TYPE_WORK); 2565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final EditType typeOther = RawContactModifier.getType(kindPhone, Phone.TYPE_OTHER); 2575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Add first home, first work 2595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final RawContactDelta state = getRawContact(TEST_ID); 2605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.insertChild(state, kindPhone, typeHome); 2615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.insertChild(state, kindPhone, typeWork); 2625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertTrue("Unable to insert", RawContactModifier.canInsert(state, kindPhone)); 2635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Add two other, which puts us just under "5" overall limit 2655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.insertChild(state, kindPhone, typeOther); 2665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.insertChild(state, kindPhone, typeOther); 2675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertTrue("Unable to insert", RawContactModifier.canInsert(state, kindPhone)); 2685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Add second home, which should push to snug limit 2705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.insertChild(state, kindPhone, typeHome); 2715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertFalse("Able to insert", RawContactModifier.canInsert(state, kindPhone)); 2725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 2735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee /** 2755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Test 2765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * {@link RawContactModifier#getBestValidType(RawContactDelta, DataKind, boolean, int)} 2775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * by asserting expected best options in various states. 2785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee */ 2795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testBestValidType() { 2805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Build a source and pull specific types 2815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final AccountType source = getAccountType(); 2825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final DataKind kindPhone = source.getKindForMimetype(Phone.CONTENT_ITEM_TYPE); 2835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final EditType typeHome = RawContactModifier.getType(kindPhone, Phone.TYPE_HOME); 2845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final EditType typeWork = RawContactModifier.getType(kindPhone, Phone.TYPE_WORK); 2855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final EditType typeFaxWork = RawContactModifier.getType(kindPhone, Phone.TYPE_FAX_WORK); 2865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final EditType typeOther = RawContactModifier.getType(kindPhone, Phone.TYPE_OTHER); 2875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee EditType suggested; 2895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Default suggestion should be home 2915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final RawContactDelta state = getRawContact(TEST_ID); 2925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee suggested = RawContactModifier.getBestValidType(state, kindPhone, false, Integer.MIN_VALUE); 2935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Unexpected suggestion", typeHome, suggested); 2945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 2955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Add first home, should now suggest work 2965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.insertChild(state, kindPhone, typeHome); 2975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee suggested = RawContactModifier.getBestValidType(state, kindPhone, false, Integer.MIN_VALUE); 2985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Unexpected suggestion", typeWork, suggested); 2995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 3005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Add work fax, should still suggest work 3015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.insertChild(state, kindPhone, typeFaxWork); 3025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee suggested = RawContactModifier.getBestValidType(state, kindPhone, false, Integer.MIN_VALUE); 3035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Unexpected suggestion", typeWork, suggested); 3045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 3055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Add other, should still suggest work 3065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.insertChild(state, kindPhone, typeOther); 3075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee suggested = RawContactModifier.getBestValidType(state, kindPhone, false, Integer.MIN_VALUE); 3085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Unexpected suggestion", typeWork, suggested); 3095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 3105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Add work, now should suggest other 3115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.insertChild(state, kindPhone, typeWork); 3125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee suggested = RawContactModifier.getBestValidType(state, kindPhone, false, Integer.MIN_VALUE); 3135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Unexpected suggestion", typeOther, suggested); 3145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 3155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 3165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testIsEmptyEmpty() { 3175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final AccountType source = getAccountType(); 3185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final DataKind kindPhone = source.getKindForMimetype(Phone.CONTENT_ITEM_TYPE); 3195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 3205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Test entirely empty row 3215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentValues after = new ContentValues(); 3225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ValuesDelta values = ValuesDelta.fromAfter(after); 3235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 3245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertTrue("Expected empty", RawContactModifier.isEmpty(values, kindPhone)); 3255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 3265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 3275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testIsEmptyDirectFields() { 3285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final AccountType source = getAccountType(); 3295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final DataKind kindPhone = source.getKindForMimetype(Phone.CONTENT_ITEM_TYPE); 3305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final EditType typeHome = RawContactModifier.getType(kindPhone, Phone.TYPE_HOME); 3315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 3325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Test row that has type values, but core fields are empty 3335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final RawContactDelta state = getRawContact(TEST_ID); 3345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ValuesDelta values = RawContactModifier.insertChild(state, kindPhone, typeHome); 3355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 3365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertTrue("Expected empty", RawContactModifier.isEmpty(values, kindPhone)); 3375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 3385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Insert some data to trigger non-empty state 3395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee values.put(Phone.NUMBER, TEST_PHONE); 3405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 3415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertFalse("Expected non-empty", RawContactModifier.isEmpty(values, kindPhone)); 3425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 3435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 3445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testTrimEmptySingle() { 3455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final AccountType source = getAccountType(); 3465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final DataKind kindPhone = source.getKindForMimetype(Phone.CONTENT_ITEM_TYPE); 3475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final EditType typeHome = RawContactModifier.getType(kindPhone, Phone.TYPE_HOME); 3485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 3495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Test row that has type values, but core fields are empty 3505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final RawContactDelta state = getRawContact(TEST_ID); 3515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.insertChild(state, kindPhone, typeHome); 3525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 3535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Build diff, expecting insert for data row and update enforcement 3545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ArrayList<ContentProviderOperation> diff = Lists.newArrayList(); 3555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee state.buildDiff(diff); 3565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Unexpected operations", 3, diff.size()); 3575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee { 3585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentProviderOperation oper = diff.get(0); 3595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Expected aggregation mode change", TYPE_UPDATE, oper.getType()); 3605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri()); 3615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 3625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee { 3635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentProviderOperation oper = diff.get(1); 3645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect type", TYPE_INSERT, oper.getType()); 3655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect target", Data.CONTENT_URI, oper.getUri()); 3665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 3675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee { 3685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentProviderOperation oper = diff.get(2); 3695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Expected aggregation mode change", TYPE_UPDATE, oper.getType()); 3705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri()); 3715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 3725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 3735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Trim empty rows and try again, expecting delete of overall contact 3745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.trimEmpty(state, source); 3755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee diff.clear(); 3765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee state.buildDiff(diff); 3775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Unexpected operations", 1, diff.size()); 3785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee { 3795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentProviderOperation oper = diff.get(0); 3805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect type", TYPE_DELETE, oper.getType()); 3815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri()); 3825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 3835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 3845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 3855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testTrimEmptySpaces() { 3865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final AccountType source = getAccountType(); 3875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final DataKind kindPhone = source.getKindForMimetype(Phone.CONTENT_ITEM_TYPE); 3885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final EditType typeHome = RawContactModifier.getType(kindPhone, Phone.TYPE_HOME); 3895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 3905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Test row that has type values, but values are spaces 3915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final RawContactDelta state = RawContactDeltaListTests.buildBeforeEntity(mContext, TEST_ID, 3925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee VER_FIRST); 3935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ValuesDelta values = RawContactModifier.insertChild(state, kindPhone, typeHome); 3945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee values.put(Phone.NUMBER, " "); 3955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 3965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Build diff, expecting insert for data row and update enforcement 3975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDeltaListTests.assertDiffPattern(state, 3985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDeltaListTests.buildAssertVersion(VER_FIRST), 3995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDeltaListTests.buildUpdateAggregationSuspended(), 4005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDeltaListTests.buildOper(Data.CONTENT_URI, TYPE_INSERT, 4015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDeltaListTests.buildDataInsert(values, TEST_ID)), 4025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDeltaListTests.buildUpdateAggregationDefault()); 4035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 4045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Trim empty rows and try again, expecting delete of overall contact 4055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.trimEmpty(state, source); 4065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDeltaListTests.assertDiffPattern(state, 4075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDeltaListTests.buildAssertVersion(VER_FIRST), 4085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDeltaListTests.buildDelete(RawContacts.CONTENT_URI)); 4095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 4105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 4115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testTrimLeaveValid() { 4125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final AccountType source = getAccountType(); 4135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final DataKind kindPhone = source.getKindForMimetype(Phone.CONTENT_ITEM_TYPE); 4145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final EditType typeHome = RawContactModifier.getType(kindPhone, Phone.TYPE_HOME); 4155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 4165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Test row that has type values with valid number 4175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final RawContactDelta state = RawContactDeltaListTests.buildBeforeEntity(mContext, TEST_ID, 4185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee VER_FIRST); 4195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ValuesDelta values = RawContactModifier.insertChild(state, kindPhone, typeHome); 4205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee values.put(Phone.NUMBER, TEST_PHONE); 4215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 4225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Build diff, expecting insert for data row and update enforcement 4235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDeltaListTests.assertDiffPattern(state, 4245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDeltaListTests.buildAssertVersion(VER_FIRST), 4255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDeltaListTests.buildUpdateAggregationSuspended(), 4265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDeltaListTests.buildOper(Data.CONTENT_URI, TYPE_INSERT, 4275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDeltaListTests.buildDataInsert(values, TEST_ID)), 4285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDeltaListTests.buildUpdateAggregationDefault()); 4295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 4305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Trim empty rows and try again, expecting no differences 4315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.trimEmpty(state, source); 4325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDeltaListTests.assertDiffPattern(state, 4335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDeltaListTests.buildAssertVersion(VER_FIRST), 4345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDeltaListTests.buildUpdateAggregationSuspended(), 4355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDeltaListTests.buildOper(Data.CONTENT_URI, TYPE_INSERT, 4365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDeltaListTests.buildDataInsert(values, TEST_ID)), 4375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDeltaListTests.buildUpdateAggregationDefault()); 4385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 4395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 4405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testTrimEmptyUntouched() { 4415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final AccountType source = getAccountType(); 4425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final DataKind kindPhone = source.getKindForMimetype(Phone.CONTENT_ITEM_TYPE); 4435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.getType(kindPhone, Phone.TYPE_HOME); 4445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 4455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Build "before" that has empty row 4465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final RawContactDelta state = getRawContact(TEST_ID); 4475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentValues before = new ContentValues(); 4485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee before.put(Data._ID, TEST_ID); 4495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee before.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 4505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee state.addEntry(ValuesDelta.fromBefore(before)); 4515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 4525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Build diff, expecting no changes 4535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ArrayList<ContentProviderOperation> diff = Lists.newArrayList(); 4545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee state.buildDiff(diff); 4555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Unexpected operations", 0, diff.size()); 4565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 4575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Try trimming existing empty, which we shouldn't touch 4585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.trimEmpty(state, source); 4595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee diff.clear(); 4605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee state.buildDiff(diff); 4615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Unexpected operations", 0, diff.size()); 4625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 4635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 4645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testTrimEmptyAfterUpdate() { 4655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final AccountType source = getAccountType(); 4665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final DataKind kindPhone = source.getKindForMimetype(Phone.CONTENT_ITEM_TYPE); 4675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final EditType typeHome = RawContactModifier.getType(kindPhone, Phone.TYPE_HOME); 4685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 4695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Build "before" that has row with some phone number 4705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentValues before = new ContentValues(); 4715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee before.put(Data._ID, TEST_ID); 4725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee before.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 4735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee before.put(kindPhone.typeColumn, typeHome.rawValue); 4745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee before.put(Phone.NUMBER, TEST_PHONE); 4755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final RawContactDelta state = getRawContact(TEST_ID, before); 4765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 4775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Build diff, expecting no changes 4785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ArrayList<ContentProviderOperation> diff = Lists.newArrayList(); 4795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee state.buildDiff(diff); 4805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Unexpected operations", 0, diff.size()); 4815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 4825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Now update row by changing number to empty string, expecting single update 4835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ValuesDelta child = state.getEntry(TEST_ID); 4845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee child.put(Phone.NUMBER, ""); 4855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee diff.clear(); 4865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee state.buildDiff(diff); 4875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Unexpected operations", 3, diff.size()); 4885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee { 4895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentProviderOperation oper = diff.get(0); 4905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Expected aggregation mode change", TYPE_UPDATE, oper.getType()); 4915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri()); 4925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 4935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee { 4945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentProviderOperation oper = diff.get(1); 4955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect type", TYPE_UPDATE, oper.getType()); 4965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect target", Data.CONTENT_URI, oper.getUri()); 4975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 4985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee { 4995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentProviderOperation oper = diff.get(2); 5005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Expected aggregation mode change", TYPE_UPDATE, oper.getType()); 5015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri()); 5025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 5035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 5045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Now run trim, which should turn that update into delete 5055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.trimEmpty(state, source); 5065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee diff.clear(); 5075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee state.buildDiff(diff); 5085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Unexpected operations", 1, diff.size()); 5095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee { 5105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentProviderOperation oper = diff.get(0); 5115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect type", TYPE_DELETE, oper.getType()); 5125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri()); 5135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 5145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 5155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 5165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testTrimInsertEmpty() { 5175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final AccountType accountType = getAccountType(); 5185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final AccountTypeManager accountTypes = getAccountTypes(accountType); 5195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final DataKind kindPhone = accountType.getKindForMimetype(Phone.CONTENT_ITEM_TYPE); 5205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.getType(kindPhone, Phone.TYPE_HOME); 5215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 5225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Try creating a contact without any child entries 5235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final RawContactDelta state = getRawContact(null); 5245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final RawContactDeltaList set = new RawContactDeltaList(); 5255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee set.add(state); 5265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 5275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 5285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Build diff, expecting single insert 5295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ArrayList<ContentProviderOperation> diff = Lists.newArrayList(); 5305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee state.buildDiff(diff); 5315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Unexpected operations", 2, diff.size()); 5325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee { 5335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentProviderOperation oper = diff.get(0); 5345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect type", TYPE_INSERT, oper.getType()); 5355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri()); 5365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 5375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 5385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Trim empty rows and try again, expecting no insert 5395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.trimEmpty(set, accountTypes); 5405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee diff.clear(); 5415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee state.buildDiff(diff); 5425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Unexpected operations", 0, diff.size()); 5435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 5445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 5455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testTrimInsertInsert() { 5465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final AccountType accountType = getAccountType(); 5475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final AccountTypeManager accountTypes = getAccountTypes(accountType); 5485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final DataKind kindPhone = accountType.getKindForMimetype(Phone.CONTENT_ITEM_TYPE); 5495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final EditType typeHome = RawContactModifier.getType(kindPhone, Phone.TYPE_HOME); 5505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 5515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Try creating a contact with single empty entry 5525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final RawContactDelta state = getRawContact(null); 5535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.insertChild(state, kindPhone, typeHome); 5545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final RawContactDeltaList set = new RawContactDeltaList(); 5555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee set.add(state); 5565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 5575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Build diff, expecting two insert operations 5585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ArrayList<ContentProviderOperation> diff = Lists.newArrayList(); 5595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee state.buildDiff(diff); 5605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Unexpected operations", 3, diff.size()); 5615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee { 5625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentProviderOperation oper = diff.get(0); 5635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect type", TYPE_INSERT, oper.getType()); 5645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri()); 5655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 5665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee { 5675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentProviderOperation oper = diff.get(1); 5685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect type", TYPE_INSERT, oper.getType()); 5695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect target", Data.CONTENT_URI, oper.getUri()); 5705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 5715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 5725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Trim empty rows and try again, expecting silence 5735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.trimEmpty(set, accountTypes); 5745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee diff.clear(); 5755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee state.buildDiff(diff); 5765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Unexpected operations", 0, diff.size()); 5775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 5785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 5795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testTrimUpdateRemain() { 5805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final AccountType accountType = getAccountType(); 5815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final AccountTypeManager accountTypes = getAccountTypes(accountType); 5825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final DataKind kindPhone = accountType.getKindForMimetype(Phone.CONTENT_ITEM_TYPE); 5835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final EditType typeHome = RawContactModifier.getType(kindPhone, Phone.TYPE_HOME); 5845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 5855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Build "before" with two phone numbers 5865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentValues first = new ContentValues(); 5875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee first.put(Data._ID, TEST_ID); 5885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee first.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 5895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee first.put(kindPhone.typeColumn, typeHome.rawValue); 5905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee first.put(Phone.NUMBER, TEST_PHONE); 5915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 5925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentValues second = new ContentValues(); 5935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee second.put(Data._ID, TEST_ID); 5945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee second.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 5955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee second.put(kindPhone.typeColumn, typeHome.rawValue); 5965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee second.put(Phone.NUMBER, TEST_PHONE); 5975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 5985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final RawContactDelta state = getRawContact(TEST_ID, first, second); 5995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final RawContactDeltaList set = new RawContactDeltaList(); 6005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee set.add(state); 6015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 6025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Build diff, expecting no changes 6035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ArrayList<ContentProviderOperation> diff = Lists.newArrayList(); 6045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee state.buildDiff(diff); 6055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Unexpected operations", 0, diff.size()); 6065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 6075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Now update row by changing number to empty string, expecting single update 6085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ValuesDelta child = state.getEntry(TEST_ID); 6095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee child.put(Phone.NUMBER, ""); 6105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee diff.clear(); 6115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee state.buildDiff(diff); 6125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Unexpected operations", 3, diff.size()); 6135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee { 6145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentProviderOperation oper = diff.get(0); 6155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Expected aggregation mode change", TYPE_UPDATE, oper.getType()); 6165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri()); 6175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 6185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee { 6195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentProviderOperation oper = diff.get(1); 6205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect type", TYPE_UPDATE, oper.getType()); 6215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect target", Data.CONTENT_URI, oper.getUri()); 6225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 6235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee { 6245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentProviderOperation oper = diff.get(2); 6255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Expected aggregation mode change", TYPE_UPDATE, oper.getType()); 6265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri()); 6275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 6285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 6295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Now run trim, which should turn that update into delete 6305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.trimEmpty(set, accountTypes); 6315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee diff.clear(); 6325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee state.buildDiff(diff); 6335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Unexpected operations", 3, diff.size()); 6345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee { 6355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentProviderOperation oper = diff.get(0); 6365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Expected aggregation mode change", TYPE_UPDATE, oper.getType()); 6375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri()); 6385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 6395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee { 6405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentProviderOperation oper = diff.get(1); 6415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect type", TYPE_DELETE, oper.getType()); 6425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect target", Data.CONTENT_URI, oper.getUri()); 6435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 6445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee { 6455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentProviderOperation oper = diff.get(2); 6465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Expected aggregation mode change", TYPE_UPDATE, oper.getType()); 6475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri()); 6485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 6495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 6505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 6515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testTrimUpdateUpdate() { 6525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final AccountType accountType = getAccountType(); 6535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final AccountTypeManager accountTypes = getAccountTypes(accountType); 6545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final DataKind kindPhone = accountType.getKindForMimetype(Phone.CONTENT_ITEM_TYPE); 6555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final EditType typeHome = RawContactModifier.getType(kindPhone, Phone.TYPE_HOME); 6565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 6575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Build "before" with two phone numbers 6585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentValues first = new ContentValues(); 6595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee first.put(Data._ID, TEST_ID); 6605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee first.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 6615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee first.put(kindPhone.typeColumn, typeHome.rawValue); 6625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee first.put(Phone.NUMBER, TEST_PHONE); 6635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 6645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final RawContactDelta state = getRawContact(TEST_ID, first); 6655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final RawContactDeltaList set = new RawContactDeltaList(); 6665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee set.add(state); 6675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 6685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Build diff, expecting no changes 6695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ArrayList<ContentProviderOperation> diff = Lists.newArrayList(); 6705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee state.buildDiff(diff); 6715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Unexpected operations", 0, diff.size()); 6725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 6735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Now update row by changing number to empty string, expecting single update 6745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ValuesDelta child = state.getEntry(TEST_ID); 6755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee child.put(Phone.NUMBER, ""); 6765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee diff.clear(); 6775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee state.buildDiff(diff); 6785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Unexpected operations", 3, diff.size()); 6795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee { 6805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentProviderOperation oper = diff.get(0); 6815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Expected aggregation mode change", TYPE_UPDATE, oper.getType()); 6825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri()); 6835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 6845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee { 6855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentProviderOperation oper = diff.get(1); 6865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect type", TYPE_UPDATE, oper.getType()); 6875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect target", Data.CONTENT_URI, oper.getUri()); 6885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 6895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee { 6905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentProviderOperation oper = diff.get(2); 6915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Expected aggregation mode change", TYPE_UPDATE, oper.getType()); 6925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri()); 6935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 6945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 6955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Now run trim, which should turn into deleting the whole contact 6965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.trimEmpty(set, accountTypes); 6975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee diff.clear(); 6985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee state.buildDiff(diff); 6995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Unexpected operations", 1, diff.size()); 7005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee { 7015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentProviderOperation oper = diff.get(0); 7025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect type", TYPE_DELETE, oper.getType()); 7035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Incorrect target", RawContacts.CONTENT_URI, oper.getUri()); 7045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 7055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 7065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 7075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testParseExtrasExistingName() { 7085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final AccountType accountType = getAccountType(); 7095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 7105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Build "before" name 7115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentValues first = new ContentValues(); 7125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee first.put(Data._ID, TEST_ID); 7135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee first.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); 7145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee first.put(StructuredName.GIVEN_NAME, TEST_NAME); 7155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 7165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Parse extras, making sure we keep single name 7175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final RawContactDelta state = getRawContact(TEST_ID, first); 7185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final Bundle extras = new Bundle(); 7195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee extras.putString(Insert.NAME, TEST_NAME2); 7205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.parseExtras(mContext, accountType, state, extras); 7215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 7225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final int nameCount = state.getMimeEntriesCount(StructuredName.CONTENT_ITEM_TYPE, true); 7235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Unexpected names", 1, nameCount); 7245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 7255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 7265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testParseExtrasIgnoreLimit() { 7275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final AccountType accountType = getAccountType(); 7285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 7295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Build "before" IM 7305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final ContentValues first = new ContentValues(); 7315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee first.put(Data._ID, TEST_ID); 7325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee first.put(Data.MIMETYPE, Im.CONTENT_ITEM_TYPE); 7335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee first.put(Im.DATA, TEST_IM); 7345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 7355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final RawContactDelta state = getRawContact(TEST_ID, first); 7365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final int beforeCount = state.getMimeEntries(Im.CONTENT_ITEM_TYPE).size(); 7375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 7385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // We should ignore data that doesn't fit account type rules, since account type 7395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // only allows single Im 7405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final Bundle extras = new Bundle(); 7415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee extras.putInt(Insert.IM_PROTOCOL, Im.PROTOCOL_GOOGLE_TALK); 7425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee extras.putString(Insert.IM_HANDLE, TEST_IM); 7435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.parseExtras(mContext, accountType, state, extras); 7445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 7455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final int afterCount = state.getMimeEntries(Im.CONTENT_ITEM_TYPE).size(); 7465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Broke account type rules", beforeCount, afterCount); 7475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 7485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 7495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testParseExtrasIgnoreUnhandled() { 7505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final AccountType accountType = getAccountType(); 7515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final RawContactDelta state = getRawContact(TEST_ID); 7525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 7535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // We should silently ignore types unsupported by account type 7545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final Bundle extras = new Bundle(); 7555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee extras.putString(Insert.POSTAL, TEST_POSTAL); 7565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.parseExtras(mContext, accountType, state, extras); 7575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 7585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertNull("Broke accoun type rules", 7595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee state.getMimeEntries(StructuredPostal.CONTENT_ITEM_TYPE)); 7605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 7615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 7625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testParseExtrasJobTitle() { 7635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final AccountType accountType = getAccountType(); 7645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final RawContactDelta state = getRawContact(TEST_ID); 7655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 7665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Make sure that we create partial Organizations 7675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final Bundle extras = new Bundle(); 7685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee extras.putString(Insert.JOB_TITLE, TEST_NAME); 7695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.parseExtras(mContext, accountType, state, extras); 7705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 7715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee final int count = state.getMimeEntries(Organization.CONTENT_ITEM_TYPE).size(); 7725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("Expected to create organization", 1, count); 7735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 7745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 7755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testMigrateWithDisplayNameFromGoogleToExchange1() { 7765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee AccountType oldAccountType = new GoogleAccountType(getContext(), ""); 7775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee AccountType newAccountType = new ExchangeAccountType(getContext(), "", EXCHANGE_ACCT_TYPE); 7785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee DataKind kind = newAccountType.getKindForMimetype(StructuredName.CONTENT_ITEM_TYPE); 7795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 7805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee ContactsMockContext context = new ContactsMockContext(getContext()); 7815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 7825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDelta oldState = new RawContactDelta(); 7835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee ContentValues mockNameValues = new ContentValues(); 7845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); 7855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(StructuredName.PREFIX, "prefix"); 7865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(StructuredName.GIVEN_NAME, "given"); 7875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(StructuredName.MIDDLE_NAME, "middle"); 7885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(StructuredName.FAMILY_NAME, "family"); 7895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(StructuredName.SUFFIX, "suffix"); 7905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(StructuredName.PHONETIC_FAMILY_NAME, "PHONETIC_FAMILY"); 7915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(StructuredName.PHONETIC_MIDDLE_NAME, "PHONETIC_MIDDLE"); 7925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(StructuredName.PHONETIC_GIVEN_NAME, "PHONETIC_GIVEN"); 7935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee oldState.addEntry(ValuesDelta.fromAfter(mockNameValues)); 7945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 7955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDelta newState = new RawContactDelta(); 7965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.migrateStructuredName(context, oldState, newState, kind); 7975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee List<ValuesDelta> list = newState.getMimeEntries(StructuredName.CONTENT_ITEM_TYPE); 7985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals(1, list.size()); 7995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 8005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee ContentValues output = list.get(0).getAfter(); 8015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("prefix", output.getAsString(StructuredName.PREFIX)); 8025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("given", output.getAsString(StructuredName.GIVEN_NAME)); 8035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("middle", output.getAsString(StructuredName.MIDDLE_NAME)); 8045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("family", output.getAsString(StructuredName.FAMILY_NAME)); 8055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("suffix", output.getAsString(StructuredName.SUFFIX)); 8065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Phonetic middle name isn't supported by Exchange. 8075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("PHONETIC_FAMILY", output.getAsString(StructuredName.PHONETIC_FAMILY_NAME)); 8085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("PHONETIC_GIVEN", output.getAsString(StructuredName.PHONETIC_GIVEN_NAME)); 8095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 8105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 8115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testMigrateWithDisplayNameFromGoogleToExchange2() { 8125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee AccountType oldAccountType = new GoogleAccountType(getContext(), ""); 8135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee AccountType newAccountType = new ExchangeAccountType(getContext(), "", EXCHANGE_ACCT_TYPE); 8145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee DataKind kind = newAccountType.getKindForMimetype(StructuredName.CONTENT_ITEM_TYPE); 8155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 8165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee ContactsMockContext context = new ContactsMockContext(getContext()); 8175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee MockContentProvider provider = context.getContactsProvider(); 8185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 8195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee String inputDisplayName = "prefix given middle family suffix"; 8205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // The method will ask the provider to split/join StructuredName. 8215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee Uri uriForBuildDisplayName = 8225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee ContactsContract.AUTHORITY_URI 8235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee .buildUpon() 8245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee .appendPath("complete_name") 8255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee .appendQueryParameter(StructuredName.DISPLAY_NAME, inputDisplayName) 8265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee .build(); 8275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee provider.expectQuery(uriForBuildDisplayName) 8285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee .returnRow("prefix", "given", "middle", "family", "suffix") 8295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee .withProjection(StructuredName.PREFIX, StructuredName.GIVEN_NAME, 8305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee StructuredName.MIDDLE_NAME, StructuredName.FAMILY_NAME, 8315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee StructuredName.SUFFIX); 8325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 8335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDelta oldState = new RawContactDelta(); 8345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee ContentValues mockNameValues = new ContentValues(); 8355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); 8365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(StructuredName.DISPLAY_NAME, inputDisplayName); 8375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee oldState.addEntry(ValuesDelta.fromAfter(mockNameValues)); 8385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 8395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDelta newState = new RawContactDelta(); 8405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.migrateStructuredName(context, oldState, newState, kind); 8415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee List<ValuesDelta> list = newState.getMimeEntries(StructuredName.CONTENT_ITEM_TYPE); 8425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals(1, list.size()); 8435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 8445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee ContentValues outputValues = list.get(0).getAfter(); 8455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("prefix", outputValues.getAsString(StructuredName.PREFIX)); 8465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("given", outputValues.getAsString(StructuredName.GIVEN_NAME)); 8475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("middle", outputValues.getAsString(StructuredName.MIDDLE_NAME)); 8485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("family", outputValues.getAsString(StructuredName.FAMILY_NAME)); 8495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("suffix", outputValues.getAsString(StructuredName.SUFFIX)); 8505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 8515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 8525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testMigrateWithStructuredNameFromExchangeToGoogle() { 8535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee AccountType oldAccountType = new ExchangeAccountType(getContext(), "", EXCHANGE_ACCT_TYPE); 8545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee AccountType newAccountType = new GoogleAccountType(getContext(), ""); 8555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee DataKind kind = newAccountType.getKindForMimetype(StructuredName.CONTENT_ITEM_TYPE); 8565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 8575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee ContactsMockContext context = new ContactsMockContext(getContext()); 8585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee MockContentProvider provider = context.getContactsProvider(); 8595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 8605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // The method will ask the provider to split/join StructuredName. 8615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee Uri uriForBuildDisplayName = 8625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee ContactsContract.AUTHORITY_URI 8635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee .buildUpon() 8645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee .appendPath("complete_name") 8655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee .appendQueryParameter(StructuredName.PREFIX, "prefix") 8665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee .appendQueryParameter(StructuredName.GIVEN_NAME, "given") 8675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee .appendQueryParameter(StructuredName.MIDDLE_NAME, "middle") 8685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee .appendQueryParameter(StructuredName.FAMILY_NAME, "family") 8695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee .appendQueryParameter(StructuredName.SUFFIX, "suffix") 8705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee .build(); 8715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee provider.expectQuery(uriForBuildDisplayName) 8725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee .returnRow("prefix given middle family suffix") 8735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee .withProjection(StructuredName.DISPLAY_NAME); 8745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 8755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDelta oldState = new RawContactDelta(); 8765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee ContentValues mockNameValues = new ContentValues(); 8775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); 8785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(StructuredName.PREFIX, "prefix"); 8795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(StructuredName.GIVEN_NAME, "given"); 8805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(StructuredName.MIDDLE_NAME, "middle"); 8815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(StructuredName.FAMILY_NAME, "family"); 8825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(StructuredName.SUFFIX, "suffix"); 8835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee oldState.addEntry(ValuesDelta.fromAfter(mockNameValues)); 8845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 8855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDelta newState = new RawContactDelta(); 8865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.migrateStructuredName(context, oldState, newState, kind); 8875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 8885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee List<ValuesDelta> list = newState.getMimeEntries(StructuredName.CONTENT_ITEM_TYPE); 8895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertNotNull(list); 8905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals(1, list.size()); 8915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee ContentValues outputValues = list.get(0).getAfter(); 8925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("prefix given middle family suffix", 8935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee outputValues.getAsString(StructuredName.DISPLAY_NAME)); 8945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 8955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 8965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testMigratePostalFromGoogleToExchange() { 8975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee AccountType oldAccountType = new GoogleAccountType(getContext(), ""); 8985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee AccountType newAccountType = new ExchangeAccountType(getContext(), "", EXCHANGE_ACCT_TYPE); 8995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee DataKind kind = newAccountType.getKindForMimetype(StructuredPostal.CONTENT_ITEM_TYPE); 9005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 9015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDelta oldState = new RawContactDelta(); 9025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee ContentValues mockNameValues = new ContentValues(); 9035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Data.MIMETYPE, StructuredPostal.CONTENT_ITEM_TYPE); 9045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(StructuredPostal.FORMATTED_ADDRESS, "formatted_address"); 9055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee oldState.addEntry(ValuesDelta.fromAfter(mockNameValues)); 9065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 9075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDelta newState = new RawContactDelta(); 9085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.migratePostal(oldState, newState, kind); 9095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 9105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee List<ValuesDelta> list = newState.getMimeEntries(StructuredPostal.CONTENT_ITEM_TYPE); 9115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertNotNull(list); 9125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals(1, list.size()); 9135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee ContentValues outputValues = list.get(0).getAfter(); 9145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // FORMATTED_ADDRESS isn't supported by Exchange. 9155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertNull(outputValues.getAsString(StructuredPostal.FORMATTED_ADDRESS)); 9165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("formatted_address", outputValues.getAsString(StructuredPostal.STREET)); 9175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 9185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 9195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testMigratePostalFromExchangeToGoogle() { 9205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee AccountType oldAccountType = new ExchangeAccountType(getContext(), "", EXCHANGE_ACCT_TYPE); 9215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee AccountType newAccountType = new GoogleAccountType(getContext(), ""); 9225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee DataKind kind = newAccountType.getKindForMimetype(StructuredPostal.CONTENT_ITEM_TYPE); 9235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 9245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDelta oldState = new RawContactDelta(); 9255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee ContentValues mockNameValues = new ContentValues(); 9265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Data.MIMETYPE, StructuredPostal.CONTENT_ITEM_TYPE); 9275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(StructuredPostal.COUNTRY, "country"); 9285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(StructuredPostal.POSTCODE, "postcode"); 9295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(StructuredPostal.REGION, "region"); 9305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(StructuredPostal.CITY, "city"); 9315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(StructuredPostal.STREET, "street"); 9325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee oldState.addEntry(ValuesDelta.fromAfter(mockNameValues)); 9335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 9345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDelta newState = new RawContactDelta(); 9355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.migratePostal(oldState, newState, kind); 9365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 9375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee List<ValuesDelta> list = newState.getMimeEntries(StructuredPostal.CONTENT_ITEM_TYPE); 9385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertNotNull(list); 9395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals(1, list.size()); 9405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee ContentValues outputValues = list.get(0).getAfter(); 9415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 9425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Check FORMATTED_ADDRESS contains all info. 9435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee String formattedAddress = outputValues.getAsString(StructuredPostal.FORMATTED_ADDRESS); 9445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertNotNull(formattedAddress); 9455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertTrue(formattedAddress.contains("country")); 9465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertTrue(formattedAddress.contains("postcode")); 9475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertTrue(formattedAddress.contains("region")); 9485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertTrue(formattedAddress.contains("postcode")); 9495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertTrue(formattedAddress.contains("city")); 9505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertTrue(formattedAddress.contains("street")); 9515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 9525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 9535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testMigrateEventFromGoogleToExchange1() { 9545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee testMigrateEventCommon(new GoogleAccountType(getContext(), ""), 9555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee new ExchangeAccountType(getContext(), "", EXCHANGE_ACCT_TYPE)); 9565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 9575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 9585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testMigrateEventFromExchangeToGoogle() { 9595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee testMigrateEventCommon(new ExchangeAccountType(getContext(), "", EXCHANGE_ACCT_TYPE), 9605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee new GoogleAccountType(getContext(), "")); 9615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 9625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 9635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee private void testMigrateEventCommon(AccountType oldAccountType, AccountType newAccountType) { 9645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee DataKind kind = newAccountType.getKindForMimetype(Event.CONTENT_ITEM_TYPE); 9655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 9665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDelta oldState = new RawContactDelta(); 9675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee ContentValues mockNameValues = new ContentValues(); 9685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Data.MIMETYPE, Event.CONTENT_ITEM_TYPE); 9695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Event.START_DATE, "1972-02-08"); 9705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Event.TYPE, Event.TYPE_BIRTHDAY); 9715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee oldState.addEntry(ValuesDelta.fromAfter(mockNameValues)); 9725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 9735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDelta newState = new RawContactDelta(); 9745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.migrateEvent(oldState, newState, kind, 1990); 9755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 9765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee List<ValuesDelta> list = newState.getMimeEntries(Event.CONTENT_ITEM_TYPE); 9775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertNotNull(list); 9785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals(1, list.size()); // Anniversary should be dropped. 9795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee ContentValues outputValues = list.get(0).getAfter(); 9805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 9815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("1972-02-08", outputValues.getAsString(Event.START_DATE)); 9825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals(Event.TYPE_BIRTHDAY, outputValues.getAsInteger(Event.TYPE).intValue()); 9835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 9845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 9855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testMigrateEventFromGoogleToExchange2() { 9865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee AccountType oldAccountType = new GoogleAccountType(getContext(), ""); 9875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee AccountType newAccountType = new ExchangeAccountType(getContext(), "", EXCHANGE_ACCT_TYPE); 9885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee DataKind kind = newAccountType.getKindForMimetype(Event.CONTENT_ITEM_TYPE); 9895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 9905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDelta oldState = new RawContactDelta(); 9915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee ContentValues mockNameValues = new ContentValues(); 9925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Data.MIMETYPE, Event.CONTENT_ITEM_TYPE); 9935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // No year format is not supported by Exchange. 9945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Event.START_DATE, "--06-01"); 9955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Event.TYPE, Event.TYPE_BIRTHDAY); 9965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee oldState.addEntry(ValuesDelta.fromAfter(mockNameValues)); 9975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues = new ContentValues(); 9985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Data.MIMETYPE, Event.CONTENT_ITEM_TYPE); 9995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Event.START_DATE, "1980-08-02"); 10005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Anniversary is not supported by Exchange 10015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Event.TYPE, Event.TYPE_ANNIVERSARY); 10025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee oldState.addEntry(ValuesDelta.fromAfter(mockNameValues)); 10035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 10045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDelta newState = new RawContactDelta(); 10055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.migrateEvent(oldState, newState, kind, 1990); 10065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 10075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee List<ValuesDelta> list = newState.getMimeEntries(Event.CONTENT_ITEM_TYPE); 10085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertNotNull(list); 10095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals(1, list.size()); // Anniversary should be dropped. 10105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee ContentValues outputValues = list.get(0).getAfter(); 10115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 10125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Default year should be used. 10135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("1990-06-01", outputValues.getAsString(Event.START_DATE)); 10145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals(Event.TYPE_BIRTHDAY, outputValues.getAsInteger(Event.TYPE).intValue()); 10155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 10165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 10175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testMigrateEmailFromGoogleToExchange() { 10185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee AccountType oldAccountType = new GoogleAccountType(getContext(), ""); 10195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee AccountType newAccountType = new ExchangeAccountType(getContext(), "", EXCHANGE_ACCT_TYPE); 10205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee DataKind kind = newAccountType.getKindForMimetype(Email.CONTENT_ITEM_TYPE); 10215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 10225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDelta oldState = new RawContactDelta(); 10235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee ContentValues mockNameValues = new ContentValues(); 10245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 10255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Email.TYPE, Email.TYPE_CUSTOM); 10265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Email.LABEL, "custom_type"); 10275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Email.ADDRESS, "address1"); 10285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee oldState.addEntry(ValuesDelta.fromAfter(mockNameValues)); 10295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues = new ContentValues(); 10305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 10315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Email.TYPE, Email.TYPE_HOME); 10325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Email.ADDRESS, "address2"); 10335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee oldState.addEntry(ValuesDelta.fromAfter(mockNameValues)); 10345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues = new ContentValues(); 10355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 10365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Email.TYPE, Email.TYPE_WORK); 10375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Email.ADDRESS, "address3"); 10385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee oldState.addEntry(ValuesDelta.fromAfter(mockNameValues)); 10395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Exchange can have up to 3 email entries. This 4th entry should be dropped. 10405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues = new ContentValues(); 10415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 10425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Email.TYPE, Email.TYPE_OTHER); 10435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Email.ADDRESS, "address4"); 10445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee oldState.addEntry(ValuesDelta.fromAfter(mockNameValues)); 10455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 10465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDelta newState = new RawContactDelta(); 10475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.migrateGenericWithTypeColumn(oldState, newState, kind); 10485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 10495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee List<ValuesDelta> list = newState.getMimeEntries(Email.CONTENT_ITEM_TYPE); 10505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertNotNull(list); 10515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals(3, list.size()); 10525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 10535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee ContentValues outputValues = list.get(0).getAfter(); 10545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals(Email.TYPE_CUSTOM, outputValues.getAsInteger(Email.TYPE).intValue()); 10555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("custom_type", outputValues.getAsString(Email.LABEL)); 10565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("address1", outputValues.getAsString(Email.ADDRESS)); 10575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 10585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee outputValues = list.get(1).getAfter(); 10595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals(Email.TYPE_HOME, outputValues.getAsInteger(Email.TYPE).intValue()); 10605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("address2", outputValues.getAsString(Email.ADDRESS)); 10615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 10625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee outputValues = list.get(2).getAfter(); 10635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals(Email.TYPE_WORK, outputValues.getAsInteger(Email.TYPE).intValue()); 10645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("address3", outputValues.getAsString(Email.ADDRESS)); 10655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 10665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 10675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testMigrateImFromGoogleToExchange() { 10685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee AccountType oldAccountType = new GoogleAccountType(getContext(), ""); 10695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee AccountType newAccountType = new ExchangeAccountType(getContext(), "", EXCHANGE_ACCT_TYPE); 10705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee DataKind kind = newAccountType.getKindForMimetype(Im.CONTENT_ITEM_TYPE); 10715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 10725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDelta oldState = new RawContactDelta(); 10735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee ContentValues mockNameValues = new ContentValues(); 10745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Data.MIMETYPE, Im.CONTENT_ITEM_TYPE); 10755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Exchange doesn't support TYPE_HOME 10765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Im.TYPE, Im.TYPE_HOME); 10775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Im.PROTOCOL, Im.PROTOCOL_JABBER); 10785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Im.DATA, "im1"); 10795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee oldState.addEntry(ValuesDelta.fromAfter(mockNameValues)); 10805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 10815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues = new ContentValues(); 10825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Data.MIMETYPE, Im.CONTENT_ITEM_TYPE); 10835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Exchange doesn't support TYPE_WORK 10845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Im.TYPE, Im.TYPE_WORK); 10855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Im.PROTOCOL, Im.PROTOCOL_YAHOO); 10865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Im.DATA, "im2"); 10875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee oldState.addEntry(ValuesDelta.fromAfter(mockNameValues)); 10885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 10895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues = new ContentValues(); 10905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Data.MIMETYPE, Im.CONTENT_ITEM_TYPE); 10915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Im.TYPE, Im.TYPE_OTHER); 10925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Im.PROTOCOL, Im.PROTOCOL_CUSTOM); 10935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Im.CUSTOM_PROTOCOL, "custom_protocol"); 10945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Im.DATA, "im3"); 10955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee oldState.addEntry(ValuesDelta.fromAfter(mockNameValues)); 10965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 10975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Exchange can have up to 3 IM entries. This 4th entry should be dropped. 10985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues = new ContentValues(); 10995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Data.MIMETYPE, Im.CONTENT_ITEM_TYPE); 11005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Im.TYPE, Im.TYPE_OTHER); 11015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Im.PROTOCOL, Im.PROTOCOL_GOOGLE_TALK); 11025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Im.DATA, "im4"); 11035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee oldState.addEntry(ValuesDelta.fromAfter(mockNameValues)); 11045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 11055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDelta newState = new RawContactDelta(); 11065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.migrateGenericWithTypeColumn(oldState, newState, kind); 11075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 11085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee List<ValuesDelta> list = newState.getMimeEntries(Im.CONTENT_ITEM_TYPE); 11095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertNotNull(list); 11105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals(3, list.size()); 11115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 11125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertNotNull(kind.defaultValues.getAsInteger(Im.TYPE)); 11135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 11145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee int defaultType = kind.defaultValues.getAsInteger(Im.TYPE); 11155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 11165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee ContentValues outputValues = list.get(0).getAfter(); 11175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // HOME should become default type. 11185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals(defaultType, outputValues.getAsInteger(Im.TYPE).intValue()); 11195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals(Im.PROTOCOL_JABBER, outputValues.getAsInteger(Im.PROTOCOL).intValue()); 11205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("im1", outputValues.getAsString(Im.DATA)); 11215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 11225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee outputValues = list.get(1).getAfter(); 11235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals(defaultType, outputValues.getAsInteger(Im.TYPE).intValue()); 11245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals(Im.PROTOCOL_YAHOO, outputValues.getAsInteger(Im.PROTOCOL).intValue()); 11255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("im2", outputValues.getAsString(Im.DATA)); 11265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 11275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee outputValues = list.get(2).getAfter(); 11285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals(defaultType, outputValues.getAsInteger(Im.TYPE).intValue()); 11295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals(Im.PROTOCOL_CUSTOM, outputValues.getAsInteger(Im.PROTOCOL).intValue()); 11305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("custom_protocol", outputValues.getAsString(Im.CUSTOM_PROTOCOL)); 11315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("im3", outputValues.getAsString(Im.DATA)); 11325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 11335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 11345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testMigratePhoneFromGoogleToExchange() { 11355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee AccountType oldAccountType = new GoogleAccountType(getContext(), ""); 11365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee AccountType newAccountType = new ExchangeAccountType(getContext(), "", EXCHANGE_ACCT_TYPE); 11375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee DataKind kind = newAccountType.getKindForMimetype(Phone.CONTENT_ITEM_TYPE); 11385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 11395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Create 5 numbers. 11405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // - "1" -- HOME 11415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // - "2" -- WORK 11425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // - "3" -- CUSTOM 11435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // - "4" -- WORK 11445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // - "5" -- WORK_MOBILE 11455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Then we convert it to Exchange account type. 11465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // - "1" -- HOME 11475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // - "2" -- WORK 11485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // - "3" -- Because CUSTOM is not supported, it'll be changed to the default, MOBILE 11495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // - "4" -- WORK 11505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // - "5" -- WORK_MOBILE not suppoted again, so will be MOBILE. 11515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // But then, Exchange doesn't support multiple MOBILE numbers, so "5" will be removed. 11525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // i.e. the result will be: 11535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // - "1" -- HOME 11545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // - "2" -- WORK 11555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // - "3" -- MOBILE 11565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // - "4" -- WORK 11575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 11585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDelta oldState = new RawContactDelta(); 11595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee ContentValues mockNameValues = new ContentValues(); 11605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 11615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Phone.TYPE, Phone.TYPE_HOME); 11625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Phone.NUMBER, "1"); 11635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee oldState.addEntry(ValuesDelta.fromAfter(mockNameValues)); 11645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues = new ContentValues(); 11655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 11665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Phone.TYPE, Phone.TYPE_WORK); 11675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Phone.NUMBER, "2"); 11685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee oldState.addEntry(ValuesDelta.fromAfter(mockNameValues)); 11695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues = new ContentValues(); 11705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 11715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee // Exchange doesn't support this type. Default to MOBILE 11725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Phone.TYPE, Phone.TYPE_CUSTOM); 11735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Phone.LABEL, "custom_type"); 11745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Phone.NUMBER, "3"); 11755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee oldState.addEntry(ValuesDelta.fromAfter(mockNameValues)); 11765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues = new ContentValues(); 11775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 11785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Phone.TYPE, Phone.TYPE_WORK); 11795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Phone.NUMBER, "4"); 11805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee oldState.addEntry(ValuesDelta.fromAfter(mockNameValues)); 11815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues = new ContentValues(); 11825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 11835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 11845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Phone.TYPE, Phone.TYPE_WORK_MOBILE); 11855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Phone.NUMBER, "5"); 11865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee oldState.addEntry(ValuesDelta.fromAfter(mockNameValues)); 11875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 11885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDelta newState = new RawContactDelta(); 11895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.migrateGenericWithTypeColumn(oldState, newState, kind); 11905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 11915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee List<ValuesDelta> list = newState.getMimeEntries(Phone.CONTENT_ITEM_TYPE); 11925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertNotNull(list); 11935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals(4, list.size()); 11945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 11955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee int defaultType = Phone.TYPE_MOBILE; 11965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 11975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee ContentValues outputValues = list.get(0).getAfter(); 11985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals(Phone.TYPE_HOME, outputValues.getAsInteger(Phone.TYPE).intValue()); 11995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("1", outputValues.getAsString(Phone.NUMBER)); 12005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee outputValues = list.get(1).getAfter(); 12015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals(Phone.TYPE_WORK, outputValues.getAsInteger(Phone.TYPE).intValue()); 12025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("2", outputValues.getAsString(Phone.NUMBER)); 12035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee outputValues = list.get(2).getAfter(); 12045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals(defaultType, outputValues.getAsInteger(Phone.TYPE).intValue()); 12055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertNull(outputValues.getAsInteger(Phone.LABEL)); 12065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("3", outputValues.getAsString(Phone.NUMBER)); 12075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee outputValues = list.get(3).getAfter(); 12085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals(Phone.TYPE_WORK, outputValues.getAsInteger(Phone.TYPE).intValue()); 12095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("4", outputValues.getAsString(Phone.NUMBER)); 12105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 12115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 12125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee public void testMigrateOrganizationFromGoogleToExchange() { 12135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee AccountType oldAccountType = new GoogleAccountType(getContext(), ""); 12145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee AccountType newAccountType = new ExchangeAccountType(getContext(), "", EXCHANGE_ACCT_TYPE); 12155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee DataKind kind = newAccountType.getKindForMimetype(Organization.CONTENT_ITEM_TYPE); 12165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 12175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDelta oldState = new RawContactDelta(); 12185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee ContentValues mockNameValues = new ContentValues(); 12195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE); 12205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Organization.COMPANY, "company1"); 12215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee mockNameValues.put(Organization.DEPARTMENT, "department1"); 12225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee oldState.addEntry(ValuesDelta.fromAfter(mockNameValues)); 12235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 12245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactDelta newState = new RawContactDelta(); 12255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee RawContactModifier.migrateGenericWithoutTypeColumn(oldState, newState, kind); 12265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 12275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee List<ValuesDelta> list = newState.getMimeEntries(Organization.CONTENT_ITEM_TYPE); 12285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertNotNull(list); 12295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals(1, list.size()); 12305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee 12315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee ContentValues outputValues = list.get(0).getAfter(); 12325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("company1", outputValues.getAsString(Organization.COMPANY)); 12335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee assertEquals("department1", outputValues.getAsString(Organization.DEPARTMENT)); 12345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee } 12355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee} 1236