15ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee/*
25ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Copyright (C) 2010 The Android Open Source Project
35ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee *
45ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Licensed under the Apache License, Version 2.0 (the "License");
55ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * you may not use this file except in compliance with the License.
65ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * You may obtain a copy of the License at
75ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee *
85ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee *      http://www.apache.org/licenses/LICENSE-2.0
95ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee *
105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Unless required by applicable law or agreed to in writing, software
115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * distributed under the License is distributed on an "AS IS" BASIS,
125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * See the License for the specific language governing permissions and
145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * limitations under the License.
155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee */
165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leepackage com.android.contacts.common.model;
185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.content.ContentUris;
205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.net.Uri;
21cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fuimport android.provider.ContactsContract;
225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.CommonDataKinds.GroupMembership;
235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.CommonDataKinds.StructuredName;
245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.Contacts;
255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.Data;
265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.DisplayNameSources;
275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.RawContacts;
285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.StatusUpdates;
295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.test.LoaderTestCase;
305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.test.suitebuilder.annotation.LargeTest;
315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.AccountTypeManager;
335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.test.mocks.ContactsMockContext;
345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.test.mocks.MockContentProvider;
355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.account.AccountType;
365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.account.AccountWithDataSet;
375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.account.BaseAccountType;
3888bede3df22a27296afcec83c2f2f430d1bc1372Yorke Leeimport com.android.contacts.common.testing.InjectedServices;
395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.test.mocks.MockAccountTypeManager;
40cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fuimport com.android.contacts.common.util.Constants;
41cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu
42cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fuimport org.json.JSONException;
43cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fuimport org.json.JSONObject;
445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee/**
465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Runs ContactLoader tests for the the contact-detail and editor view.
475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee */
485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee@LargeTest
495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leepublic class ContactLoaderTest extends LoaderTestCase {
50cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu    private static final long CONTACT_ID = 1;
51cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu    private static final long RAW_CONTACT_ID = 11;
52cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu    private static final long DATA_ID = 21;
53cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu    private static final String LOOKUP_KEY = "aa%12%@!";
54cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu
555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private ContactsMockContext mMockContext;
565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private MockContentProvider mContactsProvider;
575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    @Override
595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    protected void setUp() throws Exception {
605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        super.setUp();
615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mMockContext = new ContactsMockContext(getContext());
625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mContactsProvider = mMockContext.getContactsProvider();
635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        InjectedServices services = new InjectedServices();
655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        AccountType accountType = new BaseAccountType() {
665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            @Override
675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            public boolean areContactsWritable() {
685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                return false;
695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            }
705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        };
715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        accountType.accountType = "mockAccountType";
725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        AccountWithDataSet account =
745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                new AccountWithDataSet("mockAccountName", "mockAccountType", null);
755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        AccountTypeManager.setInstanceForTest(
775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                new MockAccountTypeManager(
785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        new AccountType[]{accountType}, new AccountWithDataSet[]{account}));
795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    @Override
825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    protected void tearDown() throws Exception {
835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mMockContext = null;
845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mContactsProvider = null;
855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        super.tearDown();
865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private Contact assertLoadContact(Uri uri) {
895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final ContactLoader loader = new ContactLoader(mMockContext, uri, true);
905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return getLoaderResultSynchronously(loader);
915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testNullUri() {
945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        Contact result = assertLoadContact(null);
955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertTrue(result.isError());
965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testEmptyUri() {
995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        Contact result = assertLoadContact(Uri.EMPTY);
1005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertTrue(result.isError());
1015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
1025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testInvalidUri() {
1045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        Contact result = assertLoadContact(Uri.parse("content://wtf"));
1055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertTrue(result.isError());
1065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
1075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testLoadContactWithContactIdUri() {
1095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Use content Uris that only contain the ID
110cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        final Uri baseUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, CONTACT_ID);
1115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri entityUri = Uri.withAppendedPath(baseUri, Contacts.Entity.CONTENT_DIRECTORY);
1125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri lookupUri = ContentUris.withAppendedId(
113cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu                Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, LOOKUP_KEY),
114cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu                CONTACT_ID);
1155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContactQueries queries = new ContactQueries();
1175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mContactsProvider.expectTypeQuery(baseUri, Contacts.CONTENT_ITEM_TYPE);
118cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        queries.fetchAllData(entityUri, CONTACT_ID, RAW_CONTACT_ID, DATA_ID, LOOKUP_KEY);
1195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        Contact contact = assertLoadContact(baseUri);
1215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
122cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        assertEquals(CONTACT_ID, contact.getId());
123cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        assertEquals(RAW_CONTACT_ID, contact.getNameRawContactId());
1245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(DisplayNameSources.STRUCTURED_NAME, contact.getDisplayNameSource());
125cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        assertEquals(LOOKUP_KEY, contact.getLookupKey());
1265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(lookupUri, contact.getLookupUri());
1275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, contact.getRawContacts().size());
1285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, contact.getStatuses().size());
1295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mContactsProvider.verify();
1305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
1315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testLoadContactWithOldStyleUri() {
1335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Use content Uris that only contain the ID but use the format used in Donut
1345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri legacyUri = ContentUris.withAppendedId(
135cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu                Uri.parse("content://contacts"), RAW_CONTACT_ID);
136cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        final Uri rawContactUri = ContentUris.withAppendedId(
137cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu                RawContacts.CONTENT_URI, RAW_CONTACT_ID);
138cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        final Uri baseUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, CONTACT_ID);
1395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri lookupUri = ContentUris.withAppendedId(
140cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu                Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, LOOKUP_KEY),
141cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu                CONTACT_ID);
1425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri entityUri = Uri.withAppendedPath(lookupUri, Contacts.Entity.CONTENT_DIRECTORY);
1435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContactQueries queries = new ContactQueries();
145cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        queries.fetchContactIdAndLookupFromRawContactUri(rawContactUri, CONTACT_ID, LOOKUP_KEY);
146cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        queries.fetchAllData(entityUri, CONTACT_ID, RAW_CONTACT_ID, DATA_ID, LOOKUP_KEY);
1475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        Contact contact = assertLoadContact(legacyUri);
1495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
150cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        assertEquals(CONTACT_ID, contact.getId());
151cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        assertEquals(RAW_CONTACT_ID, contact.getNameRawContactId());
1525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(DisplayNameSources.STRUCTURED_NAME, contact.getDisplayNameSource());
153cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        assertEquals(LOOKUP_KEY, contact.getLookupKey());
1545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(lookupUri, contact.getLookupUri());
1555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, contact.getRawContacts().size());
1565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, contact.getStatuses().size());
1575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mContactsProvider.verify();
1585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
1595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testLoadContactWithRawContactIdUri() {
1615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Use content Uris that only contain the ID but use the format used in Donut
162cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        final Uri rawContactUri = ContentUris.withAppendedId(
163cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu                RawContacts.CONTENT_URI, RAW_CONTACT_ID);
164cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        final Uri baseUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, CONTACT_ID);
1655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri lookupUri = ContentUris.withAppendedId(
166cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu                Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, LOOKUP_KEY),
167cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu                CONTACT_ID);
1685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri entityUri = Uri.withAppendedPath(lookupUri, Contacts.Entity.CONTENT_DIRECTORY);
1695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContactQueries queries = new ContactQueries();
1715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mContactsProvider.expectTypeQuery(rawContactUri, RawContacts.CONTENT_ITEM_TYPE);
172cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        queries.fetchContactIdAndLookupFromRawContactUri(rawContactUri, CONTACT_ID, LOOKUP_KEY);
173cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        queries.fetchAllData(entityUri, CONTACT_ID, RAW_CONTACT_ID, DATA_ID, LOOKUP_KEY);
1745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        Contact contact = assertLoadContact(rawContactUri);
1765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
177cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        assertEquals(CONTACT_ID, contact.getId());
178cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        assertEquals(RAW_CONTACT_ID, contact.getNameRawContactId());
1795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(DisplayNameSources.STRUCTURED_NAME, contact.getDisplayNameSource());
180cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        assertEquals(LOOKUP_KEY, contact.getLookupKey());
1815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(lookupUri, contact.getLookupUri());
1825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, contact.getRawContacts().size());
1835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, contact.getStatuses().size());
1845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mContactsProvider.verify();
1855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
1865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testLoadContactWithContactLookupUri() {
1885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Use lookup-style Uris that do not contain the Contact-ID
189cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        final Uri baseUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, CONTACT_ID);
190cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        final Uri lookupNoIdUri = Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, LOOKUP_KEY);
191cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        final Uri lookupUri = ContentUris.withAppendedId(lookupNoIdUri, CONTACT_ID);
192cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        final Uri entityUri = Uri.withAppendedPath(
193cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu                lookupNoIdUri, Contacts.Entity.CONTENT_DIRECTORY);
1945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContactQueries queries = new ContactQueries();
1965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mContactsProvider.expectTypeQuery(lookupNoIdUri, Contacts.CONTENT_ITEM_TYPE);
197cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        queries.fetchAllData(entityUri, CONTACT_ID, RAW_CONTACT_ID, DATA_ID, LOOKUP_KEY);
1985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        Contact contact = assertLoadContact(lookupNoIdUri);
2005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
201cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        assertEquals(CONTACT_ID, contact.getId());
202cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        assertEquals(RAW_CONTACT_ID, contact.getNameRawContactId());
2035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(DisplayNameSources.STRUCTURED_NAME, contact.getDisplayNameSource());
204cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        assertEquals(LOOKUP_KEY, contact.getLookupKey());
2055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(lookupUri, contact.getLookupUri());
2065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, contact.getRawContacts().size());
2075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, contact.getStatuses().size());
2085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mContactsProvider.verify();
2095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
2105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testLoadContactWithContactLookupAndIdUri() {
2125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Use lookup-style Uris that also contain the Contact-ID
213cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        final Uri baseUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, CONTACT_ID);
2145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri lookupUri = ContentUris.withAppendedId(
215cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu                Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, LOOKUP_KEY),
216cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu                CONTACT_ID);
2175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri entityUri = Uri.withAppendedPath(lookupUri, Contacts.Entity.CONTENT_DIRECTORY);
2185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContactQueries queries = new ContactQueries();
2205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mContactsProvider.expectTypeQuery(lookupUri, Contacts.CONTENT_ITEM_TYPE);
221cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        queries.fetchAllData(entityUri, CONTACT_ID, RAW_CONTACT_ID, DATA_ID, LOOKUP_KEY);
2225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        Contact contact = assertLoadContact(lookupUri);
2245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
225cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        assertEquals(CONTACT_ID, contact.getId());
226cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        assertEquals(RAW_CONTACT_ID, contact.getNameRawContactId());
2275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(DisplayNameSources.STRUCTURED_NAME, contact.getDisplayNameSource());
228cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        assertEquals(LOOKUP_KEY, contact.getLookupKey());
2295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(lookupUri, contact.getLookupUri());
2305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, contact.getRawContacts().size());
2315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, contact.getStatuses().size());
2325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mContactsProvider.verify();
2335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
2345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testLoadContactWithContactLookupWithIncorrectIdUri() {
2365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Use lookup-style Uris that contain incorrect Contact-ID
2375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // (we want to ensure that still the correct contact is chosen)
2385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final long wrongContactId = 2;
2395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final long wrongRawContactId = 12;
2405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final String wrongLookupKey = "ab%12%@!";
242cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        final Uri baseUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, CONTACT_ID);
2435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri wrongBaseUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, wrongContactId);
2445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri lookupUri = ContentUris.withAppendedId(
245cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu                Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, LOOKUP_KEY),
246cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu                CONTACT_ID);
2475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri lookupWithWrongIdUri = ContentUris.withAppendedId(
248cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu                Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, LOOKUP_KEY),
2495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                wrongContactId);
2505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri entityUri = Uri.withAppendedPath(lookupWithWrongIdUri,
2515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                Contacts.Entity.CONTENT_DIRECTORY);
2525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContactQueries queries = new ContactQueries();
2545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mContactsProvider.expectTypeQuery(lookupWithWrongIdUri, Contacts.CONTENT_ITEM_TYPE);
255cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        queries.fetchAllData(entityUri, CONTACT_ID, RAW_CONTACT_ID, DATA_ID, LOOKUP_KEY);
2565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        Contact contact = assertLoadContact(lookupWithWrongIdUri);
2585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
259cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        assertEquals(CONTACT_ID, contact.getId());
260cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        assertEquals(RAW_CONTACT_ID, contact.getNameRawContactId());
2615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(DisplayNameSources.STRUCTURED_NAME, contact.getDisplayNameSource());
262cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        assertEquals(LOOKUP_KEY, contact.getLookupKey());
2635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(lookupUri, contact.getLookupUri());
2645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, contact.getRawContacts().size());
2655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, contact.getStatuses().size());
2665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mContactsProvider.verify();
2685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
2695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
270cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu    public void testLoadContactReturnDirectoryContactWithoutDisplayName() throws JSONException {
271cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        // Use lookup-style Uri that contains encoded json object which encapsulates the
272cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        // directory contact. The test json object is:
273cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        // {
274cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        //   display_name_source": 40,
275cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        //   "vnd.android.cursor.item\/contact":{"email":{"data1":"test@google.com" }}
276cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        // }
277cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        JSONObject itemJson = new JSONObject();
278cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        itemJson.put("email", new JSONObject().put("data1", "test@google.com"));
279cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        JSONObject json = new JSONObject();
280cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        json.put(Contacts.NAME_RAW_CONTACT_ID, CONTACT_ID);
281cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        json.put(Contacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME);
282cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        json.put(Contacts.CONTENT_ITEM_TYPE, itemJson);
283cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu
284cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        final Uri lookupUri = Contacts.CONTENT_LOOKUP_URI.buildUpon()
285cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu                .encodedFragment(json.toString())
286cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu                .appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY, "1")
287cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu                .appendPath(Constants.LOOKUP_URI_ENCODED).build();
288cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu
289cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        mContactsProvider.expectTypeQuery(lookupUri, Contacts.CONTENT_ITEM_TYPE);
290cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        Contact contact = assertLoadContact(lookupUri);
291cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu
292cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        assertEquals(-1, contact.getId());
293cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        assertEquals(-1, contact.getNameRawContactId());
294cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        assertEquals(DisplayNameSources.STRUCTURED_NAME, contact.getDisplayNameSource());
295cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        assertEquals("", contact.getDisplayName());
296cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        assertEquals(lookupUri, contact.getLookupUri());
297cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        assertEquals(1, contact.getRawContacts().size());
298cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu        mContactsProvider.verify();
299cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu    }
300cd9993ef634735bb595c14b8d218ffe95df0fc74Zheng Fu
3015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    class ContactQueries {
3025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        public void fetchAllData(
3035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                Uri baseUri, long contactId, long rawContactId, long dataId, String encodedLookup) {
3045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            mContactsProvider.expectQuery(baseUri)
3055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                    .withProjection(new String[] {
3065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Contacts.NAME_RAW_CONTACT_ID, Contacts.DISPLAY_NAME_SOURCE,
3075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Contacts.LOOKUP_KEY, Contacts.DISPLAY_NAME,
3085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Contacts.DISPLAY_NAME_ALTERNATIVE, Contacts.PHONETIC_NAME,
3095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Contacts.PHOTO_ID, Contacts.STARRED, Contacts.CONTACT_PRESENCE,
3105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Contacts.CONTACT_STATUS, Contacts.CONTACT_STATUS_TIMESTAMP,
3115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Contacts.CONTACT_STATUS_RES_PACKAGE, Contacts.CONTACT_STATUS_LABEL,
3125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Contacts.Entity.CONTACT_ID,
3145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Contacts.Entity.RAW_CONTACT_ID,
3155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        RawContacts.ACCOUNT_NAME, RawContacts.ACCOUNT_TYPE,
317e5c5236faa007d2bb52af9e83618efc859a93682Yorke Lee                        RawContacts.DATA_SET,
3185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        RawContacts.DIRTY, RawContacts.VERSION, RawContacts.SOURCE_ID,
3195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        RawContacts.SYNC1, RawContacts.SYNC2, RawContacts.SYNC3, RawContacts.SYNC4,
320d7705a1b6595b57e250f21856c01bf734aa4d5fdYorke Lee                        RawContacts.DELETED,
3215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Contacts.Entity.DATA_ID,
3235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Data.DATA1, Data.DATA2, Data.DATA3, Data.DATA4, Data.DATA5,
3255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Data.DATA6, Data.DATA7, Data.DATA8, Data.DATA9, Data.DATA10,
3265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Data.DATA11, Data.DATA12, Data.DATA13, Data.DATA14, Data.DATA15,
3275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Data.SYNC1, Data.SYNC2, Data.SYNC3, Data.SYNC4,
3285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Data.DATA_VERSION, Data.IS_PRIMARY,
329e5c5236faa007d2bb52af9e83618efc859a93682Yorke Lee                        Data.IS_SUPER_PRIMARY, Data.MIMETYPE,
3305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        GroupMembership.GROUP_SOURCE_ID,
3325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Data.PRESENCE, Data.CHAT_CAPABILITY,
3345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Data.STATUS, Data.STATUS_RES_PACKAGE, Data.STATUS_ICON,
3355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Data.STATUS_LABEL, Data.STATUS_TIMESTAMP,
3365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Contacts.PHOTO_URI,
3385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Contacts.SEND_TO_VOICEMAIL,
3405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Contacts.CUSTOM_RINGTONE,
3415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Contacts.IS_USER_PROFILE,
3422c4f0b1683d93b799d6275a4e62db0596ec04532Paul Soulos
3432c4f0b1683d93b799d6275a4e62db0596ec04532Paul Soulos                        Data.TIMES_USED,
3442c4f0b1683d93b799d6275a4e62db0596ec04532Paul Soulos                        Data.LAST_TIME_USED,
3455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                    })
3465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                    .withSortOrder(Contacts.Entity.RAW_CONTACT_ID)
3475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                    .returnRow(
3485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        rawContactId, 40,
3495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        "aa%12%@!", "John Doe", "Doe, John", "jdo",
3505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        0, 0, StatusUpdates.AVAILABLE,
3515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        "Having lunch", 0,
3525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        "mockPkg1", 10,
3535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        contactId,
3555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        rawContactId,
3565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
357906f811c882dbaa732fb8d436a61d54ceee59272Yorke Lee                        "mockAccountName", "mockAccountType", null,
3585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        0, 1, 0,
3595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        "sync1", "sync2", "sync3", "sync4",
360d7705a1b6595b57e250f21856c01bf734aa4d5fdYorke Lee                        0,
3615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        dataId,
3635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        "dat1", "dat2", "dat3", "dat4", "dat5",
3655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        "dat6", "dat7", "dat8", "dat9", "dat10",
3665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        "dat11", "dat12", "dat13", "dat14", "dat15",
3675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        "syn1", "syn2", "syn3", "syn4",
3685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        0, 0,
370906f811c882dbaa732fb8d436a61d54ceee59272Yorke Lee                        0, StructuredName.CONTENT_ITEM_TYPE,
3715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        "groupId",
3735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        StatusUpdates.INVISIBLE, null,
3755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        "Having dinner", "mockPkg3", 0,
3765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        20, 0,
3775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        "content:some.photo.uri",
3795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        0,
3815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        null,
3822c4f0b1683d93b799d6275a4e62db0596ec04532Paul Soulos                        0,
3832c4f0b1683d93b799d6275a4e62db0596ec04532Paul Soulos
3842c4f0b1683d93b799d6275a4e62db0596ec04532Paul Soulos                        0,
3855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        0
3865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                    );
3875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
3885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        void fetchLookupAndId(final Uri sourceUri, final long expectedContactId,
3905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                final String expectedEncodedLookup) {
3915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            mContactsProvider.expectQuery(sourceUri)
3925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                    .withProjection(Contacts.LOOKUP_KEY, Contacts._ID)
3935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                    .returnRow(expectedEncodedLookup, expectedContactId);
3945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
3955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        void fetchContactIdAndLookupFromRawContactUri(final Uri rawContactUri,
3975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                final long expectedContactId, final String expectedEncodedLookup) {
3985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            // TODO: use a lighter query by joining rawcontacts with contacts in provider
3995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            // (See ContactContracts.java)
4005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            final Uri dataUri = Uri.withAppendedPath(rawContactUri,
4015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                    RawContacts.Data.CONTENT_DIRECTORY);
4025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            mContactsProvider.expectQuery(dataUri)
4035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                    .withProjection(RawContacts.CONTACT_ID, Contacts.LOOKUP_KEY)
4045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                    .returnRow(expectedContactId, expectedEncodedLookup);
4055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
4065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
4075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee}
408