GlobalSearchSupportTest.java revision 8920a04b4a68ed6b548bcdef5ca8736dcf8b69b1
1a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov/* 2a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * Copyright (C) 2009 The Android Open Source Project 3a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * 4a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License"); 5a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * you may not use this file except in compliance with the License. 6a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * You may obtain a copy of the License at 7a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * 8a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * http://www.apache.org/licenses/LICENSE-2.0 9a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * 10a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * Unless required by applicable law or agreed to in writing, software 11a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS, 12a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * See the License for the specific language governing permissions and 14a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * limitations under the License. 15a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov */ 168920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens 17a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovpackage com.android.providers.contacts; 18a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 196bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikovimport android.accounts.Account; 20a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport android.app.SearchManager; 21a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport android.content.ContentUris; 22a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport android.content.ContentValues; 23a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport android.database.Cursor; 24a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport android.database.DatabaseUtils; 25a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport android.net.Uri; 26a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport android.provider.ContactsContract; 27a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport android.provider.ContactsContract.Data; 28a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaokaimport android.provider.ContactsContract.Intents; 29a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport android.provider.ContactsContract.Presence; 30a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport android.provider.ContactsContract.RawContacts; 3182bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikovimport android.provider.ContactsContract.StatusUpdates; 32a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Email; 33a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Im; 34a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Organization; 35a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Phone; 36a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Photo; 37a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport android.test.suitebuilder.annotation.LargeTest; 38a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 39a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport java.io.IOException; 40a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 41a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov/** 42a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * Unit tests for {@link GlobalSearchSupport}. 43a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * 44a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * Run the test like this: 45a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * <code> 468920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens * adb shell am instrument -e class com.android.providers.contacts.GlobalSearchSupportTest -w \ 47a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * com.android.providers.contacts.tests/android.test.InstrumentationTestRunner 48a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * </code> 49a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov */ 50a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov@LargeTest 51a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovpublic class GlobalSearchSupportTest extends BaseContactsProvider2Test { 52a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov public void testSearchSuggestionsNotInVisibleGroup() throws Exception { 536bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov Account account = new Account("actname", "acttype"); 546bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov long rawContactId = createRawContact(account); 55a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov insertStructuredName(rawContactId, "Deer", "Dough"); 56a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 57a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov Uri searchUri = new Uri.Builder().scheme("content").authority(ContactsContract.AUTHORITY) 58a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov .appendPath(SearchManager.SUGGEST_URI_PATH_QUERY).appendPath("D").build(); 59a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 60a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov // If the contact is not in the "my contacts" group, nothing should be found 61a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov Cursor c = mResolver.query(searchUri, null, null, null, null); 62a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov assertEquals(0, c.getCount()); 63a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov c.close(); 64a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov } 65a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 66a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov public void testSearchSuggestionsByName() throws Exception { 67a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov long groupId = createGroup(mAccount, "gsid1", "title1"); 68a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 69a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov assertSearchSuggestion(groupId, 70a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov true, // name 71a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // nickname 72a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov true, // photo 73a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // company 74a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // title 75a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov false, // phone 76a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov false, // email 77a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov "D", // query 78a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov true, // expect icon URI 79a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov null, "Deer Dough", null); 80a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 81a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov assertSearchSuggestion(groupId, 82a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov true, // name 83a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // nickname 84a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov true, // photo 85a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka true, // company 86a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // title 87a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov false, // phone 88a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov false, // email 89a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov "D", // query 90a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov true, // expect icon URI 91a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov null, "Deer Dough", "Google"); 92a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 93a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov assertSearchSuggestion(groupId, 94a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov true, // name 95a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // nickname 96a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov true, // photo 97a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // company 98a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // title 99a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov true, // phone 100a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov false, // email 101a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov "D", // query 102a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov true, // expect icon URI 103a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov null, "Deer Dough", "1-800-4664-411"); 104a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 105a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov assertSearchSuggestion(groupId, 106a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov true, // name 107a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // nickname 108a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov true, // photo 109a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // company 110a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // title 111a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov false, // phone 112a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov true, // email 113a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov "D", // query 114a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov true, // expect icon URI 11582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov String.valueOf(StatusUpdates.getPresenceIconResourceId(StatusUpdates.OFFLINE)), 116a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov "Deer Dough", "foo@acme.com"); 117a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 118a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov assertSearchSuggestion(groupId, 119a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov true, // name 120a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // nickname 121a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov false, // photo 122a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka true, // company 123a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // title 124a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov false, // phone 125a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov false, // email 126a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov "D", // query 127a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov false, // expect icon URI 128a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov null, "Deer Dough", "Google"); 129a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka 130a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka // Nickname is searchale 131a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka assertSearchSuggestion(groupId, 132a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka true, // name 133a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka true, // nickname 134a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // photo 135a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka true, // company 136a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // title 137a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // phone 138a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // email 139a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka "L", // query 140a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // expect icon URI 141a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka null, "Deer Dough", "Google"); 142a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka 143a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka // Company is searchable 144a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka assertSearchSuggestion(groupId, 145a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka true, // name 146a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // nickname 147a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // photo 148a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka true, // company 149a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // title 150a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // phone 151a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // email 152a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka "G", // query 153a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // expect icon URI 154a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka null, "Deer Dough", "Google"); 155a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka 156a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka // Title is searchable 157a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka assertSearchSuggestion(groupId, 158a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka true, // name 159a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // nickname 160a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // photo 161a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka true, // company 162a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka true, // title 163a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // phone 164a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // email 165a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka "S", // query 166a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka false, // expect icon URI 167a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka null, "Deer Dough", "Google"); 168a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov } 169a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 170a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka private void assertSearchSuggestion(long groupId, boolean name, boolean nickname, boolean photo, 171a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka boolean company, boolean title, boolean phone, boolean email, String query, 172a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka boolean expectIcon1Uri, String expectedIcon2, String expectedText1, 173a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka String expectedText2) throws IOException { 174a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov ContentValues values = new ContentValues(); 175a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 176a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov long rawContactId = createRawContact(); 177a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov insertGroupMembership(rawContactId, groupId); 178a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 179a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov if (name) { 180a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov insertStructuredName(rawContactId, "Deer", "Dough"); 181a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov } 182a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 183a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka if (nickname) { 184a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka insertNickname(rawContactId, "Little Fawn"); 185a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka } 186a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka 187a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov final Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 188a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov if (photo) { 189a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.clear(); 190a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov byte[] photoData = loadTestPhoto(); 191a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 192a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE); 193a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(Photo.PHOTO, photoData); 194a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov mResolver.insert(Data.CONTENT_URI, values); 195a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov } 196a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 197a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka if (company || title) { 198a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.clear(); 199a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 200a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(Data.MIMETYPE, Organization.CONTENT_ITEM_TYPE); 201a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(Organization.TYPE, Organization.TYPE_WORK); 202a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka if (company) { 203a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.put(Organization.COMPANY, "Google"); 204a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka } 205a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka if (title) { 206a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka values.put(Organization.TITLE, "Software Engineer"); 207a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaoka } 208a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov mResolver.insert(Data.CONTENT_URI, values); 209a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov } 210a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 211a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov if (email) { 212a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.clear(); 213a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 214a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 215a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(Email.TYPE, Email.TYPE_WORK); 216a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(Email.DATA, "foo@acme.com"); 217a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov mResolver.insert(Data.CONTENT_URI, values); 218a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 219a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov int protocol = Im.PROTOCOL_GOOGLE_TALK; 220a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 221a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.clear(); 22282bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.PROTOCOL, protocol); 22382bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.IM_HANDLE, "foo@acme.com"); 22482bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.IM_ACCOUNT, "foo"); 22582bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.PRESENCE_STATUS, StatusUpdates.OFFLINE); 22682bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov values.put(StatusUpdates.PRESENCE_CUSTOM_STATUS, "Coding for Android"); 22782bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikov mResolver.insert(StatusUpdates.CONTENT_URI, values); 228a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov } 229a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 230a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov if (phone) { 231a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.clear(); 232a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(Data.RAW_CONTACT_ID, rawContactId); 233a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 234a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(Data.IS_PRIMARY, 1); 235a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(Phone.TYPE, Phone.TYPE_HOME); 236a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(Phone.NUMBER, "1-800-4664-411"); 237a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov mResolver.insert(Data.CONTENT_URI, values); 238a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov } 239a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 240a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov long contactId = queryContactId(rawContactId); 241a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov Uri searchUri = new Uri.Builder().scheme("content").authority(ContactsContract.AUTHORITY) 242a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov .appendPath(SearchManager.SUGGEST_URI_PATH_QUERY).appendPath(query).build(); 243a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 244a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov Cursor c = mResolver.query(searchUri, null, null, null, null); 245a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov assertEquals(1, c.getCount()); 246a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov c.moveToFirst(); 247a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.clear(); 248a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 249a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov // SearchManager does not declare a constant for _id 250a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put("_id", contactId); 251a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_TEXT_1, expectedText1); 252a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_TEXT_2, expectedText2); 253a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 254a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov String icon1 = c.getString(c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_1)); 255a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov if (expectIcon1Uri) { 256a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov assertTrue(icon1.startsWith("content:")); 257a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov } else { 258a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov assertEquals(String.valueOf(com.android.internal.R.drawable.ic_contact_picture), icon1); 259a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov } 260a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 261a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_ICON_2, expectedIcon2); 262a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID, contactId); 263a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, contactId); 264a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov assertCursorValues(c, values); 265a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov c.close(); 266a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 267b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov // See if the same result is returned by a shortcut refresh 268b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov Uri shortcutsUri = ContactsContract.AUTHORITY_URI.buildUpon() 269b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov .appendPath(SearchManager.SUGGEST_URI_PATH_SHORTCUT).build(); 270b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov Uri refreshUri = ContentUris.withAppendedId(shortcutsUri, contactId); 271b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov 272b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov String[] projection = new String[]{ 273b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov SearchManager.SUGGEST_COLUMN_ICON_1, 274b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov SearchManager.SUGGEST_COLUMN_ICON_2, 275b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov SearchManager.SUGGEST_COLUMN_TEXT_1, 276b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov SearchManager.SUGGEST_COLUMN_TEXT_2, 277b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID, 278b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, 279b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov "_id", 280b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov }; 281b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov 282b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov c = mResolver.query(refreshUri, projection, null, null, null); 283b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov try { 284b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov assertEquals("Record count", 1, c.getCount()); 285b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov c.moveToFirst(); 286b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov assertCursorValues(c, values); 287b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov } finally { 288b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov c.close(); 289b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov } 290b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov 291a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov // Cleanup 292a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov mResolver.delete(rawContactUri, null, null); 293a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov } 294a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 295a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov public void testSearchSuggestionsByPhoneNumber() throws Exception { 296a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov ContentValues values = new ContentValues(); 297a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 298a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov Uri searchUri = new Uri.Builder().scheme("content").authority(ContactsContract.AUTHORITY) 299a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov .appendPath(SearchManager.SUGGEST_URI_PATH_QUERY).appendPath("12345").build(); 300a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 301a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov Cursor c = mResolver.query(searchUri, null, null, null, null); 302a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov DatabaseUtils.dumpCursor(c); 303a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov assertEquals(2, c.getCount()); 304a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov c.moveToFirst(); 305a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 306a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_TEXT_1, "Dial number"); 307a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_TEXT_2, "using 12345"); 308a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_ICON_1, 309a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov String.valueOf(com.android.internal.R.drawable.call_contact)); 310a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_INTENT_ACTION, 311a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov Intents.SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED); 312a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA, "tel:12345"); 313a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.putNull(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID); 314a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov assertCursorValues(c, values); 315a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 316a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov c.moveToNext(); 317a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.clear(); 318a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_TEXT_1, "Create contact"); 319a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_TEXT_2, "using 12345"); 320a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_ICON_1, 321a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov String.valueOf(com.android.internal.R.drawable.create_contact)); 322a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_INTENT_ACTION, 323a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov Intents.SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED); 324a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA, "tel:12345"); 325a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, 326a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov SearchManager.SUGGEST_NEVER_MAKE_SHORTCUT); 327a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov assertCursorValues(c, values); 328a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov c.close(); 329a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov } 330a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov} 331a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 332