LegacyContactsProviderTest.java revision 445ca81effbb0d61c7bc0033acf2d3dfd228fd4e
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
19bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.content.ContentProvider;
20bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.content.ContentUris;
21bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.content.ContentValues;
22bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.content.res.Resources;
23bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.database.Cursor;
24bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.net.Uri;
25bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts;
26bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.ContactMethods;
27bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.Extensions;
28bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.GroupMembership;
29bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.Groups;
30bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.Organizations;
31bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.People;
32bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.Phones;
33bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.Photos;
34bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.Presence;
35bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.test.suitebuilder.annotation.LargeTest;
36bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
37bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport java.io.ByteArrayOutputStream;
38bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport java.io.IOException;
39bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport java.io.InputStream;
40bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
41bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov/**
42bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov * Tests for legacy contacts APIs.
43bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov */
44bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov@LargeTest
45bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovpublic class LegacyContactsProviderTest extends BaseContactsProvider2Test {
46bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
47f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final boolean USE_LEGACY_PROVIDER = false;
48f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
49bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    @Override
50bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    protected Class<? extends ContentProvider> getProviderClass() {
51f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov       return USE_LEGACY_PROVIDER ? ContactsProvider.class : SynchronousContactsProvider2.class;
52bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
53bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
54bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    @Override
55bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    protected String getAuthority() {
56bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        return Contacts.AUTHORITY;
57bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
58bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
59bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    public void testPeopleInsert() {
60bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
61bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
62bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
63bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri uri = mResolver.insert(People.CONTENT_URI, values);
64bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(uri, values);
65d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        assertSelection(People.CONTENT_URI, values, People._ID, ContentUris.parseId(uri));
66bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
67bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
68f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    // TODO fix and reenable the test
69f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public void __testPeopleDelete() {
70bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
71bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NAME, "John Doe");
72bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personId = mResolver.insert(People.CONTENT_URI, values);
73bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.delete(personId, null, null);
74bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
75bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Cursor c = mResolver.query(personId, null, People.NAME + "='John Doe'" , null, null);
76bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertEquals("Record count after deletion", 0, c.getCount());
77bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        c.close();
78bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
79bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        try {
80bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            mResolver.query(People.DELETED_CONTENT_URI, null, null, null, null);
81bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        } catch (UnsupportedOperationException e) {
82bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            // Expected exception
83bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        }
84bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
85bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
86445ca81effbb0d61c7bc0033acf2d3dfd228fd4eDmitri Plotnikov    public void testPeopleFilter() {
87bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
88bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NAME, "Deer Doe");
89bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.insert(People.CONTENT_URI, values);
90bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
91bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
92bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NAME, "Dear Dough");
93bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.insert(People.CONTENT_URI, values);
94bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
95bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
96bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NAME, "D.R. Dauwe");
97bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.insert(People.CONTENT_URI, values);
98bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
99bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertFilteredContacts("d", "Deer Doe", "Dear Dough", "D.R. Dauwe");
100bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertFilteredContacts("de", "Deer Doe", "Dear Dough");
101bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertFilteredContacts("dee", "Deer Doe");
102bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertFilteredContacts("der");
103bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
104bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
1050f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    public void testDefaultDisplayName() {
106bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
107bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NAME, "John Doe");
108bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
109bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, People.DISPLAY_NAME, "John Doe");
110bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
111bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
1123cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    public void testPrimaryOrganization() {
113bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
114bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        final Uri personUri = mResolver.insert(People.CONTENT_URI, values);
115bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
116bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
117bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Primary
118bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
119bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.ISPRIMARY, 1);
120bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.COMPANY, "Google");
121bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.TYPE, Organizations.TYPE_WORK);
122bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.PERSON_ID, personId);
123bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri orgUri1 = mResolver.insert(Organizations.CONTENT_URI, values);
124bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
125bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Non-primary
126bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
127bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.COMPANY, "Acme");
128bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.TYPE, Organizations.TYPE_WORK);
129bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.PERSON_ID, personId);
130bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri orgUri2 = mResolver.insert(Organizations.CONTENT_URI, values);
131bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
132bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
133bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PRIMARY_ORGANIZATION_ID, ContentUris.parseId(orgUri1));
134bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.DISPLAY_NAME, "Google");
135bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
136bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
137bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Remove the original primary organization
138bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.delete(orgUri1, null, null);
139bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
140bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
141bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PRIMARY_ORGANIZATION_ID, ContentUris.parseId(orgUri2));
142bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.DISPLAY_NAME, "Acme");
143bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
144bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
145bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Remove the remaining organization
146bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.delete(orgUri2, null, null);
147bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
148bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
149bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.putNull(People.PRIMARY_ORGANIZATION_ID);
150bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.putNull(People.DISPLAY_NAME);
151bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
152bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
153bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
154e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    public void testPrimaryPhone() {
155bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
156bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
157bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
158bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
159bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Primary
160bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
161bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.ISPRIMARY, 1);
162bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.TYPE, Phones.TYPE_WORK);
163bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.PERSON_ID, personId);
164bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.NUMBER, "12345");
165bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri phoneUri1 = mResolver.insert(Phones.CONTENT_URI, values);
166bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
167bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Non-primary
168bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
169bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.TYPE, Phones.TYPE_WORK);
170bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.PERSON_ID, personId);
171bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.NUMBER, "67890");
172bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri phoneUri2 = mResolver.insert(Phones.CONTENT_URI, values);
173bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
174bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
175bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PRIMARY_PHONE_ID, ContentUris.parseId(phoneUri1));
176bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.DISPLAY_NAME, "12345");
177bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
178bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
179bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Remove the primary phone number
180bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.delete(phoneUri1, null, null);
181bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
182bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
183bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PRIMARY_PHONE_ID, ContentUris.parseId(phoneUri2));
184bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.DISPLAY_NAME, "67890");
185bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
186bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
187bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Remove the remaining phone number
188bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.delete(phoneUri2, null, null);
189bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
190bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
191bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.putNull(People.PRIMARY_PHONE_ID);
192bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.putNull(People.DISPLAY_NAME);
193bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
194bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
195bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
196e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    public void testPrimaryEmail() {
197bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
198bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
199bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
200bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
201bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Primary
202bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
203bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.PERSON_ID, personId);
204bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.KIND, Contacts.KIND_EMAIL);
205bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.TYPE, ContactMethods.TYPE_HOME);
206bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.DATA, "foo@acme.com");
207bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.ISPRIMARY, 1);
208bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri emailUri1 = mResolver.insert(ContactMethods.CONTENT_URI, values);
209bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
210bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Non-primary
211bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
212bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.PERSON_ID, personId);
213bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.KIND, Contacts.KIND_EMAIL);
214bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.TYPE, ContactMethods.TYPE_WORK);
215bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.DATA, "bar@acme.com");
216bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri emailUri2 = mResolver.insert(ContactMethods.CONTENT_URI, values);
217bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
218bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
219bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PRIMARY_EMAIL_ID, ContentUris.parseId(emailUri1));
220bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.DISPLAY_NAME, "foo@acme.com");
221bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
222bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
223bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Remove the primary email
224bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.delete(emailUri1, null, null);
225bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
226bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
227bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PRIMARY_EMAIL_ID, ContentUris.parseId(emailUri2));
228bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.DISPLAY_NAME, "bar@acme.com");
229bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
230bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
231bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Remove the remaining email
232bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.delete(emailUri2, null, null);
233bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
234bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
235bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.putNull(People.PRIMARY_EMAIL_ID);
236bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.putNull(People.DISPLAY_NAME);
237bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
238bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
239bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
240bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    public void testMarkAsContacted() {
241bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
242bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
243bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
244bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
245bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        int timesContactedBefore =
246bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                Integer.parseInt(getStoredValue(personUri, People.TIMES_CONTACTED));
247bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long timeBefore = System.currentTimeMillis();
248bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        People.markAsContacted(mResolver, personId);
249bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long timeAfter = System.currentTimeMillis();
250bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
251bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long lastContacted = Long.parseLong(getStoredValue(personUri, People.LAST_TIME_CONTACTED));
252bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        int timesContactedAfter =
253bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            Integer.parseInt(getStoredValue(personUri, People.TIMES_CONTACTED));
254bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
255bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertTrue(lastContacted >= timeBefore);
256bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertTrue(lastContacted <= timeAfter);
257bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertEquals(timesContactedAfter, timesContactedBefore + 1);
258bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
259bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
2603cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    public void testOrganizationsInsert() {
261bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
262bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
263bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
264bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
265bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
266bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.COMPANY, "Sierra");
267bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.PERSON_ID, personId);
268bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.TYPE, Organizations.TYPE_CUSTOM);
269bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.LABEL, "Club");
270bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.TITLE, "Member");
271bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.ISPRIMARY, 1);
272bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
273bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri uri = mResolver.insert(Organizations.CONTENT_URI, values);
274bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(uri, values);
275d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        assertSelection(Organizations.CONTENT_URI, values,
276d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Organizations._ID, ContentUris.parseId(uri));
277bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
278bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertPersonIdConstraint(Organizations.CONTENT_URI, Organizations.TYPE,
279bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                Organizations.TYPE_WORK);
280bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
281bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertTypeAndLabelConstraints(Organizations.CONTENT_URI, Organizations.PERSON_ID, personId,
282bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                Organizations.TYPE, Organizations.TYPE_CUSTOM, Organizations.TYPE_OTHER,
283bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                Organizations.LABEL);
284bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
285bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
286e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    public void testPhonesInsert() {
287bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
288bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
289bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
290bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
291bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
292bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
293bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.PERSON_ID, personId);
294bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.TYPE, Phones.TYPE_CUSTOM);
295bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.LABEL, "Directory");
296bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.NUMBER, "1-800-4664-411");
297bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.ISPRIMARY, 1);
298bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
299bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri uri = mResolver.insert(Phones.CONTENT_URI, values);
300bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
301bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Adding another value to assert
302bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.NUMBER_KEY, "11446640081");
303bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
304bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // The result is joined with People
305bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
306bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(uri, values);
307d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        assertSelection(Phones.CONTENT_URI, values,
308d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Phones._ID, ContentUris.parseId(uri));
309bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
310bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Access the phone through People
311bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri twigUri = Uri.withAppendedPath(personUri, People.Phones.CONTENT_DIRECTORY);
312bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(twigUri, values);
313bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
314bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Now the person should be joined with Phone
315bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
316bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
317bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.TYPE, Phones.TYPE_CUSTOM);
318bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.LABEL, "Directory");
319bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NUMBER, "1-800-4664-411");
320bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
321bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
322bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertPersonIdConstraint(Phones.CONTENT_URI, Phones.TYPE, Phones.TYPE_WORK);
323bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
324bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertTypeAndLabelConstraints(Phones.CONTENT_URI, Phones.PERSON_ID, personId, Phones.TYPE,
325bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                Phones.TYPE_CUSTOM, Phones.TYPE_OTHER, Phones.LABEL);
326bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
327bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
328e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    public void testEmailInsert() {
329e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        assertContactMethodInsert(Contacts.KIND_EMAIL, ContactMethods.TYPE_CUSTOM,
330e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                "Some other way", "foo@acme.com", null, true);
331e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
332e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
333e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    public void testImInsert() {
334e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        assertContactMethodInsert(Contacts.KIND_IM, ContactMethods.TYPE_CUSTOM, "Some other way",
335e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                "Foo", "Bar", true);
336e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
337e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
338e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    public void testPostalInsert() {
339e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        assertContactMethodInsert(Contacts.KIND_POSTAL, ContactMethods.TYPE_CUSTOM,
340e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov                "Some other way", "Foo", "Bar", true);
341e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    }
342e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov
343e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov    private void assertContactMethodInsert(int kind, int type, String label, String data,
344e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov            String auxData, boolean primary) {
345bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
346bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
347bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        final Uri personUri = mResolver.insert(People.CONTENT_URI, values);
348bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
349bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
350bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
351bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.PERSON_ID, personId);
352e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        values.put(ContactMethods.KIND, kind);
353e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        values.put(ContactMethods.TYPE, type);
354e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        values.put(ContactMethods.LABEL, label);
355e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        values.put(ContactMethods.DATA, data);
356e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        values.put(ContactMethods.AUX_DATA, auxData);
357e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        values.put(ContactMethods.ISPRIMARY, primary ? 1 : 0);
358bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
359bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri uri = mResolver.insert(ContactMethods.CONTENT_URI, values);
360bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
361bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // The result is joined with People
362bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
363bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(uri, values);
364d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        assertSelection(ContactMethods.CONTENT_URI, values,
365d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                ContactMethods._ID, ContentUris.parseId(uri));
366bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
367e80e514a6175ad2ee03ea6eff6201e0e47d5a710Dmitri Plotnikov        // Access the contact method through People
368bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri twigUri = Uri.withAppendedPath(personUri, People.ContactMethods.CONTENT_DIRECTORY);
369bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(twigUri, values);
370bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
371bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertPersonIdConstraint(ContactMethods.CONTENT_URI, ContactMethods.TYPE,
372bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                ContactMethods.TYPE_WORK);
373bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
374bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertTypeAndLabelConstraints(ContactMethods.CONTENT_URI, ContactMethods.PERSON_ID,
375bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                personId, ContactMethods.TYPE, ContactMethods.TYPE_CUSTOM,
376bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                ContactMethods.TYPE_OTHER, ContactMethods.LABEL);
377bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
378bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
3790f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    public void testExtensionsInsert() {
380bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
381bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        final Uri personUri = mResolver.insert(People.CONTENT_URI, values);
382bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
383bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
384bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
385bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Extensions.PERSON_ID, personId);
386bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Extensions.NAME, "Foo");
387bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Extensions.VALUE, "Bar");
388bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
389bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri uri = mResolver.insert(Extensions.CONTENT_URI, values);
390bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(uri, values);
391d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        assertSelection(Extensions.CONTENT_URI, values,
392d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                Extensions._ID, ContentUris.parseId(uri));
393bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
394bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Access the extensions through People
395bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri twigUri = Uri.withAppendedPath(personUri, People.Extensions.CONTENT_DIRECTORY);
396bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(twigUri, values);
397bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
398bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
3990f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    public void testGroupsInsert() {
400bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
401bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Groups.NAME, "Galois");
402bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Groups.NOTES, "Abel");
4030f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov        values.put(Groups.SYSTEM_ID, "12345");
404bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
405bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri groupUri = mResolver.insert(Groups.CONTENT_URI, values);
406bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(groupUri, values);
407bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
408bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
4090f8f3b3e4a6ad18c5868d0215cc137845a2ddc74Dmitri Plotnikov    public void testGroupMembershipsInsert() {
410bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
411bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Groups.NAME, "Galois");
412bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Groups.NOTES, "Abel");
413bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri groupUri = mResolver.insert(Groups.CONTENT_URI, values);
414bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
415bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
416bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NAME, "Klein");
417bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
418bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
419bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long groupId = ContentUris.parseId(groupUri);
420bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
421bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
422d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        values.clear();
423d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        values.put(GroupMembership.GROUP_ID, groupId);
424d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        values.put(GroupMembership.PERSON_ID, personId);
425d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        Uri membershipUri = mResolver.insert(GroupMembership.CONTENT_URI, values);
426d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        assertStoredValues(membershipUri, values);
427d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        assertSelection(GroupMembership.CONTENT_URI, values,
428d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov                GroupMembership._ID, ContentUris.parseId(membershipUri));
429bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
430bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personsGroupsUri = Uri.withAppendedPath(personUri, GroupMembership.CONTENT_DIRECTORY);
431d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov        assertStoredValues(personsGroupsUri, values);
432bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
433bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
434d51a83ac4f8032b62d9a23b90a8f43d6b7eb2dbbDmitri Plotnikov    public void testAddToGroup() {
435bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
436bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
437bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
438bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
439bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
440bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Groups.NAME, "Galois");
441bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri groupUri = mResolver.insert(Groups.CONTENT_URI, values);
442bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
443bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        People.addToGroup(mResolver, personId, "Galois");
444bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
445bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
446bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(GroupMembership.GROUP_ID, ContentUris.parseId(groupUri));
447bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(GroupMembership.PERSON_ID, personId);
448bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
449bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personsGroupsUri = Uri.withAppendedPath(personUri, GroupMembership.CONTENT_DIRECTORY);
450bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personsGroupsUri, values);
451bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
452bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
45370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov    public void testPresenceInsertMatchOnHandle() {
454bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
455bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
456bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
457bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
458bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
459bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        String encodedProtocol =
460bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                ContactMethods.encodePredefinedImProtocol(ContactMethods.PROTOCOL_GOOGLE_TALK);
461bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
462bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
463bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.PERSON_ID, personId);
464bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.KIND, Contacts.KIND_IM);
465bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.TYPE, ContactMethods.TYPE_HOME);
466bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.DATA, "Android");
467bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.AUX_DATA, encodedProtocol);
468bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.insert(ContactMethods.CONTENT_URI, values);
469bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
470bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
471bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Presence.IM_PROTOCOL, encodedProtocol);
472bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Presence.IM_HANDLE, "Android");
473bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Presence.IM_ACCOUNT, "foo");
47470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        values.put(Presence.PRESENCE_STATUS, Presence.OFFLINE);
47570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        values.put(Presence.PRESENCE_CUSTOM_STATUS, "Coding for Android");
476bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
477bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri presenceUri = mResolver.insert(Presence.CONTENT_URI, values);
47870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        assertSelection(Presence.CONTENT_URI, values,
47970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                Presence._ID, ContentUris.parseId(presenceUri));
480bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
481bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Presence.PERSON_ID, personId);
48270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        assertStoredValues(presenceUri, values);
483bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
48470b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        // Now the person should be joined with Presence
48570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        values.clear();
486bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
48770b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        values.put(People.IM_PROTOCOL, encodedProtocol);
48870b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        values.put(People.IM_HANDLE, "Android");
48970b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        values.put(People.IM_ACCOUNT, "foo");
49070b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        values.put(People.PRESENCE_STATUS, Presence.OFFLINE);
49170b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        values.put(People.PRESENCE_CUSTOM_STATUS, "Coding for Android");
49270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        assertStoredValues(personUri, values);
493bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
494bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
49570b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov    public void testPresenceInsertMatchOnEmail() {
496bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
497bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
498bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
499bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
500bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
501bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        String protocol =
502bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            ContactMethods.encodePredefinedImProtocol(ContactMethods.PROTOCOL_GOOGLE_TALK);
503bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
504bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
505bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.PERSON_ID, personId);
506bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.KIND, Contacts.KIND_EMAIL);
507bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.TYPE, ContactMethods.TYPE_HOME);
508bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.DATA, "Android@android.com");
509bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.insert(ContactMethods.CONTENT_URI, values);
510bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
511bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
512bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Presence.IM_PROTOCOL, protocol);
513bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Presence.IM_HANDLE, "Android@android.com");
514bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Presence.IM_ACCOUNT, "foo");
515bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Presence.PRESENCE_STATUS, Presence.OFFLINE);
516bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Presence.PRESENCE_CUSTOM_STATUS, "Coding for Android");
517bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
518bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri presenceUri = mResolver.insert(Presence.CONTENT_URI, values);
519bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
520bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Presence.PERSON_ID, personId);
521bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(presenceUri, values);
52270b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov        assertSelection(Presence.CONTENT_URI, values,
52370b5ee6864cb3368d24a9e876fb93008997b12dfDmitri Plotnikov                Presence._ID, ContentUris.parseId(presenceUri));
524bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
525bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Now the person should be joined with Presence
526bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
527bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
528bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.IM_PROTOCOL, protocol);
529bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.IM_HANDLE, "Android@android.com");
530bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.IM_ACCOUNT, "foo");
531bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PRESENCE_STATUS, Presence.OFFLINE);
532bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PRESENCE_CUSTOM_STATUS, "Coding for Android");
533bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
534bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
535bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
536c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov    public void testPhotoUpdate() throws Exception {
537bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        byte[] photo = loadTestPhoto();
538bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
539bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
540bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
541bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
542bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
543bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Photos.DATA, photo);
544c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        values.put(Photos.LOCAL_VERSION, "10");
545c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        values.put(Photos.DOWNLOAD_REQUIRED, 1);
546c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        values.put(Photos.EXISTS_ON_SERVER, 1);
547c6ad6f6c5690a28bacb9fa0f4357ea8c8a91e3baDmitri Plotnikov        values.put(Photos.SYNC_ERROR, "404 does not exist");
548bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
549bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri photoUri = Uri.withAppendedPath(personUri, Photos.CONTENT_DIRECTORY);
550bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.update(photoUri, values, null, null);
551bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(photoUri, values);
552bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
553bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
554bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    private void putContactValues(ContentValues values) {
555bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Populating only unhidden columns
556bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NAME, "Deer Dough");
557bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PHONETIC_NAME, "Dear Doe");
558bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NOTES, "Cash Cow");
559bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.TIMES_CONTACTED, 3);
560bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.LAST_TIME_CONTACTED, 10);
561bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.CUSTOM_RINGTONE, "ringtone");
562bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.SEND_TO_VOICEMAIL, 1);
563bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.STARRED, 1);
564bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
565bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
566bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    private byte[] loadTestPhoto() throws IOException {
567bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        final Resources resources = getContext().getResources();
568bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        InputStream is =
569bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                resources.openRawResource(com.android.internal.R.drawable.ic_contact_picture);
570bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ByteArrayOutputStream os = new ByteArrayOutputStream();
571bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        byte[] buffer = new byte[1000];
572bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        int count;
573bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        while((count = is.read(buffer)) != -1) {
574bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            os.write(buffer, 0, count);
575bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        }
576bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        return os.toByteArray();
577bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
578bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
579bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    private void assertFilteredContacts(String filter, String... expectedNames) {
580bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri filterUri = Uri.withAppendedPath(People.CONTENT_FILTER_URI, filter);
581bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Cursor c = mResolver.query(filterUri, null, null, null, null);
582bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        try {
583bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            assertEquals("Record count", expectedNames.length, c.getCount());
584bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            int column = c.getColumnIndex(People.NAME);
585bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            for (int i = 0; i < expectedNames.length; i++) {
586bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                c.moveToNext();
587bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                assertEquals(expectedNames[i], c.getString(column));
588bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            }
589bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        } finally {
590bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            c.close();
591bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        }
592bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
593bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
594bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    private void assertPersonIdConstraint(Uri uri, String typeColumn, int defaultType) {
595bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
596bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(typeColumn, defaultType);
597bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        try {
598bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            mResolver.insert(uri, values);
599bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            fail("Inserted row without person ID");
600bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        } catch (Exception e) {
601bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            // Exception expected
602bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        }
603bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
604bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
605bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    private void assertTypeAndLabelConstraints(Uri uri, String personIdColumn, long personId,
606bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            String typeColumn, int defaultType, int otherType, String labelColumn) {
607bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
608bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(personIdColumn, personId);
609bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(typeColumn, defaultType);
610bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        try {
611bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            mResolver.insert(uri, values);
612bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            fail("Inserted row with custom type but without label");
613bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        } catch (Exception e) {
614bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            // Exception expected
615bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        }
616bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
617bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
618bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(personIdColumn, personId);
619bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        try {
620bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            mResolver.insert(uri, values);
621bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            fail("Inserted row without either type or label");
622bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        } catch (Exception e) {
623bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            // Exception expected
624bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        }
625bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
626bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
627bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(personIdColumn, personId);
628bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(typeColumn, otherType);
629bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(labelColumn, "Foo");
630bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        try {
631bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            mResolver.insert(uri, values);
6323cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            fail("Inserted row with both type and label");
633bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        } catch (Exception e) {
634bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            // Exception expected
635bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        }
636bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
637bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
638bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov}
639