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