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