11dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze/* 2ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze * Copyright (C) 2017 The Android Open Source Project 31dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * 41dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * Licensed under the Apache License, Version 2.0 (the "License"); 51dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * you may not use this file except in compliance with the License. 61dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * You may obtain a copy of the License at 71dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * 81dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * http://www.apache.org/licenses/LICENSE-2.0 91dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * 101dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * Unless required by applicable law or agreed to in writing, software 111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * distributed under the License is distributed on an "AS IS" BASIS, 121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * See the License for the specific language governing permissions and 141dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * limitations under the License. 151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * 161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze */ 171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 182078bc2358031ef3a191900d9036daf4251911c1Matthew Fritzepackage com.android.settings.search; 191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 20f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhangimport static android.provider.SearchIndexablesContract.INDEXABLES_RAW_COLUMNS; 21f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhangimport static com.google.common.truth.Truth.assertThat; 22f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhangimport static org.mockito.Matchers.any; 23f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhangimport static org.mockito.Matchers.anyInt; 24f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhangimport static org.mockito.Matchers.anyList; 25f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhangimport static org.mockito.Matchers.anyMap; 26f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhangimport static org.mockito.Matchers.anyString; 27f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhangimport static org.mockito.Mockito.doNothing; 28f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhangimport static org.mockito.Mockito.doReturn; 29f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhangimport static org.mockito.Mockito.mock; 30f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhangimport static org.mockito.Mockito.spy; 31f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhangimport static org.mockito.Mockito.times; 32f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhangimport static org.mockito.Mockito.verify; 33f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhangimport static org.mockito.Mockito.when; 34f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang 35ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.annotation.NonNull; 36ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.annotation.Nullable; 37ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.content.ContentProvider; 38ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.content.ContentValues; 391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport android.content.Context; 40ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.content.Intent; 41f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhangimport android.content.pm.ApplicationInfo; 42ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.content.pm.PackageManager; 43ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.content.pm.ProviderInfo; 44ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.content.pm.ResolveInfo; 451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport android.database.Cursor; 46ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.database.MatrixCursor; 471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport android.database.sqlite.SQLiteDatabase; 48ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.net.Uri; 49a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritzeimport android.os.Build; 501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport android.provider.SearchIndexableResource; 51ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.util.ArrayMap; 52012028e3a320dd3eeca3c39f0e47c1c40697bdf6Fan Zhang 531dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport com.android.settings.R; 541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport com.android.settings.TestConfig; 55a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhangimport com.android.settings.testutils.DatabaseTestUtils; 56f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhangimport com.android.settings.testutils.FakeFeatureFactory; 57f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhangimport com.android.settings.testutils.SettingsRobolectricTestRunner; 58ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport com.android.settings.testutils.shadow.ShadowDatabaseIndexingUtils; 59ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport com.android.settings.testutils.shadow.ShadowRunnableAsyncTask; 60012028e3a320dd3eeca3c39f0e47c1c40697bdf6Fan Zhang 611dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport org.junit.After; 621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport org.junit.Before; 631dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport org.junit.Test; 641dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport org.junit.runner.RunWith; 65ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport org.mockito.Mock; 66ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport org.mockito.MockitoAnnotations; 67be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritzeimport org.robolectric.Robolectric; 68ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport org.robolectric.RuntimeEnvironment; 691dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport org.robolectric.annotation.Config; 70ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport org.robolectric.shadows.ShadowContentResolver; 711dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 721dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport java.util.ArrayList; 731dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport java.util.Arrays; 741dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport java.util.HashMap; 75ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport java.util.HashSet; 761dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport java.util.List; 771dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport java.util.Locale; 783f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritzeimport java.util.Map; 79ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport java.util.Set; 801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 811dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze@RunWith(SettingsRobolectricTestRunner.class) 82739b0eef10b9701282712f905a4904cad54ad2c8Daniel Nishi@Config( 83739b0eef10b9701282712f905a4904cad54ad2c8Daniel Nishi manifest = TestConfig.MANIFEST_PATH, 84739b0eef10b9701282712f905a4904cad54ad2c8Daniel Nishi sdk = TestConfig.SDK_VERSION, 85739b0eef10b9701282712f905a4904cad54ad2c8Daniel Nishi shadows = { 86739b0eef10b9701282712f905a4904cad54ad2c8Daniel Nishi ShadowRunnableAsyncTask.class, 87739b0eef10b9701282712f905a4904cad54ad2c8Daniel Nishi ShadowDatabaseIndexingUtils.class, 88739b0eef10b9701282712f905a4904cad54ad2c8Daniel Nishi ShadowContentResolver.class 89739b0eef10b9701282712f905a4904cad54ad2c8Daniel Nishi } 90739b0eef10b9701282712f905a4904cad54ad2c8Daniel Nishi) 911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzepublic class DatabaseIndexingManagerTest { 921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze private final String localeStr = "en_US"; 931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 943f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze private final int rank = 8; 951dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze private final String title = "title\u2011title"; 961dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze private final String updatedTitle = "title-title"; 971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze private final String normalizedTitle = "titletitle"; 981dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze private final String summaryOn = "summary\u2011on"; 991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze private final String updatedSummaryOn = "summary-on"; 1001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze private final String normalizedSummaryOn = "summaryon"; 1011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze private final String summaryOff = "summary\u2011off"; 102a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang private final String updatedSummaryOff = "summary-off"; 1031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze private final String normalizedSummaryOff = "summaryoff"; 1041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze private final String entries = "entries"; 1051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze private final String keywords = "keywords, keywordss, keywordsss"; 1061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze private final String spaceDelimittedKeywords = "keywords keywordss keywordsss"; 1071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze private final String screenTitle = "screen title"; 1081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze private final String className = "class name"; 1091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze private final int iconResId = 0xff; 1105416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze private final int noIcon = 0; 1111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze private final String action = "action"; 1121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze private final String targetPackage = "target package"; 1131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze private final String targetClass = "target class"; 1141dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze private final String packageName = "package name"; 1151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze private final String key = "key"; 1161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze private final int userId = -1; 1171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze private final boolean enabled = true; 1181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 119ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze private final String AUTHORITY_ONE = "authority"; 120ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze private final String PACKAGE_ONE = "com.android.settings"; 121ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 122ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze private final String TITLE_ONE = "title one"; 123ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze private final String TITLE_TWO = "title two"; 124ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze private final String KEY_ONE = "key one"; 125ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze private final String KEY_TWO = "key two"; 126ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 1271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze private Context mContext; 128ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 1291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze private DatabaseIndexingManager mManager; 1301dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze private SQLiteDatabase mDb; 1311dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 132ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze @Mock 133ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze private PackageManager mPackageManager; 134ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 1351dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze @Before 1361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze public void setUp() { 137ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze MockitoAnnotations.initMocks(this); 138ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze mContext = spy(RuntimeEnvironment.application); 139a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze mManager = spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE)); 1401dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze mDb = IndexDatabaseHelper.getInstance(mContext).getWritableDatabase(); 141ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 142ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze doReturn(mPackageManager).when(mContext).getPackageManager(); 14398a9e42c93deaf5bb5f3028971065cc910e8d51fMatthew Fritze FakeFeatureFactory.setupForTest(mContext); 1441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze } 1451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 1461dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze @After 1471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze public void cleanUp() { 148012028e3a320dd3eeca3c39f0e47c1c40697bdf6Fan Zhang DatabaseTestUtils.clearDb(mContext); 1491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze } 1501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 1511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze @Test 1521dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze public void testDatabaseSchema() { 1531dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze Cursor dbCursor = mDb.query("prefs_index", null, null, null, null, null, null); 1541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze List<String> columnNames = new ArrayList<>(Arrays.asList(dbCursor.getColumnNames())); 1551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Note that docid is not included. 156a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang List<String> expColumnNames = new ArrayList<>(Arrays.asList(new String[]{ 1571dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze "locale", 1581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze "data_rank", 1591dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze "data_title", 1601dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze "data_title_normalized", 1611dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze "data_summary_on", 1621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze "data_summary_on_normalized", 1631dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze "data_summary_off", 1641dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze "data_summary_off_normalized", 1651dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze "data_entries", 1661dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze "data_keywords", 1671dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze "class_name", 1681dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze "screen_title", 1691dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze "intent_action", 1701dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze "intent_target_package", 1711dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze "intent_target_class", 1721dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze "icon", 1731dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze "enabled", 1741dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze "data_key_reference", 1751dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze "user_id", 1761dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze "payload_type", 1771dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze "payload" 1781dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze })); 1791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Prevent database schema regressions 1801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(columnNames).containsAllIn(expColumnNames); 1811dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze } 1821dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 1831dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Tests for the flow: IndexOneRaw -> UpdateOneRowWithFilteredData -> UpdateOneRow 1841dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 1851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze @Test 186ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze public void testInsertRawColumn_rowInserted() { 1871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze SearchIndexableRaw raw = getFakeRaw(); 188bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze mManager.indexOneSearchIndexableData(mDb, localeStr, raw, 189bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze new HashMap<>()/* Non-indexable keys */); 1901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null); 1911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getCount()).isEqualTo(1); 1921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze } 1931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 1941dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze @Test 195bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze public void testInsertRawColumn_nonIndexableKey_resultIsDisabled() { 196bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze SearchIndexableRaw raw = getFakeRaw(); 197bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze Map<String, Set<String>> niks = new HashMap<>(); 198bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze Set<String> keys = new HashSet<>(); 199bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze keys.add(raw.key); 200bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze niks.put(raw.intentTargetPackage, keys); 201bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze 202bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze mManager.indexOneSearchIndexableData(mDb, localeStr, raw, niks); 203bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 0", null); 204bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze assertThat(cursor.getCount()).isEqualTo(1); 205bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze } 206bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze 207bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze @Test 208ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze public void testInsertRawColumn_rowMatches() { 2091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze SearchIndexableRaw raw = getFakeRaw(); 210bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze mManager.indexOneSearchIndexableData(mDb, localeStr, raw, 211bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze new HashMap<>()/* Non-indexable keys */); 2121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null); 2131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze cursor.moveToPosition(0); 2141dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 2151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Locale 2161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(0)).isEqualTo(localeStr); 2171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Data Rank 2181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getInt(1)).isEqualTo(raw.rank); 2191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Data Title 2201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(2)).isEqualTo(updatedTitle); 2211dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Normalized Title 2221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(3)).isEqualTo(normalizedTitle); 2231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Summary On 2241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(4)).isEqualTo(updatedSummaryOn); 2251dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Summary On Normalized 2261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(5)).isEqualTo(normalizedSummaryOn); 2271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Summary Off 2281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(6)).isEqualTo(updatedSummaryOff); 2291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Summary off normalized 2301dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(7)).isEqualTo(normalizedSummaryOff); 2311dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Entries 2321dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(8)).isEqualTo(raw.entries); 2331dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Keywords 2341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(9)).isEqualTo(spaceDelimittedKeywords); 2351dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Screen Title 2361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(10)).isEqualTo(raw.screenTitle); 2371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Class Name 2381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(11)).isEqualTo(raw.className); 2391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Icon 2401dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getInt(12)).isEqualTo(raw.iconResId); 2411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Intent Action 2421dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(13)).isEqualTo(raw.intentAction); 2431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Target Package 2441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(14)).isEqualTo(raw.intentTargetPackage); 2451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Target Class 2461dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(15)).isEqualTo(raw.intentTargetClass); 2471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Enabled 2481dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getInt(16) == 1).isEqualTo(raw.enabled); 2491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Data ref key 2501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(17)).isNotNull(); 2511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // User Id 2521dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getInt(18)).isEqualTo(raw.userId); 2531dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Payload Type - default is 0 2541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getInt(19)).isEqualTo(0); 2551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Payload 2563746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze byte[] payload = cursor.getBlob(20); 2573746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload, 2583746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze ResultPayload.CREATOR); 2593746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class); 2601dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze } 2611dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 2621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze @Test 263ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze public void testInsertRawColumn_mismatchedLocale_noRowInserted() { 2641dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze SearchIndexableRaw raw = getFakeRaw("ca-fr"); 2651dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze mManager.indexOneSearchIndexableData(mDb, localeStr, raw, null /* Non-indexable keys */); 2661dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null); 2671dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getCount()).isEqualTo(0); 2681dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze } 2691dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 2701dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Tests for the flow: IndexOneResource -> IndexFromResource -> 2711dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // UpdateOneRowWithFilteredData -> UpdateOneRow 2721dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 2731dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze @Test 2741dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze public void testNullResource_NothingInserted() { 2751dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze mManager.indexOneSearchIndexableData(mDb, localeStr, null /* searchIndexableResource */, 276248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang new HashMap<>()); 2771dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null); 2781dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getCount()).isEqualTo(0); 2791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze } 2801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 2811dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze @Test 2821dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze public void testAddResource_RowsInserted() { 283dc9a82f5b017f430aa7d50f12450082f1bdc871eFan Zhang SearchIndexableResource resource = getFakeResource(R.xml.display_settings); 284ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>()); 2851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null); 286305f900bfa42a4ecc3a7b8d1454331d8ad8d76a9Romain Guy assertThat(cursor.getCount()).isEqualTo(17); 2871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze } 2881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 2891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze @Test 290ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze public void testAddResource_withNIKs_rowsInsertedDisabled() { 291dc9a82f5b017f430aa7d50f12450082f1bdc871eFan Zhang SearchIndexableResource resource = getFakeResource(R.xml.display_settings); 292d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling // Only add 2 of 16 items to be disabled. 293d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling String[] keys = {"brightness", "wallpaper"}; 294ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze Map<String, Set<String>> niks = getNonIndexableKeys(keys); 295ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 2963f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze mManager.indexOneSearchIndexableData(mDb, localeStr, resource, niks); 2973f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze 2983f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 0", null); 2993f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze assertThat(cursor.getCount()).isEqualTo(2); 3003f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 1", null); 301305f900bfa42a4ecc3a7b8d1454331d8ad8d76a9Romain Guy assertThat(cursor.getCount()).isEqualTo(15); 3023f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze } 3033f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze 3043f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze @Test 305ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze public void testAddResourceHeader_rowsMatch() { 3061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze SearchIndexableResource resource = getFakeResource(R.xml.application_settings); 307ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>()); 3081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 3091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null); 3101dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze cursor.moveToPosition(1); 3111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 3121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Locale 3131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(0)).isEqualTo(localeStr); 3141dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Data Rank 3151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getInt(1)).isEqualTo(rank); 3161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Data Title 317015a50bef99a23a8c795486b99021a5784d65d64Doris Ling assertThat(cursor.getString(2)).isEqualTo("App info"); 3181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Normalized Title 319015a50bef99a23a8c795486b99021a5784d65d64Doris Ling assertThat(cursor.getString(3)).isEqualTo("app info"); 3201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Summary On 3211dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(4)).isEqualTo("Manage apps, set up quick launch shortcuts"); 3221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Summary On Normalized 3231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(5)).isEqualTo("manage apps, set up quick launch shortcuts"); 3241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Summary Off - only on for checkbox preferences 3251dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(6)).isEmpty(); 3261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Summary off normalized - only on for checkbox preferences 3271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(7)).isEmpty(); 3281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Entries - only on for list preferences 3291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(8)).isNull(); 3301dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Keywords 3311dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(9)).isEmpty(); 3321dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Screen Title 333015a50bef99a23a8c795486b99021a5784d65d64Doris Ling assertThat(cursor.getString(10)).isEqualTo("App info"); 3341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Class Name 3351dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(11)).isEqualTo(className); 3361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Icon 337d0b42b03229225571ed060a377a0f72264058db6Matthew Fritze assertThat(cursor.getInt(12)).isEqualTo(0); 3381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Intent Action 3391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(13)).isEqualTo(action); 3401dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Target Package 3411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(14)).isEqualTo(targetPackage); 3421dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Target Class 3431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(15)).isEqualTo(targetClass); 3441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Enabled 3451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getInt(16) == 1).isEqualTo(enabled); 3461dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Data ref key 3471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(17)).isEqualTo("applications_settings"); 3481dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // User Id 3491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getInt(18)).isEqualTo(userId); 3501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Payload Type - default is 0 3511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getInt(19)).isEqualTo(0); 3521dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Payload - should be updated to real payloads as controllers are added 3533746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze byte[] payload = cursor.getBlob(20); 3543746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload, 3553746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze ResultPayload.CREATOR); 3563746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class); 3571dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze } 3581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 3591dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze @Test 360ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze public void testAddResource_withChildFragment_shouldUpdateSiteMapDb() { 361f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam // FIXME: This test was failing. (count = 6 at the end) 362f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam 363f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam// SearchIndexableResource resource = getFakeResource(R.xml.network_and_internet); 364f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam// mManager.indexOneSearchIndexableData(mDb, localeStr, resource, 365f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam// new HashMap<>()); 366f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam// Cursor query = mDb.query(IndexDatabaseHelper.Tables.TABLE_SITE_MAP, SITE_MAP_COLUMNS, 367f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam// null, null, null, null, null); 368f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam// query.moveToPosition(-1); 369f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam// int count = 0; 370f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam// while (query.moveToNext()) { 371f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam// count++; 372f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam// assertThat(query.getString(query.getColumnIndex(SiteMapColumns.PARENT_CLASS))) 373f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam// .isEqualTo(className); 374f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam// assertThat(query.getString(query.getColumnIndex(SiteMapColumns.PARENT_TITLE))) 375f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam// .isEqualTo(mContext.getString(R.string.network_dashboard_title)); 376f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam// assertThat(query.getString(query.getColumnIndex(SiteMapColumns.CHILD_CLASS))) 377f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam// .isNotEmpty(); 378f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam// assertThat(query.getString(query.getColumnIndex(SiteMapColumns.CHILD_TITLE))) 379f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam// .isNotEmpty(); 380f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam// } 381f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam// assertThat(count).isEqualTo(5); 382a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang } 383a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang 384a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang @Test 385ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze public void testAddResource_customSetting_rowsMatch() { 386d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling SearchIndexableResource resource = getFakeResource(R.xml.swipe_to_notification_settings); 387ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>()); 388248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang final String prefTitle = 389248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang mContext.getString(R.string.fingerprint_swipe_for_notifications_title); 390248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang final String prefSummary = 391248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang mContext.getString(R.string.fingerprint_swipe_for_notifications_summary); 39282be5f0c3fa4b9511e1e7e4c4e9c20cf31a8294fFan Zhang final String keywords = mContext.getString(R.string.keywords_gesture); 393248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang Cursor cursor = mDb.rawQuery( 394248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang "SELECT * FROM prefs_index where data_title='" + prefTitle + "'", null); 395248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang cursor.moveToFirst(); 3961dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 3971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Locale 3981dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(0)).isEqualTo(localeStr); 3991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Data Rank 4001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getInt(1)).isEqualTo(rank); 4011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Data Title 402248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang assertThat(cursor.getString(2)).isEqualTo(prefTitle); 4031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Normalized Title 404248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang assertThat(cursor.getString(3)).isEqualTo(prefTitle.toLowerCase()); 4051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Summary On 406248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang assertThat(cursor.getString(4)).isEqualTo(prefSummary); 4071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Summary On Normalized 408248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang assertThat(cursor.getString(5)).isEqualTo(prefSummary.toLowerCase()); 4091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Summary Off - only on for checkbox preferences 4101dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(6)).isEmpty(); 4111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Summary off normalized - only on for checkbox preferences 4121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(7)).isEmpty(); 4131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Entries - only on for list preferences 4141dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(8)).isNull(); 4151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Keywords 41682be5f0c3fa4b9511e1e7e4c4e9c20cf31a8294fFan Zhang assertThat(cursor.getString(9)).isEqualTo(keywords); 4171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Screen Title 418248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang assertThat(cursor.getString(10)).isEqualTo( 419d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling mContext.getString(R.string.fingerprint_swipe_for_notifications_title)); 4201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Class Name 4211dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(11)).isEqualTo(className); 4221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Icon 4235416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze assertThat(cursor.getInt(12)).isEqualTo(noIcon); 4241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Intent Action 4251dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(13)).isEqualTo(action); 4261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Target Package 4271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(14)).isEqualTo(targetPackage); 4281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Target Class 4291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(15)).isEqualTo(targetClass); 4301dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Enabled 4311dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getInt(16) == 1).isEqualTo(enabled); 4321dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Data ref key 4331dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(17)).isEqualTo("gesture_swipe_down_fingerprint"); 4341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // User Id 4351dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getInt(18)).isEqualTo(userId); 4361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Payload Type - default is 0 4371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getInt(19)).isEqualTo(0); 4381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Payload - should be updated to real payloads as controllers are added 4393746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze byte[] payload = cursor.getBlob(20); 4403746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload, 4413746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze ResultPayload.CREATOR); 4423746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class); 4431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze } 4441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 4451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze @Test 446ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze public void testAddResource_checkboxPreference_rowsMatch() { 4471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze SearchIndexableResource resource = getFakeResource(R.xml.application_settings); 448ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>()); 4491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 4501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze /* Should return 6 results, with the following titles: 4511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze * Advanced Settings, Apps, Manage Apps, Preferred install location, Running Services 4521dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze */ 4531dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null); 4541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze cursor.moveToPosition(0); 4551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Locale 4561dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(0)).isEqualTo(localeStr); 4571dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Data Rank 4581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getInt(1)).isEqualTo(rank); 4591dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Data Title 4601dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(2)).isEqualTo("Advanced settings"); 4611dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Normalized Title 4621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(3)).isEqualTo("advanced settings"); 4631dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Summary On 4641dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(4)).isEqualTo("Enable more settings options"); 4651dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Summary On Normalized 4661dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(5)).isEqualTo("enable more settings options"); 4671dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Summary Off 4681dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(6)).isEqualTo("Enable more settings options"); 4691dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Summary Off 4701dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(7)).isEqualTo("enable more settings options"); 4711dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Entries - only on for list preferences 4721dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(8)).isNull(); 4731dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Keywords 4741dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(9)).isEmpty(); 4751dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Screen Title 476015a50bef99a23a8c795486b99021a5784d65d64Doris Ling assertThat(cursor.getString(10)).isEqualTo("App info"); 4771dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Class Name 4781dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(11)).isEqualTo(className); 4791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Icon 4805416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze assertThat(cursor.getInt(12)).isEqualTo(noIcon); 4811dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Intent Action 4821dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(13)).isEqualTo(action); 4831dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Target Package 4841dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(14)).isEqualTo(targetPackage); 4851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Target Class 4861dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(15)).isEqualTo(targetClass); 4871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Enabled 4881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getInt(16) == 1).isEqualTo(enabled); 4891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Data ref key 4901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(17)).isEqualTo("toggle_advanced_settings"); 4911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // User Id 4921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getInt(18)).isEqualTo(userId); 4931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Payload Type - default is 0 4941dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getInt(19)).isEqualTo(0); 4951dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Payload - should be updated to real payloads as controllers are added 4963746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze byte[] payload = cursor.getBlob(20); 4973746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload, 4983746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze ResultPayload.CREATOR); 4993746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class); 5001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze } 5011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 5021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze @Test 503ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze public void testAddResource_listPreference_rowsMatch() { 5041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze SearchIndexableResource resource = getFakeResource(R.xml.application_settings); 505ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>()); 5061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 5071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null); 5081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze cursor.moveToPosition(3); 5091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Locale 5101dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(0)).isEqualTo(localeStr); 5111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Data Rank 5121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getInt(1)).isEqualTo(rank); 5131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Data Title 5141dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(2)).isEqualTo("Preferred install location"); 5151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Normalized Title 5161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(3)).isEqualTo("preferred install location"); 5171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Summary On 518a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang assertThat(cursor.getString(4)).isEqualTo( 519a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang "Change the preferred installation location for new apps"); 5201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Summary On Normalized 521a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang assertThat(cursor.getString(5)).isEqualTo( 522a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang "change the preferred installation location for new apps"); 5231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Summary Off - only on for checkbox preferences 5241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(6)).isEmpty(); 5251dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Summary off normalized - only on for checkbox preferences 5261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(7)).isEmpty(); 5271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Entries - only on for list preferences 5281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(8)).isEqualTo("Internal device storage|Removable SD card|" + 529a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang "Let the system decide|"); 5301dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Keywords 5311dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(9)).isEmpty(); 5321dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Screen Title 533015a50bef99a23a8c795486b99021a5784d65d64Doris Ling assertThat(cursor.getString(10)).isEqualTo("App info"); 5341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Class Name 5351dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(11)).isEqualTo(className); 5361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Icon 5375416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze assertThat(cursor.getInt(12)).isEqualTo(noIcon); 5381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Intent Action 5391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(13)).isEqualTo(action); 5401dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Target Package 5411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(14)).isEqualTo(targetPackage); 5421dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Target Class 5431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(15)).isEqualTo(targetClass); 5441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Enabled 5451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getInt(16) == 1).isEqualTo(enabled); 5461dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Data ref key 5471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(17)).isEqualTo("app_install_location"); 5481dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // User Id 5491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getInt(18)).isEqualTo(userId); 5501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Payload Type - default is 0 5511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getInt(19)).isEqualTo(0); 5521dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Payload - should be updated to real payloads as controllers are added 5533746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze byte[] payload = cursor.getBlob(20); 5543746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload, 5553746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze ResultPayload.CREATOR); 5563746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class); 5571dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze } 5581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 5595416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze @Test 5605416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze public void testAddResource_iconAddedFromXml() { 5615416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze SearchIndexableResource resource = getFakeResource(R.xml.connected_devices); 5625416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>()); 5635416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze 5645416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null); 5655416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze cursor.moveToPosition(0); 5665416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze 5675416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze // Icon 5685416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze assertThat(cursor.getInt(12)).isNotEqualTo(noIcon); 5695416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze } 5705416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze 5711dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Tests for the flow: IndexOneResource -> IndexFromProvider -> IndexFromResource -> 5721dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // UpdateOneRowWithFilteredData -> UpdateOneRow 5731dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 5741dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze @Test 575ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze public void testResourceProvider_rowInserted() { 576d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling SearchIndexableResource resource = getFakeResource(R.xml.swipe_to_notification_settings); 5771dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze resource.xmlResId = 0; 5781dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze resource.className = "com.android.settings.display.ScreenZoomSettings"; 5791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 580ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>()); 5811dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null); 5821dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getCount()).isEqualTo(1); 5831dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze } 5841dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 5851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze @Test 586ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze public void testResourceProvider_rowMatches() { 587d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling SearchIndexableResource resource = getFakeResource(R.xml.swipe_to_notification_settings); 5881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze resource.xmlResId = 0; 5891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze resource.className = "com.android.settings.display.ScreenZoomSettings"; 5901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 591ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>()); 5921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null); 5931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze cursor.moveToPosition(0); 5941dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 5951dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Locale 5961dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(0)).isEqualTo(localeStr); 5971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Data Rank 598473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze assertThat(cursor.getInt(1)).isEqualTo(0); 5991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Data Title 6001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(2)).isEqualTo("Display size"); 6011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Normalized Title 6021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(3)).isEqualTo("display size"); 6031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Summary On 6041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(4)).isEmpty(); 6051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Summary On Normalized 6061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(5)).isEmpty(); 6071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Summary Off - only on for checkbox preferences 6081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(6)).isEmpty(); 6091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Summary off normalized - only on for checkbox preferences 6101dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(7)).isEmpty(); 6111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Entries - only on for list preferences 6121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(8)).isNull(); 6131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Keywords 6141dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(9)).isEqualTo("display density screen zoom scale scaling"); 6151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Screen Title 6161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(10)).isEqualTo("Display size"); 6171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Class Name 6181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(11)) 6191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze .isEqualTo("com.android.settings.display.ScreenZoomSettings"); 6201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Icon 6215416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze assertThat(cursor.getInt(12)).isEqualTo(noIcon); 6221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Intent Action 6231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(13)).isNull(); 6241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Target Package 6251dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(14)).isNull(); 6261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Target Class 6271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(15)).isNull(); 6281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Enabled 6291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getInt(16) == 1).isEqualTo(enabled); 6301dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Data ref key 6311dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(17)).isNull(); 6321dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // User Id 6331dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getInt(18)).isEqualTo(userId); 6341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Payload Type - default is 0 6351dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getInt(19)).isEqualTo(0); 6361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Payload - should be updated to real payloads as controllers are added 6373746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze byte[] payload = cursor.getBlob(20); 6383746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload, 6393746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze ResultPayload.CREATOR); 6403746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class); 6411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze } 6421dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 6431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze @Test 644ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze public void testResourceProvider_resourceRowInserted() { 6453f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze SearchIndexableResource resource = getFakeResource(0); 6461dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze resource.className = "com.android.settings.LegalSettings"; 6471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 648ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>()); 6491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null); 6503f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze assertThat(cursor.getCount()).isEqualTo(6); 6511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze } 6521dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 6531dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze @Test 654ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze public void testResourceProvider_resourceRowMatches() { 655473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze SearchIndexableResource resource = getFakeResource(0 /* xml */); 6563f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze resource.className = "com.android.settings.display.ScreenZoomSettings"; 6571dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 658ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>()); 6591dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null); 6601dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze cursor.moveToPosition(0); 6611dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 6621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Locale 6631dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(0)).isEqualTo(localeStr); 6641dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Data Rank 665473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze assertThat(cursor.getInt(1)).isEqualTo(0); 6661dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Data Title 6673f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze assertThat(cursor.getString(2)).isEqualTo("Display size"); 6681dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Normalized Title 6693f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze assertThat(cursor.getString(3)).isEqualTo("display size"); 6701dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Summary On 6711dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(4)).isEmpty(); 6721dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Summary On Normalized 6731dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(5)).isEmpty(); 6741dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Summary Off - only on for checkbox preferences 6751dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(6)).isEmpty(); 6761dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Summary off normalized - only on for checkbox preferences 6771dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(7)).isEmpty(); 6781dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Entries - only on for list preferences 6791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(8)).isNull(); 6801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Keywords 6813f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze assertThat(cursor.getString(9)).isEqualTo( 6823f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze "display density screen zoom scale scaling"); 6831dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Screen Title 6843f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze assertThat(cursor.getString(10)).isEqualTo("Display size"); 6851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Class Name 6861dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(11)) 6873f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze .isEqualTo("com.android.settings.display.ScreenZoomSettings"); 6881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Icon 6895416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze assertThat(cursor.getInt(12)).isEqualTo(noIcon); 6901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Intent Action 6911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(13)).isNull(); 6921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Target Package 6931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(14)).isNull(); 6941dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Target Class 6951dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(15)).isNull(); 6961dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Enabled 6971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getInt(16) == 1).isEqualTo(enabled); 6981dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Data ref key 6991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getString(17)).isNull(); 7001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // User Id 7011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getInt(18)).isEqualTo(userId); 7021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Payload Type - default is 0 7031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze assertThat(cursor.getInt(19)).isEqualTo(0); 7041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Payload - should be updated to real payloads as controllers are added 7053746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze byte[] payload = cursor.getBlob(20); 7063746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload, 7073746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze ResultPayload.CREATOR); 7083746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class); 7091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze } 7101dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 7113f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze @Test 712ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze public void testResourceProvider_disabledResource_rowsInserted() { 713473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze SearchIndexableResource resource = getFakeResource(0 /* xml */); 7143f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze resource.className = "com.android.settings.LegalSettings"; 7153f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze 7163f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze mManager.indexOneSearchIndexableData(mDb, localeStr, resource, 717ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze new HashMap<String, Set<String>>()); 7183f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze 7193f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 1", null); 720031af9f287de17384bd7b7498cda44a804ef8091Matthew Fritze assertThat(cursor.getCount()).isEqualTo(1); 7213f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 0", null); 722031af9f287de17384bd7b7498cda44a804ef8091Matthew Fritze assertThat(cursor.getCount()).isEqualTo(5); 7233f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze } 7243f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze 72504615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze @Test 726ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze public void testResource_withTitleAndSettingName_titleNotInserted() { 72704615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze SearchIndexableResource resource = getFakeResource(R.xml.swipe_to_notification_settings); 72804615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze mManager.indexFromResource(mDb, localeStr, resource, new ArrayList<String>()); 72904615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze 73004615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE" + 73104615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze " enabled = 1", null); 73204615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze assertThat(cursor.getCount()).isEqualTo(1); 73304615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze } 73404615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze 735473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze @Test 736473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze public void testResourceProvider_nonSubsettingIntent() { 737473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze SearchIndexableResource resource = getFakeResource(0 /* xml */); 738473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze String fakeAction = "fake_action"; 739473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze resource.className = "com.android.settings.LegalSettings"; 740473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze resource.intentAction = fakeAction; 741473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze resource.intentTargetPackage = SearchIndexableResources.SUBSETTING_TARGET_PACKAGE; 742473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze 743473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>()); 744473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null); 745473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze cursor.moveToPosition(0); 746473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze 747473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze // Intent Action 748473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze assertThat(cursor.getString(13)).isEqualTo(fakeAction); 749473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze // Target Package 750473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze assertThat(cursor.getString(14)) 751473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze .isEqualTo(SearchIndexableResources.SUBSETTING_TARGET_PACKAGE); 752473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze } 753473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze 754ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // Test new public indexing flow 755ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 756ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze @Test 757ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze public void testPerformIndexing_fullIndex_getsDataFromProviders() { 758ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze DummyProvider provider = new DummyProvider(); 759ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze provider.onCreate(); 760a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze ShadowContentResolver.registerProvider(AUTHORITY_ONE, provider); 761ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 762ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // Test that Indexables are added for Full indexing 763ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt())) 764ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze .thenReturn(getDummyResolveInfo()); 765ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 766ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze DatabaseIndexingManager manager = 767a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE)); 768ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 769ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze manager.performIndexing(); 770ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 771a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze verify(manager).addIndexablesFromRemoteProvider(PACKAGE_ONE, AUTHORITY_ONE); 772a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze verify(manager).updateDatabase(true /* isFullIndex */, Locale.getDefault().toString()); 773a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze } 774ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 775a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze @Test 776a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze public void testPerformIndexing_incrementalIndex_noDataAdded() { 777f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang final List<ResolveInfo> providerInfo = getDummyResolveInfo(); 778f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang skipFullIndex(providerInfo); 779a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze DummyProvider provider = new DummyProvider(); 780a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze provider.onCreate(); 781a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze ShadowContentResolver.registerProvider(AUTHORITY_ONE, provider); 782a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze // Test that Indexables are added for Full indexing 783a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt())) 784f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang .thenReturn(providerInfo); 785a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze 786a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze DatabaseIndexingManager manager = 787a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE)); 788a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze 789a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze manager.mDataToProcess.dataToUpdate.clear(); 790a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze 791a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze manager.performIndexing(); 792a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze 793a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze verify(manager, times(0)).addDataToDatabase(any(SQLiteDatabase.class), anyString(), 794a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze anyList(), anyMap()); 795a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze verify(manager, times(0)).addIndexablesFromRemoteProvider(PACKAGE_ONE, AUTHORITY_ONE); 796a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze verify(manager).updateDataInDatabase(any(SQLiteDatabase.class), anyMap()); 797ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze } 798ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 799ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze @Test 800a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze public void testPerformIndexing_localeChanged_databaseDropped() { 801a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze DummyProvider provider = new DummyProvider(); 802a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze provider.onCreate(); 803a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze ShadowContentResolver.registerProvider(AUTHORITY_ONE, provider); 804a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze 805a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze // Test that Indexables are added for Full indexing 806a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt())) 807a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze .thenReturn(getDummyResolveInfo()); 808a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze 809a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze // Initialize the Manager 810a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze DatabaseIndexingManager manager = 811a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE)); 812a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze 813a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze // Insert data point which will be dropped 814a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze final String oldTitle = "This is French"; 815a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze insertSpecialCase(oldTitle, true, "key"); 816a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze 817a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze // Add a data point to be added by the indexing 818a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze SearchIndexableRaw raw = new SearchIndexableRaw(mContext); 819a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze final String newTitle = "This is English"; 820a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze raw.title = newTitle; 821a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze manager.mDataToProcess.dataToUpdate.add(raw); 822a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze 823a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze manager.performIndexing(); 824a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze 825a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze // Assert that the New Title is inserted 826a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze final Cursor newCursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE data_title = '" + 827a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze newTitle + "'", null); 828a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze assertThat(newCursor.getCount()).isEqualTo(1); 829a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze 830a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze // Assert that the Old Title is no longer in the database, since it was dropped 831a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze final Cursor oldCursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE data_title = '" + 832a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze oldTitle + "'", null); 833a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze assertThat(oldCursor.getCount()).isEqualTo(0); 834a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze } 835a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze 836a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze @Test 837a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze public void testPerformIndexing_onOta_FullIndex() { 838ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze DummyProvider provider = new DummyProvider(); 839ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze provider.onCreate(); 840ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze ShadowContentResolver.registerProvider( 841ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze AUTHORITY_ONE, provider 842ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze ); 843ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 844ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // Test that Indexables are added for Full indexing 845ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt())) 846ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze .thenReturn(getDummyResolveInfo()); 847ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 848ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze DatabaseIndexingManager manager = 849a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE)); 850ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 851ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze manager.performIndexing(); 852ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 853a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze verify(manager).updateDatabase(true /* isFullIndex */, Locale.getDefault().toString()); 854a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze } 855ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 856a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze @Test 857f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang public void testPerformIndexing_onPackageChange_shouldFullIndex() { 858f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang final List<ResolveInfo> providers = getDummyResolveInfo(); 859f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang final String buildNumber = Build.FINGERPRINT; 860f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang final String locale = Locale.getDefault().toString(); 861f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang skipFullIndex(providers); 862f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang 863f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang // This snapshot is already indexed. Should return false 864f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang assertThat(IndexDatabaseHelper.isFullIndex( 865f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang mContext, locale, buildNumber, 866f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang IndexDatabaseHelper.buildProviderVersionedNames(providers))) 867f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang .isFalse(); 868f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang 869f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang // Change provider version number, this should trigger full index. 870f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang providers.get(0).providerInfo.applicationInfo.versionCode++; 871f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang 872f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang assertThat(IndexDatabaseHelper.isFullIndex(mContext, locale, buildNumber, 873f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang IndexDatabaseHelper.buildProviderVersionedNames(providers))) 874f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang .isTrue(); 875f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang } 876f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang 877f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang @Test 878a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze public void testPerformIndexing_onOta_buildNumberIsCached() { 879a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze DummyProvider provider = new DummyProvider(); 880a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze provider.onCreate(); 881a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze ShadowContentResolver.registerProvider( 882a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze AUTHORITY_ONE, provider 883a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze ); 884a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze 885a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze // Test that Indexables are added for Full indexing 886a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt())) 887a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze .thenReturn(getDummyResolveInfo()); 888a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze 889a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze DatabaseIndexingManager manager = 890a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE)); 891a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze 892a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze manager.performIndexing(); 893a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze 894a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze assertThat(IndexDatabaseHelper.getInstance(mContext).isBuildIndexed(mContext, 895a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze Build.FINGERPRINT)).isTrue(); 896ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze } 897ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 898ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze @Test 899ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze public void testFullUpdatedDatabase_noData_addDataToDatabaseNotCalled() { 900a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze mManager.updateDatabase(true /* isFullIndex */, localeStr); 901ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze mManager.mDataToProcess.dataToUpdate.clear(); 902ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze verify(mManager, times(0)).addDataToDatabase(any(SQLiteDatabase.class), anyString(), 903ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze anyList(), anyMap()); 904ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze } 905ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 906ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze @Test 907ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze public void testFullUpdatedDatabase_updatedDataInDatabaseNotCalled() { 908a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze mManager.updateDatabase(true /* isFullIndex */, localeStr); 909ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze verify(mManager, times(0)).updateDataInDatabase(any(SQLiteDatabase.class), anyMap()); 910ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze } 911ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 912ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze @Test 9138a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze public void testLocaleUpdated_afterIndexing_localeNotAdded() { 914a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze mManager.updateDatabase(true /* isFullIndex */, localeStr); 915ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze assertThat(IndexDatabaseHelper.getInstance(mContext) 9168a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze .isLocaleAlreadyIndexed(mContext, localeStr)).isFalse(); 9178a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze } 9188a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze 9198a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze @Test 9208a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze public void testLocaleUpdated_afterFullIndexing_localeAdded() { 9218a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze mManager.performIndexing(); 9228a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze assertThat(IndexDatabaseHelper.getInstance(mContext) 923ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze .isLocaleAlreadyIndexed(mContext, localeStr)).isTrue(); 924ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze } 925ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 926ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze @Test 927ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze public void testUpdateDatabase_newEligibleData_addedToDatabase() { 928ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // Test that addDataToDatabase is called when dataToUpdate is non-empty 929ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze mManager.mDataToProcess.dataToUpdate.add(getFakeRaw()); 930a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze mManager.updateDatabase(true /* isFullIndex */, localeStr); 931ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 932ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null); 933ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze cursor.moveToPosition(0); 934ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 935ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // Locale 936ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze assertThat(cursor.getString(0)).isEqualTo(localeStr); 937ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // Data Rank 938ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze assertThat(cursor.getInt(1)).isEqualTo(rank); 939ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // Data Title 940ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze assertThat(cursor.getString(2)).isEqualTo(updatedTitle); 941ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // Normalized Title 942ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze assertThat(cursor.getString(3)).isEqualTo(normalizedTitle); 943ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // Summary On 944ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze assertThat(cursor.getString(4)).isEqualTo(updatedSummaryOn); 945ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // Summary On Normalized 946ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze assertThat(cursor.getString(5)).isEqualTo(normalizedSummaryOn); 947ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // Summary Off 948ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze assertThat(cursor.getString(6)).isEqualTo(updatedSummaryOff); 949ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // Summary off normalized 950ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze assertThat(cursor.getString(7)).isEqualTo(normalizedSummaryOff); 951ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // Entries 952ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze assertThat(cursor.getString(8)).isEqualTo(entries); 953ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // Keywords 954ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze assertThat(cursor.getString(9)).isEqualTo(spaceDelimittedKeywords); 955ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // Screen Title 956ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze assertThat(cursor.getString(10)).isEqualTo(screenTitle); 957ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // Class Name 958ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze assertThat(cursor.getString(11)).isEqualTo(className); 959ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // Icon 960ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze assertThat(cursor.getInt(12)).isEqualTo(iconResId); 961ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // Intent Action 962ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze assertThat(cursor.getString(13)).isEqualTo(action); 963ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // Target Package 964ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze assertThat(cursor.getString(14)).isEqualTo(targetPackage); 965ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // Target Class 966ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze assertThat(cursor.getString(15)).isEqualTo(targetClass); 967ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // Enabled 968ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze assertThat(cursor.getInt(16) == 1).isEqualTo(enabled); 969ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // Data ref key 970ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze assertThat(cursor.getString(17)).isNotNull(); 971ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // User Id 972ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze assertThat(cursor.getInt(18)).isEqualTo(userId); 973ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // Payload Type - default is 0 974ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze assertThat(cursor.getInt(19)).isEqualTo(0); 975ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // Payload 9763746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze byte[] payload = cursor.getBlob(20); 9773746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload, 9783746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze ResultPayload.CREATOR); 9793746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class); 980ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze } 981ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 982ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze @Test 983ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze public void testUpdateDataInDatabase_enabledResultsAreNonIndexable_becomeDisabled() { 984ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // Both results are enabled, and then TITLE_ONE gets disabled. 985ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze final boolean enabled = true; 986ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze insertSpecialCase(TITLE_ONE, enabled, KEY_ONE); 987ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze insertSpecialCase(TITLE_TWO, enabled, KEY_TWO); 988ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze Map<String, Set<String>> niks = new ArrayMap<>(); 989ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze Set<String> keys = new HashSet<>(); 990ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze keys.add(KEY_ONE); 991ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze niks.put(targetPackage, keys); 992ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 993ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze mManager.updateDataInDatabase(mDb, niks); 994ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 995ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 0", null); 996ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze cursor.moveToPosition(0); 997ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 998ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze assertThat(cursor.getString(2)).isEqualTo(TITLE_ONE); 999ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze } 1000ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 1001ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze @Test 10024f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze public void testUpdateDataInDatabase_disabledResultsAreIndexable_becomeEnabled() { 1003ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // Both results are initially disabled, and then TITLE_TWO gets enabled. 1004ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze final boolean enabled = false; 1005ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze insertSpecialCase(TITLE_ONE, enabled, KEY_ONE); 1006ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze insertSpecialCase(TITLE_TWO, enabled, KEY_TWO); 1007ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze Map<String, Set<String>> niks = new ArrayMap<>(); 1008ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze Set<String> keys = new HashSet<>(); 1009ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze keys.add(KEY_ONE); 1010ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze niks.put(targetPackage, keys); 1011ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 1012ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze mManager.updateDataInDatabase(mDb, niks); 1013ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 1014ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 1", null); 1015ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze cursor.moveToPosition(0); 1016ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 1017ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze assertThat(cursor.getString(2)).isEqualTo(TITLE_TWO); 1018ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze } 1019ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 10204f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze @Test 10214f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze public void testEmptyNonIndexableKeys_emptyDataKeyResources_addedToDatabase() { 10224f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze insertSpecialCase(TITLE_ONE, true /* enabled */, null /* dataReferenceKey */); 10234f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze 10244f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze mManager.updateDatabase(false, localeStr); 10254f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze 10264f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 1", null); 10274f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze cursor.moveToPosition(0); 10284f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze assertThat(cursor.getCount()).isEqualTo(1); 10294f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze assertThat(cursor.getString(2)).isEqualTo(TITLE_ONE); 10304f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze } 1031be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze 1032be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze @Test 1033be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze public void testUpdateAsyncTask_onPostExecute_performsCallback() { 1034be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze IndexingCallback callback = mock(IndexingCallback.class); 1035be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze 1036be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze DatabaseIndexingManager.IndexingTask task = mManager.new IndexingTask(callback); 1037be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze task.execute(); 1038be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze 1039be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze Robolectric.flushForegroundThreadScheduler(); 1040be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze 1041be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze verify(callback).onIndexingFinished(); 1042be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze } 1043be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze 1044be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze @Test 1045be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze public void testUpdateAsyncTask_onPostExecute_setsIndexingComplete() { 1046be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze SearchFeatureProviderImpl provider = new SearchFeatureProviderImpl(); 1047be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze DatabaseIndexingManager manager = spy(provider.getIndexingManager(mContext)); 1048be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze DatabaseIndexingManager.IndexingTask task = manager.new IndexingTask(null); 1049be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze doNothing().when(manager).performIndexing(); 1050be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze 1051be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze task.execute(); 1052be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze Robolectric.flushForegroundThreadScheduler(); 1053be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze 1054be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze assertThat(provider.isIndexingComplete(mContext)).isTrue(); 1055be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze } 1056be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze 10571dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze // Util functions 10581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 1059f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang private void skipFullIndex(List<ResolveInfo> providers) { 1060f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang IndexDatabaseHelper.setLocaleIndexed(mContext, Locale.getDefault().toString()); 1061f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang IndexDatabaseHelper.setBuildIndexed(mContext, Build.FINGERPRINT); 1062f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang IndexDatabaseHelper.setProvidersIndexed(mContext, 1063f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang IndexDatabaseHelper.buildProviderVersionedNames(providers)); 1064f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang } 1065f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang 10661dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze private SearchIndexableRaw getFakeRaw() { 10671dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze return getFakeRaw(localeStr); 10681dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze } 10691dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 10701dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze private SearchIndexableRaw getFakeRaw(String localeStr) { 10711dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze SearchIndexableRaw data = new SearchIndexableRaw(mContext); 10721dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze data.locale = new Locale(localeStr); 10731dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze data.rank = rank; 10741dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze data.title = title; 10751dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze data.summaryOn = summaryOn; 10761dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze data.summaryOff = summaryOff; 10771dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze data.entries = entries; 10781dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze data.keywords = keywords; 10791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze data.screenTitle = screenTitle; 10801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze data.className = className; 10811dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze data.packageName = packageName; 10821dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze data.iconResId = iconResId; 10831dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze data.intentAction = action; 10841dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze data.intentTargetPackage = targetPackage; 10851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze data.intentTargetClass = targetClass; 10861dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze data.key = key; 10871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze data.userId = userId; 10881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze data.enabled = enabled; 10891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze return data; 10901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze } 10911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze 10921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze private SearchIndexableResource getFakeResource(int xml) { 10931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze SearchIndexableResource sir = new SearchIndexableResource(mContext); 10941dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze sir.rank = rank; 10951dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze sir.xmlResId = xml; 10961dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze sir.className = className; 10971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze sir.packageName = packageName; 10981dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze sir.iconResId = iconResId; 10991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze sir.intentAction = action; 11001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze sir.intentTargetPackage = targetPackage; 11011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze sir.intentTargetClass = targetClass; 11021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze sir.enabled = enabled; 11031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze return sir; 11041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze } 11053f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze 1106ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze private Map<String, Set<String>> getNonIndexableKeys(String[] keys) { 1107ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze Map<String, Set<String>> niks = new HashMap<>(); 1108ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze Set<String> keysList = new HashSet<>(); 1109ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze keysList.addAll(Arrays.asList(keys)); 11103f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze niks.put(packageName, keysList); 11113f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze return niks; 11123f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze } 1113ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 1114ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze private List<ResolveInfo> getDummyResolveInfo() { 1115ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze List<ResolveInfo> infoList = new ArrayList<>(); 1116ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze ResolveInfo info = new ResolveInfo(); 1117ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze info.providerInfo = new ProviderInfo(); 1118ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze info.providerInfo.exported = true; 1119ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze info.providerInfo.authority = AUTHORITY_ONE; 1120ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze info.providerInfo.packageName = PACKAGE_ONE; 1121f8d95fa35da90e7ea796521a199c290fb2e3f101Fan Zhang info.providerInfo.applicationInfo = new ApplicationInfo(); 1122ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze infoList.add(info); 1123ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 1124ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze return infoList; 1125ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze } 1126ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 1127ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // TODO move this method and its counterpart in CursorToSearchResultConverterTest into 1128ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze // a util class with public fields to assert values. 1129ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze private Cursor getDummyCursor() { 11304f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze MatrixCursor cursor = new MatrixCursor(INDEXABLES_RAW_COLUMNS); 1131ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze final String BLANK = ""; 1132ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 1133ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze ArrayList<String> item = 11344f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze new ArrayList<>(INDEXABLES_RAW_COLUMNS.length); 1135ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze item.add("42"); // Rank 1136ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze item.add(TITLE_ONE); // Title 1137ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze item.add(BLANK); // Summary on 1138ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze item.add(BLANK); // summary off 1139ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze item.add(BLANK); // entries 1140ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze item.add(BLANK); // keywords 1141ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze item.add(BLANK); // screen title 1142ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze item.add(BLANK); // classname 1143ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze item.add("123"); // Icon 1144ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze item.add(BLANK); // Intent action 1145ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze item.add(BLANK); // target package 1146ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze item.add(BLANK); // target class 1147ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze item.add(KEY_ONE); // Key 1148ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze item.add("-1"); // userId 1149ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze cursor.addRow(item); 1150ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 1151ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze return cursor; 1152ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze } 1153ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 1154ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze private void insertSpecialCase(String specialCase, boolean enabled, String key) { 1155ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze ContentValues values = new ContentValues(); 1156ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze values.put(IndexDatabaseHelper.IndexColumns.DOCID, specialCase.hashCode()); 1157ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze values.put(IndexDatabaseHelper.IndexColumns.LOCALE, localeStr); 1158ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze values.put(IndexDatabaseHelper.IndexColumns.DATA_RANK, 1); 1159ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE, specialCase); 1160ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE_NORMALIZED, ""); 1161ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON, ""); 1162ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON_NORMALIZED, ""); 1163ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF, ""); 1164ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF_NORMALIZED, ""); 1165ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze values.put(IndexDatabaseHelper.IndexColumns.DATA_ENTRIES, ""); 1166ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze values.put(IndexDatabaseHelper.IndexColumns.DATA_KEYWORDS, ""); 1167ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze values.put(IndexDatabaseHelper.IndexColumns.CLASS_NAME, ""); 1168ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze values.put(IndexDatabaseHelper.IndexColumns.SCREEN_TITLE, "Moves"); 1169ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze values.put(IndexDatabaseHelper.IndexColumns.INTENT_ACTION, ""); 1170ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze values.put(IndexDatabaseHelper.IndexColumns.INTENT_TARGET_PACKAGE, targetPackage); 1171ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze values.put(IndexDatabaseHelper.IndexColumns.INTENT_TARGET_CLASS, ""); 1172ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze values.put(IndexDatabaseHelper.IndexColumns.ICON, ""); 1173ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze values.put(IndexDatabaseHelper.IndexColumns.ENABLED, enabled); 1174ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze values.put(IndexDatabaseHelper.IndexColumns.DATA_KEY_REF, key); 1175ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze values.put(IndexDatabaseHelper.IndexColumns.USER_ID, 0); 1176ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze values.put(IndexDatabaseHelper.IndexColumns.PAYLOAD_TYPE, 0); 1177ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze values.put(IndexDatabaseHelper.IndexColumns.PAYLOAD, (String) null); 1178ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 1179ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze mDb.replaceOrThrow(IndexDatabaseHelper.Tables.TABLE_PREFS_INDEX, null, values); 1180ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze } 1181ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 1182ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze private class DummyProvider extends ContentProvider { 1183ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 1184ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze @Override 1185ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze public boolean onCreate() { 1186ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze return false; 1187ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze } 1188ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 1189ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze @Override 1190ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze public Cursor query(@NonNull Uri uri, @Nullable String[] projection, 1191ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze @Nullable String selection, @Nullable String[] selectionArgs, 1192ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze @Nullable String sortOrder) { 1193ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze if (uri.toString().contains("xml")) { 1194ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze return null; 1195ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze } 1196ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze return getDummyCursor(); 1197ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze } 1198ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 1199ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze @Override 1200ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze public String getType(@NonNull Uri uri) { 1201ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze return null; 1202ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze } 1203ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 1204ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze @Override 1205ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) { 1206ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze return null; 1207ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze } 1208ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 1209ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze @Override 1210ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze public int delete(@NonNull Uri uri, @Nullable String selection, 1211ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze @Nullable String[] selectionArgs) { 1212ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze return 0; 1213ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze } 1214ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze 1215ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze @Override 1216ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze public int update(@NonNull Uri uri, @Nullable ContentValues values, 1217ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze @Nullable String selection, @Nullable String[] selectionArgs) { 1218ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze return 0; 1219ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze } 1220ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze } 1221a9831d40d081cc8c7ca32891e64c09b5e1d19abbPhilip Quinn} 1222