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