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