GlobalSearchSupportTest.java revision 244f914757fef93841d33a300a1b42a77ac80b2e
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.ContentValues;
22a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport android.database.Cursor;
23a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport android.database.DatabaseUtils;
24a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport android.net.Uri;
25a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport android.provider.ContactsContract;
26244f914757fef93841d33a300a1b42a77ac80b2eDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.GroupMembership;
27244f914757fef93841d33a300a1b42a77ac80b2eDmitri Plotnikovimport android.provider.ContactsContract.Data;
28a5d05d90333a70d471d78e82caeb5cfa2e4d4c59Tadashi G. Takaokaimport android.provider.ContactsContract.Intents;
2982bd858c9911dfbd8dca52dc276333768b0a429eDmitri Plotnikovimport android.provider.ContactsContract.StatusUpdates;
30a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport android.test.suitebuilder.annotation.LargeTest;
31a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
32a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov/**
33a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * Unit tests for {@link GlobalSearchSupport}.
345b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * <p>
35a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov * Run the test like this:
365b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * <p>
375b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * <code><pre>
388920a04b4a68ed6b548bcdef5ca8736dcf8b69b1Omari Stephens * adb shell am instrument -e class com.android.providers.contacts.GlobalSearchSupportTest -w \
39a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov *         com.android.providers.contacts.tests/android.test.InstrumentationTestRunner
405b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * </pre></code>
41a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov */
42a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov@LargeTest
43a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovpublic class GlobalSearchSupportTest extends BaseContactsProvider2Test {
445b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
45244f914757fef93841d33a300a1b42a77ac80b2eDmitri Plotnikov    public void testSearchSuggestionsNotInDefaultDirectory() throws Exception {
466bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov        Account account = new Account("actname", "acttype");
47244f914757fef93841d33a300a1b42a77ac80b2eDmitri Plotnikov
48244f914757fef93841d33a300a1b42a77ac80b2eDmitri Plotnikov        // Creating an AUTO_ADD group will exclude all ungrouped contacts from global search
49244f914757fef93841d33a300a1b42a77ac80b2eDmitri Plotnikov        createGroup(account, "any", "any", 0 /* visible */, true /* auto-add */, false /* fav */);
50244f914757fef93841d33a300a1b42a77ac80b2eDmitri Plotnikov
516bc46c9f22aaa9e68f344b171426fc686d3b536aDmitri Plotnikov        long rawContactId = createRawContact(account);
52a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        insertStructuredName(rawContactId, "Deer", "Dough");
53a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
54244f914757fef93841d33a300a1b42a77ac80b2eDmitri Plotnikov        // Remove the new contact from all groups
55244f914757fef93841d33a300a1b42a77ac80b2eDmitri Plotnikov        mResolver.delete(Data.CONTENT_URI, Data.RAW_CONTACT_ID + "=" + rawContactId
56244f914757fef93841d33a300a1b42a77ac80b2eDmitri Plotnikov                + " AND " + Data.MIMETYPE + "='" + GroupMembership.CONTENT_ITEM_TYPE + "'", null);
57244f914757fef93841d33a300a1b42a77ac80b2eDmitri Plotnikov
58a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        Uri searchUri = new Uri.Builder().scheme("content").authority(ContactsContract.AUTHORITY)
59a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov                .appendPath(SearchManager.SUGGEST_URI_PATH_QUERY).appendPath("D").build();
60a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
61a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        // If the contact is not in the "my contacts" group, nothing should be found
62a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        Cursor c = mResolver.query(searchUri, null, null, null, null);
63a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        assertEquals(0, c.getCount());
64a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        c.close();
65a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov    }
66a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
675b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    public void testSearchSuggestionsByNameWithPhoto() throws Exception {
685b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        GoldenContact contact = new GoldenContactBuilder().name("Deer", "Dough").photo(
695b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                loadTestPhoto()).build();
705b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        new SuggestionTesterBuilder(contact).query("D").expectIcon1Uri(true).expectedText1(
715b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                "Deer Dough").build().test();
72a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov    }
73a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
745b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    public void testSearchSuggestionsByNameWithPhotoAndCompany() throws Exception {
755b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        GoldenContact contact = new GoldenContactBuilder().name("Deer", "Dough").photo(
765b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                loadTestPhoto()).company("Google").build();
775b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        new SuggestionTesterBuilder(contact).query("D").expectIcon1Uri(true).expectedText1(
785b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                "Deer Dough").expectedText2("Google").build().test();
795b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    }
80a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
815b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    public void testSearchSuggestionsByNameWithPhotoAndPhone() {
825b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        GoldenContact contact = new GoldenContactBuilder().name("Deer", "Dough").photo(
835b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                loadTestPhoto()).phone("1-800-4664-411").build();
845b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        new SuggestionTesterBuilder(contact).query("D").expectIcon1Uri(true).expectedText1(
855b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                "Deer Dough").expectedText2("1-800-4664-411").build().test();
865b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    }
87a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
885b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    public void testSearchSuggestionsByNameWithPhotoAndEmail() {
895b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        GoldenContact contact = new GoldenContactBuilder().name("Deer", "Dough").photo(
905b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                loadTestPhoto()).email("foo@acme.com").build();
915b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        new SuggestionTesterBuilder(contact).query("D").expectIcon1Uri(true).expectedIcon2(
925b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                String.valueOf(StatusUpdates.getPresenceIconResourceId(StatusUpdates.OFFLINE)))
935b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                .expectedText1("Deer Dough").expectedText2("foo@acme.com").build().test();
945b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    }
95a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
965b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    public void testSearchSuggestionsByNameWithCompany() {
975b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        GoldenContact contact = new GoldenContactBuilder().name("Deer", "Dough").company("Google")
985b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                .build();
995b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        new SuggestionTesterBuilder(contact).query("D").expectedText1("Deer Dough").expectedText2(
1005b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                "Google").build().test();
1015b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    }
102a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
1035b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    public void testSearchByNicknameWithCompany() {
1045b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        GoldenContact contact = new GoldenContactBuilder().name("Deer", "Dough").nickname(
1055b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                "Little Fawn").company("Google").build();
1065b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        new SuggestionTesterBuilder(contact).query("L").expectedText1("Deer Dough").expectedText2(
1075b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                "Google").build().test();
1085b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    }
109a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
1105b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    public void testSearchByCompany() {
1115b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        GoldenContact contact = new GoldenContactBuilder().name("Deer", "Dough").company("Google")
1125b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                .build();
1135b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        new SuggestionTesterBuilder(contact).query("G").expectedText1("Deer Dough").expectedText2(
1145b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                "Google").build().test();
1155b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    }
116b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov
1175b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    public void testSearchByTitleWithCompany() {
1185b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        GoldenContact contact = new GoldenContactBuilder().name("Deer", "Dough").company("Google")
1195b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                .title("Software Engineer").build();
1205b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        new SuggestionTesterBuilder(contact).query("S").expectIcon1Uri(false).expectedText1(
1215b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                "Deer Dough").expectedText2("Google").build().test();
122a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov    }
123a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
124a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov    public void testSearchSuggestionsByPhoneNumber() throws Exception {
125a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        ContentValues values = new ContentValues();
126a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
127a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        Uri searchUri = new Uri.Builder().scheme("content").authority(ContactsContract.AUTHORITY)
128a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov                .appendPath(SearchManager.SUGGEST_URI_PATH_QUERY).appendPath("12345").build();
129a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
130a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        Cursor c = mResolver.query(searchUri, null, null, null, null);
131a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        DatabaseUtils.dumpCursor(c);
132a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        assertEquals(2, c.getCount());
133a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        c.moveToFirst();
134a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
135a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        values.put(SearchManager.SUGGEST_COLUMN_TEXT_1, "Dial number");
136a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        values.put(SearchManager.SUGGEST_COLUMN_TEXT_2, "using 12345");
137a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        values.put(SearchManager.SUGGEST_COLUMN_ICON_1,
138a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov                String.valueOf(com.android.internal.R.drawable.call_contact));
139a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        values.put(SearchManager.SUGGEST_COLUMN_INTENT_ACTION,
140a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov                Intents.SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED);
141a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        values.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA, "tel:12345");
142a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        values.putNull(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID);
143a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        assertCursorValues(c, values);
144a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
145a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        c.moveToNext();
146a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        values.clear();
147a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        values.put(SearchManager.SUGGEST_COLUMN_TEXT_1, "Create contact");
148a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        values.put(SearchManager.SUGGEST_COLUMN_TEXT_2, "using 12345");
149a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        values.put(SearchManager.SUGGEST_COLUMN_ICON_1,
150a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov                String.valueOf(com.android.internal.R.drawable.create_contact));
151a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        values.put(SearchManager.SUGGEST_COLUMN_INTENT_ACTION,
152a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov                Intents.SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED);
153a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        values.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA, "tel:12345");
154a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        values.put(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID,
155a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov                SearchManager.SUGGEST_NEVER_MAKE_SHORTCUT);
156a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        assertCursorValues(c, values);
157a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov        c.close();
158a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov    }
159a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov
1605b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    /**
1612d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill     * Tests that the quick search suggestion returns the expected contact
1625b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill     * information.
1635b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill     */
1645b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    private final class SuggestionTester {
1655b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
1665b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        private final GoldenContact contact;
1675b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
1685b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        private final String query;
1695b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
1705b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        private final boolean expectIcon1Uri;
1715b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
1725b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        private final String expectedIcon2;
1735b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
1745b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        private final String expectedText1;
1755b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
1765b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        private final String expectedText2;
1775b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
1785b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        public SuggestionTester(SuggestionTesterBuilder builder) {
1795b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            contact = builder.contact;
1805b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            query = builder.query;
1815b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            expectIcon1Uri = builder.expectIcon1Uri;
1825b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            expectedIcon2 = builder.expectedIcon2;
1835b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            expectedText1 = builder.expectedText1;
1845b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            expectedText2 = builder.expectedText2;
1855b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        }
1865b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
1872d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        /**
1882d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * Tests suggest and refresh queries from quick search box, then deletes the contact from
1892d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * the data base.
1902d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         */
1915b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        public void test() {
1925b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
1932d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            testQsbSuggest();
1942d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            testContactIdQsbRefresh();
1952d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            testLookupKeyQsbRefresh();
1962d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill
1972d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            // Cleanup
1982d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            contact.delete();
1992d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        }
2002d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill
2012d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        /**
2022d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * Tests that the contacts provider return the appropriate information from the golden
2032d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * contact in response to the suggestion query from the quick search box.
2042d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         */
2052d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        private void testQsbSuggest() {
2062d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill
2075b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            Uri searchUri = new Uri.Builder().scheme("content").authority(
2085b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                    ContactsContract.AUTHORITY).appendPath(SearchManager.SUGGEST_URI_PATH_QUERY)
2095b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                    .appendPath(query).build();
2105b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
2115b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            Cursor c = mResolver.query(searchUri, null, null, null, null);
2125b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            assertEquals(1, c.getCount());
2135b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            c.moveToFirst();
2145b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
2155b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            String icon1 = c.getString(c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_1));
2165b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            if (expectIcon1Uri) {
2175b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                assertTrue(icon1.startsWith("content:"));
2185b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            } else {
2195b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                assertEquals(String.valueOf(com.android.internal.R.drawable.ic_contact_picture),
2205b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                        icon1);
2215b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            }
2225b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
2232d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            // SearchManager does not declare a constant for _id
2242d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            ContentValues values = getContactValues();
2255b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            assertCursorValues(c, values);
2265b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            c.close();
2272d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        }
2282d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill
2292d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        /**
2302d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * Returns the expected Quick Search Box content values for the golden contact.
2312d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         */
2322d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        private ContentValues getContactValues() {
2332d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill
2342d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            ContentValues values = new ContentValues();
2352d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            values.put("_id", contact.getContactId());
2362d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            values.put(SearchManager.SUGGEST_COLUMN_TEXT_1, expectedText1);
2372d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            values.put(SearchManager.SUGGEST_COLUMN_TEXT_2, expectedText2);
2382d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill
2392d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            values.put(SearchManager.SUGGEST_COLUMN_ICON_2, expectedIcon2);
2402d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            values.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID, contact.getLookupKey());
2412d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            values.put(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, contact.getLookupKey());
2422d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            return values;
2432d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        }
2442d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill
2452d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        /**
2462d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * Performs the refresh query and returns a cursor to the results.
2472d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         *
2482d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * @param refreshId the final component path of the refresh query, which identifies which
2492d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         *        contact to refresh.
2502d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         */
2512d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        private Cursor refreshQuery(String refreshId) {
2525b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
2535b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            // See if the same result is returned by a shortcut refresh
2542d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            Uri refershUri = ContactsContract.AUTHORITY_URI.buildUpon().appendPath(
2552d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill                    SearchManager.SUGGEST_URI_PATH_SHORTCUT)
2562d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill                    .appendPath(refreshId).build();
2575b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
2585b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            String[] projection = new String[] {
2595b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                    SearchManager.SUGGEST_COLUMN_ICON_1, SearchManager.SUGGEST_COLUMN_ICON_2,
2605b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                    SearchManager.SUGGEST_COLUMN_TEXT_1, SearchManager.SUGGEST_COLUMN_TEXT_2,
2615b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                    SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID,
2625b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                    SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, "_id",
2635b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            };
2645b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
2652d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            return mResolver.query(refershUri, projection, null, null, null);
2662d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        }
2672d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill
2682d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        /**
2692d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * Tests that the contacts provider returns an empty result in response to a refresh query
2702d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * from the quick search box that uses the contact id to identify the contact.  The empty
2712d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * result indicates that the shortcut is no longer valid, and the QSB will replace it with
2722d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * a new-style shortcut the next time they click on the contact.
2732d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         *
2742d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * @see #testLookupKeyQsbRefresh()
2752d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         */
2762d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        private void testContactIdQsbRefresh() {
2772d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill
2782d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            Cursor c = refreshQuery(String.valueOf(contact.getContactId()));
2792d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            try {
2802d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill                assertEquals("Record count", 0, c.getCount());
2812d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            } finally {
2822d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill                c.close();
2832d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            }
2842d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        }
2852d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill
2862d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        /**
2872d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * Tests that the contacts provider return the appropriate information from the golden
2882d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * contact in response to the refresh query from the quick search box.  The refresh query
2892d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * uses the currently-supported mechanism of identifying the contact by the lookup key,
2902d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * which is more stable than the previously used contact id.
2912d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         */
2922d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill        private void testLookupKeyQsbRefresh() {
2932d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill
2942d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill            Cursor c = refreshQuery(contact.getLookupKey());
2955b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            try {
2965b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                assertEquals("Record count", 1, c.getCount());
2975b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                c.moveToFirst();
2982d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill                assertCursorValues(c, getContactValues());
2995b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            } finally {
3005b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill                c.close();
3015b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            }
3025b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        }
3035b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    }
3045b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
3055b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    /**
3065b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill     * Builds {@link SuggestionTester} objects. Unspecified boolean objects default to
3075b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill     * false. Unspecified String objects default to null.
3085b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill     */
3095b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    private final class SuggestionTesterBuilder {
3105b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
3115b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        private final GoldenContact contact;
3125b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
3135b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        private String query;
3145b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
3155b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        private boolean expectIcon1Uri;
3165b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
3175b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        private String expectedIcon2;
3185b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
3195b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        private String expectedText1;
3205b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
3215b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        private String expectedText2;
3225b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
3235b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        public SuggestionTesterBuilder(GoldenContact contact) {
3245b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            this.contact = contact;
3255b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        }
3265b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
3275b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        /**
3285b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         * Builds the {@link SuggestionTester} specified by this builder.
3295b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         */
3305b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        public SuggestionTester build() {
3315b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            return new SuggestionTester(this);
3325b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        }
3335b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
3345b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        /**
3352d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill         * The text of the user's query to quick search (i.e., what they typed
3365b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         * in the search box).
3375b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         */
3385b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        public SuggestionTesterBuilder query(String value) {
3395b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            query = value;
3405b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            return this;
3415b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        }
3425b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
3435b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        /**
3445b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         * Whether to set Icon1, which in practice is the contact's photo.
3455b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         * <p>
3465b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         * TODO(tomo): Replace with actual expected value? This might be hard
3475b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         * because the values look non-deterministic, such as
3485b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         * "content://com.android.contacts/contacts/2015/photo"
3495b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         */
3505b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        public SuggestionTesterBuilder expectIcon1Uri(boolean value) {
3515b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            expectIcon1Uri = value;
3525b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            return this;
3535b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        }
3545b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
3555b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        /**
3565b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         * The value for Icon2, which in practice is the contact's Chat status
3575b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         * (available, busy, etc.)
3585b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         */
3595b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        public SuggestionTesterBuilder expectedIcon2(String value) {
3605b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            expectedIcon2 = value;
3615b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            return this;
3625b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        }
3635b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
3645b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        /**
3655b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         * First line of suggestion text expected to be returned (required).
3665b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         */
3675b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        public SuggestionTesterBuilder expectedText1(String value) {
3685b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            expectedText1 = value;
3695b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            return this;
3705b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        }
3715b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill
3725b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        /**
3735b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         * Second line of suggestion text expected to return (optional).
3745b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill         */
3755b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        public SuggestionTesterBuilder expectedText2(String value) {
3765b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            expectedText2 = value;
3775b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill            return this;
3785b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill        }
3795b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill    }
3805b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill}
381