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.net.Uri; 24a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikovimport android.provider.ContactsContract; 25244f914757fef93841d33a300a1b42a77ac80b2eDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.GroupMembership; 26174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikovimport android.provider.ContactsContract.Contacts; 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 749a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov public void testSearchSuggestionsByEmailWithPhoto() { 759a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov GoldenContact contact = new GoldenContactBuilder().name("Deer", "Dough").photo( 769a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov loadTestPhoto()).email("foo@acme.com").build(); 779a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov new SuggestionTesterBuilder(contact).query("foo@ac").expectIcon1Uri(true).expectedIcon2( 789a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov String.valueOf(StatusUpdates.getPresenceIconResourceId(StatusUpdates.OFFLINE))) 799a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov .expectedText1("Deer Dough").expectedText2("foo@acme.com").build().test(); 809a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov } 819a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov 82174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov public void testSearchSuggestionsByName() { 835b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill GoldenContact contact = new GoldenContactBuilder().name("Deer", "Dough").company("Google") 845b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill .build(); 855b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill new SuggestionTesterBuilder(contact).query("D").expectedText1("Deer Dough").expectedText2( 86174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov null).build().test(); 875b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 88a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 89174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov public void testSearchByNickname() { 905b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill GoldenContact contact = new GoldenContactBuilder().name("Deer", "Dough").nickname( 915b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill "Little Fawn").company("Google").build(); 925b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill new SuggestionTesterBuilder(contact).query("L").expectedText1("Deer Dough").expectedText2( 93174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov "Little Fawn").build().test(); 945b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 95a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 965b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public void testSearchByCompany() { 975b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill GoldenContact contact = new GoldenContactBuilder().name("Deer", "Dough").company("Google") 985b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill .build(); 995b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill new SuggestionTesterBuilder(contact).query("G").expectedText1("Deer Dough").expectedText2( 1005b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill "Google").build().test(); 1015b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 102b3f909fee75cb384fc381ec5ce70dd001669f945Dmitri Plotnikov 1035b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public void testSearchByTitleWithCompany() { 1045b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill GoldenContact contact = new GoldenContactBuilder().name("Deer", "Dough").company("Google") 1055b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill .title("Software Engineer").build(); 1065b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill new SuggestionTesterBuilder(contact).query("S").expectIcon1Uri(false).expectedText1( 107174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov "Deer Dough").expectedText2("Software Engineer, Google").build().test(); 108a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov } 109a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 1109a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov public void testSearchSuggestionsByPhoneNumberOnNonPhone() throws Exception { 1119a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov getContactsProvider().setIsPhone(false); 1129a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov 1139a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov GoldenContact contact = new GoldenContactBuilder().name("Deer", "Dough").photo( 1149a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov loadTestPhoto()).phone("1-800-4664-411").build(); 1159a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov new SuggestionTesterBuilder(contact).query("1800").expectIcon1Uri(true).expectedText1( 1169a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov "Deer Dough").expectedText2("1-800-4664-411").build().test(); 1179a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov } 1189a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov 1199a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov public void testSearchSuggestionsByPhoneNumberOnPhone() throws Exception { 1209a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov getContactsProvider().setIsPhone(true); 1219a6be1610fdf40c2f7f04cfe4b66fde3a35940dcDmitri Plotnikov 122a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov ContentValues values = new ContentValues(); 123a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 124a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov Uri searchUri = new Uri.Builder().scheme("content").authority(ContactsContract.AUTHORITY) 125280eaf5da5ab5086e82eac76d34e7ecd0bbf91f9Dave Santoro .appendPath(SearchManager.SUGGEST_URI_PATH_QUERY).appendPath("12345678").build(); 126a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 127a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov Cursor c = mResolver.query(searchUri, null, null, null, null); 128a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov assertEquals(2, c.getCount()); 129a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov c.moveToFirst(); 130a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 131a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_TEXT_1, "Dial number"); 132280eaf5da5ab5086e82eac76d34e7ecd0bbf91f9Dave Santoro values.put(SearchManager.SUGGEST_COLUMN_TEXT_2, "using 12345678"); 133a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_ICON_1, 134a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov String.valueOf(com.android.internal.R.drawable.call_contact)); 135a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_INTENT_ACTION, 136a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov Intents.SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED); 137280eaf5da5ab5086e82eac76d34e7ecd0bbf91f9Dave Santoro values.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA, "tel:12345678"); 138a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.putNull(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID); 139a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov assertCursorValues(c, values); 140a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 141a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov c.moveToNext(); 142a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.clear(); 143a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_TEXT_1, "Create contact"); 144280eaf5da5ab5086e82eac76d34e7ecd0bbf91f9Dave Santoro values.put(SearchManager.SUGGEST_COLUMN_TEXT_2, "using 12345678"); 145a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_ICON_1, 146a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov String.valueOf(com.android.internal.R.drawable.create_contact)); 147a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_INTENT_ACTION, 148a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov Intents.SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED); 149280eaf5da5ab5086e82eac76d34e7ecd0bbf91f9Dave Santoro values.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA, "tel:12345678"); 150a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, 151a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov SearchManager.SUGGEST_NEVER_MAKE_SHORTCUT); 152a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov assertCursorValues(c, values); 153a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov c.close(); 154a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov } 155a908fb5f39aa2021662a6cc317cc7e4db2d8bfb0Dmitri Plotnikov 1565b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 1572d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill * Tests that the quick search suggestion returns the expected contact 1585b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * information. 1595b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 1605b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private final class SuggestionTester { 1615b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 1625b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private final GoldenContact contact; 1635b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 1645b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private final String query; 1655b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 1665b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private final boolean expectIcon1Uri; 1675b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 1685b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private final String expectedIcon2; 1695b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 1705b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private final String expectedText1; 1715b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 1725b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private final String expectedText2; 1735b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 1745b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public SuggestionTester(SuggestionTesterBuilder builder) { 1755b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill contact = builder.contact; 1765b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill query = builder.query; 1775b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill expectIcon1Uri = builder.expectIcon1Uri; 1785b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill expectedIcon2 = builder.expectedIcon2; 1795b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill expectedText1 = builder.expectedText1; 1805b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill expectedText2 = builder.expectedText2; 1815b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 1825b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 1832d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill /** 1842d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill * Tests suggest and refresh queries from quick search box, then deletes the contact from 1852d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill * the data base. 1862d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill */ 1875b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public void test() { 1885b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 1892d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill testQsbSuggest(); 1902d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill testContactIdQsbRefresh(); 1912d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill testLookupKeyQsbRefresh(); 1922d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill 1932d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill // Cleanup 1942d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill contact.delete(); 1952d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill } 1962d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill 1972d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill /** 1982d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill * Tests that the contacts provider return the appropriate information from the golden 1992d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill * contact in response to the suggestion query from the quick search box. 2002d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill */ 2012d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill private void testQsbSuggest() { 2022d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill 2035b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill Uri searchUri = new Uri.Builder().scheme("content").authority( 2045b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill ContactsContract.AUTHORITY).appendPath(SearchManager.SUGGEST_URI_PATH_QUERY) 2055b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill .appendPath(query).build(); 2065b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 2075b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill Cursor c = mResolver.query(searchUri, null, null, null, null); 2085b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill assertEquals(1, c.getCount()); 2095b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill c.moveToFirst(); 2105b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 2115b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill String icon1 = c.getString(c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_1)); 2125b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill if (expectIcon1Uri) { 2135b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill assertTrue(icon1.startsWith("content:")); 2145b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } else { 2155b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill assertEquals(String.valueOf(com.android.internal.R.drawable.ic_contact_picture), 2165b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill icon1); 2175b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 2185b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 2192d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill // SearchManager does not declare a constant for _id 2202d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill ContentValues values = getContactValues(); 2215b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill assertCursorValues(c, values); 2225b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill c.close(); 2232d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill } 2242d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill 2252d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill /** 2262d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill * Returns the expected Quick Search Box content values for the golden contact. 2272d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill */ 2282d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill private ContentValues getContactValues() { 2292d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill 2302d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill ContentValues values = new ContentValues(); 2312d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill values.put("_id", contact.getContactId()); 2322d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill values.put(SearchManager.SUGGEST_COLUMN_TEXT_1, expectedText1); 2332d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill values.put(SearchManager.SUGGEST_COLUMN_TEXT_2, expectedText2); 2342d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill 2352d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill values.put(SearchManager.SUGGEST_COLUMN_ICON_2, expectedIcon2); 236174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA, 237174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov Contacts.getLookupUri(contact.getContactId(), contact.getLookupKey()) 238174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov .toString()); 239174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, contact.getLookupKey()); 240174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA, query); 241174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov return values; 242174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov } 243174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov 244174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov /** 245174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov * Returns the expected Quick Search Box content values for the golden contact. 246174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov */ 247174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov private ContentValues getRefreshValues() { 248174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov 249174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov ContentValues values = new ContentValues(); 250174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov values.put("_id", contact.getContactId()); 251174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_TEXT_1, expectedText1); 252174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_TEXT_2, expectedText2); 253174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov 254174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov values.put(SearchManager.SUGGEST_COLUMN_ICON_2, expectedIcon2); 2552d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill values.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID, contact.getLookupKey()); 2562d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill values.put(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, contact.getLookupKey()); 2572d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill return values; 2582d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill } 2592d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill 2602d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill /** 2612d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill * Performs the refresh query and returns a cursor to the results. 2622d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill * 2632d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill * @param refreshId the final component path of the refresh query, which identifies which 2642d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill * contact to refresh. 2652d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill */ 2662d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill private Cursor refreshQuery(String refreshId) { 2675b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 2685b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill // See if the same result is returned by a shortcut refresh 2692d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill Uri refershUri = ContactsContract.AUTHORITY_URI.buildUpon().appendPath( 2702d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill SearchManager.SUGGEST_URI_PATH_SHORTCUT) 271174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov .appendPath(refreshId) 272174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov .appendQueryParameter(SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA, query) 273174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov .build(); 2745b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 2755b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill String[] projection = new String[] { 2765b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill SearchManager.SUGGEST_COLUMN_ICON_1, SearchManager.SUGGEST_COLUMN_ICON_2, 2775b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill SearchManager.SUGGEST_COLUMN_TEXT_1, SearchManager.SUGGEST_COLUMN_TEXT_2, 2785b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID, 2795b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, "_id", 2805b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill }; 2815b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 2822d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill return mResolver.query(refershUri, projection, null, null, null); 2832d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill } 2842d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill 2852d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill /** 2862d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill * Tests that the contacts provider returns an empty result in response to a refresh query 2872d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill * from the quick search box that uses the contact id to identify the contact. The empty 2882d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill * result indicates that the shortcut is no longer valid, and the QSB will replace it with 2892d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill * a new-style shortcut the next time they click on the contact. 2902d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill * 2912d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill * @see #testLookupKeyQsbRefresh() 2922d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill */ 2932d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill private void testContactIdQsbRefresh() { 2942d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill 2952d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill Cursor c = refreshQuery(String.valueOf(contact.getContactId())); 2962d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill try { 2972d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill assertEquals("Record count", 0, c.getCount()); 2982d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill } finally { 2992d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill c.close(); 3002d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill } 3012d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill } 3022d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill 3032d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill /** 3042d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill * Tests that the contacts provider return the appropriate information from the golden 3052d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill * contact in response to the refresh query from the quick search box. The refresh query 3062d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill * uses the currently-supported mechanism of identifying the contact by the lookup key, 3072d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill * which is more stable than the previously used contact id. 3082d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill */ 3092d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill private void testLookupKeyQsbRefresh() { 3102d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill 3112d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill Cursor c = refreshQuery(contact.getLookupKey()); 3125b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill try { 3135b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill assertEquals("Record count", 1, c.getCount()); 3145b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill c.moveToFirst(); 315174f7d319b987aa2aeeb6f2563f4b939acb8d791Dmitri Plotnikov assertCursorValues(c, getRefreshValues()); 3165b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } finally { 3175b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill c.close(); 3185b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 3195b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 3205b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 3215b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 3225b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 3235b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * Builds {@link SuggestionTester} objects. Unspecified boolean objects default to 3245b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * false. Unspecified String objects default to null. 3255b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 3265b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private final class SuggestionTesterBuilder { 3275b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 3285b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private final GoldenContact contact; 3295b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 3305b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private String query; 3315b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 3325b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private boolean expectIcon1Uri; 3335b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 3345b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private String expectedIcon2; 3355b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 3365b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private String expectedText1; 3375b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 3385b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill private String expectedText2; 3395b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 3405b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public SuggestionTesterBuilder(GoldenContact contact) { 3415b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill this.contact = contact; 3425b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 3435b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 3445b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 3455b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * Builds the {@link SuggestionTester} specified by this builder. 3465b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 3475b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public SuggestionTester build() { 3485b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill return new SuggestionTester(this); 3495b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 3505b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 3515b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 3522d2ec88b7af615b2f05e987da45425be9cace1baTom O'Neill * The text of the user's query to quick search (i.e., what they typed 3535b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * in the search box). 3545b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 3555b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public SuggestionTesterBuilder query(String value) { 3565b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill query = value; 3575b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill return this; 3585b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 3595b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 3605b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 3615b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * Whether to set Icon1, which in practice is the contact's photo. 3625b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * <p> 3635b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * TODO(tomo): Replace with actual expected value? This might be hard 3645b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * because the values look non-deterministic, such as 3655b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * "content://com.android.contacts/contacts/2015/photo" 3665b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 3675b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public SuggestionTesterBuilder expectIcon1Uri(boolean value) { 3685b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill expectIcon1Uri = value; 3695b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill return this; 3705b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 3715b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 3725b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 3735b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * The value for Icon2, which in practice is the contact's Chat status 3745b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * (available, busy, etc.) 3755b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 3765b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public SuggestionTesterBuilder expectedIcon2(String value) { 3775b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill expectedIcon2 = value; 3785b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill return this; 3795b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 3805b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 3815b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 3825b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * First line of suggestion text expected to be returned (required). 3835b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 3845b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public SuggestionTesterBuilder expectedText1(String value) { 3855b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill expectedText1 = value; 3865b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill return this; 3875b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 3885b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill 3895b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill /** 3905b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill * Second line of suggestion text expected to return (optional). 3915b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill */ 3925b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill public SuggestionTesterBuilder expectedText2(String value) { 3935b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill expectedText2 = value; 3945b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill return this; 3955b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 3965b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill } 3975b3b3ec368625c07a2c94d2199a75099d4d9b8a9Tom O'Neill} 398