1ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey/* 2ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * Copyright (C) 2009 The Android Open Source Project 3ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * 4ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 5ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * you may not use this file except in compliance with the License. 6ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * You may obtain a copy of the License at 7ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * 8ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 9ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * 10ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * Unless required by applicable law or agreed to in writing, software 11ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 12ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * See the License for the specific language governing permissions and 14ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * limitations under the License. 15ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey */ 16ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 1728f8857b1b46bde18b85c6d3c2a63ac44c3c2e1cEvan Millarpackage com.android.providers.contacts; 18ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 195aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkeyimport android.accounts.Account; 201a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkeyimport android.content.ContentProviderOperation; 216cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikovimport android.content.ContentUris; 226cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikovimport android.content.ContentValues; 231a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkeyimport android.content.OperationApplicationException; 24ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkeyimport android.database.Cursor; 256cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikovimport android.net.Uri; 261a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkeyimport android.os.RemoteException; 271a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkeyimport android.provider.ContactsContract; 281a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkeyimport android.provider.ContactsContract.AggregationExceptions; 29ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmannimport android.provider.ContactsContract.CommonDataKinds.GroupMembership; 305aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkeyimport android.provider.ContactsContract.Contacts; 31ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkeyimport android.provider.ContactsContract.Groups; 321a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkeyimport android.provider.ContactsContract.Settings; 338920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephensimport android.test.suitebuilder.annotation.MediumTest; 34ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 3538210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport com.google.android.collect.Lists; 3638210445730ee04c351c7cc1b3800cfe23e34325Makoto Onuki 371a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkeyimport java.util.ArrayList; 381a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 39ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey/** 40ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * Unit tests for {@link Groups} and {@link GroupMembership}. 41ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * 42ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * Run the test like this: 43ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * <code> 448920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens * adb shell am instrument -e class com.android.providers.contacts.GroupsTest -w \ 4528f8857b1b46bde18b85c6d3c2a63ac44c3c2e1cEvan Millar * com.android.providers.contacts.tests/android.test.InstrumentationTestRunner 46ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * </code> 47ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey */ 48fc42772538fc6f7e2e444cbe6b24e06a3fbf933dMakoto Onuki@MediumTest 49bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovpublic class GroupsTest extends BaseContactsProvider2Test { 50ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 51ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey private static final String GROUP_GREY = "Grey"; 52ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey private static final String GROUP_RED = "Red"; 53ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey private static final String GROUP_GREEN = "Green"; 54ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey private static final String GROUP_BLUE = "Blue"; 55ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 56ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey private static final String PERSON_ALPHA = "Alpha"; 57ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey private static final String PERSON_BRAVO = "Bravo"; 58ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey private static final String PERSON_CHARLIE = "Charlie"; 59ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey private static final String PERSON_DELTA = "Delta"; 60ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 61ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey private static final String PHONE_ALPHA = "555-1111"; 62ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey private static final String PHONE_BRAVO_1 = "555-2222"; 63ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey private static final String PHONE_BRAVO_2 = "555-3333"; 64ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey private static final String PHONE_CHARLIE_1 = "555-4444"; 65ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey private static final String PHONE_CHARLIE_2 = "555-5555"; 66ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 67ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public void testGroupSummary() { 68ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 69ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // Clear any existing data before starting 70bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov // TODO make the provider wipe data automatically 71bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov ((SynchronousContactsProvider2)mActor.provider).wipeData(); 72ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 73ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // Create a handful of groups 74ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey long groupGrey = mActor.createGroup(GROUP_GREY); 75ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey long groupRed = mActor.createGroup(GROUP_RED); 76ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey long groupGreen = mActor.createGroup(GROUP_GREEN); 77ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey long groupBlue = mActor.createGroup(GROUP_BLUE); 78ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 79ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // Create a handful of contacts 80ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann long contactAlpha = mActor.createRawContact(PERSON_ALPHA); 81ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann long contactBravo = mActor.createRawContact(PERSON_BRAVO); 82ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann long contactCharlie = mActor.createRawContact(PERSON_CHARLIE); 83ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann long contactCharlieDupe = mActor.createRawContact(PERSON_CHARLIE); 8447fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov setAggregationException( 8547fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov AggregationExceptions.TYPE_KEEP_TOGETHER, contactCharlie, contactCharlieDupe); 86ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann long contactDelta = mActor.createRawContact(PERSON_DELTA); 87ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 886bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov assertAggregated(contactCharlie, contactCharlieDupe); 89ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 90ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // Add phone numbers to specific contacts 91ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey mActor.createPhone(contactAlpha, PHONE_ALPHA); 92ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey mActor.createPhone(contactBravo, PHONE_BRAVO_1); 93ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey mActor.createPhone(contactBravo, PHONE_BRAVO_2); 94ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey mActor.createPhone(contactCharlie, PHONE_CHARLIE_1); 95ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey mActor.createPhone(contactCharlieDupe, PHONE_CHARLIE_2); 96ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 97ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // Add contacts to various mixture of groups. Grey will have all 98ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // contacts, Red only with phone numbers, Green with no phones, and Blue 99ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // with no contacts at all. 100ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey mActor.createGroupMembership(contactAlpha, groupGrey); 101ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey mActor.createGroupMembership(contactBravo, groupGrey); 102ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey mActor.createGroupMembership(contactCharlie, groupGrey); 103ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey mActor.createGroupMembership(contactDelta, groupGrey); 104ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 105ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey mActor.createGroupMembership(contactAlpha, groupRed); 106ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey mActor.createGroupMembership(contactBravo, groupRed); 107ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey mActor.createGroupMembership(contactCharlie, groupRed); 108ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 109ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey mActor.createGroupMembership(contactDelta, groupGreen); 110ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 111ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // Walk across groups summary cursor and verify returned counts. 112ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey final Cursor cursor = mActor.resolver.query(Groups.CONTENT_SUMMARY_URI, 113ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey Projections.PROJ_SUMMARY, null, null, null); 114ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 115ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // Require that each group has a summary row 116ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey assertTrue("Didn't return summary for all groups", (cursor.getCount() == 4)); 117ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 118ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey while (cursor.moveToNext()) { 119ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey final long groupId = cursor.getLong(Projections.COL_ID); 120ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey final int summaryCount = cursor.getInt(Projections.COL_SUMMARY_COUNT); 121ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey final int summaryWithPhones = cursor.getInt(Projections.COL_SUMMARY_WITH_PHONES); 122ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 123ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey if (groupId == groupGrey) { 124ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // Grey should have four aggregates, three with phones. 1256bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov assertEquals("Incorrect Grey count", 4, summaryCount); 1266bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov assertEquals("Incorrect Grey with phones count", 3, summaryWithPhones); 127ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey } else if (groupId == groupRed) { 128ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // Red should have 3 aggregates, all with phones. 1296bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov assertEquals("Incorrect Red count", 3, summaryCount); 1306bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov assertEquals("Incorrect Red with phones count", 3, summaryWithPhones); 131ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey } else if (groupId == groupGreen) { 132ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // Green should have 1 aggregate, none with phones. 1336bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov assertEquals("Incorrect Green count", 1, summaryCount); 1346bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov assertEquals("Incorrect Green with phones count", 0, summaryWithPhones); 135ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey } else if (groupId == groupBlue) { 136ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // Blue should have no contacts. 1376bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov assertEquals("Incorrect Blue count", 0, summaryCount); 1386bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov assertEquals("Incorrect Blue with phones count", 0, summaryWithPhones); 139ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey } else { 140ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey fail("Unrecognized group in summary cursor"); 141ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey } 142ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey } 1430265a180cf027d149f11f8750652ac67ea08ca24Dmitri Plotnikov cursor.close(); 144ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey } 145ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 1469261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana public void testGroupDirtySetOnChange() { 1479261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri uri = ContentUris.withAppendedId(Groups.CONTENT_URI, 1489261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana createGroup(mAccount, "gsid1", "title1")); 1499261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDirty(uri, true); 150718b97b3bb9f084ad3f3e25bd5c1c01d3e8a8144Jeff Sharkey clearDirty(uri); 1519261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDirty(uri, false); 1529261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 1539261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 15473776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov public void testMarkAsDirtyParameter() { 15573776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov Uri uri = ContentUris.withAppendedId(Groups.CONTENT_URI, 15673776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov createGroup(mAccount, "gsid1", "title1")); 157718b97b3bb9f084ad3f3e25bd5c1c01d3e8a8144Jeff Sharkey clearDirty(uri); 158e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey Uri updateUri = setCallerIsSyncAdapter(uri, mAccount); 15973776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov 16073776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov ContentValues values = new ContentValues(); 16173776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov values.put(Groups.NOTES, "New notes"); 16273776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov mResolver.update(updateUri, values, null, null); 16373776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov assertDirty(uri, false); 16473776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov } 16573776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov 1661fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana public void testGroupDirtyClearedWhenSetExplicitly() { 1671fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana Uri uri = ContentUris.withAppendedId(Groups.CONTENT_URI, 1681fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana createGroup(mAccount, "gsid1", "title1")); 1691fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, true); 1701fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 1711fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana ContentValues values = new ContentValues(); 1721fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana values.put(Groups.DIRTY, 0); 1731fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana values.put(Groups.NOTES, "other notes"); 174718b97b3bb9f084ad3f3e25bd5c1c01d3e8a8144Jeff Sharkey assertEquals(1, mResolver.update(uri, values, null, null)); 1751fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 1761fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, false); 1771fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana } 1781fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 17994021b213e4db367f60b30fcbfe9019e28571784Fred Quintana public void testGroupDeletion1() { 18094021b213e4db367f60b30fcbfe9019e28571784Fred Quintana long groupId = createGroup(mAccount, "g1", "gt1"); 18194021b213e4db367f60b30fcbfe9019e28571784Fred Quintana Uri uri = ContentUris.withAppendedId(Groups.CONTENT_URI, groupId); 18294021b213e4db367f60b30fcbfe9019e28571784Fred Quintana 18394021b213e4db367f60b30fcbfe9019e28571784Fred Quintana assertEquals(1, getCount(uri, null, null)); 18494021b213e4db367f60b30fcbfe9019e28571784Fred Quintana mResolver.delete(uri, null, null); 18594021b213e4db367f60b30fcbfe9019e28571784Fred Quintana assertEquals(1, getCount(uri, null, null)); 1865870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, Groups.DELETED, "1"); 18794021b213e4db367f60b30fcbfe9019e28571784Fred Quintana 188e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey Uri permanentDeletionUri = setCallerIsSyncAdapter(uri, mAccount); 18994021b213e4db367f60b30fcbfe9019e28571784Fred Quintana mResolver.delete(permanentDeletionUri, null, null); 19094021b213e4db367f60b30fcbfe9019e28571784Fred Quintana assertEquals(0, getCount(uri, null, null)); 19194021b213e4db367f60b30fcbfe9019e28571784Fred Quintana } 19294021b213e4db367f60b30fcbfe9019e28571784Fred Quintana 19394021b213e4db367f60b30fcbfe9019e28571784Fred Quintana public void testGroupDeletion2() { 19494021b213e4db367f60b30fcbfe9019e28571784Fred Quintana long groupId = createGroup(mAccount, "g1", "gt1"); 19594021b213e4db367f60b30fcbfe9019e28571784Fred Quintana Uri uri = ContentUris.withAppendedId(Groups.CONTENT_URI, groupId); 19694021b213e4db367f60b30fcbfe9019e28571784Fred Quintana 19794021b213e4db367f60b30fcbfe9019e28571784Fred Quintana assertEquals(1, getCount(uri, null, null)); 198e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey Uri permanentDeletionUri = setCallerIsSyncAdapter(uri, mAccount); 19994021b213e4db367f60b30fcbfe9019e28571784Fred Quintana mResolver.delete(permanentDeletionUri, null, null); 20094021b213e4db367f60b30fcbfe9019e28571784Fred Quintana assertEquals(0, getCount(uri, null, null)); 20194021b213e4db367f60b30fcbfe9019e28571784Fred Quintana } 20294021b213e4db367f60b30fcbfe9019e28571784Fred Quintana 2039261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana public void testGroupVersionUpdates() { 2049261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri uri = ContentUris.withAppendedId(Groups.CONTENT_URI, 2059261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana createGroup(mAccount, "gsid1", "title1")); 2069261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana long version = getVersion(uri); 2079261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana ContentValues values = new ContentValues(); 2089261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana values.put(Groups.TITLE, "title2"); 2099261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana mResolver.update(uri, values, null, null); 2109261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertEquals(version + 1, getVersion(uri)); 2119261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 2126cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov 213ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey private interface Projections { 214ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String[] PROJ_SUMMARY = new String[] { 215ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey Groups._ID, 216ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey Groups.SUMMARY_COUNT, 217ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey Groups.SUMMARY_WITH_PHONES, 218ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey }; 219ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 220ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final int COL_ID = 0; 221ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final int COL_SUMMARY_COUNT = 1; 222ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final int COL_SUMMARY_WITH_PHONES = 2; 223ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey } 224ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 2255aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey private static final Account sTestAccount = new Account("user@example.com", "com.example"); 2261a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey private static final Account sSecondAccount = new Account("other@example.net", "net.example"); 2275aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey private static final String GROUP_ID = "testgroup"; 2285aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey 2291a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey public void assertRawContactVisible(long rawContactId, boolean expected) { 2301a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final long contactId = this.queryContactId(rawContactId); 2311a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertContactVisible(contactId, expected); 2321a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey } 2331a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 2341a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey public void assertContactVisible(long contactId, boolean expected) { 2351a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final Cursor cursor = mResolver.query(Contacts.CONTENT_URI, new String[] { 2365aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey Contacts.IN_VISIBLE_GROUP 2371a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey }, Contacts._ID + "=" + contactId, null, null); 2385aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey assertTrue("Contact not found", cursor.moveToFirst()); 2391a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final boolean actual = (cursor.getInt(0) != 0); 2405aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey cursor.close(); 2411a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertEquals("Unexpected visibility", expected, actual); 2421a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey } 2431a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 2441a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey public ContentProviderOperation buildVisibleAssert(long contactId, boolean visible) { 2451a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey return ContentProviderOperation.newAssertQuery(Contacts.CONTENT_URI).withSelection( 2461a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey Contacts._ID + "=" + contactId + " AND " + Contacts.IN_VISIBLE_GROUP + "=" 2471a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey + (visible ? 1 : 0), null).withExpectedCount(1).build(); 2485aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey } 2495aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey 2501a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey public void testDelayVisibleTransaction() throws RemoteException, OperationApplicationException { 2515aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey final ContentValues values = new ContentValues(); 2525aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey 2535aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey final long groupId = this.createGroup(sTestAccount, GROUP_ID, GROUP_ID, 1); 2545aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey final Uri groupUri = ContentUris.withAppendedId(Groups.CONTENT_URI, groupId); 2555aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey 2561a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey // Create contact with specific membership 2575aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey final long rawContactId = this.createRawContact(sTestAccount); 2585aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey final long contactId = this.queryContactId(rawContactId); 2595aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey final Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 2605aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey 2615aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey this.insertGroupMembership(rawContactId, groupId); 2625aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey 2631a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final ArrayList<ContentProviderOperation> oper = Lists.newArrayList(); 2641a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 2651a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey // Update visibility inside a transaction and assert that inside the 2661a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey // transaction it hasn't been updated yet. 2671a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey oper.add(buildVisibleAssert(contactId, true)); 2681a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey oper.add(ContentProviderOperation.newUpdate(groupUri).withValue(Groups.GROUP_VISIBLE, 0) 2691a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey .build()); 2701a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey oper.add(buildVisibleAssert(contactId, true)); 2711a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey mResolver.applyBatch(ContactsContract.AUTHORITY, oper); 2721a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 2731a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey // After previous transaction finished, visibility should be updated 2741a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey oper.clear(); 2751a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey oper.add(buildVisibleAssert(contactId, false)); 2761a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey mResolver.applyBatch(ContactsContract.AUTHORITY, oper); 2771a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey } 2781a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 2791a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey public void testLocalSingleVisible() { 2801a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final long rawContactId = this.createRawContact(); 2811a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 2821a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey // Single, local contacts should always be visible 2831a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId, true); 2841a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey } 2851a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 2861a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey public void testLocalMixedVisible() { 2871a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey // Aggregate, when mixed with local, should become visible 2881a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final long rawContactId1 = this.createRawContact(); 2891a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final long rawContactId2 = this.createRawContact(sTestAccount); 2901a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 2911a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final long groupId = this.createGroup(sTestAccount, GROUP_ID, GROUP_ID, 0); 2921a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey this.insertGroupMembership(rawContactId2, groupId); 2931a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 2941a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey // Make sure they are still apart 2951a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertNotAggregated(rawContactId1, rawContactId2); 2961a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId1, true); 2971a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId2, false); 2981a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 2991a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey // Force together and see what happens 3001a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final ContentValues values = new ContentValues(); 3011a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_TOGETHER); 3021a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(AggregationExceptions.RAW_CONTACT_ID1, rawContactId1); 3031a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(AggregationExceptions.RAW_CONTACT_ID2, rawContactId2); 3041a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey mResolver.update(AggregationExceptions.CONTENT_URI, values, null, null); 3051a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3061a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId1, true); 3071a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId2, true); 3081a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey } 3091a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3101a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey public void testUngroupedVisible() { 3111a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final long rawContactId = this.createRawContact(sTestAccount); 3121a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3131a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final ContentValues values = new ContentValues(); 3141a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(Settings.ACCOUNT_NAME, sTestAccount.name); 3151a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(Settings.ACCOUNT_TYPE, sTestAccount.type); 3161a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(Settings.UNGROUPED_VISIBLE, 0); 3171a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey mResolver.insert(Settings.CONTENT_URI, values); 3181a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3191a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId, false); 3201a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3211a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.clear(); 3221a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(Settings.UNGROUPED_VISIBLE, 1); 3231a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey mResolver.update(Settings.CONTENT_URI, values, Settings.ACCOUNT_NAME + "=? AND " 3241a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey + Settings.ACCOUNT_TYPE + "=?", new String[] { 3251a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey sTestAccount.name, sTestAccount.type 3261a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey }); 3275aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey 3281a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId, true); 3291a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey } 3301a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3311a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey public void testMultipleSourcesVisible() { 3321a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final long rawContactId1 = this.createRawContact(sTestAccount); 3331a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final long rawContactId2 = this.createRawContact(sSecondAccount); 3341a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3351a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final long groupId = this.createGroup(sTestAccount, GROUP_ID, GROUP_ID, 0); 3361a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey this.insertGroupMembership(rawContactId1, groupId); 3371a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3381a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey // Make sure still invisible 3391a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId1, false); 3401a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId2, false); 3411a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3421a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey // Make group visible 3431a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final ContentValues values = new ContentValues(); 3445aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey values.put(Groups.GROUP_VISIBLE, 1); 3451a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey mResolver.update(Groups.CONTENT_URI, values, Groups._ID + "=" + groupId, null); 3465aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey 3471a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId1, true); 3481a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId2, false); 3491a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3501a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey // Force them together 3511a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.clear(); 3521a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_TOGETHER); 3531a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(AggregationExceptions.RAW_CONTACT_ID1, rawContactId1); 3541a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(AggregationExceptions.RAW_CONTACT_ID2, rawContactId2); 3551a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey mResolver.update(AggregationExceptions.CONTENT_URI, values, null, null); 3561a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3571a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId1, true); 3581a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId2, true); 3591a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3601a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey // Make group invisible 3611a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.clear(); 3621a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(Groups.GROUP_VISIBLE, 0); 3631a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey mResolver.update(Groups.CONTENT_URI, values, Groups._ID + "=" + groupId, null); 3641a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3651a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId1, false); 3661a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId2, false); 3671a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3681a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey // Turn on ungrouped for first 3691a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.clear(); 3701a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(Settings.ACCOUNT_NAME, sTestAccount.name); 3711a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(Settings.ACCOUNT_TYPE, sTestAccount.type); 3721a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(Settings.UNGROUPED_VISIBLE, 1); 3731a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey mResolver.insert(Settings.CONTENT_URI, values); 3741a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3751a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId1, false); 3761a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId2, false); 3771a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3781a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey // Turn on ungrouped for second account 3795aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey values.clear(); 3801a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(Settings.ACCOUNT_NAME, sSecondAccount.name); 3811a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(Settings.ACCOUNT_TYPE, sSecondAccount.type); 3821a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(Settings.UNGROUPED_VISIBLE, 1); 3831a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey mResolver.insert(Settings.CONTENT_URI, values); 3841a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3851a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId1, true); 3861a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId2, true); 3875aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey } 388ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey} 389