1bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov/*
2bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov * Copyright (C) 2009 The Android Open Source Project
3bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov *
4bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License");
5bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov * you may not use this file except in compliance with the License.
6bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov * You may obtain a copy of the License at
7bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov *
8bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov *      http://www.apache.org/licenses/LICENSE-2.0
9bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov *
10bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov * Unless required by applicable law or agreed to in writing, software
11bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS,
12bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov * See the License for the specific language governing permissions and
14bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov * limitations under the License.
15bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov */
16bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
17bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovpackage com.android.providers.contacts;
18bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
19c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.app.SearchManager;
20bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.content.ContentProvider;
21bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.content.ContentUris;
22bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.content.ContentValues;
23bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.database.Cursor;
24bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.net.Uri;
25bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts;
26bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.ContactMethods;
27bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.Extensions;
28bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.GroupMembership;
29bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.Groups;
30bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.Organizations;
31bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.People;
32bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.Phones;
33bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.Photos;
34bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.Presence;
351c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikovimport android.provider.Contacts.Settings;
3642c817741879588db9014739f4dc194621e97381Dmitri Plotnikovimport android.provider.ContactsContract;
3724c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoroimport android.test.suitebuilder.annotation.MediumTest;
38bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
39bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport java.io.IOException;
40bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
41bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov/**
42bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov * Tests for legacy contacts APIs.
438920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens *
448920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens * Run the test like this:
458920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens * <code>
468920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens * adb shell am instrument -e class com.android.providers.contacts.LegacyContactsProviderTest -w \
478920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens *         com.android.providers.contacts.tests/android.test.InstrumentationTestRunner
488920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens * </code>
4924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro *
5024c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * Note that this SHOULD be a large test, but had to be bumped down to medium due to a bug in the
5124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * SQLite cleanup code.
52bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov */
5324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro@MediumTest
541c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov@SuppressWarnings("deprecation")
55bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovpublic class LegacyContactsProviderTest extends BaseContactsProvider2Test {
56bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
57bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    @Override
58bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    protected Class<? extends ContentProvider> getProviderClass() {
59038a60f1920d798bc391a376e81980921a75cc34Fred Quintana       return SynchronousContactsProvider2.class;
60bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
61bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
62bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    @Override
63bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    protected String getAuthority() {
64bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        return Contacts.AUTHORITY;
65bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
66bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
67bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    public void testPeopleInsert() {
68bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
69bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
70bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
71bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri uri = mResolver.insert(People.CONTENT_URI, values);
72bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(uri, values);
735dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov        assertSelection(People.CONTENT_URI, values, "people", People._ID, ContentUris.parseId(uri));
74bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
75bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
7667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    public void testPeopleUpdate() {
7767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        ContentValues values = new ContentValues();
7867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        putContactValues(values);
7967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
8067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mResolver.insert(People.CONTENT_URI, values);
8167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        long personId = ContentUris.parseId(uri);
8267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        assertStoredValues(uri, values);
8367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        assertSelection(People.CONTENT_URI, values, "people", People._ID, personId);
8467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
8567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        values.clear();
8667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        putContactValues2(values);
8767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        mResolver.update(uri, values, null, null);
8867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        assertStoredValues(uri, values);
8967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
9067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        values.clear();
9167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        putContactValues(values);
9267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        mResolver.update(People.CONTENT_URI, values, People._ID + "=" + personId, null);
9367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        assertStoredValues(uri, values);
9467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
9567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
9633b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov    public void testPeopleDelete() {
97bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
98bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NAME, "John Doe");
99bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personId = mResolver.insert(People.CONTENT_URI, values);
100bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.delete(personId, null, null);
101bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
102bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Cursor c = mResolver.query(personId, null, People.NAME + "='John Doe'" , null, null);
103bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertEquals("Record count after deletion", 0, c.getCount());
104bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        c.close();
105bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
106bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        try {
107bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            mResolver.query(People.DELETED_CONTENT_URI, null, null, null, null);
108bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        } catch (UnsupportedOperationException e) {
109bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            // Expected exception
110bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        }
111bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
112bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
113445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov    public void testPeopleFilter() {
114bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
115bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NAME, "Deer Doe");
116bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.insert(People.CONTENT_URI, values);
117bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
118bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
119bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NAME, "Dear Dough");
120bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.insert(People.CONTENT_URI, values);
121bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
122bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
123bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NAME, "D.R. Dauwe");
124bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.insert(People.CONTENT_URI, values);
125bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
126bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertFilteredContacts("d", "Deer Doe", "Dear Dough", "D.R. Dauwe");
127bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertFilteredContacts("de", "Deer Doe", "Dear Dough");
128bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertFilteredContacts("dee", "Deer Doe");
129bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertFilteredContacts("der");
130bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
131bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
1320f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    public void testDefaultDisplayName() {
133bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
134bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NAME, "John Doe");
135bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
1365870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov        assertStoredValue(personUri, People.DISPLAY_NAME, "John Doe");
137bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
138bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
1393cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    public void testPrimaryOrganization() {
140bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
141bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        final Uri personUri = mResolver.insert(People.CONTENT_URI, values);
142bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
143bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
144bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Primary
145bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
146bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.ISPRIMARY, 1);
147bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.COMPANY, "Google");
148bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.TYPE, Organizations.TYPE_WORK);
149bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.PERSON_ID, personId);
150bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri orgUri1 = mResolver.insert(Organizations.CONTENT_URI, values);
151bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
152bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Non-primary
153bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
154bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.COMPANY, "Acme");
155bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.TYPE, Organizations.TYPE_WORK);
156bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.PERSON_ID, personId);
157bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri orgUri2 = mResolver.insert(Organizations.CONTENT_URI, values);
158bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
159bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
160bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PRIMARY_ORGANIZATION_ID, ContentUris.parseId(orgUri1));
161bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.DISPLAY_NAME, "Google");
162bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
163bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
164bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Remove the original primary organization
165bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.delete(orgUri1, null, null);
166bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
167bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
168bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PRIMARY_ORGANIZATION_ID, ContentUris.parseId(orgUri2));
169bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.DISPLAY_NAME, "Acme");
170bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
171bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
172bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Remove the remaining organization
173bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.delete(orgUri2, null, null);
174bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
175bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
176bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.putNull(People.PRIMARY_ORGANIZATION_ID);
177bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.putNull(People.DISPLAY_NAME);
178bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
179bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
180bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
181e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    public void testPrimaryPhone() {
182bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
183ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        putContactValuesExceptName(values);
184ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov
185bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
186bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
187bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
188bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Primary
189bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
190bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.ISPRIMARY, 1);
191bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.TYPE, Phones.TYPE_WORK);
192bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.PERSON_ID, personId);
193bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.NUMBER, "12345");
194bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri phoneUri1 = mResolver.insert(Phones.CONTENT_URI, values);
195bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
196bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Non-primary
197bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
198bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.TYPE, Phones.TYPE_WORK);
199bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.PERSON_ID, personId);
200bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.NUMBER, "67890");
201bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri phoneUri2 = mResolver.insert(Phones.CONTENT_URI, values);
202bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
203bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
204bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PRIMARY_PHONE_ID, ContentUris.parseId(phoneUri1));
205bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.DISPLAY_NAME, "12345");
206bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
207bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
208ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        values.clear();
209ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        putContactValuesExceptName(values);
210ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        values.put(People.PRIMARY_PHONE_ID, ContentUris.parseId(phoneUri1));
211ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        assertStoredValues(phoneUri2, values);
212ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov
213bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Remove the primary phone number
214bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.delete(phoneUri1, null, null);
215bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
216bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
217bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PRIMARY_PHONE_ID, ContentUris.parseId(phoneUri2));
218bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.DISPLAY_NAME, "67890");
219bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
220bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
221bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Remove the remaining phone number
222bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.delete(phoneUri2, null, null);
223bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
224bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
225bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.putNull(People.PRIMARY_PHONE_ID);
226bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.putNull(People.DISPLAY_NAME);
227bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
228bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
229bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
230bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov    public void testEmailCrud() {
231bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
232bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
233bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
234bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
235bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Primary
236bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
237bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.PERSON_ID, personId);
238bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.KIND, Contacts.KIND_EMAIL);
239bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.TYPE, ContactMethods.TYPE_HOME);
240bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.DATA, "foo@acme.com");
241bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.ISPRIMARY, 1);
242bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri emailUri1 = mResolver.insert(ContactMethods.CONTENT_URI, values);
243bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
24461efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        assertEquals(ContactMethods.CONTENT_EMAIL_ITEM_TYPE, mResolver.getType(emailUri1));
24561efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov
246bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        assertStoredValues(ContactMethods.CONTENT_URI,
247bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                ContactMethods._ID + "=" + ContentUris.parseId(emailUri1), null, values);
248bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        assertStoredValues(ContactMethods.CONTENT_EMAIL_URI,
249bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                ContactMethods._ID + "=" + ContentUris.parseId(emailUri1), null, values);
250bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov    }
251bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov
252bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov    public void testPrimaryEmail() {
253bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        ContentValues values = new ContentValues();
254ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        putContactValuesExceptName(values);
255bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
256bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        long personId = ContentUris.parseId(personUri);
257bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov
258bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        // Primary
259bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        values.clear();
260bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        values.put(ContactMethods.PERSON_ID, personId);
261bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        values.put(ContactMethods.KIND, Contacts.KIND_EMAIL);
262bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        values.put(ContactMethods.TYPE, ContactMethods.TYPE_HOME);
263bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        values.put(ContactMethods.DATA, "foo@acme.com");
264bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        values.put(ContactMethods.ISPRIMARY, 1);
265bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        Uri emailUri1 = mResolver.insert(ContactMethods.CONTENT_URI, values);
266bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov
267bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Non-primary
268bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
269bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.PERSON_ID, personId);
270bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.KIND, Contacts.KIND_EMAIL);
271bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.TYPE, ContactMethods.TYPE_WORK);
272bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.DATA, "bar@acme.com");
273bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri emailUri2 = mResolver.insert(ContactMethods.CONTENT_URI, values);
274bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
275bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
276bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PRIMARY_EMAIL_ID, ContentUris.parseId(emailUri1));
277bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.DISPLAY_NAME, "foo@acme.com");
278bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
279bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
280ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        values.clear();
281ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        putContactValuesExceptName(values);
282ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        values.put(People.PRIMARY_EMAIL_ID, ContentUris.parseId(emailUri1));
283ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        assertStoredValues(emailUri2, values);
284ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov
285bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Remove the primary email
286bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.delete(emailUri1, null, null);
287bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
288bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
289bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PRIMARY_EMAIL_ID, ContentUris.parseId(emailUri2));
290bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.DISPLAY_NAME, "bar@acme.com");
291bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
292bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
293bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Remove the remaining email
294bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.delete(emailUri2, null, null);
295bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
296bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
297bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.putNull(People.PRIMARY_EMAIL_ID);
298bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.putNull(People.DISPLAY_NAME);
299bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
300bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
301bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
302bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    public void testMarkAsContacted() {
303bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
304bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
305bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
306bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
307bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        int timesContactedBefore =
308bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                Integer.parseInt(getStoredValue(personUri, People.TIMES_CONTACTED));
309bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long timeBefore = System.currentTimeMillis();
310bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        People.markAsContacted(mResolver, personId);
311bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long timeAfter = System.currentTimeMillis();
312bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
313bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long lastContacted = Long.parseLong(getStoredValue(personUri, People.LAST_TIME_CONTACTED));
314bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        int timesContactedAfter =
315bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            Integer.parseInt(getStoredValue(personUri, People.TIMES_CONTACTED));
316bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
317bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertTrue(lastContacted >= timeBefore);
318bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertTrue(lastContacted <= timeAfter);
319bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertEquals(timesContactedAfter, timesContactedBefore + 1);
320bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
321bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
3223cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    public void testOrganizationsInsert() {
323bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
324bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
325bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
326bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
327bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
328bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.COMPANY, "Sierra");
329bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.PERSON_ID, personId);
330bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.TYPE, Organizations.TYPE_CUSTOM);
331bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.LABEL, "Club");
332bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.TITLE, "Member");
333bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.ISPRIMARY, 1);
334bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
335bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri uri = mResolver.insert(Organizations.CONTENT_URI, values);
336bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(uri, values);
337d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        assertSelection(Organizations.CONTENT_URI, values,
3385dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                "organizations", Organizations._ID, ContentUris.parseId(uri));
339bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
340bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertPersonIdConstraint(Organizations.CONTENT_URI, Organizations.TYPE,
341bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                Organizations.TYPE_WORK);
342bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
343bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertTypeAndLabelConstraints(Organizations.CONTENT_URI, Organizations.PERSON_ID, personId,
344bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                Organizations.TYPE, Organizations.TYPE_CUSTOM, Organizations.TYPE_OTHER,
345bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                Organizations.LABEL);
346e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov
347e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov
348e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov        Uri twigUri = Uri.withAppendedPath(personUri, Organizations.CONTENT_DIRECTORY);
349e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov        assertStoredValues(twigUri, values);
350e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov
351e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov        Uri twigUriWithId = ContentUris.withAppendedId(twigUri, ContentUris.parseId(uri));
352e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov        assertStoredValues(twigUriWithId, values);
353bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
354bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
355044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    public void testOrganizationsUpdate() {
356044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        ContentValues values = new ContentValues();
357044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
358044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
359044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
360044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.clear();
361044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Organizations.COMPANY, "Sierra");
362044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Organizations.PERSON_ID, personId);
363044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Organizations.TYPE, Organizations.TYPE_CUSTOM);
364044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Organizations.LABEL, "Club");
365044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Organizations.TITLE, "Member");
366044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Organizations.ISPRIMARY, 0);
367044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
368044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        Uri uri = mResolver.insert(Organizations.CONTENT_URI, values);
369044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
370044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.clear();
371044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Organizations.COMPANY, "Planetary");
372044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Organizations.PERSON_ID, personId);
373044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Organizations.TYPE, Organizations.TYPE_CUSTOM);
374044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Organizations.LABEL, "Society");
375044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Organizations.TITLE, "Chair");
376044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Organizations.ISPRIMARY, 1);
377044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
378044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mResolver.update(uri, values, null, null);
379044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
380044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        assertStoredValues(uri, values);
381044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
382044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
383e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    public void testPhonesInsert() {
384bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
385bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
386bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
387bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
388bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
389bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
390bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.PERSON_ID, personId);
391bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.TYPE, Phones.TYPE_CUSTOM);
392bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.LABEL, "Directory");
393bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.NUMBER, "1-800-4664-411");
394bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.ISPRIMARY, 1);
395bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
396bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri uri = mResolver.insert(Phones.CONTENT_URI, values);
39742c817741879588db9014739f4dc194621e97381Dmitri Plotnikov        ContentValues expectedResults[] = new ContentValues[1];
398bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Adding another value to assert
399892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov        expectedResults[0] = new ContentValues(values);
40042c817741879588db9014739f4dc194621e97381Dmitri Plotnikov        expectedResults[0].put(Phones.NUMBER_KEY, "11446640081");
40142c817741879588db9014739f4dc194621e97381Dmitri Plotnikov
402bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // The result is joined with People
403892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov        putContactValues(expectedResults[0]);
404892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov        assertStoredValues(uri, expectedResults);
4055dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov        assertSelection(Phones.CONTENT_URI, values, "phones",
406d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Phones._ID, ContentUris.parseId(uri));
407bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
408bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Access the phone through People
409bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri twigUri = Uri.withAppendedPath(personUri, People.Phones.CONTENT_DIRECTORY);
410892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov        assertStoredValues(twigUri, expectedResults);
411bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
412bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Now the person should be joined with Phone
413bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
414bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
415bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.TYPE, Phones.TYPE_CUSTOM);
416bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.LABEL, "Directory");
417bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NUMBER, "1-800-4664-411");
418bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
419bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
420bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertPersonIdConstraint(Phones.CONTENT_URI, Phones.TYPE, Phones.TYPE_WORK);
421bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
422bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertTypeAndLabelConstraints(Phones.CONTENT_URI, Phones.PERSON_ID, personId, Phones.TYPE,
423bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                Phones.TYPE_CUSTOM, Phones.TYPE_OTHER, Phones.LABEL);
424bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
425bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
426044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    public void testPhonesUpdate() {
427044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        ContentValues values = new ContentValues();
428044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
429044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
430044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
431044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.clear();
432044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Phones.PERSON_ID, personId);
433044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Phones.TYPE, Phones.TYPE_CUSTOM);
434044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Phones.LABEL, "Directory");
435044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Phones.NUMBER, "1-800-4664-411");
436044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Phones.ISPRIMARY, 0);
437044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
438044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        Uri uri = mResolver.insert(Phones.CONTENT_URI, values);
439044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
440044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.clear();
441044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Phones.PERSON_ID, personId);
442044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Phones.TYPE, Phones.TYPE_FAX_HOME);
443044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.putNull(Phones.LABEL);
444044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Phones.NUMBER, "1-800-555-4663");
445044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Phones.ISPRIMARY, 1);
446044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
447044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mResolver.update(uri, values, null, null);
448044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
44942c817741879588db9014739f4dc194621e97381Dmitri Plotnikov        ContentValues[] expectedValues = new ContentValues[1];
450892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov        expectedValues[0] = values;
45142c817741879588db9014739f4dc194621e97381Dmitri Plotnikov        expectedValues[0].put(Phones.NUMBER_KEY, "36645550081");
452892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov        assertStoredValues(uri, expectedValues);
453044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
454044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
455fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov    public void testPhonesFilterQuery() {
456fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        ContentValues values = new ContentValues();
457fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        putContactValues(values);
458fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
459fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
460fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov
461fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        values.clear();
462fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        values.put(Phones.PERSON_ID, personId);
463fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        values.put(Phones.TYPE, Phones.TYPE_CUSTOM);
464fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        values.put(Phones.LABEL, "Directory");
465892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov        values.put(Phones.NUMBER, "800-4664-411");
466fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        values.put(Phones.ISPRIMARY, 1);
467fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov
468fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        Uri uri = mResolver.insert(Phones.CONTENT_URI, values);
469fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov
470892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov        Uri filterUri1 = Uri.withAppendedPath(Phones.CONTENT_FILTER_URL, "18004664411");
47142c817741879588db9014739f4dc194621e97381Dmitri Plotnikov        ContentValues[] expectedValues = new ContentValues[1];
472892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov        expectedValues[0] = values;
47342c817741879588db9014739f4dc194621e97381Dmitri Plotnikov        expectedValues[0].put(Phones.NUMBER_KEY, "1144664008");
474892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov        assertStoredValues(filterUri1, expectedValues);
475fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov
476fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        Uri filterUri2 = Uri.withAppendedPath(Phones.CONTENT_FILTER_URL, "7773334444");
477fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        assertEquals(0, getCount(filterUri2, null, null));
478fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov    }
479fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov
480e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    public void testEmailInsert() {
481044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        assertContactMethodInsert(Contacts.KIND_EMAIL,
482044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                ContactMethods.TYPE_CUSTOM, "Some other way", "foo@acme.com", null, true);
483044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
484044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
485044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    public void testEmailUpdate() {
486044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        assertContactMethodUpdate(Contacts.KIND_EMAIL,
487044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                ContactMethods.TYPE_CUSTOM, "Some other way", "foo@acme.com", null, false,
488044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                ContactMethods.TYPE_HOME, null, "bar@acme.com", "aux", true);
489e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
490e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
4910126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov    public void testImInsertStandard() {
492044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        assertContactMethodInsert(Contacts.KIND_IM,
493044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                ContactMethods.TYPE_CUSTOM, "Some other way", "pre:3", "Bar", true);
494044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
495044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
496044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    public void testImUpdateStandard() {
497044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        assertContactMethodUpdate(Contacts.KIND_IM,
498044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                ContactMethods.TYPE_CUSTOM, "Some other way", "pre:3", "Bar", false,
499044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                ContactMethods.TYPE_WORK, null, "pre:4", "Buz", true);
5000126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov    }
5010126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov
5020126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov    public void testImInsertCustom() {
503044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        assertContactMethodInsert(Contacts.KIND_IM,
504044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                ContactMethods.TYPE_CUSTOM, "Some other way", "custom:my_proto", "Bar", true);
505044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
506044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
507044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    public void testImUpdateCustom() {
508044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        assertContactMethodUpdate(Contacts.KIND_IM,
509044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                ContactMethods.TYPE_CUSTOM, "Some other way", "custom:my_proto", "Bar", false,
510044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                ContactMethods.TYPE_HOME, null, "custom:my_other_proto", "Buz", true);
511e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
512e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
513e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    public void testPostalInsert() {
514044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        assertContactMethodInsert(Contacts.KIND_POSTAL,
515044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                ContactMethods.TYPE_CUSTOM, "Some other way", "Foo", "Bar", true);
516044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
517044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
518044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    public void testPostalUpdate() {
519044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        assertContactMethodUpdate(Contacts.KIND_POSTAL,
520044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                ContactMethods.TYPE_CUSTOM, "Some other way", "Foo", "Bar", false,
521044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                ContactMethods.TYPE_WORK, null, "Biz", "Baz", true);
522e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
523e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
524e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private void assertContactMethodInsert(int kind, int type, String label, String data,
525e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            String auxData, boolean primary) {
526bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
527bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
528bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        final Uri personUri = mResolver.insert(People.CONTENT_URI, values);
529bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
530bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
531bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
532bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.PERSON_ID, personId);
533e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        values.put(ContactMethods.KIND, kind);
534e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        values.put(ContactMethods.TYPE, type);
535e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        values.put(ContactMethods.LABEL, label);
536e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        values.put(ContactMethods.DATA, data);
537e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        values.put(ContactMethods.AUX_DATA, auxData);
538e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        values.put(ContactMethods.ISPRIMARY, primary ? 1 : 0);
539bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
540bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri uri = mResolver.insert(ContactMethods.CONTENT_URI, values);
541bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
542bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // The result is joined with People
543bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
544bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(uri, values);
5455dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov        assertSelection(ContactMethods.CONTENT_URI, values, "contact_methods",
546d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                ContactMethods._ID, ContentUris.parseId(uri));
547bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
548e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        // Access the contact method through People
549bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri twigUri = Uri.withAppendedPath(personUri, People.ContactMethods.CONTENT_DIRECTORY);
550bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(twigUri, values);
551bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
552bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertPersonIdConstraint(ContactMethods.CONTENT_URI, ContactMethods.TYPE,
553bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                ContactMethods.TYPE_WORK);
554bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
555bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertTypeAndLabelConstraints(ContactMethods.CONTENT_URI, ContactMethods.PERSON_ID,
556bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                personId, ContactMethods.TYPE, ContactMethods.TYPE_CUSTOM,
557bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                ContactMethods.TYPE_OTHER, ContactMethods.LABEL);
558bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
559bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
560044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void assertContactMethodUpdate(int kind,
561044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            int type1, String label1, String data1, String auxData1, boolean primary1,
562044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            int type2, String label2, String data2, String auxData2, boolean primary2) {
563044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        ContentValues values = new ContentValues();
564044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        putContactValues(values);
565044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        final Uri personUri = mResolver.insert(People.CONTENT_URI, values);
566044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
567044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
568044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.clear();
569044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(ContactMethods.PERSON_ID, personId);
570044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(ContactMethods.KIND, kind);
571044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(ContactMethods.TYPE, type1);
572044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(ContactMethods.LABEL, label1);
573044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(ContactMethods.DATA, data1);
574044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(ContactMethods.AUX_DATA, auxData1);
575044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(ContactMethods.ISPRIMARY, primary1 ? 1 : 0);
576044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
577044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        Uri uri = mResolver.insert(ContactMethods.CONTENT_URI, values);
578044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
579044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.clear();
580044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(ContactMethods.TYPE, type2);
581044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(ContactMethods.LABEL, label2);
582044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(ContactMethods.DATA, data2);
583044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(ContactMethods.AUX_DATA, auxData2);
584044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(ContactMethods.ISPRIMARY, primary2 ? 1 : 0);
585044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mResolver.update(uri, values, null, null);
586044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
587044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        assertStoredValues(uri, values);
588044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
589044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
5900f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    public void testExtensionsInsert() {
591bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
592bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        final Uri personUri = mResolver.insert(People.CONTENT_URI, values);
593bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
594bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
595bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
596bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Extensions.PERSON_ID, personId);
597bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Extensions.NAME, "Foo");
598bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Extensions.VALUE, "Bar");
599bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
600bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri uri = mResolver.insert(Extensions.CONTENT_URI, values);
601bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(uri, values);
6025dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov        assertSelection(Extensions.CONTENT_URI, values, "extensions",
603d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Extensions._ID, ContentUris.parseId(uri));
604bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
605bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Access the extensions through People
606bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri twigUri = Uri.withAppendedPath(personUri, People.Extensions.CONTENT_DIRECTORY);
607bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(twigUri, values);
608bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
609bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
610044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    public void testExtensionsUpdate() {
611044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        ContentValues values = new ContentValues();
612044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        final Uri personUri = mResolver.insert(People.CONTENT_URI, values);
613044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
614044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
615044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.clear();
616044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Extensions.PERSON_ID, personId);
617044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Extensions.NAME, "Foo");
618044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Extensions.VALUE, "Bar");
619044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
620044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        Uri uri = mResolver.insert(Extensions.CONTENT_URI, values);
621044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
622044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.clear();
623044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Extensions.NAME, "Biz");
624044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Extensions.VALUE, "Baz");
625044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mResolver.update(uri, values, null, null);
626044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
627044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        assertStoredValues(uri, values);
628044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
629044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
6300f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    public void testGroupsInsert() {
631bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
632bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Groups.NAME, "Galois");
633bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Groups.NOTES, "Abel");
6340f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        values.put(Groups.SYSTEM_ID, "12345");
635bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
636bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri groupUri = mResolver.insert(Groups.CONTENT_URI, values);
637bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(groupUri, values);
638bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
639bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
640044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    public void testGroupsUpdate() {
641044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        ContentValues values = new ContentValues();
642044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Groups.NAME, "Galois");
643044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Groups.NOTES, "Abel");
644044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Groups.SYSTEM_ID, "12345");
645044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
646044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        Uri groupUri = mResolver.insert(Groups.CONTENT_URI, values);
647044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
648044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.clear();
649044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Groups.NAME, "Klein");
650044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Groups.NOTES, "Vierergruppe");
651044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Groups.SYSTEM_ID, "1234");
652044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mResolver.update(groupUri, values, null, null);
653044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        assertStoredValues(groupUri, values);
654044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
655044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
6560f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    public void testGroupMembershipsInsert() {
657bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
658bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Groups.NOTES, "Abel");
65971e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        Uri groupUri = insertLegacyGroup("Galois", values);
66071e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        Uri personUri = insertPerson("Klein", values);
66171e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        Uri membershipUri = insertLegacyGroupMembership(groupUri, personUri, values);
662d4b57da3f07bc530db69015d363c61a768a4713aDmitri Plotnikov        values.put(Groups.NAME, "Galois");
663d4b57da3f07bc530db69015d363c61a768a4713aDmitri Plotnikov        values.put(Groups.NOTES, "Abel");
664d4b57da3f07bc530db69015d363c61a768a4713aDmitri Plotnikov
665d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        assertStoredValues(membershipUri, values);
6665dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov        assertSelection(GroupMembership.CONTENT_URI, values, "groupmembership",
667d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                GroupMembership._ID, ContentUris.parseId(membershipUri));
668bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
669bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personsGroupsUri = Uri.withAppendedPath(personUri, GroupMembership.CONTENT_DIRECTORY);
670d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        assertStoredValues(personsGroupsUri, values);
671bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
672bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
673d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov    public void testAddToGroup() {
674bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
675bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
676bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
677bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
678bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
679bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Groups.NAME, "Galois");
680bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri groupUri = mResolver.insert(Groups.CONTENT_URI, values);
681bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
682bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        People.addToGroup(mResolver, personId, "Galois");
683bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
684bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
685bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(GroupMembership.GROUP_ID, ContentUris.parseId(groupUri));
686bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(GroupMembership.PERSON_ID, personId);
687bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
688bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personsGroupsUri = Uri.withAppendedPath(personUri, GroupMembership.CONTENT_DIRECTORY);
689bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personsGroupsUri, values);
690bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
691bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
69271e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov    public void testGroupMembersByGroupName() {
69371e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        ContentValues values = new ContentValues();
69471e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        Uri groupUri1 = insertLegacyGroup("Galois", values);
69571e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        Uri personUri1 = insertPerson("Klein", values);
69671e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        insertLegacyGroupMembership(groupUri1, personUri1, values);
69771e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov
69871e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        Uri groupUri2 = insertLegacyGroup("Euler", values);
69971e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        Uri personUri2 = insertPerson("Lagrange", values);
70071e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        insertLegacyGroupMembership(groupUri2, personUri2, values);
70171e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov
70271e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        // NOTE: testing non-public API support
70371e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        assertStoredValue(Uri.parse("content://contacts/groups/name/Galois/members"),
70471e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                People.NAME, "Klein");
70571e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        assertStoredValue(Uri.parse("content://contacts/groups/name/Euler/members"),
70671e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                People.NAME, "Lagrange");
70771e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov    }
70871e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov
709c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    public void testPhotoUpdate() throws Exception {
710f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro        byte[] photo = loadPhotoFromResource(
711f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro                com.android.providers.contacts.tests.R.drawable.earth_small, PhotoSize.ORIGINAL);
712f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro        byte[] thumbnailedPhoto = loadPhotoFromResource(
713f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro                com.android.providers.contacts.tests.R.drawable.earth_small, PhotoSize.THUMBNAIL);
714bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
715bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
716bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
717bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
718bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
719bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Photos.DATA, photo);
720c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        values.put(Photos.LOCAL_VERSION, "10");
721c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        // FIXME this column was unavailable for update in legacy ContactsProvider
722c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        // values.put(Photos.DOWNLOAD_REQUIRED, 1);
723c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        values.put(Photos.EXISTS_ON_SERVER, 1);
724c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        values.put(Photos.SYNC_ERROR, "404 does not exist");
725bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
726bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri photoUri = Uri.withAppendedPath(personUri, Photos.CONTENT_DIRECTORY);
727bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.update(photoUri, values, null, null);
728f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro        values.put(Photos.DATA, thumbnailedPhoto);
729bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(photoUri, values);
730044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
731044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        long photoId = Long.parseLong(getStoredValue(photoUri, Photos._ID));
732044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
733044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Photos.LOCAL_VERSION, "11");
734f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro        values.put(Photos.DATA, photo);
735044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        Uri contentUri = ContentUris.withAppendedId(Photos.CONTENT_URI, photoId);
736044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mResolver.update(contentUri, values, null, null);
737f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro        values.put(Photos.DATA, thumbnailedPhoto);
738044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        assertStoredValues(contentUri, values);
739044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        assertStoredValues(photoUri, values);
740bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
741bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
742c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    /**
743c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov     * Capturing the search suggestion requirements in test cases as a reference.
744c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov     */
745c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    public void testSearchSuggestionsNotInMyContacts() throws Exception {
746c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        // We don't provide compatibility for search suggestions
747038a60f1920d798bc391a376e81980921a75cc34Fred Quintana        return;
748c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    }
749c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
750c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    /**
751c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov     * Capturing the search suggestion requirements in test cases as a reference.
752c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov     */
753c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    public void testSearchSuggestionsByName() throws Exception {
754c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
755c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        // We don't provide compatibility for search suggestions
756038a60f1920d798bc391a376e81980921a75cc34Fred Quintana        return;
757c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    }
758c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
759c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    private void assertSearchSuggestion(boolean name, boolean photo, boolean organization,
760c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            boolean phone, boolean email, String query, boolean expectIcon1Uri, String expectedIcon2,
761c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            String expectedText1, String expectedText2) throws IOException {
762c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        ContentValues values = new ContentValues();
763c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
764c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        if (name) {
765c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(People.NAME, "Deer Dough");
766c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        }
767c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
768c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        final Uri personUri = mResolver.insert(People.CONTENT_URI, values);
769c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        long personId = ContentUris.parseId(personUri);
770c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
771c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        People.addToMyContactsGroup(mResolver, personId);
772c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
773c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        if (photo) {
774c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.clear();
775c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            byte[] photoData = loadTestPhoto();
776c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Photos.DATA, photoData);
777c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Photos.LOCAL_VERSION, "1");
778c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Photos.EXISTS_ON_SERVER, 0);
779c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            Uri photoUri = Uri.withAppendedPath(personUri, Photos.CONTENT_DIRECTORY);
780c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            mResolver.update(photoUri, values, null, null);
781c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        }
782c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
783c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        if (organization) {
784c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.clear();
785c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Organizations.ISPRIMARY, 1);
786c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Organizations.COMPANY, "Google");
787c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Organizations.TYPE, Organizations.TYPE_WORK);
788c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Organizations.PERSON_ID, personId);
789c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            mResolver.insert(Organizations.CONTENT_URI, values);
790c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        }
791c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
792c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        if (email) {
793c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.clear();
794c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(ContactMethods.PERSON_ID, personId);
795c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(ContactMethods.KIND, Contacts.KIND_EMAIL);
796c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(ContactMethods.TYPE, ContactMethods.TYPE_HOME);
797c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(ContactMethods.DATA, "foo@acme.com");
798c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(ContactMethods.ISPRIMARY, 1);
799c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            mResolver.insert(ContactMethods.CONTENT_URI, values);
800c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
801c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
802c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            String protocol = ContactMethods
803c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov                    .encodePredefinedImProtocol(ContactMethods.PROTOCOL_GOOGLE_TALK);
804c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.clear();
805c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Presence.IM_PROTOCOL, protocol);
806c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Presence.IM_HANDLE, "foo@acme.com");
807c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Presence.IM_ACCOUNT, "foo");
808c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Presence.PRESENCE_STATUS, Presence.OFFLINE);
809c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Presence.PRESENCE_CUSTOM_STATUS, "Coding for Android");
810c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            mResolver.insert(Presence.CONTENT_URI, values);
811c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        }
812c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
813c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        if (phone) {
814c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.clear();
815c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Phones.PERSON_ID, personId);
816c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Phones.TYPE, Phones.TYPE_HOME);
817c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Phones.NUMBER, "1-800-4664-411");
818c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Phones.ISPRIMARY, 1);
819c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            mResolver.insert(Phones.CONTENT_URI, values);
820c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        }
821c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
822c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        Uri searchUri = new Uri.Builder().scheme("content").authority(Contacts.AUTHORITY)
823c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov                .appendPath(SearchManager.SUGGEST_URI_PATH_QUERY).appendPath(query).build();
824c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
825c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        Cursor c = mResolver.query(searchUri, null, null, null, null);
826c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        assertEquals(1, c.getCount());
827c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        c.moveToFirst();
828c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        values.clear();
829c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
830c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        String icon1 = c.getString(c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_1));
831c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        if (expectIcon1Uri) {
832c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            assertTrue(icon1.startsWith("content:"));
833c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        } else {
834c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            assertEquals(String.valueOf(com.android.internal.R.drawable.ic_contact_picture), icon1);
835c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        }
836c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
837c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        // SearchManager does not declare a constant for _id
838c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        values.put("_id", personId);
839c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        values.put(SearchManager.SUGGEST_COLUMN_ICON_2, expectedIcon2);
840c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        values.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID, personId);
841c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        values.put(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, personId);
842c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        values.put(SearchManager.SUGGEST_COLUMN_TEXT_1, expectedText1);
843c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        values.put(SearchManager.SUGGEST_COLUMN_TEXT_2, expectedText2);
844c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        assertCursorValues(c, values);
845c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        c.close();
846c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
847c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        // Cleanup
848c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        mResolver.delete(personUri, null, null);
849c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    }
850c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
851c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    /**
852c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov     * Capturing the search suggestion requirements in test cases as a reference.
853c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov     */
854c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    public void testSearchSuggestionsByPhoneNumber() throws Exception {
855c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        // We don't provide compatibility for search suggestions
856038a60f1920d798bc391a376e81980921a75cc34Fred Quintana        return;
857c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    }
858c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
8591c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov    public void testSettings() throws Exception {
8601c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        mActor.addAuthority(ContactsContract.AUTHORITY);
8611c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov
8621c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        ContentValues values = new ContentValues();
8631c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        values.put(Settings._SYNC_ACCOUNT, "foo");
8641c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        values.put(Settings._SYNC_ACCOUNT_TYPE, "bar");
8651c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        values.put(Settings.KEY, Settings.SYNC_EVERYTHING);
8661c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        values.put(Settings.VALUE, 7);
8671c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        mResolver.update(Settings.CONTENT_URI, values, null, null);
8681c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov
8691c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        assertStoredValue(Settings.CONTENT_URI, Settings._SYNC_ACCOUNT + "='foo' AND "
8701c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                + Settings.KEY + "='" + Settings.SYNC_EVERYTHING + "'", null, Settings.VALUE, "7");
8711c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov
8721c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        assertStoredValue(ContactsContract.Settings.CONTENT_URI,
8731c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                ContactsContract.Settings.ACCOUNT_NAME + "='foo'",
8741c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                null, ContactsContract.Settings.SHOULD_SYNC, "7");
8751c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov
8761c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        values.clear();
8771c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        values.put(ContactsContract.Settings.SHOULD_SYNC, 8);
8781c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        mResolver.update(ContactsContract.Settings.CONTENT_URI, values,
8791c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                ContactsContract.Settings.ACCOUNT_NAME + "='foo'", null);
8801c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov
8811c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        assertStoredValue(Settings.CONTENT_URI, Settings._SYNC_ACCOUNT + "='foo' AND "
8821c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                + Settings.KEY + "='" + Settings.SYNC_EVERYTHING + "'", null, Settings.VALUE, "8");
8831c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov    }
8841c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov
88571e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov    private Uri insertPerson(String name, ContentValues values) {
88671e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        values.put(People.NAME, name);
88771e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        return mResolver.insert(People.CONTENT_URI, values);
88871e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov    }
88971e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov
89071e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov    private Uri insertLegacyGroup(String name, ContentValues values) {
89171e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        values.put(Groups.NAME, name);
89271e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        return mResolver.insert(Groups.CONTENT_URI, values);
89371e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov    }
89471e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov
89571e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov    private Uri insertLegacyGroupMembership(Uri groupUri, Uri personUri, ContentValues values) {
89671e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        long groupId = ContentUris.parseId(groupUri);
89771e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
89871e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov
89971e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        values.clear();
90071e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        values.put(GroupMembership.GROUP_ID, groupId);
90171e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        values.put(GroupMembership.PERSON_ID, personId);
90271e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        Uri membershipUri = mResolver.insert(GroupMembership.CONTENT_URI, values);
90371e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        return membershipUri;
90471e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov    }
90571e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov
906bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    private void putContactValues(ContentValues values) {
907ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        putContactValuesExceptName(values);
908bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NAME, "Deer Dough");
909ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov    }
910ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov
911ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov    private void putContactValuesExceptName(ContentValues values) {
912ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        // Populating only unhidden columns
913bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NOTES, "Cash Cow");
914bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.TIMES_CONTACTED, 3);
915bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.LAST_TIME_CONTACTED, 10);
916bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.CUSTOM_RINGTONE, "ringtone");
917bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.SEND_TO_VOICEMAIL, 1);
918bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.STARRED, 1);
919bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
920bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
92167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private void putContactValues2(ContentValues values) {
92267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        // Populating only unhidden columns
92367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        values.put(People.NAME, "John Doe");
92467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        values.put(People.PHONETIC_NAME, "jon dawe");
92567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        values.put(People.NOTES, "Poor Johnny");
92667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        values.put(People.TIMES_CONTACTED, 4);
92767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        values.put(People.LAST_TIME_CONTACTED, 11);
92867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        values.put(People.CUSTOM_RINGTONE, "rangtone");
92967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        values.put(People.SEND_TO_VOICEMAIL, 0);
93067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        values.put(People.STARRED, 0);
93167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
93267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
933bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    private void assertFilteredContacts(String filter, String... expectedNames) {
934bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri filterUri = Uri.withAppendedPath(People.CONTENT_FILTER_URI, filter);
935bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Cursor c = mResolver.query(filterUri, null, null, null, null);
936bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        try {
937bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            assertEquals("Record count", expectedNames.length, c.getCount());
938bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            int column = c.getColumnIndex(People.NAME);
939bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            for (int i = 0; i < expectedNames.length; i++) {
940bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                c.moveToNext();
941bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                assertEquals(expectedNames[i], c.getString(column));
942bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            }
943bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        } finally {
944bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            c.close();
945bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        }
946bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
947bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
948bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    private void assertPersonIdConstraint(Uri uri, String typeColumn, int defaultType) {
949bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
950bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(typeColumn, defaultType);
951bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        try {
952bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            mResolver.insert(uri, values);
953bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            fail("Inserted row without person ID");
954bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        } catch (Exception e) {
955bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            // Exception expected
956bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        }
957bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
958bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
959bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    private void assertTypeAndLabelConstraints(Uri uri, String personIdColumn, long personId,
960bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            String typeColumn, int defaultType, int otherType, String labelColumn) {
961bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
962bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(personIdColumn, personId);
963bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(labelColumn, "Foo");
964622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkey
965bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        try {
966bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            mResolver.insert(uri, values);
967622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkey            fail("Inserted row with label without defining type");
968bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        } catch (Exception e) {
969bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            // Exception expected
970bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        }
971bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
972bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
9735dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov    protected void assertSelection(Uri uri, ContentValues values, String legacyTable,
9745dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov            String idColumn, long id) {
97567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        values.put(idColumn, id);
97667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        String qualified = legacyTable + "." + idColumn;
97767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        super.assertSelection(uri, values, qualified, id);
978c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    }
979bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov}
980