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