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 378ed367fdc0b086d54c489f68d555e2f0a4035f63Chiao Chengimport com.android.providers.contacts.testutil.RawContactUtil; 388ed367fdc0b086d54c489f68d555e2f0a4035f63Chiao Cheng 391a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkeyimport java.util.ArrayList; 401a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 41ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey/** 42ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * Unit tests for {@link Groups} and {@link GroupMembership}. 43ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * 44ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * Run the test like this: 45ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * <code> 468920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens * adb shell am instrument -e class com.android.providers.contacts.GroupsTest -w \ 4728f8857b1b46bde18b85c6d3c2a63ac44c3c2e1cEvan Millar * com.android.providers.contacts.tests/android.test.InstrumentationTestRunner 48ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * </code> 49ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey */ 50fc42772538fc6f7e2e444cbe6b24e06a3fbf933dMakoto Onuki@MediumTest 51bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovpublic class GroupsTest extends BaseContactsProvider2Test { 52ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 53ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey private static final String GROUP_GREY = "Grey"; 54ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey private static final String GROUP_RED = "Red"; 55ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey private static final String GROUP_GREEN = "Green"; 56ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey private static final String GROUP_BLUE = "Blue"; 57ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 58ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey private static final String PERSON_ALPHA = "Alpha"; 59ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey private static final String PERSON_BRAVO = "Bravo"; 60ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey private static final String PERSON_CHARLIE = "Charlie"; 61ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey private static final String PERSON_DELTA = "Delta"; 62ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 63ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey private static final String PHONE_ALPHA = "555-1111"; 64ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey private static final String PHONE_BRAVO_1 = "555-2222"; 65ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey private static final String PHONE_BRAVO_2 = "555-3333"; 66ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey private static final String PHONE_CHARLIE_1 = "555-4444"; 67ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey private static final String PHONE_CHARLIE_2 = "555-5555"; 68ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 69ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public void testGroupSummary() { 70ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 71ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // Clear any existing data before starting 72bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov // TODO make the provider wipe data automatically 73bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov ((SynchronousContactsProvider2)mActor.provider).wipeData(); 74ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 75ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // Create a handful of groups 76ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey long groupGrey = mActor.createGroup(GROUP_GREY); 77ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey long groupRed = mActor.createGroup(GROUP_RED); 78ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey long groupGreen = mActor.createGroup(GROUP_GREEN); 79ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey long groupBlue = mActor.createGroup(GROUP_BLUE); 80ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 81ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // Create a handful of contacts 82ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann long contactAlpha = mActor.createRawContact(PERSON_ALPHA); 83ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann long contactBravo = mActor.createRawContact(PERSON_BRAVO); 84ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann long contactCharlie = mActor.createRawContact(PERSON_CHARLIE); 85ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann long contactCharlieDupe = mActor.createRawContact(PERSON_CHARLIE); 8647fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov setAggregationException( 8747fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov AggregationExceptions.TYPE_KEEP_TOGETHER, contactCharlie, contactCharlieDupe); 88ed6bfd922fd84db21de08c1d12e93c501b86560dDaniel Lehmann long contactDelta = mActor.createRawContact(PERSON_DELTA); 89ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 906bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov assertAggregated(contactCharlie, contactCharlieDupe); 91ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 92ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // Add phone numbers to specific contacts 93ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey mActor.createPhone(contactAlpha, PHONE_ALPHA); 94ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey mActor.createPhone(contactBravo, PHONE_BRAVO_1); 95ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey mActor.createPhone(contactBravo, PHONE_BRAVO_2); 96ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey mActor.createPhone(contactCharlie, PHONE_CHARLIE_1); 97ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey mActor.createPhone(contactCharlieDupe, PHONE_CHARLIE_2); 98ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 99ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // Add contacts to various mixture of groups. Grey will have all 100ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // contacts, Red only with phone numbers, Green with no phones, and Blue 101ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // with no contacts at all. 102ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey mActor.createGroupMembership(contactAlpha, groupGrey); 103ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey mActor.createGroupMembership(contactBravo, groupGrey); 104ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey mActor.createGroupMembership(contactCharlie, groupGrey); 105ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey mActor.createGroupMembership(contactDelta, groupGrey); 106ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 107ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey mActor.createGroupMembership(contactAlpha, groupRed); 108ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey mActor.createGroupMembership(contactBravo, groupRed); 109ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey mActor.createGroupMembership(contactCharlie, groupRed); 110ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 111ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey mActor.createGroupMembership(contactDelta, groupGreen); 112ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 113ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // Walk across groups summary cursor and verify returned counts. 114ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey final Cursor cursor = mActor.resolver.query(Groups.CONTENT_SUMMARY_URI, 115ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey Projections.PROJ_SUMMARY, null, null, null); 116ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 117ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // Require that each group has a summary row 118ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey assertTrue("Didn't return summary for all groups", (cursor.getCount() == 4)); 119ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 120ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey while (cursor.moveToNext()) { 121ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey final long groupId = cursor.getLong(Projections.COL_ID); 122ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey final int summaryCount = cursor.getInt(Projections.COL_SUMMARY_COUNT); 123ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey final int summaryWithPhones = cursor.getInt(Projections.COL_SUMMARY_WITH_PHONES); 124ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 125ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey if (groupId == groupGrey) { 126ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // Grey should have four aggregates, three with phones. 1276bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov assertEquals("Incorrect Grey count", 4, summaryCount); 1286bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov assertEquals("Incorrect Grey with phones count", 3, summaryWithPhones); 129ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey } else if (groupId == groupRed) { 130ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // Red should have 3 aggregates, all with phones. 1316bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov assertEquals("Incorrect Red count", 3, summaryCount); 1326bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov assertEquals("Incorrect Red with phones count", 3, summaryWithPhones); 133ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey } else if (groupId == groupGreen) { 134ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // Green should have 1 aggregate, none with phones. 1356bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov assertEquals("Incorrect Green count", 1, summaryCount); 1366bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov assertEquals("Incorrect Green with phones count", 0, summaryWithPhones); 137ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey } else if (groupId == groupBlue) { 138ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey // Blue should have no contacts. 1396bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov assertEquals("Incorrect Blue count", 0, summaryCount); 1406bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov assertEquals("Incorrect Blue with phones count", 0, summaryWithPhones); 141ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey } else { 142ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey fail("Unrecognized group in summary cursor"); 143ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey } 144ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey } 1450265a180cf027d149f11f8750652ac67ea08ca24Dmitri Plotnikov cursor.close(); 146ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey } 147ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 1489261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana public void testGroupDirtySetOnChange() { 1499261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri uri = ContentUris.withAppendedId(Groups.CONTENT_URI, 1509261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana createGroup(mAccount, "gsid1", "title1")); 1519261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDirty(uri, true); 152718b97b3bb9f084ad3f3e25bd5c1c01d3e8a8144Jeff Sharkey clearDirty(uri); 1539261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertDirty(uri, false); 1549261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 1559261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana 15673776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov public void testMarkAsDirtyParameter() { 15773776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov Uri uri = ContentUris.withAppendedId(Groups.CONTENT_URI, 15873776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov createGroup(mAccount, "gsid1", "title1")); 159718b97b3bb9f084ad3f3e25bd5c1c01d3e8a8144Jeff Sharkey clearDirty(uri); 160e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey Uri updateUri = setCallerIsSyncAdapter(uri, mAccount); 16173776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov 16273776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov ContentValues values = new ContentValues(); 16373776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov values.put(Groups.NOTES, "New notes"); 16473776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov mResolver.update(updateUri, values, null, null); 16573776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov assertDirty(uri, false); 16673776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov } 16773776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov 1681fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana public void testGroupDirtyClearedWhenSetExplicitly() { 1691fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana Uri uri = ContentUris.withAppendedId(Groups.CONTENT_URI, 1701fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana createGroup(mAccount, "gsid1", "title1")); 1711fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, true); 1721fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 1731fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana ContentValues values = new ContentValues(); 1741fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana values.put(Groups.DIRTY, 0); 1751fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana values.put(Groups.NOTES, "other notes"); 176718b97b3bb9f084ad3f3e25bd5c1c01d3e8a8144Jeff Sharkey assertEquals(1, mResolver.update(uri, values, null, null)); 1771fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 1781fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana assertDirty(uri, false); 1791fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana } 1801fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana 18194021b213e4db367f60b30fcbfe9019e28571784Fred Quintana public void testGroupDeletion1() { 18294021b213e4db367f60b30fcbfe9019e28571784Fred Quintana long groupId = createGroup(mAccount, "g1", "gt1"); 18394021b213e4db367f60b30fcbfe9019e28571784Fred Quintana Uri uri = ContentUris.withAppendedId(Groups.CONTENT_URI, groupId); 18494021b213e4db367f60b30fcbfe9019e28571784Fred Quintana 18594021b213e4db367f60b30fcbfe9019e28571784Fred Quintana assertEquals(1, getCount(uri, null, null)); 18694021b213e4db367f60b30fcbfe9019e28571784Fred Quintana mResolver.delete(uri, null, null); 18794021b213e4db367f60b30fcbfe9019e28571784Fred Quintana assertEquals(1, getCount(uri, null, null)); 1885870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov assertStoredValue(uri, Groups.DELETED, "1"); 18994021b213e4db367f60b30fcbfe9019e28571784Fred Quintana 190e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey Uri permanentDeletionUri = setCallerIsSyncAdapter(uri, mAccount); 19194021b213e4db367f60b30fcbfe9019e28571784Fred Quintana mResolver.delete(permanentDeletionUri, null, null); 19294021b213e4db367f60b30fcbfe9019e28571784Fred Quintana assertEquals(0, getCount(uri, null, null)); 19394021b213e4db367f60b30fcbfe9019e28571784Fred Quintana } 19494021b213e4db367f60b30fcbfe9019e28571784Fred Quintana 19594021b213e4db367f60b30fcbfe9019e28571784Fred Quintana public void testGroupDeletion2() { 19694021b213e4db367f60b30fcbfe9019e28571784Fred Quintana long groupId = createGroup(mAccount, "g1", "gt1"); 19794021b213e4db367f60b30fcbfe9019e28571784Fred Quintana Uri uri = ContentUris.withAppendedId(Groups.CONTENT_URI, groupId); 19894021b213e4db367f60b30fcbfe9019e28571784Fred Quintana 19994021b213e4db367f60b30fcbfe9019e28571784Fred Quintana assertEquals(1, getCount(uri, null, null)); 200e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey Uri permanentDeletionUri = setCallerIsSyncAdapter(uri, mAccount); 20194021b213e4db367f60b30fcbfe9019e28571784Fred Quintana mResolver.delete(permanentDeletionUri, null, null); 20294021b213e4db367f60b30fcbfe9019e28571784Fred Quintana assertEquals(0, getCount(uri, null, null)); 20394021b213e4db367f60b30fcbfe9019e28571784Fred Quintana } 20494021b213e4db367f60b30fcbfe9019e28571784Fred Quintana 2059261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana public void testGroupVersionUpdates() { 2069261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana Uri uri = ContentUris.withAppendedId(Groups.CONTENT_URI, 2079261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana createGroup(mAccount, "gsid1", "title1")); 2089261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana long version = getVersion(uri); 2099261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana ContentValues values = new ContentValues(); 2109261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana values.put(Groups.TITLE, "title2"); 2119261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana mResolver.update(uri, values, null, null); 2129261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana assertEquals(version + 1, getVersion(uri)); 2139261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana } 2146cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov 215ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey private interface Projections { 216ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final String[] PROJ_SUMMARY = new String[] { 217ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey Groups._ID, 218ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey Groups.SUMMARY_COUNT, 219ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey Groups.SUMMARY_WITH_PHONES, 220ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey }; 221ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 222ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final int COL_ID = 0; 223ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final int COL_SUMMARY_COUNT = 1; 224ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey public static final int COL_SUMMARY_WITH_PHONES = 2; 225ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey } 226ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey 2275aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey private static final Account sTestAccount = new Account("user@example.com", "com.example"); 2281a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey private static final Account sSecondAccount = new Account("other@example.net", "net.example"); 2295aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey private static final String GROUP_ID = "testgroup"; 2305aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey 2311a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey public void assertRawContactVisible(long rawContactId, boolean expected) { 2321a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final long contactId = this.queryContactId(rawContactId); 2331a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertContactVisible(contactId, expected); 2341a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey } 2351a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 2361a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey public void assertContactVisible(long contactId, boolean expected) { 2371a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final Cursor cursor = mResolver.query(Contacts.CONTENT_URI, new String[] { 2385aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey Contacts.IN_VISIBLE_GROUP 2391a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey }, Contacts._ID + "=" + contactId, null, null); 2405aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey assertTrue("Contact not found", cursor.moveToFirst()); 2411a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final boolean actual = (cursor.getInt(0) != 0); 2425aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey cursor.close(); 2431a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertEquals("Unexpected visibility", expected, actual); 2441a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey } 2451a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 2461a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey public ContentProviderOperation buildVisibleAssert(long contactId, boolean visible) { 2471a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey return ContentProviderOperation.newAssertQuery(Contacts.CONTENT_URI).withSelection( 2481a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey Contacts._ID + "=" + contactId + " AND " + Contacts.IN_VISIBLE_GROUP + "=" 2491a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey + (visible ? 1 : 0), null).withExpectedCount(1).build(); 2505aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey } 2515aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey 2521a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey public void testDelayVisibleTransaction() throws RemoteException, OperationApplicationException { 2535aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey final ContentValues values = new ContentValues(); 2545aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey 2555aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey final long groupId = this.createGroup(sTestAccount, GROUP_ID, GROUP_ID, 1); 2565aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey final Uri groupUri = ContentUris.withAppendedId(Groups.CONTENT_URI, groupId); 2575aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey 2581a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey // Create contact with specific membership 2598ed367fdc0b086d54c489f68d555e2f0a4035f63Chiao Cheng final long rawContactId = RawContactUtil.createRawContact(this.mResolver, sTestAccount); 2605aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey final long contactId = this.queryContactId(rawContactId); 2615aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey final Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 2625aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey 2635aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey this.insertGroupMembership(rawContactId, groupId); 2645aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey 2651a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final ArrayList<ContentProviderOperation> oper = Lists.newArrayList(); 2661a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 2671a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey // Update visibility inside a transaction and assert that inside the 2681a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey // transaction it hasn't been updated yet. 2691a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey oper.add(buildVisibleAssert(contactId, true)); 2701a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey oper.add(ContentProviderOperation.newUpdate(groupUri).withValue(Groups.GROUP_VISIBLE, 0) 2711a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey .build()); 2721a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey oper.add(buildVisibleAssert(contactId, true)); 2731a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey mResolver.applyBatch(ContactsContract.AUTHORITY, oper); 2741a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 2751a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey // After previous transaction finished, visibility should be updated 2761a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey oper.clear(); 2771a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey oper.add(buildVisibleAssert(contactId, false)); 2781a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey mResolver.applyBatch(ContactsContract.AUTHORITY, oper); 2791a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey } 2801a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 2811a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey public void testLocalSingleVisible() { 2828ed367fdc0b086d54c489f68d555e2f0a4035f63Chiao Cheng final long rawContactId = RawContactUtil.createRawContact(this.mResolver); 2831a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 2841a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey // Single, local contacts should always be visible 2851a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId, true); 2861a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey } 2871a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 2881a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey public void testLocalMixedVisible() { 2891a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey // Aggregate, when mixed with local, should become visible 2908ed367fdc0b086d54c489f68d555e2f0a4035f63Chiao Cheng final long rawContactId1 = RawContactUtil.createRawContact(this.mResolver); 2918ed367fdc0b086d54c489f68d555e2f0a4035f63Chiao Cheng final long rawContactId2 = RawContactUtil.createRawContact(this.mResolver, sTestAccount); 2921a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 2931a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final long groupId = this.createGroup(sTestAccount, GROUP_ID, GROUP_ID, 0); 2941a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey this.insertGroupMembership(rawContactId2, groupId); 2951a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 2961a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey // Make sure they are still apart 2971a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertNotAggregated(rawContactId1, rawContactId2); 2981a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId1, true); 2991a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId2, false); 3001a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3011a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey // Force together and see what happens 3021a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final ContentValues values = new ContentValues(); 3031a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_TOGETHER); 3041a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(AggregationExceptions.RAW_CONTACT_ID1, rawContactId1); 3051a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(AggregationExceptions.RAW_CONTACT_ID2, rawContactId2); 3061a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey mResolver.update(AggregationExceptions.CONTENT_URI, values, null, null); 3071a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3081a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId1, true); 3091a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId2, true); 3101a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey } 3111a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3121a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey public void testUngroupedVisible() { 3138ed367fdc0b086d54c489f68d555e2f0a4035f63Chiao Cheng final long rawContactId = RawContactUtil.createRawContact(this.mResolver, sTestAccount); 3141a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3151a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final ContentValues values = new ContentValues(); 3161a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(Settings.ACCOUNT_NAME, sTestAccount.name); 3171a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(Settings.ACCOUNT_TYPE, sTestAccount.type); 3181a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(Settings.UNGROUPED_VISIBLE, 0); 3191a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey mResolver.insert(Settings.CONTENT_URI, values); 3201a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3211a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId, false); 3221a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3231a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.clear(); 3241a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(Settings.UNGROUPED_VISIBLE, 1); 3251a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey mResolver.update(Settings.CONTENT_URI, values, Settings.ACCOUNT_NAME + "=? AND " 3261a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey + Settings.ACCOUNT_TYPE + "=?", new String[] { 3271a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey sTestAccount.name, sTestAccount.type 3281a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey }); 3295aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey 3301a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId, true); 3311a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey } 3321a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3331a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey public void testMultipleSourcesVisible() { 3348ed367fdc0b086d54c489f68d555e2f0a4035f63Chiao Cheng final long rawContactId1 = RawContactUtil.createRawContact(this.mResolver, sTestAccount); 3358ed367fdc0b086d54c489f68d555e2f0a4035f63Chiao Cheng final long rawContactId2 = RawContactUtil.createRawContact(this.mResolver, sSecondAccount); 3361a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3371a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final long groupId = this.createGroup(sTestAccount, GROUP_ID, GROUP_ID, 0); 3381a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey this.insertGroupMembership(rawContactId1, groupId); 3391a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3401a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey // Make sure still invisible 3411a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId1, false); 3421a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId2, false); 3431a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3441a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey // Make group visible 3451a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey final ContentValues values = new ContentValues(); 3465aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey values.put(Groups.GROUP_VISIBLE, 1); 3471a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey mResolver.update(Groups.CONTENT_URI, values, Groups._ID + "=" + groupId, null); 3485aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey 3491a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId1, true); 3501a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId2, false); 3511a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3521a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey // Force them together 3531a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.clear(); 3541a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_TOGETHER); 3551a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(AggregationExceptions.RAW_CONTACT_ID1, rawContactId1); 3561a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(AggregationExceptions.RAW_CONTACT_ID2, rawContactId2); 3571a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey mResolver.update(AggregationExceptions.CONTENT_URI, values, null, null); 3581a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3591a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId1, true); 3601a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId2, true); 3611a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3621a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey // Make group invisible 3631a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.clear(); 3641a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(Groups.GROUP_VISIBLE, 0); 3651a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey mResolver.update(Groups.CONTENT_URI, values, Groups._ID + "=" + groupId, null); 3661a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3671a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId1, false); 3681a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId2, false); 3691a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3701a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey // Turn on ungrouped for first 3711a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.clear(); 3721a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(Settings.ACCOUNT_NAME, sTestAccount.name); 3731a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(Settings.ACCOUNT_TYPE, sTestAccount.type); 3741a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(Settings.UNGROUPED_VISIBLE, 1); 3751a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey mResolver.insert(Settings.CONTENT_URI, values); 3761a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3771a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId1, false); 3781a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId2, false); 3791a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3801a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey // Turn on ungrouped for second account 3815aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey values.clear(); 3821a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(Settings.ACCOUNT_NAME, sSecondAccount.name); 3831a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(Settings.ACCOUNT_TYPE, sSecondAccount.type); 3841a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey values.put(Settings.UNGROUPED_VISIBLE, 1); 3851a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey mResolver.insert(Settings.CONTENT_URI, values); 3861a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey 3871a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId1, true); 3881a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey assertRawContactVisible(rawContactId2, true); 3895aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey } 390ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey} 391