GroupsTest.java revision 47fd3881dfd2a21de29e917b6114974ff0a67b1b
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
191a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkeyimport com.google.android.collect.Lists;
201a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
215aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkeyimport android.accounts.Account;
221a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkeyimport android.content.ContentProviderOperation;
236cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikovimport android.content.ContentUris;
246cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikovimport android.content.ContentValues;
251a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkeyimport android.content.OperationApplicationException;
26ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkeyimport android.database.Cursor;
276cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikovimport android.net.Uri;
281a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkeyimport android.os.RemoteException;
291a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkeyimport android.provider.ContactsContract;
301a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkeyimport android.provider.ContactsContract.AggregationExceptions;
315aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkeyimport android.provider.ContactsContract.Contacts;
32ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkeyimport android.provider.ContactsContract.Groups;
331a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkeyimport android.provider.ContactsContract.Settings;
34ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkeyimport android.provider.ContactsContract.CommonDataKinds.GroupMembership;
35ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkeyimport android.test.suitebuilder.annotation.LargeTest;
368920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephensimport android.test.suitebuilder.annotation.MediumTest;
37ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey
381a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkeyimport java.util.ArrayList;
391a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
40ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey/**
41ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * Unit tests for {@link Groups} and {@link GroupMembership}.
42ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey *
43ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * Run the test like this:
44ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * <code>
458920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens * adb shell am instrument -e class com.android.providers.contacts.GroupsTest -w \
4628f8857b1b46bde18b85c6d3c2a63ac44c3c2e1cEvan Millar *         com.android.providers.contacts.tests/android.test.InstrumentationTestRunner
47ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey * </code>
48ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey */
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
678920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens    @LargeTest
68ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey    public void testGroupSummary() {
69ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey
70ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        // Clear any existing data before starting
71bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // TODO make the provider wipe data automatically
72bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ((SynchronousContactsProvider2)mActor.provider).wipeData();
73ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey
74ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        // Create a handful of groups
75ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        long groupGrey = mActor.createGroup(GROUP_GREY);
76ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        long groupRed = mActor.createGroup(GROUP_RED);
77ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        long groupGreen = mActor.createGroup(GROUP_GREEN);
78ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        long groupBlue = mActor.createGroup(GROUP_BLUE);
79ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey
80ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        // Create a handful of contacts
8147fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov        long contactAlpha = mActor.createRawContact(false, PERSON_ALPHA);
8247fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov        long contactBravo = mActor.createRawContact(false, PERSON_BRAVO);
8347fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov        long contactCharlie = mActor.createRawContact(false, PERSON_CHARLIE);
8447fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov        long contactCharlieDupe = mActor.createRawContact(false, PERSON_CHARLIE);
8547fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov        setAggregationException(
8647fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov                AggregationExceptions.TYPE_KEEP_TOGETHER, contactCharlie, contactCharlieDupe);
8747fd3881dfd2a21de29e917b6114974ff0a67b1bDmitri Plotnikov        long contactDelta = mActor.createRawContact(false, PERSON_DELTA);
88ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey
896bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov        assertAggregated(contactCharlie, contactCharlieDupe);
90ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey
91ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        // Add phone numbers to specific contacts
92ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        mActor.createPhone(contactAlpha, PHONE_ALPHA);
93ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        mActor.createPhone(contactBravo, PHONE_BRAVO_1);
94ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        mActor.createPhone(contactBravo, PHONE_BRAVO_2);
95ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        mActor.createPhone(contactCharlie, PHONE_CHARLIE_1);
96ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        mActor.createPhone(contactCharlieDupe, PHONE_CHARLIE_2);
97ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey
98ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        // Add contacts to various mixture of groups. Grey will have all
99ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        // contacts, Red only with phone numbers, Green with no phones, and Blue
100ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        // with no contacts at all.
101ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        mActor.createGroupMembership(contactAlpha, groupGrey);
102ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        mActor.createGroupMembership(contactBravo, groupGrey);
103ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        mActor.createGroupMembership(contactCharlie, groupGrey);
104ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        mActor.createGroupMembership(contactDelta, groupGrey);
105ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey
106ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        mActor.createGroupMembership(contactAlpha, groupRed);
107ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        mActor.createGroupMembership(contactBravo, groupRed);
108ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        mActor.createGroupMembership(contactCharlie, groupRed);
109ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey
110ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        mActor.createGroupMembership(contactDelta, groupGreen);
111ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey
112ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        // Walk across groups summary cursor and verify returned counts.
113ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        final Cursor cursor = mActor.resolver.query(Groups.CONTENT_SUMMARY_URI,
114ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey                Projections.PROJ_SUMMARY, null, null, null);
115ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey
116ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        // Require that each group has a summary row
117ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        assertTrue("Didn't return summary for all groups", (cursor.getCount() == 4));
118ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey
119ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        while (cursor.moveToNext()) {
120ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey            final long groupId = cursor.getLong(Projections.COL_ID);
121ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey            final int summaryCount = cursor.getInt(Projections.COL_SUMMARY_COUNT);
122ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey            final int summaryWithPhones = cursor.getInt(Projections.COL_SUMMARY_WITH_PHONES);
123ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey
124ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey            if (groupId == groupGrey) {
125ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey                // Grey should have four aggregates, three with phones.
1266bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov                assertEquals("Incorrect Grey count", 4, summaryCount);
1276bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov                assertEquals("Incorrect Grey with phones count", 3, summaryWithPhones);
128ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey            } else if (groupId == groupRed) {
129ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey                // Red should have 3 aggregates, all with phones.
1306bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov                assertEquals("Incorrect Red count", 3, summaryCount);
1316bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov                assertEquals("Incorrect Red with phones count", 3, summaryWithPhones);
132ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey            } else if (groupId == groupGreen) {
133ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey                // Green should have 1 aggregate, none with phones.
1346bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov                assertEquals("Incorrect Green count", 1, summaryCount);
1356bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov                assertEquals("Incorrect Green with phones count", 0, summaryWithPhones);
136ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey            } else if (groupId == groupBlue) {
137ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey                // Blue should have no contacts.
1386bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov                assertEquals("Incorrect Blue count", 0, summaryCount);
1396bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov                assertEquals("Incorrect Blue with phones count", 0, summaryWithPhones);
140ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey            } else {
141ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey                fail("Unrecognized group in summary cursor");
142ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey            }
143ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        }
1440265a180cf027d149f11f8750652ac67ea08ca24Dmitri Plotnikov        cursor.close();
145ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey    }
146ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey
1478920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens    @MediumTest
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
1568920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens    @MediumTest
15773776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov    public void testMarkAsDirtyParameter() {
15873776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov        Uri uri = ContentUris.withAppendedId(Groups.CONTENT_URI,
15973776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov                createGroup(mAccount, "gsid1", "title1"));
160718b97b3bb9f084ad3f3e25bd5c1c01d3e8a8144Jeff Sharkey        clearDirty(uri);
161e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey        Uri updateUri = setCallerIsSyncAdapter(uri, mAccount);
16273776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov
16373776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov        ContentValues values = new ContentValues();
16473776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov        values.put(Groups.NOTES, "New notes");
16573776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov        mResolver.update(updateUri, values, null, null);
16673776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov        assertDirty(uri, false);
16773776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov    }
16873776ffd5c00e94db987ee30864e9c7a8396d22dDmitri Plotnikov
1698920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens    @MediumTest
1701fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana    public void testGroupDirtyClearedWhenSetExplicitly() {
1711fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana        Uri uri = ContentUris.withAppendedId(Groups.CONTENT_URI,
1721fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana                createGroup(mAccount, "gsid1", "title1"));
1731fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana        assertDirty(uri, true);
1741fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana
1751fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana        ContentValues values = new ContentValues();
1761fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana        values.put(Groups.DIRTY, 0);
1771fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana        values.put(Groups.NOTES, "other notes");
178718b97b3bb9f084ad3f3e25bd5c1c01d3e8a8144Jeff Sharkey        assertEquals(1, mResolver.update(uri, values, null, null));
1791fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana
1801fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana        assertDirty(uri, false);
1811fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana    }
1821fd9b53d9e5d8ea87b69a51fb084c6f0d9f7c93eFred Quintana
1838920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens    @MediumTest
18494021b213e4db367f60b30fcbfe9019e28571784Fred Quintana    public void testGroupDeletion1() {
18594021b213e4db367f60b30fcbfe9019e28571784Fred Quintana        long groupId = createGroup(mAccount, "g1", "gt1");
18694021b213e4db367f60b30fcbfe9019e28571784Fred Quintana        Uri uri = ContentUris.withAppendedId(Groups.CONTENT_URI, groupId);
18794021b213e4db367f60b30fcbfe9019e28571784Fred Quintana
18894021b213e4db367f60b30fcbfe9019e28571784Fred Quintana        assertEquals(1, getCount(uri, null, null));
18994021b213e4db367f60b30fcbfe9019e28571784Fred Quintana        mResolver.delete(uri, null, null);
19094021b213e4db367f60b30fcbfe9019e28571784Fred Quintana        assertEquals(1, getCount(uri, null, null));
1915870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov        assertStoredValue(uri, Groups.DELETED, "1");
19294021b213e4db367f60b30fcbfe9019e28571784Fred Quintana
193e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey        Uri permanentDeletionUri = setCallerIsSyncAdapter(uri, mAccount);
19494021b213e4db367f60b30fcbfe9019e28571784Fred Quintana        mResolver.delete(permanentDeletionUri, null, null);
19594021b213e4db367f60b30fcbfe9019e28571784Fred Quintana        assertEquals(0, getCount(uri, null, null));
19694021b213e4db367f60b30fcbfe9019e28571784Fred Quintana    }
19794021b213e4db367f60b30fcbfe9019e28571784Fred Quintana
1988920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens    @MediumTest
19994021b213e4db367f60b30fcbfe9019e28571784Fred Quintana    public void testGroupDeletion2() {
20094021b213e4db367f60b30fcbfe9019e28571784Fred Quintana        long groupId = createGroup(mAccount, "g1", "gt1");
20194021b213e4db367f60b30fcbfe9019e28571784Fred Quintana        Uri uri = ContentUris.withAppendedId(Groups.CONTENT_URI, groupId);
20294021b213e4db367f60b30fcbfe9019e28571784Fred Quintana
20394021b213e4db367f60b30fcbfe9019e28571784Fred Quintana        assertEquals(1, getCount(uri, null, null));
204e246689441b2ff39cb97de277d6caeec95358863Jeff Sharkey        Uri permanentDeletionUri = setCallerIsSyncAdapter(uri, mAccount);
20594021b213e4db367f60b30fcbfe9019e28571784Fred Quintana        mResolver.delete(permanentDeletionUri, null, null);
20694021b213e4db367f60b30fcbfe9019e28571784Fred Quintana        assertEquals(0, getCount(uri, null, null));
20794021b213e4db367f60b30fcbfe9019e28571784Fred Quintana    }
20894021b213e4db367f60b30fcbfe9019e28571784Fred Quintana
2098920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens    @MediumTest
2109261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana    public void testGroupVersionUpdates() {
2119261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana        Uri uri = ContentUris.withAppendedId(Groups.CONTENT_URI,
2129261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana                createGroup(mAccount, "gsid1", "title1"));
2139261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana        long version = getVersion(uri);
2149261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana        ContentValues values = new ContentValues();
2159261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana        values.put(Groups.TITLE, "title2");
2169261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana        mResolver.update(uri, values, null, null);
2179261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana        assertEquals(version + 1, getVersion(uri));
2189261b2141aa90a4fed632fd6da03026d4c216280Fred Quintana    }
2196cffee46a1334d2b3ed19f436b27638451541044Dmitri Plotnikov
220ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey    private interface Projections {
221ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        public static final String[] PROJ_SUMMARY = new String[] {
222ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey            Groups._ID,
223ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey            Groups.SUMMARY_COUNT,
224ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey            Groups.SUMMARY_WITH_PHONES,
225ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        };
226ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey
227ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        public static final int COL_ID = 0;
228ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        public static final int COL_SUMMARY_COUNT = 1;
229ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey        public static final int COL_SUMMARY_WITH_PHONES = 2;
230ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey    }
231ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey
2325aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey    private static final Account sTestAccount = new Account("user@example.com", "com.example");
2331a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey    private static final Account sSecondAccount = new Account("other@example.net", "net.example");
2345aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey    private static final String GROUP_ID = "testgroup";
2355aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey
2361a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey    public void assertRawContactVisible(long rawContactId, boolean expected) {
2371a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        final long contactId = this.queryContactId(rawContactId);
2381a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        assertContactVisible(contactId, expected);
2391a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey    }
2401a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
2411a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey    public void assertContactVisible(long contactId, boolean expected) {
2421a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        final Cursor cursor = mResolver.query(Contacts.CONTENT_URI, new String[] {
2435aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey            Contacts.IN_VISIBLE_GROUP
2441a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        }, Contacts._ID + "=" + contactId, null, null);
2455aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey        assertTrue("Contact not found", cursor.moveToFirst());
2461a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        final boolean actual = (cursor.getInt(0) != 0);
2475aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey        cursor.close();
2481a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        assertEquals("Unexpected visibility", expected, actual);
2491a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey    }
2501a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
2511a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey    public ContentProviderOperation buildVisibleAssert(long contactId, boolean visible) {
2521a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        return ContentProviderOperation.newAssertQuery(Contacts.CONTENT_URI).withSelection(
2531a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey                Contacts._ID + "=" + contactId + " AND " + Contacts.IN_VISIBLE_GROUP + "="
2541a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey                        + (visible ? 1 : 0), null).withExpectedCount(1).build();
2555aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey    }
2565aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey
2578920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens    @LargeTest
2581a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey    public void testDelayVisibleTransaction() throws RemoteException, OperationApplicationException {
2595aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey        final ContentValues values = new ContentValues();
2605aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey
2615aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey        final long groupId = this.createGroup(sTestAccount, GROUP_ID, GROUP_ID, 1);
2625aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey        final Uri groupUri = ContentUris.withAppendedId(Groups.CONTENT_URI, groupId);
2635aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey
2641a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        // Create contact with specific membership
2655aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey        final long rawContactId = this.createRawContact(sTestAccount);
2665aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey        final long contactId = this.queryContactId(rawContactId);
2675aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey        final Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
2685aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey
2695aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey        this.insertGroupMembership(rawContactId, groupId);
2705aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey
2711a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        final ArrayList<ContentProviderOperation> oper = Lists.newArrayList();
2721a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
2731a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        // Update visibility inside a transaction and assert that inside the
2741a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        // transaction it hasn't been updated yet.
2751a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        oper.add(buildVisibleAssert(contactId, true));
2761a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        oper.add(ContentProviderOperation.newUpdate(groupUri).withValue(Groups.GROUP_VISIBLE, 0)
2771a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey                .build());
2781a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        oper.add(buildVisibleAssert(contactId, true));
2791a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        mResolver.applyBatch(ContactsContract.AUTHORITY, oper);
2801a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
2811a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        // After previous transaction finished, visibility should be updated
2821a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        oper.clear();
2831a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        oper.add(buildVisibleAssert(contactId, false));
2841a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        mResolver.applyBatch(ContactsContract.AUTHORITY, oper);
2851a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey    }
2861a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
2871a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey    public void testLocalSingleVisible() {
2881a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        final long rawContactId = this.createRawContact();
2891a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
2901a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        // Single, local contacts should always be visible
2911a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        assertRawContactVisible(rawContactId, true);
2921a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey    }
2931a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
2941a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey    public void testLocalMixedVisible() {
2951a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        // Aggregate, when mixed with local, should become visible
2961a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        final long rawContactId1 = this.createRawContact();
2971a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        final long rawContactId2 = this.createRawContact(sTestAccount);
2981a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
2991a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        final long groupId = this.createGroup(sTestAccount, GROUP_ID, GROUP_ID, 0);
3001a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        this.insertGroupMembership(rawContactId2, groupId);
3011a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
3021a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        // Make sure they are still apart
3031a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        assertNotAggregated(rawContactId1, rawContactId2);
3041a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        assertRawContactVisible(rawContactId1, true);
3051a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        assertRawContactVisible(rawContactId2, false);
3061a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
3071a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        // Force together and see what happens
3081a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        final ContentValues values = new ContentValues();
3091a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        values.put(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_TOGETHER);
3101a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        values.put(AggregationExceptions.RAW_CONTACT_ID1, rawContactId1);
3111a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        values.put(AggregationExceptions.RAW_CONTACT_ID2, rawContactId2);
3121a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        mResolver.update(AggregationExceptions.CONTENT_URI, values, null, null);
3131a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
3141a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        assertRawContactVisible(rawContactId1, true);
3151a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        assertRawContactVisible(rawContactId2, true);
3161a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey    }
3171a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
3181a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey    public void testUngroupedVisible() {
3191a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        final long rawContactId = this.createRawContact(sTestAccount);
3201a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
3211a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        final ContentValues values = new ContentValues();
3221a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        values.put(Settings.ACCOUNT_NAME, sTestAccount.name);
3231a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        values.put(Settings.ACCOUNT_TYPE, sTestAccount.type);
3241a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        values.put(Settings.UNGROUPED_VISIBLE, 0);
3251a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        mResolver.insert(Settings.CONTENT_URI, values);
3261a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
3271a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        assertRawContactVisible(rawContactId, false);
3281a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
3291a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        values.clear();
3301a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        values.put(Settings.UNGROUPED_VISIBLE, 1);
3311a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        mResolver.update(Settings.CONTENT_URI, values, Settings.ACCOUNT_NAME + "=? AND "
3321a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey                + Settings.ACCOUNT_TYPE + "=?", new String[] {
3331a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey                sTestAccount.name, sTestAccount.type
3341a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        });
3355aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey
3361a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        assertRawContactVisible(rawContactId, true);
3371a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey    }
3381a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
3391a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey    public void testMultipleSourcesVisible() {
3401a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        final long rawContactId1 = this.createRawContact(sTestAccount);
3411a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        final long rawContactId2 = this.createRawContact(sSecondAccount);
3421a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
3431a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        final long groupId = this.createGroup(sTestAccount, GROUP_ID, GROUP_ID, 0);
3441a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        this.insertGroupMembership(rawContactId1, groupId);
3451a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
3461a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        // Make sure still invisible
3471a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        assertRawContactVisible(rawContactId1, false);
3481a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        assertRawContactVisible(rawContactId2, false);
3491a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
3501a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        // Make group visible
3511a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        final ContentValues values = new ContentValues();
3525aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey        values.put(Groups.GROUP_VISIBLE, 1);
3531a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        mResolver.update(Groups.CONTENT_URI, values, Groups._ID + "=" + groupId, null);
3545aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey
3551a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        assertRawContactVisible(rawContactId1, true);
3561a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        assertRawContactVisible(rawContactId2, false);
3571a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
3581a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        // Force them together
3591a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        values.clear();
3601a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        values.put(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_TOGETHER);
3611a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        values.put(AggregationExceptions.RAW_CONTACT_ID1, rawContactId1);
3621a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        values.put(AggregationExceptions.RAW_CONTACT_ID2, rawContactId2);
3631a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        mResolver.update(AggregationExceptions.CONTENT_URI, values, null, null);
3641a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
3651a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        assertRawContactVisible(rawContactId1, true);
3661a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        assertRawContactVisible(rawContactId2, true);
3671a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
3681a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        // Make group invisible
3691a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        values.clear();
3701a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        values.put(Groups.GROUP_VISIBLE, 0);
3711a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        mResolver.update(Groups.CONTENT_URI, values, Groups._ID + "=" + groupId, null);
3721a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
3731a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        assertRawContactVisible(rawContactId1, false);
3741a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        assertRawContactVisible(rawContactId2, false);
3751a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
3761a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        // Turn on ungrouped for first
3771a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        values.clear();
3781a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        values.put(Settings.ACCOUNT_NAME, sTestAccount.name);
3791a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        values.put(Settings.ACCOUNT_TYPE, sTestAccount.type);
3801a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        values.put(Settings.UNGROUPED_VISIBLE, 1);
3811a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        mResolver.insert(Settings.CONTENT_URI, values);
3821a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
3831a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        assertRawContactVisible(rawContactId1, false);
3841a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        assertRawContactVisible(rawContactId2, false);
3851a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
3861a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        // Turn on ungrouped for second account
3875aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey        values.clear();
3881a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        values.put(Settings.ACCOUNT_NAME, sSecondAccount.name);
3891a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        values.put(Settings.ACCOUNT_TYPE, sSecondAccount.type);
3901a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        values.put(Settings.UNGROUPED_VISIBLE, 1);
3911a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        mResolver.insert(Settings.CONTENT_URI, values);
3921a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey
3931a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        assertRawContactVisible(rawContactId1, true);
3941a21fa6383449df4bf0d46138a23aa02dfa235a0Jeff Sharkey        assertRawContactVisible(rawContactId2, true);
3955aec18c7ba70a011ffff949cfa3faaffce0a79c7Jeff Sharkey    }
396ca8172420c0913dff96ea607d477d8b8abfe5ddbJeff Sharkey}
397