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
19f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoroimport com.android.providers.contacts.tests.*;
20f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro
21c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikovimport android.app.SearchManager;
22bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.content.ContentProvider;
23bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.content.ContentUris;
24bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.content.ContentValues;
25bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.database.Cursor;
26bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.net.Uri;
27bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts;
28bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.ContactMethods;
29bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.Extensions;
30bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.GroupMembership;
31bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.Groups;
32bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.Organizations;
33bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.People;
34bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.Phones;
35bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.Photos;
36bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.Presence;
371c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikovimport android.provider.Contacts.Settings;
3842c817741879588db9014739f4dc194621e97381Dmitri Plotnikovimport android.provider.ContactsContract;
3924c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoroimport android.test.suitebuilder.annotation.MediumTest;
40bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
41bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport java.io.IOException;
42bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
43bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov/**
44bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov * Tests for legacy contacts APIs.
458920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens *
468920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens * Run the test like this:
478920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens * <code>
488920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens * adb shell am instrument -e class com.android.providers.contacts.LegacyContactsProviderTest -w \
498920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens *         com.android.providers.contacts.tests/android.test.InstrumentationTestRunner
508920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens * </code>
5124c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro *
5224c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * Note that this SHOULD be a large test, but had to be bumped down to medium due to a bug in the
5324c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro * SQLite cleanup code.
54bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov */
5524c1d384b45a6d3c1cc959062a9d4308335fabbfDave Santoro@MediumTest
561c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov@SuppressWarnings("deprecation")
57bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovpublic class LegacyContactsProviderTest extends BaseContactsProvider2Test {
58bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
59bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    @Override
60bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    protected Class<? extends ContentProvider> getProviderClass() {
61038a60f1920d798bc391a376e81980921a75cc34Fred Quintana       return SynchronousContactsProvider2.class;
62bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
63bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
64bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    @Override
65bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    protected String getAuthority() {
66bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        return Contacts.AUTHORITY;
67bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
68bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
69bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    public void testPeopleInsert() {
70bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
71bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
72bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
73bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri uri = mResolver.insert(People.CONTENT_URI, values);
74bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(uri, values);
755dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov        assertSelection(People.CONTENT_URI, values, "people", People._ID, ContentUris.parseId(uri));
76bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
77bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
7867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    public void testPeopleUpdate() {
7967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        ContentValues values = new ContentValues();
8067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        putContactValues(values);
8167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
8267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        Uri uri = mResolver.insert(People.CONTENT_URI, values);
8367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        long personId = ContentUris.parseId(uri);
8467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        assertStoredValues(uri, values);
8567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        assertSelection(People.CONTENT_URI, values, "people", People._ID, personId);
8667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
8767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        values.clear();
8867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        putContactValues2(values);
8967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        mResolver.update(uri, values, null, null);
9067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        assertStoredValues(uri, values);
9167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
9267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        values.clear();
9367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        putContactValues(values);
9467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        mResolver.update(People.CONTENT_URI, values, People._ID + "=" + personId, null);
9567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        assertStoredValues(uri, values);
9667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
9767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
9833b41fdb8d7c3c654cb070799c9d6e2b4ab16078Dmitri Plotnikov    public void testPeopleDelete() {
99bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
100bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NAME, "John Doe");
101bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personId = mResolver.insert(People.CONTENT_URI, values);
102bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.delete(personId, null, null);
103bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
104bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Cursor c = mResolver.query(personId, null, People.NAME + "='John Doe'" , null, null);
105bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertEquals("Record count after deletion", 0, c.getCount());
106bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        c.close();
107bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
108bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        try {
109bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            mResolver.query(People.DELETED_CONTENT_URI, null, null, null, null);
110bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        } catch (UnsupportedOperationException e) {
111bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            // Expected exception
112bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        }
113bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
114bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
115445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov    public void testPeopleFilter() {
116bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
117bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NAME, "Deer Doe");
118bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.insert(People.CONTENT_URI, values);
119bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
120bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
121bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NAME, "Dear Dough");
122bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.insert(People.CONTENT_URI, values);
123bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
124bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
125bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NAME, "D.R. Dauwe");
126bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.insert(People.CONTENT_URI, values);
127bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
128bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertFilteredContacts("d", "Deer Doe", "Dear Dough", "D.R. Dauwe");
129bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertFilteredContacts("de", "Deer Doe", "Dear Dough");
130bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertFilteredContacts("dee", "Deer Doe");
131bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertFilteredContacts("der");
132bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
133bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
1340f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    public void testDefaultDisplayName() {
135bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
136bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NAME, "John Doe");
137bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
1385870f2dcc2ac7715b2c078a886ee346622e7887eDmitri Plotnikov        assertStoredValue(personUri, People.DISPLAY_NAME, "John Doe");
139bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
140bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
1413cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    public void testPrimaryOrganization() {
142bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
143bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        final Uri personUri = mResolver.insert(People.CONTENT_URI, values);
144bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
145bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
146bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Primary
147bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
148bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.ISPRIMARY, 1);
149bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.COMPANY, "Google");
150bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.TYPE, Organizations.TYPE_WORK);
151bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.PERSON_ID, personId);
152bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri orgUri1 = mResolver.insert(Organizations.CONTENT_URI, values);
153bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
154bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Non-primary
155bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
156bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.COMPANY, "Acme");
157bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.TYPE, Organizations.TYPE_WORK);
158bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.PERSON_ID, personId);
159bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri orgUri2 = mResolver.insert(Organizations.CONTENT_URI, values);
160bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
161bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
162bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PRIMARY_ORGANIZATION_ID, ContentUris.parseId(orgUri1));
163bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.DISPLAY_NAME, "Google");
164bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
165bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
166bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Remove the original primary organization
167bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.delete(orgUri1, null, null);
168bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
169bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
170bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PRIMARY_ORGANIZATION_ID, ContentUris.parseId(orgUri2));
171bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.DISPLAY_NAME, "Acme");
172bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
173bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
174bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Remove the remaining organization
175bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.delete(orgUri2, null, null);
176bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
177bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
178bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.putNull(People.PRIMARY_ORGANIZATION_ID);
179bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.putNull(People.DISPLAY_NAME);
180bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
181bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
182bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
183e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    public void testPrimaryPhone() {
184bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
185ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        putContactValuesExceptName(values);
186ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov
187bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
188bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
189bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
190bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Primary
191bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
192bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.ISPRIMARY, 1);
193bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.TYPE, Phones.TYPE_WORK);
194bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.PERSON_ID, personId);
195bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.NUMBER, "12345");
196bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri phoneUri1 = mResolver.insert(Phones.CONTENT_URI, values);
197bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
198bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Non-primary
199bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
200bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.TYPE, Phones.TYPE_WORK);
201bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.PERSON_ID, personId);
202bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.NUMBER, "67890");
203bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri phoneUri2 = mResolver.insert(Phones.CONTENT_URI, values);
204bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
205bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
206bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PRIMARY_PHONE_ID, ContentUris.parseId(phoneUri1));
207bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.DISPLAY_NAME, "12345");
208bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
209bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
210ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        values.clear();
211ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        putContactValuesExceptName(values);
212ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        values.put(People.PRIMARY_PHONE_ID, ContentUris.parseId(phoneUri1));
213ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        assertStoredValues(phoneUri2, values);
214ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov
215bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Remove the primary phone number
216bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.delete(phoneUri1, null, null);
217bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
218bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
219bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PRIMARY_PHONE_ID, ContentUris.parseId(phoneUri2));
220bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.DISPLAY_NAME, "67890");
221bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
222bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
223bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Remove the remaining phone number
224bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.delete(phoneUri2, null, null);
225bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
226bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
227bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.putNull(People.PRIMARY_PHONE_ID);
228bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.putNull(People.DISPLAY_NAME);
229bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
230bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
231bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
232bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov    public void testEmailCrud() {
233bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
234bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
235bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
236bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
237bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Primary
238bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
239bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.PERSON_ID, personId);
240bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.KIND, Contacts.KIND_EMAIL);
241bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.TYPE, ContactMethods.TYPE_HOME);
242bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.DATA, "foo@acme.com");
243bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.ISPRIMARY, 1);
244bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri emailUri1 = mResolver.insert(ContactMethods.CONTENT_URI, values);
245bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
24661efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov        assertEquals(ContactMethods.CONTENT_EMAIL_ITEM_TYPE, mResolver.getType(emailUri1));
24761efab87c2c8166b3cd69ed1a908d1c0d7271d0bDmitri Plotnikov
248bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        assertStoredValues(ContactMethods.CONTENT_URI,
249bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                ContactMethods._ID + "=" + ContentUris.parseId(emailUri1), null, values);
250bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        assertStoredValues(ContactMethods.CONTENT_EMAIL_URI,
251bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov                ContactMethods._ID + "=" + ContentUris.parseId(emailUri1), null, values);
252bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov    }
253bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov
254bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov    public void testPrimaryEmail() {
255bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        ContentValues values = new ContentValues();
256ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        putContactValuesExceptName(values);
257bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
258bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        long personId = ContentUris.parseId(personUri);
259bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov
260bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        // Primary
261bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        values.clear();
262bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        values.put(ContactMethods.PERSON_ID, personId);
263bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        values.put(ContactMethods.KIND, Contacts.KIND_EMAIL);
264bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        values.put(ContactMethods.TYPE, ContactMethods.TYPE_HOME);
265bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        values.put(ContactMethods.DATA, "foo@acme.com");
266bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        values.put(ContactMethods.ISPRIMARY, 1);
267bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov        Uri emailUri1 = mResolver.insert(ContactMethods.CONTENT_URI, values);
268bce6ee29f2d971ceae2bfce85a06bb3ecec6537aDmitri Plotnikov
269bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Non-primary
270bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
271bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.PERSON_ID, personId);
272bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.KIND, Contacts.KIND_EMAIL);
273bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.TYPE, ContactMethods.TYPE_WORK);
274bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.DATA, "bar@acme.com");
275bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri emailUri2 = mResolver.insert(ContactMethods.CONTENT_URI, values);
276bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
277bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
278bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PRIMARY_EMAIL_ID, ContentUris.parseId(emailUri1));
279bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.DISPLAY_NAME, "foo@acme.com");
280bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
281bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
282ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        values.clear();
283ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        putContactValuesExceptName(values);
284ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        values.put(People.PRIMARY_EMAIL_ID, ContentUris.parseId(emailUri1));
285ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        assertStoredValues(emailUri2, values);
286ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov
287bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Remove the primary email
288bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.delete(emailUri1, null, null);
289bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
290bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
291bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PRIMARY_EMAIL_ID, ContentUris.parseId(emailUri2));
292bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.DISPLAY_NAME, "bar@acme.com");
293bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
294bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
295bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Remove the remaining email
296bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.delete(emailUri2, null, null);
297bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
298bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
299bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.putNull(People.PRIMARY_EMAIL_ID);
300bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.putNull(People.DISPLAY_NAME);
301bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
302bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
303bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
304bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    public void testMarkAsContacted() {
305bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
306bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
307bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
308bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
309bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        int timesContactedBefore =
310bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                Integer.parseInt(getStoredValue(personUri, People.TIMES_CONTACTED));
311bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long timeBefore = System.currentTimeMillis();
312bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        People.markAsContacted(mResolver, personId);
313bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long timeAfter = System.currentTimeMillis();
314bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
315bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long lastContacted = Long.parseLong(getStoredValue(personUri, People.LAST_TIME_CONTACTED));
316bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        int timesContactedAfter =
317bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            Integer.parseInt(getStoredValue(personUri, People.TIMES_CONTACTED));
318bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
319bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertTrue(lastContacted >= timeBefore);
320bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertTrue(lastContacted <= timeAfter);
321bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertEquals(timesContactedAfter, timesContactedBefore + 1);
322bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
323bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
3243cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    public void testOrganizationsInsert() {
325bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
326bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
327bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
328bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
329bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
330bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.COMPANY, "Sierra");
331bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.PERSON_ID, personId);
332bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.TYPE, Organizations.TYPE_CUSTOM);
333bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.LABEL, "Club");
334bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.TITLE, "Member");
335bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.ISPRIMARY, 1);
336bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
337bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri uri = mResolver.insert(Organizations.CONTENT_URI, values);
338bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(uri, values);
339d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        assertSelection(Organizations.CONTENT_URI, values,
3405dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov                "organizations", Organizations._ID, ContentUris.parseId(uri));
341bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
342bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertPersonIdConstraint(Organizations.CONTENT_URI, Organizations.TYPE,
343bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                Organizations.TYPE_WORK);
344bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
345bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertTypeAndLabelConstraints(Organizations.CONTENT_URI, Organizations.PERSON_ID, personId,
346bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                Organizations.TYPE, Organizations.TYPE_CUSTOM, Organizations.TYPE_OTHER,
347bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                Organizations.LABEL);
348e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov
349e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov
350e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov        Uri twigUri = Uri.withAppendedPath(personUri, Organizations.CONTENT_DIRECTORY);
351e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov        assertStoredValues(twigUri, values);
352e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov
353e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov        Uri twigUriWithId = ContentUris.withAppendedId(twigUri, ContentUris.parseId(uri));
354e06751fce696a31fcba173821dbe78b08bae20beDmitri Plotnikov        assertStoredValues(twigUriWithId, values);
355bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
356bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
357044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    public void testOrganizationsUpdate() {
358044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        ContentValues values = new ContentValues();
359044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
360044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
361044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
362044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.clear();
363044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Organizations.COMPANY, "Sierra");
364044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Organizations.PERSON_ID, personId);
365044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Organizations.TYPE, Organizations.TYPE_CUSTOM);
366044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Organizations.LABEL, "Club");
367044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Organizations.TITLE, "Member");
368044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Organizations.ISPRIMARY, 0);
369044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
370044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        Uri uri = mResolver.insert(Organizations.CONTENT_URI, values);
371044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
372044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.clear();
373044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Organizations.COMPANY, "Planetary");
374044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Organizations.PERSON_ID, personId);
375044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Organizations.TYPE, Organizations.TYPE_CUSTOM);
376044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Organizations.LABEL, "Society");
377044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Organizations.TITLE, "Chair");
378044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Organizations.ISPRIMARY, 1);
379044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
380044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mResolver.update(uri, values, null, null);
381044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
382044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        assertStoredValues(uri, values);
383044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
384044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
385e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    public void testPhonesInsert() {
386bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
387bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
388bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
389bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
390bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
391bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
392bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.PERSON_ID, personId);
393bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.TYPE, Phones.TYPE_CUSTOM);
394bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.LABEL, "Directory");
395bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.NUMBER, "1-800-4664-411");
396bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.ISPRIMARY, 1);
397bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
398bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri uri = mResolver.insert(Phones.CONTENT_URI, values);
39942c817741879588db9014739f4dc194621e97381Dmitri Plotnikov        ContentValues expectedResults[] = new ContentValues[1];
400bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Adding another value to assert
401892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov        expectedResults[0] = new ContentValues(values);
40242c817741879588db9014739f4dc194621e97381Dmitri Plotnikov        expectedResults[0].put(Phones.NUMBER_KEY, "11446640081");
40342c817741879588db9014739f4dc194621e97381Dmitri Plotnikov
404bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // The result is joined with People
405892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov        putContactValues(expectedResults[0]);
406892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov        assertStoredValues(uri, expectedResults);
4075dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov        assertSelection(Phones.CONTENT_URI, values, "phones",
408d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Phones._ID, ContentUris.parseId(uri));
409bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
410bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Access the phone through People
411bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri twigUri = Uri.withAppendedPath(personUri, People.Phones.CONTENT_DIRECTORY);
412892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov        assertStoredValues(twigUri, expectedResults);
413bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
414bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Now the person should be joined with Phone
415bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
416bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
417bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.TYPE, Phones.TYPE_CUSTOM);
418bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.LABEL, "Directory");
419bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NUMBER, "1-800-4664-411");
420bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
421bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
422bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertPersonIdConstraint(Phones.CONTENT_URI, Phones.TYPE, Phones.TYPE_WORK);
423bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
424bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertTypeAndLabelConstraints(Phones.CONTENT_URI, Phones.PERSON_ID, personId, Phones.TYPE,
425bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                Phones.TYPE_CUSTOM, Phones.TYPE_OTHER, Phones.LABEL);
426bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
427bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
428044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    public void testPhonesUpdate() {
429044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        ContentValues values = new ContentValues();
430044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
431044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
432044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
433044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.clear();
434044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Phones.PERSON_ID, personId);
435044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Phones.TYPE, Phones.TYPE_CUSTOM);
436044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Phones.LABEL, "Directory");
437044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Phones.NUMBER, "1-800-4664-411");
438044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Phones.ISPRIMARY, 0);
439044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
440044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        Uri uri = mResolver.insert(Phones.CONTENT_URI, values);
441044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
442044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.clear();
443044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Phones.PERSON_ID, personId);
444044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Phones.TYPE, Phones.TYPE_FAX_HOME);
445044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.putNull(Phones.LABEL);
446044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Phones.NUMBER, "1-800-555-4663");
447044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Phones.ISPRIMARY, 1);
448044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
449044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mResolver.update(uri, values, null, null);
450044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
45142c817741879588db9014739f4dc194621e97381Dmitri Plotnikov        ContentValues[] expectedValues = new ContentValues[1];
452892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov        expectedValues[0] = values;
45342c817741879588db9014739f4dc194621e97381Dmitri Plotnikov        expectedValues[0].put(Phones.NUMBER_KEY, "36645550081");
454892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov        assertStoredValues(uri, expectedValues);
455044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
456044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
457fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov    public void testPhonesFilterQuery() {
458fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        ContentValues values = new ContentValues();
459fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        putContactValues(values);
460fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
461fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
462fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov
463fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        values.clear();
464fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        values.put(Phones.PERSON_ID, personId);
465fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        values.put(Phones.TYPE, Phones.TYPE_CUSTOM);
466fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        values.put(Phones.LABEL, "Directory");
467892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov        values.put(Phones.NUMBER, "800-4664-411");
468fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        values.put(Phones.ISPRIMARY, 1);
469fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov
470fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        Uri uri = mResolver.insert(Phones.CONTENT_URI, values);
471fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov
472892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov        Uri filterUri1 = Uri.withAppendedPath(Phones.CONTENT_FILTER_URL, "18004664411");
47342c817741879588db9014739f4dc194621e97381Dmitri Plotnikov        ContentValues[] expectedValues = new ContentValues[1];
474892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov        expectedValues[0] = values;
47542c817741879588db9014739f4dc194621e97381Dmitri Plotnikov        expectedValues[0].put(Phones.NUMBER_KEY, "1144664008");
476892a3d9ded5c64a63ae3d5d5c52c59528b466c93Dmitri Plotnikov        assertStoredValues(filterUri1, expectedValues);
477fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov
478fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        Uri filterUri2 = Uri.withAppendedPath(Phones.CONTENT_FILTER_URL, "7773334444");
479fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov        assertEquals(0, getCount(filterUri2, null, null));
480fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov    }
481fb362d1a5df250a49fad06db323b0d41fe0e3757Dmitri Plotnikov
482e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    public void testEmailInsert() {
483044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        assertContactMethodInsert(Contacts.KIND_EMAIL,
484044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                ContactMethods.TYPE_CUSTOM, "Some other way", "foo@acme.com", null, true);
485044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
486044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
487044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    public void testEmailUpdate() {
488044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        assertContactMethodUpdate(Contacts.KIND_EMAIL,
489044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                ContactMethods.TYPE_CUSTOM, "Some other way", "foo@acme.com", null, false,
490044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                ContactMethods.TYPE_HOME, null, "bar@acme.com", "aux", true);
491e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
492e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
4930126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov    public void testImInsertStandard() {
494044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        assertContactMethodInsert(Contacts.KIND_IM,
495044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                ContactMethods.TYPE_CUSTOM, "Some other way", "pre:3", "Bar", true);
496044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
497044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
498044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    public void testImUpdateStandard() {
499044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        assertContactMethodUpdate(Contacts.KIND_IM,
500044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                ContactMethods.TYPE_CUSTOM, "Some other way", "pre:3", "Bar", false,
501044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                ContactMethods.TYPE_WORK, null, "pre:4", "Buz", true);
5020126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov    }
5030126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov
5040126458fabecb6514bf6d368ae6a066a78856a91Dmitri Plotnikov    public void testImInsertCustom() {
505044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        assertContactMethodInsert(Contacts.KIND_IM,
506044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                ContactMethods.TYPE_CUSTOM, "Some other way", "custom:my_proto", "Bar", true);
507044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
508044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
509044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    public void testImUpdateCustom() {
510044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        assertContactMethodUpdate(Contacts.KIND_IM,
511044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                ContactMethods.TYPE_CUSTOM, "Some other way", "custom:my_proto", "Bar", false,
512044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                ContactMethods.TYPE_HOME, null, "custom:my_other_proto", "Buz", true);
513e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
514e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
515e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    public void testPostalInsert() {
516044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        assertContactMethodInsert(Contacts.KIND_POSTAL,
517044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                ContactMethods.TYPE_CUSTOM, "Some other way", "Foo", "Bar", true);
518044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
519044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
520044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    public void testPostalUpdate() {
521044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        assertContactMethodUpdate(Contacts.KIND_POSTAL,
522044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                ContactMethods.TYPE_CUSTOM, "Some other way", "Foo", "Bar", false,
523044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov                ContactMethods.TYPE_WORK, null, "Biz", "Baz", true);
524e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
525e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
526e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private void assertContactMethodInsert(int kind, int type, String label, String data,
527e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            String auxData, boolean primary) {
528bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
529bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
530bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        final Uri personUri = mResolver.insert(People.CONTENT_URI, values);
531bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
532bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
533bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
534bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.PERSON_ID, personId);
535e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        values.put(ContactMethods.KIND, kind);
536e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        values.put(ContactMethods.TYPE, type);
537e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        values.put(ContactMethods.LABEL, label);
538e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        values.put(ContactMethods.DATA, data);
539e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        values.put(ContactMethods.AUX_DATA, auxData);
540e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        values.put(ContactMethods.ISPRIMARY, primary ? 1 : 0);
541bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
542bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri uri = mResolver.insert(ContactMethods.CONTENT_URI, values);
543bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
544bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // The result is joined with People
545bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
546bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(uri, values);
5475dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov        assertSelection(ContactMethods.CONTENT_URI, values, "contact_methods",
548d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                ContactMethods._ID, ContentUris.parseId(uri));
549bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
550e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        // Access the contact method through People
551bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri twigUri = Uri.withAppendedPath(personUri, People.ContactMethods.CONTENT_DIRECTORY);
552bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(twigUri, values);
553bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
554bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertPersonIdConstraint(ContactMethods.CONTENT_URI, ContactMethods.TYPE,
555bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                ContactMethods.TYPE_WORK);
556bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
557bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertTypeAndLabelConstraints(ContactMethods.CONTENT_URI, ContactMethods.PERSON_ID,
558bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                personId, ContactMethods.TYPE, ContactMethods.TYPE_CUSTOM,
559bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                ContactMethods.TYPE_OTHER, ContactMethods.LABEL);
560bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
561bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
562044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    private void assertContactMethodUpdate(int kind,
563044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            int type1, String label1, String data1, String auxData1, boolean primary1,
564044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov            int type2, String label2, String data2, String auxData2, boolean primary2) {
565044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        ContentValues values = new ContentValues();
566044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        putContactValues(values);
567044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        final Uri personUri = mResolver.insert(People.CONTENT_URI, values);
568044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
569044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
570044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.clear();
571044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(ContactMethods.PERSON_ID, personId);
572044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(ContactMethods.KIND, kind);
573044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(ContactMethods.TYPE, type1);
574044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(ContactMethods.LABEL, label1);
575044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(ContactMethods.DATA, data1);
576044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(ContactMethods.AUX_DATA, auxData1);
577044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(ContactMethods.ISPRIMARY, primary1 ? 1 : 0);
578044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
579044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        Uri uri = mResolver.insert(ContactMethods.CONTENT_URI, values);
580044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
581044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.clear();
582044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(ContactMethods.TYPE, type2);
583044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(ContactMethods.LABEL, label2);
584044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(ContactMethods.DATA, data2);
585044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(ContactMethods.AUX_DATA, auxData2);
586044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(ContactMethods.ISPRIMARY, primary2 ? 1 : 0);
587044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mResolver.update(uri, values, null, null);
588044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
589044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        assertStoredValues(uri, values);
590044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
591044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
5920f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    public void testExtensionsInsert() {
593bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
594bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        final Uri personUri = mResolver.insert(People.CONTENT_URI, values);
595bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
596bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
597bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
598bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Extensions.PERSON_ID, personId);
599bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Extensions.NAME, "Foo");
600bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Extensions.VALUE, "Bar");
601bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
602bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri uri = mResolver.insert(Extensions.CONTENT_URI, values);
603bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(uri, values);
6045dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov        assertSelection(Extensions.CONTENT_URI, values, "extensions",
605d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Extensions._ID, ContentUris.parseId(uri));
606bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
607bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Access the extensions through People
608bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri twigUri = Uri.withAppendedPath(personUri, People.Extensions.CONTENT_DIRECTORY);
609bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(twigUri, values);
610bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
611bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
612044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    public void testExtensionsUpdate() {
613044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        ContentValues values = new ContentValues();
614044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        final Uri personUri = mResolver.insert(People.CONTENT_URI, values);
615044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
616044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
617044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.clear();
618044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Extensions.PERSON_ID, personId);
619044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Extensions.NAME, "Foo");
620044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Extensions.VALUE, "Bar");
621044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
622044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        Uri uri = mResolver.insert(Extensions.CONTENT_URI, values);
623044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
624044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.clear();
625044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Extensions.NAME, "Biz");
626044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Extensions.VALUE, "Baz");
627044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mResolver.update(uri, values, null, null);
628044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
629044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        assertStoredValues(uri, values);
630044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
631044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
6320f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    public void testGroupsInsert() {
633bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
634bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Groups.NAME, "Galois");
635bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Groups.NOTES, "Abel");
6360f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        values.put(Groups.SYSTEM_ID, "12345");
637bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
638bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri groupUri = mResolver.insert(Groups.CONTENT_URI, values);
639bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(groupUri, values);
640bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
641bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
642044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    public void testGroupsUpdate() {
643044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        ContentValues values = new ContentValues();
644044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Groups.NAME, "Galois");
645044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Groups.NOTES, "Abel");
646044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Groups.SYSTEM_ID, "12345");
647044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
648044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        Uri groupUri = mResolver.insert(Groups.CONTENT_URI, values);
649044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
650044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.clear();
651044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Groups.NAME, "Klein");
652044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Groups.NOTES, "Vierergruppe");
653044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Groups.SYSTEM_ID, "1234");
654044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mResolver.update(groupUri, values, null, null);
655044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        assertStoredValues(groupUri, values);
656044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov    }
657044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
6580f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    public void testGroupMembershipsInsert() {
659bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
660bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Groups.NOTES, "Abel");
66171e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        Uri groupUri = insertLegacyGroup("Galois", values);
66271e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        Uri personUri = insertPerson("Klein", values);
66371e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        Uri membershipUri = insertLegacyGroupMembership(groupUri, personUri, values);
664d4b57da3f07bc530db69015d363c61a768a4713aDmitri Plotnikov        values.put(Groups.NAME, "Galois");
665d4b57da3f07bc530db69015d363c61a768a4713aDmitri Plotnikov        values.put(Groups.NOTES, "Abel");
666d4b57da3f07bc530db69015d363c61a768a4713aDmitri Plotnikov
667d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        assertStoredValues(membershipUri, values);
6685dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov        assertSelection(GroupMembership.CONTENT_URI, values, "groupmembership",
669d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                GroupMembership._ID, ContentUris.parseId(membershipUri));
670bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
671bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personsGroupsUri = Uri.withAppendedPath(personUri, GroupMembership.CONTENT_DIRECTORY);
672d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        assertStoredValues(personsGroupsUri, values);
673bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
674bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
675d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov    public void testAddToGroup() {
676bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
677bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
678bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
679bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
680bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
681bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Groups.NAME, "Galois");
682bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri groupUri = mResolver.insert(Groups.CONTENT_URI, values);
683bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
684bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        People.addToGroup(mResolver, personId, "Galois");
685bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
686bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
687bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(GroupMembership.GROUP_ID, ContentUris.parseId(groupUri));
688bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(GroupMembership.PERSON_ID, personId);
689bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
690bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personsGroupsUri = Uri.withAppendedPath(personUri, GroupMembership.CONTENT_DIRECTORY);
691bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personsGroupsUri, values);
692bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
693bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
69471e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov    public void testGroupMembersByGroupName() {
69571e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        ContentValues values = new ContentValues();
69671e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        Uri groupUri1 = insertLegacyGroup("Galois", values);
69771e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        Uri personUri1 = insertPerson("Klein", values);
69871e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        insertLegacyGroupMembership(groupUri1, personUri1, values);
69971e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov
70071e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        Uri groupUri2 = insertLegacyGroup("Euler", values);
70171e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        Uri personUri2 = insertPerson("Lagrange", values);
70271e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        insertLegacyGroupMembership(groupUri2, personUri2, values);
70371e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov
70471e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        // NOTE: testing non-public API support
70571e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        assertStoredValue(Uri.parse("content://contacts/groups/name/Galois/members"),
70671e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                People.NAME, "Klein");
70771e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        assertStoredValue(Uri.parse("content://contacts/groups/name/Euler/members"),
70871e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov                People.NAME, "Lagrange");
70971e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov    }
71071e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov
711c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    public void testPhotoUpdate() throws Exception {
712f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro        byte[] photo = loadPhotoFromResource(
713f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro                com.android.providers.contacts.tests.R.drawable.earth_small, PhotoSize.ORIGINAL);
714f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro        byte[] thumbnailedPhoto = loadPhotoFromResource(
715f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro                com.android.providers.contacts.tests.R.drawable.earth_small, PhotoSize.THUMBNAIL);
716bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
717bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
718bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
719bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
720bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
721bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Photos.DATA, photo);
722c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        values.put(Photos.LOCAL_VERSION, "10");
723c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        // FIXME this column was unavailable for update in legacy ContactsProvider
724c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        // values.put(Photos.DOWNLOAD_REQUIRED, 1);
725c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        values.put(Photos.EXISTS_ON_SERVER, 1);
726c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        values.put(Photos.SYNC_ERROR, "404 does not exist");
727bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
728bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri photoUri = Uri.withAppendedPath(personUri, Photos.CONTENT_DIRECTORY);
729bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.update(photoUri, values, null, null);
730f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro        values.put(Photos.DATA, thumbnailedPhoto);
731bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(photoUri, values);
732044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
733044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        long photoId = Long.parseLong(getStoredValue(photoUri, Photos._ID));
734044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov
735044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        values.put(Photos.LOCAL_VERSION, "11");
736f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro        values.put(Photos.DATA, photo);
737044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        Uri contentUri = ContentUris.withAppendedId(Photos.CONTENT_URI, photoId);
738044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        mResolver.update(contentUri, values, null, null);
739f547fd54d7933e1c03af4a8dc10560c71c38f6b8Dave Santoro        values.put(Photos.DATA, thumbnailedPhoto);
740044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        assertStoredValues(contentUri, values);
741044685c79fb8fb6e15479d0e68d60f8630f6be43Dmitri Plotnikov        assertStoredValues(photoUri, values);
742bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
743bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
744c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    /**
745c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov     * Capturing the search suggestion requirements in test cases as a reference.
746c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov     */
747c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    public void testSearchSuggestionsNotInMyContacts() throws Exception {
748c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        // We don't provide compatibility for search suggestions
749038a60f1920d798bc391a376e81980921a75cc34Fred Quintana        return;
750c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    }
751c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
752c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    /**
753c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov     * Capturing the search suggestion requirements in test cases as a reference.
754c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov     */
755c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    public void testSearchSuggestionsByName() throws Exception {
756c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
757c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        // We don't provide compatibility for search suggestions
758038a60f1920d798bc391a376e81980921a75cc34Fred Quintana        return;
759c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    }
760c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
761c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    private void assertSearchSuggestion(boolean name, boolean photo, boolean organization,
762c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            boolean phone, boolean email, String query, boolean expectIcon1Uri, String expectedIcon2,
763c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            String expectedText1, String expectedText2) throws IOException {
764c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        ContentValues values = new ContentValues();
765c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
766c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        if (name) {
767c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(People.NAME, "Deer Dough");
768c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        }
769c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
770c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        final Uri personUri = mResolver.insert(People.CONTENT_URI, values);
771c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        long personId = ContentUris.parseId(personUri);
772c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
773c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        People.addToMyContactsGroup(mResolver, personId);
774c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
775c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        if (photo) {
776c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.clear();
777c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            byte[] photoData = loadTestPhoto();
778c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Photos.DATA, photoData);
779c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Photos.LOCAL_VERSION, "1");
780c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Photos.EXISTS_ON_SERVER, 0);
781c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            Uri photoUri = Uri.withAppendedPath(personUri, Photos.CONTENT_DIRECTORY);
782c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            mResolver.update(photoUri, values, null, null);
783c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        }
784c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
785c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        if (organization) {
786c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.clear();
787c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Organizations.ISPRIMARY, 1);
788c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Organizations.COMPANY, "Google");
789c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Organizations.TYPE, Organizations.TYPE_WORK);
790c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Organizations.PERSON_ID, personId);
791c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            mResolver.insert(Organizations.CONTENT_URI, values);
792c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        }
793c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
794c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        if (email) {
795c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.clear();
796c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(ContactMethods.PERSON_ID, personId);
797c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(ContactMethods.KIND, Contacts.KIND_EMAIL);
798c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(ContactMethods.TYPE, ContactMethods.TYPE_HOME);
799c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(ContactMethods.DATA, "foo@acme.com");
800c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(ContactMethods.ISPRIMARY, 1);
801c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            mResolver.insert(ContactMethods.CONTENT_URI, values);
802c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
803c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
804c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            String protocol = ContactMethods
805c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov                    .encodePredefinedImProtocol(ContactMethods.PROTOCOL_GOOGLE_TALK);
806c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.clear();
807c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Presence.IM_PROTOCOL, protocol);
808c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Presence.IM_HANDLE, "foo@acme.com");
809c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Presence.IM_ACCOUNT, "foo");
810c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Presence.PRESENCE_STATUS, Presence.OFFLINE);
811c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Presence.PRESENCE_CUSTOM_STATUS, "Coding for Android");
812c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            mResolver.insert(Presence.CONTENT_URI, values);
813c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        }
814c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
815c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        if (phone) {
816c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.clear();
817c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Phones.PERSON_ID, personId);
818c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Phones.TYPE, Phones.TYPE_HOME);
819c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Phones.NUMBER, "1-800-4664-411");
820c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            values.put(Phones.ISPRIMARY, 1);
821c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            mResolver.insert(Phones.CONTENT_URI, values);
822c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        }
823c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
824c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        Uri searchUri = new Uri.Builder().scheme("content").authority(Contacts.AUTHORITY)
825c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov                .appendPath(SearchManager.SUGGEST_URI_PATH_QUERY).appendPath(query).build();
826c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
827c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        Cursor c = mResolver.query(searchUri, null, null, null, null);
828c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        assertEquals(1, c.getCount());
829c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        c.moveToFirst();
830c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        values.clear();
831c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
832c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        String icon1 = c.getString(c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_1));
833c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        if (expectIcon1Uri) {
834c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            assertTrue(icon1.startsWith("content:"));
835c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        } else {
836c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov            assertEquals(String.valueOf(com.android.internal.R.drawable.ic_contact_picture), icon1);
837c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        }
838c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
839c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        // SearchManager does not declare a constant for _id
840c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        values.put("_id", personId);
841c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        values.put(SearchManager.SUGGEST_COLUMN_ICON_2, expectedIcon2);
842c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        values.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID, personId);
843c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        values.put(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, personId);
844c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        values.put(SearchManager.SUGGEST_COLUMN_TEXT_1, expectedText1);
845c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        values.put(SearchManager.SUGGEST_COLUMN_TEXT_2, expectedText2);
846c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        assertCursorValues(c, values);
847c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        c.close();
848c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
849c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        // Cleanup
850c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        mResolver.delete(personUri, null, null);
851c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    }
852c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
853c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    /**
854c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov     * Capturing the search suggestion requirements in test cases as a reference.
855c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov     */
856c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    public void testSearchSuggestionsByPhoneNumber() throws Exception {
857c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov        // We don't provide compatibility for search suggestions
858038a60f1920d798bc391a376e81980921a75cc34Fred Quintana        return;
859c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    }
860c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov
8611c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov    public void testSettings() throws Exception {
8621c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        mActor.addAuthority(ContactsContract.AUTHORITY);
8631c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov
8641c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        ContentValues values = new ContentValues();
8651c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        values.put(Settings._SYNC_ACCOUNT, "foo");
8661c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        values.put(Settings._SYNC_ACCOUNT_TYPE, "bar");
8671c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        values.put(Settings.KEY, Settings.SYNC_EVERYTHING);
8681c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        values.put(Settings.VALUE, 7);
8691c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        mResolver.update(Settings.CONTENT_URI, values, null, null);
8701c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov
8711c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        assertStoredValue(Settings.CONTENT_URI, Settings._SYNC_ACCOUNT + "='foo' AND "
8721c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                + Settings.KEY + "='" + Settings.SYNC_EVERYTHING + "'", null, Settings.VALUE, "7");
8731c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov
8741c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        assertStoredValue(ContactsContract.Settings.CONTENT_URI,
8751c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                ContactsContract.Settings.ACCOUNT_NAME + "='foo'",
8761c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                null, ContactsContract.Settings.SHOULD_SYNC, "7");
8771c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov
8781c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        values.clear();
8791c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        values.put(ContactsContract.Settings.SHOULD_SYNC, 8);
8801c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        mResolver.update(ContactsContract.Settings.CONTENT_URI, values,
8811c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                ContactsContract.Settings.ACCOUNT_NAME + "='foo'", null);
8821c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov
8831c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov        assertStoredValue(Settings.CONTENT_URI, Settings._SYNC_ACCOUNT + "='foo' AND "
8841c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov                + Settings.KEY + "='" + Settings.SYNC_EVERYTHING + "'", null, Settings.VALUE, "8");
8851c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov    }
8861c8e40c18f92722b9bec6e8ce2e345a9828efa16Dmitri Plotnikov
88771e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov    private Uri insertPerson(String name, ContentValues values) {
88871e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        values.put(People.NAME, name);
88971e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        return mResolver.insert(People.CONTENT_URI, values);
89071e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov    }
89171e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov
89271e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov    private Uri insertLegacyGroup(String name, ContentValues values) {
89371e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        values.put(Groups.NAME, name);
89471e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        return mResolver.insert(Groups.CONTENT_URI, values);
89571e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov    }
89671e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov
89771e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov    private Uri insertLegacyGroupMembership(Uri groupUri, Uri personUri, ContentValues values) {
89871e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        long groupId = ContentUris.parseId(groupUri);
89971e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
90071e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov
90171e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        values.clear();
90271e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        values.put(GroupMembership.GROUP_ID, groupId);
90371e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        values.put(GroupMembership.PERSON_ID, personId);
90471e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        Uri membershipUri = mResolver.insert(GroupMembership.CONTENT_URI, values);
90571e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov        return membershipUri;
90671e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov    }
90771e051c79a57af70ec7b095074c3e7faf9507b52Dmitri Plotnikov
908bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    private void putContactValues(ContentValues values) {
909ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        putContactValuesExceptName(values);
910bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NAME, "Deer Dough");
911ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov    }
912ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov
913ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov    private void putContactValuesExceptName(ContentValues values) {
914ee56e80dcab0ca58f81dc5318db8d0c453d75903Dmitri Plotnikov        // Populating only unhidden columns
915bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PHONETIC_NAME, "Dear Doe");
916bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NOTES, "Cash Cow");
917bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.TIMES_CONTACTED, 3);
918bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.LAST_TIME_CONTACTED, 10);
919bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.CUSTOM_RINGTONE, "ringtone");
920bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.SEND_TO_VOICEMAIL, 1);
921bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.STARRED, 1);
922bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
923bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
92467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    private void putContactValues2(ContentValues values) {
92567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        // Populating only unhidden columns
92667b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        values.put(People.NAME, "John Doe");
92767b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        values.put(People.PHONETIC_NAME, "jon dawe");
92867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        values.put(People.NOTES, "Poor Johnny");
92967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        values.put(People.TIMES_CONTACTED, 4);
93067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        values.put(People.LAST_TIME_CONTACTED, 11);
93167b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        values.put(People.CUSTOM_RINGTONE, "rangtone");
93267b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        values.put(People.SEND_TO_VOICEMAIL, 0);
93367b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        values.put(People.STARRED, 0);
93467b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov    }
93567b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov
936bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    private void assertFilteredContacts(String filter, String... expectedNames) {
937bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri filterUri = Uri.withAppendedPath(People.CONTENT_FILTER_URI, filter);
938bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Cursor c = mResolver.query(filterUri, null, null, null, null);
939bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        try {
940bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            assertEquals("Record count", expectedNames.length, c.getCount());
941bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            int column = c.getColumnIndex(People.NAME);
942bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            for (int i = 0; i < expectedNames.length; i++) {
943bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                c.moveToNext();
944bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                assertEquals(expectedNames[i], c.getString(column));
945bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            }
946bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        } finally {
947bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            c.close();
948bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        }
949bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
950bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
951bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    private void assertPersonIdConstraint(Uri uri, String typeColumn, int defaultType) {
952bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
953bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(typeColumn, defaultType);
954bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        try {
955bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            mResolver.insert(uri, values);
956bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            fail("Inserted row without person ID");
957bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        } catch (Exception e) {
958bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            // Exception expected
959bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        }
960bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
961bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
962bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    private void assertTypeAndLabelConstraints(Uri uri, String personIdColumn, long personId,
963bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            String typeColumn, int defaultType, int otherType, String labelColumn) {
964bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
965bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(personIdColumn, personId);
966bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(labelColumn, "Foo");
967622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkey
968bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        try {
969bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            mResolver.insert(uri, values);
970622e0a2f00b3de248926ec9e89b11a6425919819Jeff Sharkey            fail("Inserted row with label without defining type");
971bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        } catch (Exception e) {
972bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            // Exception expected
973bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        }
974bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
975bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
9765dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov    protected void assertSelection(Uri uri, ContentValues values, String legacyTable,
9775dec8cf5a992bac38c0e81d744fc77d748e926aaDmitri Plotnikov            String idColumn, long id) {
97867b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        values.put(idColumn, id);
97967b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        String qualified = legacyTable + "." + idColumn;
98067b73a3e6bc186aa83915275bde6eeeeea5e97cfDmitri Plotnikov        super.assertSelection(uri, values, qualified, id);
981c70dc0e38ff82c6e6d6b7458637c54fbdf446aacDmitri Plotnikov    }
982bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov}
983