DatabaseIndexingManagerTest.java revision bdd57aad3eb4ffeb106feb7b3d300ac6680def0d
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
20ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.annotation.NonNull;
21ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.annotation.Nullable;
22ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.content.ContentProvider;
23ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.content.ContentValues;
241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport android.content.Context;
25ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.content.Intent;
26ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.content.pm.PackageManager;
27ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.content.pm.ProviderInfo;
28ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.content.pm.ResolveInfo;
291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport android.database.Cursor;
30ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.database.MatrixCursor;
311dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport android.database.sqlite.SQLiteDatabase;
32ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.net.Uri;
33a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritzeimport android.os.Build;
341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport android.provider.SearchIndexableResource;
35ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport android.util.ArrayMap;
36012028e3a320dd3eeca3c39f0e47c1c40697bdf6Fan Zhang
371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport com.android.settings.R;
3898a9e42c93deaf5bb5f3028971065cc910e8d51fMatthew Fritzeimport com.android.settings.testutils.FakeFeatureFactory;
399f1e911759dc6fedaac9fa65afb79f6a93022bf4Andrew Sappersteinimport com.android.settings.testutils.SettingsRobolectricTestRunner;
401dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport com.android.settings.TestConfig;
41a8b089db8a6d495a18dc3ad91d3bd84b042fb004Fan Zhangimport com.android.settings.testutils.DatabaseTestUtils;
42ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport com.android.settings.testutils.shadow.ShadowDatabaseIndexingUtils;
43ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport com.android.settings.testutils.shadow.ShadowRunnableAsyncTask;
44012028e3a320dd3eeca3c39f0e47c1c40697bdf6Fan Zhang
451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport org.junit.After;
461dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport org.junit.Before;
471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport org.junit.Test;
481dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport org.junit.runner.RunWith;
49ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport org.mockito.Mock;
50ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport org.mockito.MockitoAnnotations;
51be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritzeimport org.robolectric.Robolectric;
52ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport org.robolectric.RuntimeEnvironment;
531dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport org.robolectric.annotation.Config;
54ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport org.robolectric.shadows.ShadowContentResolver;
551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
561dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport java.util.ArrayList;
571dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport java.util.Arrays;
581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport java.util.HashMap;
59ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport java.util.HashSet;
601dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport java.util.List;
611dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport java.util.Locale;
623f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritzeimport java.util.Map;
63ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport java.util.Set;
641dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
654f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritzeimport static android.provider.SearchIndexablesContract.INDEXABLES_RAW_COLUMNS;
661dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport static com.google.common.truth.Truth.assertThat;
67ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport static org.mockito.Matchers.any;
68ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport static org.mockito.Matchers.anyInt;
69ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport static org.mockito.Matchers.anyList;
70ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport static org.mockito.Matchers.anyMap;
71ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport static org.mockito.Matchers.anyString;
72be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritzeimport static org.mockito.Mockito.doNothing;
73ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport static org.mockito.Mockito.doReturn;
744f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritzeimport static org.mockito.Mockito.mock;
751dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzeimport static org.mockito.Mockito.spy;
76ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport static org.mockito.Mockito.times;
77ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport static org.mockito.Mockito.verify;
78ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritzeimport static org.mockito.Mockito.when;
791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze@RunWith(SettingsRobolectricTestRunner.class)
81ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
82a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        shadows = {ShadowRunnableAsyncTask.class})
831dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritzepublic class DatabaseIndexingManagerTest {
841dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String localeStr = "en_US";
851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
863f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze    private final int rank = 8;
871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String title = "title\u2011title";
881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String updatedTitle = "title-title";
891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String normalizedTitle = "titletitle";
901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String summaryOn = "summary\u2011on";
911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String updatedSummaryOn = "summary-on";
921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String normalizedSummaryOn = "summaryon";
931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String summaryOff = "summary\u2011off";
94a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang    private final String updatedSummaryOff = "summary-off";
951dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String normalizedSummaryOff = "summaryoff";
961dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String entries = "entries";
971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String keywords = "keywords, keywordss, keywordsss";
981dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String spaceDelimittedKeywords = "keywords keywordss keywordsss";
991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String screenTitle = "screen title";
1001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String className = "class name";
1011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final int iconResId = 0xff;
1025416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze    private final int noIcon = 0;
1031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String action = "action";
1041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String targetPackage = "target package";
1051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String targetClass = "target class";
1061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String packageName = "package name";
1071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final String key = "key";
1081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final int userId = -1;
1091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private final boolean enabled = true;
1101dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
111ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private final String AUTHORITY_ONE = "authority";
112ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private final String PACKAGE_ONE = "com.android.settings";
113ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
114ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private final String TITLE_ONE = "title one";
115ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private final String TITLE_TWO = "title two";
116ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private final String KEY_ONE = "key one";
117ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private final String KEY_TWO = "key two";
118ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private Context mContext;
120ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1211dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private DatabaseIndexingManager mManager;
1221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private SQLiteDatabase mDb;
1231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
124ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Mock
125ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private PackageManager mPackageManager;
126ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Before
1281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    public void setUp() {
129ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        MockitoAnnotations.initMocks(this);
130ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mContext = spy(RuntimeEnvironment.application);
131a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        mManager = spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE));
1321dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        mDb = IndexDatabaseHelper.getInstance(mContext).getWritableDatabase();
133ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
134ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        doReturn(mPackageManager).when(mContext).getPackageManager();
13598a9e42c93deaf5bb5f3028971065cc910e8d51fMatthew Fritze        FakeFeatureFactory.setupForTest(mContext);
1361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
1371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
1381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @After
1391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    public void cleanUp() {
140012028e3a320dd3eeca3c39f0e47c1c40697bdf6Fan Zhang        DatabaseTestUtils.clearDb(mContext);
1411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
1421dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
1431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
1441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    public void testDatabaseSchema() {
1451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor dbCursor = mDb.query("prefs_index", null, null, null, null, null, null);
1461dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        List<String> columnNames = new ArrayList<>(Arrays.asList(dbCursor.getColumnNames()));
1471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Note that docid is not included.
148a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang        List<String> expColumnNames = new ArrayList<>(Arrays.asList(new String[]{
1491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "locale",
1501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_rank",
1511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_title",
1521dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_title_normalized",
1531dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_summary_on",
1541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_summary_on_normalized",
1551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_summary_off",
1561dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_summary_off_normalized",
1571dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_entries",
1581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_keywords",
1591dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "class_name",
1601dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "screen_title",
1611dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "intent_action",
1621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "intent_target_package",
1631dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "intent_target_class",
1641dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "icon",
1651dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "enabled",
1661dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "data_key_reference",
1671dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "user_id",
1681dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "payload_type",
1691dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                "payload"
1701dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        }));
1711dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Prevent database schema regressions
1721dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(columnNames).containsAllIn(expColumnNames);
1731dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
1741dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
1751dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    // Tests for the flow: IndexOneRaw -> UpdateOneRowWithFilteredData -> UpdateOneRow
1761dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
1771dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
178ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testInsertRawColumn_rowInserted() {
1791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableRaw raw = getFakeRaw();
180bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, raw,
181bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze                new HashMap<>()/* Non-indexable keys */);
1821dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
1831dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(1);
1841dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
1851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
1861dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
187bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze    public void testInsertRawColumn_nonIndexableKey_resultIsDisabled() {
188bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze        SearchIndexableRaw raw = getFakeRaw();
189bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze        Map<String, Set<String>> niks = new HashMap<>();
190bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze        Set<String> keys = new HashSet<>();
191bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze        keys.add(raw.key);
192bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze        niks.put(raw.intentTargetPackage, keys);
193bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze
194bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, raw, niks);
195bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 0", null);
196bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(1);
197bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze    }
198bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze
199bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze    @Test
200ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testInsertRawColumn_rowMatches() {
2011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableRaw raw = getFakeRaw();
202bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, raw,
203bdd57aad3eb4ffeb106feb7b3d300ac6680def0dMatthew Fritze                new HashMap<>()/* Non-indexable keys */);
2041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
2051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(0);
2061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
2081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
2091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
2101dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(raw.rank);
2111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
2121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(2)).isEqualTo(updatedTitle);
2131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
2141dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(3)).isEqualTo(normalizedTitle);
2151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
2161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(4)).isEqualTo(updatedSummaryOn);
2171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
2181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(5)).isEqualTo(normalizedSummaryOn);
2191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off
2201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEqualTo(updatedSummaryOff);
2211dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized
2221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEqualTo(normalizedSummaryOff);
2231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries
2241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isEqualTo(raw.entries);
2251dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
2261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(9)).isEqualTo(spaceDelimittedKeywords);
2271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
2281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(10)).isEqualTo(raw.screenTitle);
2291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
2301dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11)).isEqualTo(raw.className);
2311dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
2321dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(raw.iconResId);
2331dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
2341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isEqualTo(raw.intentAction);
2351dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
2361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isEqualTo(raw.intentTargetPackage);
2371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
2381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isEqualTo(raw.intentTargetClass);
2391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
2401dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(raw.enabled);
2411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
2421dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isNotNull();
2431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
2441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(raw.userId);
2451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
2461dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
2471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload
2483746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        byte[] payload = cursor.getBlob(20);
2493746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
2503746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze                ResultPayload.CREATOR);
2513746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
2521dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
2531dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
255ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testInsertRawColumn_mismatchedLocale_noRowInserted() {
2561dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableRaw raw = getFakeRaw("ca-fr");
2571dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, raw, null /* Non-indexable keys */);
2581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
2591dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(0);
2601dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
2611dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    // Tests for the flow: IndexOneResource -> IndexFromResource ->
2631dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    //                     UpdateOneRowWithFilteredData -> UpdateOneRow
2641dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2651dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
2661dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    public void testNullResource_NothingInserted() {
2671dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, null /* searchIndexableResource */,
268248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang                new HashMap<>());
2691dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
2701dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(0);
2711dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
2721dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2731dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
2741dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    public void testAddResource_RowsInserted() {
275dc9a82f5b017f430aa7d50f12450082f1bdc871eFan Zhang        SearchIndexableResource resource = getFakeResource(R.xml.display_settings);
276ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
2771dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
278305f900bfa42a4ecc3a7b8d1454331d8ad8d76a9Romain Guy        assertThat(cursor.getCount()).isEqualTo(17);
2791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
2801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2811dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
282ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResource_withNIKs_rowsInsertedDisabled() {
283dc9a82f5b017f430aa7d50f12450082f1bdc871eFan Zhang        SearchIndexableResource resource = getFakeResource(R.xml.display_settings);
284d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling        // Only add 2 of 16 items to be disabled.
285d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling        String[] keys = {"brightness", "wallpaper"};
286ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Map<String, Set<String>> niks = getNonIndexableKeys(keys);
287ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
2883f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, niks);
2893f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
2903f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 0", null);
2913f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(2);
2923f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 1", null);
293305f900bfa42a4ecc3a7b8d1454331d8ad8d76a9Romain Guy        assertThat(cursor.getCount()).isEqualTo(15);
2943f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze    }
2953f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
2963f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze    @Test
297ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResourceHeader_rowsMatch() {
2981dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableResource resource = getFakeResource(R.xml.application_settings);
299ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
3001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
3011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
3021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(1);
3031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
3041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
3051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
3061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
3071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
3081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
309015a50bef99a23a8c795486b99021a5784d65d64Doris Ling        assertThat(cursor.getString(2)).isEqualTo("App info");
3101dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
311015a50bef99a23a8c795486b99021a5784d65d64Doris Ling        assertThat(cursor.getString(3)).isEqualTo("app info");
3121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
3131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(4)).isEqualTo("Manage apps, set up quick launch shortcuts");
3141dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
3151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(5)).isEqualTo("manage apps, set up quick launch shortcuts");
3161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off - only on for checkbox preferences
3171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEmpty();
3181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized - only on for checkbox preferences
3191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEmpty();
3201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
3211dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isNull();
3221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
3231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(9)).isEmpty();
3241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
325015a50bef99a23a8c795486b99021a5784d65d64Doris Ling        assertThat(cursor.getString(10)).isEqualTo("App info");
3261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
3271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11)).isEqualTo(className);
3281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
329d0b42b03229225571ed060a377a0f72264058db6Matthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(0);
3301dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
3311dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isEqualTo(action);
3321dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
3331dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isEqualTo(targetPackage);
3341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
3351dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isEqualTo(targetClass);
3361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
3371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
3381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
3391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isEqualTo("applications_settings");
3401dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
3411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
3421dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
3431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
3441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
3453746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        byte[] payload = cursor.getBlob(20);
3463746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
3473746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze                ResultPayload.CREATOR);
3483746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
3491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
3501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
3511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
352ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResource_withChildFragment_shouldUpdateSiteMapDb() {
353f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam        // FIXME: This test was failing. (count = 6 at the end)
354f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam
355f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        SearchIndexableResource resource = getFakeResource(R.xml.network_and_internet);
356f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        mManager.indexOneSearchIndexableData(mDb, localeStr, resource,
357f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                new HashMap<>());
358f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        Cursor query = mDb.query(IndexDatabaseHelper.Tables.TABLE_SITE_MAP, SITE_MAP_COLUMNS,
359f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                null, null, null, null, null);
360f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        query.moveToPosition(-1);
361f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        int count = 0;
362f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        while (query.moveToNext()) {
363f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//            count++;
364f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//            assertThat(query.getString(query.getColumnIndex(SiteMapColumns.PARENT_CLASS)))
365f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                    .isEqualTo(className);
366f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//            assertThat(query.getString(query.getColumnIndex(SiteMapColumns.PARENT_TITLE)))
367f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                    .isEqualTo(mContext.getString(R.string.network_dashboard_title));
368f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//            assertThat(query.getString(query.getColumnIndex(SiteMapColumns.CHILD_CLASS)))
369f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                    .isNotEmpty();
370f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//            assertThat(query.getString(query.getColumnIndex(SiteMapColumns.CHILD_TITLE)))
371f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                    .isNotEmpty();
372f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        }
373f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        assertThat(count).isEqualTo(5);
374a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang    }
375a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang
376a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang    @Test
377ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResource_customSetting_rowsMatch() {
378d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling        SearchIndexableResource resource = getFakeResource(R.xml.swipe_to_notification_settings);
379ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
380248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        final String prefTitle =
381248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang                mContext.getString(R.string.fingerprint_swipe_for_notifications_title);
382248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        final String prefSummary =
383248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang                mContext.getString(R.string.fingerprint_swipe_for_notifications_summary);
38482be5f0c3fa4b9511e1e7e4c4e9c20cf31a8294fFan Zhang        final String keywords = mContext.getString(R.string.keywords_gesture);
385248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        Cursor cursor = mDb.rawQuery(
386248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang                "SELECT * FROM prefs_index where data_title='" + prefTitle + "'", null);
387248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        cursor.moveToFirst();
3881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
3891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
3901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
3911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
3921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
3931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
394248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        assertThat(cursor.getString(2)).isEqualTo(prefTitle);
3951dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
396248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        assertThat(cursor.getString(3)).isEqualTo(prefTitle.toLowerCase());
3971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
398248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        assertThat(cursor.getString(4)).isEqualTo(prefSummary);
3991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
400248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        assertThat(cursor.getString(5)).isEqualTo(prefSummary.toLowerCase());
4011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off - only on for checkbox preferences
4021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEmpty();
4031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized - only on for checkbox preferences
4041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEmpty();
4051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
4061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isNull();
4071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
40882be5f0c3fa4b9511e1e7e4c4e9c20cf31a8294fFan Zhang        assertThat(cursor.getString(9)).isEqualTo(keywords);
4091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
410248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        assertThat(cursor.getString(10)).isEqualTo(
411d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling                mContext.getString(R.string.fingerprint_swipe_for_notifications_title));
4121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
4131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11)).isEqualTo(className);
4141dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
4155416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(noIcon);
4161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
4171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isEqualTo(action);
4181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
4191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isEqualTo(targetPackage);
4201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
4211dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isEqualTo(targetClass);
4221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
4231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
4241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
4251dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isEqualTo("gesture_swipe_down_fingerprint");
4261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
4271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
4281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
4291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
4301dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
4313746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        byte[] payload = cursor.getBlob(20);
4323746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
4333746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze                ResultPayload.CREATOR);
4343746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
4351dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
4361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
4371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
438ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResource_checkboxPreference_rowsMatch() {
4391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableResource resource = getFakeResource(R.xml.application_settings);
440ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
4411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
4421dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        /* Should return 6 results, with the following titles:
4431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze         * Advanced Settings, Apps, Manage Apps, Preferred install location, Running Services
4441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze         */
4451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
4461dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(0);
4471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
4481dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
4491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
4501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
4511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
4521dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(2)).isEqualTo("Advanced settings");
4531dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
4541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(3)).isEqualTo("advanced settings");
4551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
4561dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(4)).isEqualTo("Enable more settings options");
4571dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
4581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(5)).isEqualTo("enable more settings options");
4591dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off
4601dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEqualTo("Enable more settings options");
4611dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off
4621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEqualTo("enable more settings options");
4631dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
4641dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isNull();
4651dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
4661dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(9)).isEmpty();
4671dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
468015a50bef99a23a8c795486b99021a5784d65d64Doris Ling        assertThat(cursor.getString(10)).isEqualTo("App info");
4691dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
4701dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11)).isEqualTo(className);
4711dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
4725416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(noIcon);
4731dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
4741dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isEqualTo(action);
4751dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
4761dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isEqualTo(targetPackage);
4771dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
4781dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isEqualTo(targetClass);
4791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
4801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
4811dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
4821dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isEqualTo("toggle_advanced_settings");
4831dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
4841dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
4851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
4861dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
4871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
4883746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        byte[] payload = cursor.getBlob(20);
4893746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
4903746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze                ResultPayload.CREATOR);
4913746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
4921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
4931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
4941dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
495ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResource_listPreference_rowsMatch() {
4961dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableResource resource = getFakeResource(R.xml.application_settings);
497ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
4981dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
4991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
5001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(3);
5011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
5021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
5031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
5041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
5051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
5061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(2)).isEqualTo("Preferred install location");
5071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
5081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(3)).isEqualTo("preferred install location");
5091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
510a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang        assertThat(cursor.getString(4)).isEqualTo(
511a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang                "Change the preferred installation location for new apps");
5121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
513a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang        assertThat(cursor.getString(5)).isEqualTo(
514a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang                "change the preferred installation location for new apps");
5151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off - only on for checkbox preferences
5161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEmpty();
5171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized - only on for checkbox preferences
5181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEmpty();
5191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
5201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isEqualTo("Internal device storage|Removable SD card|" +
521a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang                "Let the system decide|");
5221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
5231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(9)).isEmpty();
5241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
525015a50bef99a23a8c795486b99021a5784d65d64Doris Ling        assertThat(cursor.getString(10)).isEqualTo("App info");
5261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
5271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11)).isEqualTo(className);
5281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
5295416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(noIcon);
5301dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
5311dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isEqualTo(action);
5321dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
5331dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isEqualTo(targetPackage);
5341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
5351dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isEqualTo(targetClass);
5361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
5371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
5381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
5391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isEqualTo("app_install_location");
5401dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
5411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
5421dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
5431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
5441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
5453746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        byte[] payload = cursor.getBlob(20);
5463746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
5473746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze                ResultPayload.CREATOR);
5483746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
5491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
5501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
5515416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze    @Test
5525416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze    public void testAddResource_iconAddedFromXml() {
5535416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        SearchIndexableResource resource = getFakeResource(R.xml.connected_devices);
5545416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
5555416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze
5565416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
5575416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        cursor.moveToPosition(0);
5585416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze
5595416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        // Icon
5605416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        assertThat(cursor.getInt(12)).isNotEqualTo(noIcon);
5615416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze    }
5625416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze
5631dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    // Tests for the flow: IndexOneResource -> IndexFromProvider -> IndexFromResource ->
5641dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    //                     UpdateOneRowWithFilteredData -> UpdateOneRow
5651dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
5661dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
567ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResourceProvider_rowInserted() {
568d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling        SearchIndexableResource resource = getFakeResource(R.xml.swipe_to_notification_settings);
5691dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        resource.xmlResId = 0;
5701dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        resource.className = "com.android.settings.display.ScreenZoomSettings";
5711dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
572ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
5731dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
5741dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(1);
5751dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
5761dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
5771dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
578ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResourceProvider_rowMatches() {
579d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling        SearchIndexableResource resource = getFakeResource(R.xml.swipe_to_notification_settings);
5801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        resource.xmlResId = 0;
5811dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        resource.className = "com.android.settings.display.ScreenZoomSettings";
5821dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
583ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
5841dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
5851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(0);
5861dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
5871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
5881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
5891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
5901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
5911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
5921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(2)).isEqualTo("Display size");
5931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
5941dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(3)).isEqualTo("display size");
5951dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
5961dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(4)).isEmpty();
5971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
5981dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(5)).isEmpty();
5991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off - only on for checkbox preferences
6001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEmpty();
6011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized - only on for checkbox preferences
6021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEmpty();
6031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
6041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isNull();
6051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
6061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(9)).isEqualTo("display density screen zoom scale scaling");
6071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
6081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(10)).isEqualTo("Display size");
6091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
6101dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11))
6111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                .isEqualTo("com.android.settings.display.ScreenZoomSettings");
6121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
6135416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(noIcon);
6141dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
6151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isNull();
6161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
6171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isNull();
6181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
6191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isNull();
6201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
6211dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
6221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
6231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isNull();
6241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
6251dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
6261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
6271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
6281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
6293746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        byte[] payload = cursor.getBlob(20);
6303746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
6313746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze                ResultPayload.CREATOR);
6323746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
6331dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
6341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
6351dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
636ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResourceProvider_resourceRowInserted() {
6373f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        SearchIndexableResource resource = getFakeResource(0);
6381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        resource.className = "com.android.settings.LegalSettings";
6391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
640ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
6411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
6423f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(6);
6431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
6441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
6451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
646ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResourceProvider_resourceRowMatches() {
6473f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        SearchIndexableResource resource = getFakeResource(0);
6483f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        resource.className = "com.android.settings.display.ScreenZoomSettings";
6491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
650ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
6511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
6521dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(0);
6531dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
6541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
6551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
6561dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
6571dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
6581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
6593f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getString(2)).isEqualTo("Display size");
6601dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
6613f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getString(3)).isEqualTo("display size");
6621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
6631dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(4)).isEmpty();
6641dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
6651dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(5)).isEmpty();
6661dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off - only on for checkbox preferences
6671dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEmpty();
6681dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized - only on for checkbox preferences
6691dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEmpty();
6701dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
6711dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isNull();
6721dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
6733f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getString(9)).isEqualTo(
6743f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze                "display density screen zoom scale scaling");
6751dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
6763f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getString(10)).isEqualTo("Display size");
6771dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
6781dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11))
6793f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze                .isEqualTo("com.android.settings.display.ScreenZoomSettings");
6801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
6815416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(noIcon);
6821dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
6831dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isNull();
6841dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
6851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isNull();
6861dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
6871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isNull();
6881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
6891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
6901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
6911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isNull();
6921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
6931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
6941dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
6951dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
6961dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
6973746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        byte[] payload = cursor.getBlob(20);
6983746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
6993746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze                ResultPayload.CREATOR);
7003746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
7011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
7021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
7033f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze    @Test
704ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResourceProvider_disabledResource_rowsInserted() {
7053f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        SearchIndexableResource resource = getFakeResource(0);
7063f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        resource.className = "com.android.settings.LegalSettings";
7073f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
7083f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource,
709ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                new HashMap<String, Set<String>>());
7103f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
7113f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 1", null);
712031af9f287de17384bd7b7498cda44a804ef8091Matthew Fritze        assertThat(cursor.getCount()).isEqualTo(1);
7133f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 0", null);
714031af9f287de17384bd7b7498cda44a804ef8091Matthew Fritze        assertThat(cursor.getCount()).isEqualTo(5);
7153f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze    }
7163f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
71704615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze    @Test
718ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResource_withTitleAndSettingName_titleNotInserted() {
71904615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze        SearchIndexableResource resource = getFakeResource(R.xml.swipe_to_notification_settings);
72004615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze        mManager.indexFromResource(mDb, localeStr, resource, new ArrayList<String>());
72104615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze
72204615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE" +
72304615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze                " enabled = 1", null);
72404615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze        assertThat(cursor.getCount()).isEqualTo(1);
72504615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze    }
72604615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze
727ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    // Test new public indexing flow
728ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
729ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
730a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Config(shadows = {ShadowDatabaseIndexingUtils.class,})
731ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testPerformIndexing_fullIndex_getsDataFromProviders() {
732ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        DummyProvider provider = new DummyProvider();
733ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        provider.onCreate();
734a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        ShadowContentResolver.registerProvider(AUTHORITY_ONE, provider);
735ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
736ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Test that Indexables are added for Full indexing
737ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt()))
738ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                .thenReturn(getDummyResolveInfo());
739ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
740ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        DatabaseIndexingManager manager =
741a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE));
742a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        doReturn(true).when(manager).isFullIndex(anyString(), anyString());
743ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
744ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        manager.performIndexing();
745ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
746a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager).addIndexablesFromRemoteProvider(PACKAGE_ONE, AUTHORITY_ONE);
747a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager).updateDatabase(true /* isFullIndex */, Locale.getDefault().toString());
748a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    }
749ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
750a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Test
751a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Config(shadows = {ShadowDatabaseIndexingUtils.class,})
752a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    public void testPerformIndexing_incrementalIndex_noDataAdded() {
753a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DummyProvider provider = new DummyProvider();
754a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        provider.onCreate();
755a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        ShadowContentResolver.registerProvider(AUTHORITY_ONE, provider);
756ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
757a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Test that Indexables are added for Full indexing
758a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt()))
759a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                .thenReturn(getDummyResolveInfo());
760a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
761a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DatabaseIndexingManager manager =
762a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE));
763a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        doReturn(false).when(manager).isFullIndex(anyString(), anyString());
764a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
765a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        manager.mDataToProcess.dataToUpdate.clear();
766a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
767a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        manager.performIndexing();
768a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
769a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager, times(0)).addDataToDatabase(any(SQLiteDatabase.class), anyString(),
770a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                anyList(), anyMap());
771a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager, times(0)).addIndexablesFromRemoteProvider(PACKAGE_ONE, AUTHORITY_ONE);
772a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager).updateDataInDatabase(any(SQLiteDatabase.class), anyMap());
773ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
774ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
775ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
776a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Config(shadows = {ShadowDatabaseIndexingUtils.class,})
777a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    public void testPerformIndexing_localeChanged_databaseDropped() {
778a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DummyProvider provider = new DummyProvider();
779a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        provider.onCreate();
780a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        ShadowContentResolver.registerProvider(AUTHORITY_ONE, provider);
781a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
782a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Test that Indexables are added for Full indexing
783a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt()))
784a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                .thenReturn(getDummyResolveInfo());
785a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
786a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Initialize the Manager
787a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DatabaseIndexingManager manager =
788a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE));
789a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        doReturn(true).when(manager).isFullIndex(anyString(), anyString());
790a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
791a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Insert data point which will be dropped
792a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        final String oldTitle = "This is French";
793a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        insertSpecialCase(oldTitle, true, "key");
794a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
795a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Add a data point to be added by the indexing
796a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        SearchIndexableRaw raw = new SearchIndexableRaw(mContext);
797a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        final String newTitle = "This is English";
798a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        raw.title = newTitle;
799a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        manager.mDataToProcess.dataToUpdate.add(raw);
800a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
801a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        manager.performIndexing();
802a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
803a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Assert that the New Title is inserted
804a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        final Cursor newCursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE data_title = '" +
805a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                newTitle + "'", null);
806a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        assertThat(newCursor.getCount()).isEqualTo(1);
807a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
808a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Assert that the Old Title is no longer in the database, since it was dropped
809a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        final Cursor oldCursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE data_title = '" +
810a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                oldTitle + "'", null);
811a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        assertThat(oldCursor.getCount()).isEqualTo(0);
812a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    }
813a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
814a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Test
815a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Config(shadows = {ShadowDatabaseIndexingUtils.class,})
816a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    public void testPerformIndexing_onOta_FullIndex() {
817ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        DummyProvider provider = new DummyProvider();
818ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        provider.onCreate();
819ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        ShadowContentResolver.registerProvider(
820ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                AUTHORITY_ONE, provider
821ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        );
822ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
823ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Test that Indexables are added for Full indexing
824ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt()))
825ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                .thenReturn(getDummyResolveInfo());
826ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
827ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        DatabaseIndexingManager manager =
828a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE));
829a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        doReturn(true).when(manager).isFullIndex(anyString(), anyString());
830ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
831ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        manager.performIndexing();
832ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
833a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager).updateDatabase(true /* isFullIndex */, Locale.getDefault().toString());
834a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    }
835ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
836a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Test
837a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Config(shadows = {ShadowDatabaseIndexingUtils.class,})
838a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    public void testPerformIndexing_onOta_buildNumberIsCached() {
839a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DummyProvider provider = new DummyProvider();
840a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        provider.onCreate();
841a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        ShadowContentResolver.registerProvider(
842a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                AUTHORITY_ONE, provider
843a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        );
844a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
845a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Test that Indexables are added for Full indexing
846a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt()))
847a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                .thenReturn(getDummyResolveInfo());
848a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
849a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DatabaseIndexingManager manager =
850a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE));
851a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        doReturn(true).when(manager).isFullIndex(anyString(), anyString());
852a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
853a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        manager.performIndexing();
854a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
855a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        assertThat(IndexDatabaseHelper.getInstance(mContext).isBuildIndexed(mContext,
856a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                Build.FINGERPRINT)).isTrue();
857ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
858ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
859ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
860ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testFullUpdatedDatabase_noData_addDataToDatabaseNotCalled() {
861a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        mManager.updateDatabase(true /* isFullIndex */, localeStr);
862ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.mDataToProcess.dataToUpdate.clear();
863ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        verify(mManager, times(0)).addDataToDatabase(any(SQLiteDatabase.class), anyString(),
864ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                anyList(), anyMap());
865ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
866ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
867ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
868ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testFullUpdatedDatabase_updatedDataInDatabaseNotCalled() {
869a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        mManager.updateDatabase(true /* isFullIndex */, localeStr);
870ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        verify(mManager, times(0)).updateDataInDatabase(any(SQLiteDatabase.class), anyMap());
871ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
872ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
873ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
8748a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze    public void testLocaleUpdated_afterIndexing_localeNotAdded() {
875a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        mManager.updateDatabase(true /* isFullIndex */, localeStr);
876ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(IndexDatabaseHelper.getInstance(mContext)
8778a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze                .isLocaleAlreadyIndexed(mContext, localeStr)).isFalse();
8788a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze    }
8798a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze
8808a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze    @Test
8818a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze    public void testLocaleUpdated_afterFullIndexing_localeAdded() {
8828a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze        mManager.performIndexing();
8838a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze        assertThat(IndexDatabaseHelper.getInstance(mContext)
884ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                .isLocaleAlreadyIndexed(mContext, localeStr)).isTrue();
885ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
886ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
887ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
888ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testUpdateDatabase_newEligibleData_addedToDatabase() {
889ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Test that addDataToDatabase is called when dataToUpdate is non-empty
890ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.mDataToProcess.dataToUpdate.add(getFakeRaw());
891a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        mManager.updateDatabase(true /* isFullIndex */, localeStr);
892ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
893ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
894ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        cursor.moveToPosition(0);
895ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
896ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Locale
897ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
898ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Data Rank
899ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
900ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Data Title
901ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(2)).isEqualTo(updatedTitle);
902ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Normalized Title
903ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(3)).isEqualTo(normalizedTitle);
904ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Summary On
905ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(4)).isEqualTo(updatedSummaryOn);
906ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Summary On Normalized
907ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(5)).isEqualTo(normalizedSummaryOn);
908ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Summary Off
909ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(6)).isEqualTo(updatedSummaryOff);
910ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Summary off normalized
911ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(7)).isEqualTo(normalizedSummaryOff);
912ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Entries
913ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(8)).isEqualTo(entries);
914ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Keywords
915ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(9)).isEqualTo(spaceDelimittedKeywords);
916ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Screen Title
917ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(10)).isEqualTo(screenTitle);
918ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Class Name
919ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(11)).isEqualTo(className);
920ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Icon
921ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(iconResId);
922ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Intent Action
923ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(13)).isEqualTo(action);
924ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Target Package
925ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(14)).isEqualTo(targetPackage);
926ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Target Class
927ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(15)).isEqualTo(targetClass);
928ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Enabled
929ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
930ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Data ref key
931ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(17)).isNotNull();
932ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // User Id
933ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
934ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Payload Type - default is 0
935ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
936ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Payload
9373746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        byte[] payload = cursor.getBlob(20);
9383746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
9393746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze                ResultPayload.CREATOR);
9403746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
941ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
942ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
943ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
944ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testUpdateDataInDatabase_enabledResultsAreNonIndexable_becomeDisabled() {
945ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Both results are enabled, and then TITLE_ONE gets disabled.
946ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        final boolean enabled = true;
947ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        insertSpecialCase(TITLE_ONE, enabled, KEY_ONE);
948ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        insertSpecialCase(TITLE_TWO, enabled, KEY_TWO);
949ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Map<String, Set<String>> niks = new ArrayMap<>();
950ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Set<String> keys = new HashSet<>();
951ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        keys.add(KEY_ONE);
952ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        niks.put(targetPackage, keys);
953ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
954ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.updateDataInDatabase(mDb, niks);
955ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
956ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 0", null);
957ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        cursor.moveToPosition(0);
958ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
959ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(2)).isEqualTo(TITLE_ONE);
960ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
961ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
962ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
9634f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze    public void testUpdateDataInDatabase_disabledResultsAreIndexable_becomeEnabled() {
964ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Both results are initially disabled, and then TITLE_TWO gets enabled.
965ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        final boolean enabled = false;
966ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        insertSpecialCase(TITLE_ONE, enabled, KEY_ONE);
967ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        insertSpecialCase(TITLE_TWO, enabled, KEY_TWO);
968ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Map<String, Set<String>> niks = new ArrayMap<>();
969ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Set<String> keys = new HashSet<>();
970ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        keys.add(KEY_ONE);
971ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        niks.put(targetPackage, keys);
972ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
973ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.updateDataInDatabase(mDb, niks);
974ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
975ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 1", null);
976ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        cursor.moveToPosition(0);
977ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
978ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(2)).isEqualTo(TITLE_TWO);
979ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
980ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
9814f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze    @Test
9824f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze    @Config(shadows = {ShadowContentResolver.class})
9834f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze    public void testEmptyNonIndexableKeys_emptyDataKeyResources_addedToDatabase() {
9844f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        insertSpecialCase(TITLE_ONE, true /* enabled */, null /* dataReferenceKey */);
9854f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze
9864f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        mManager.updateDatabase(false, localeStr);
9874f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze
9884f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 1", null);
9894f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        cursor.moveToPosition(0);
9904f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        assertThat(cursor.getCount()).isEqualTo(1);
9914f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        assertThat(cursor.getString(2)).isEqualTo(TITLE_ONE);
9924f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze    }
993be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze
994be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze    @Test
995be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze    public void testUpdateAsyncTask_onPostExecute_performsCallback() {
996be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        IndexingCallback callback = mock(IndexingCallback.class);
997be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze
998be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        DatabaseIndexingManager.IndexingTask task = mManager.new IndexingTask(callback);
999be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        task.execute();
1000be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze
1001be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        Robolectric.flushForegroundThreadScheduler();
1002be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze
1003be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        verify(callback).onIndexingFinished();
1004be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze    }
1005be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze
1006be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze    @Test
1007be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze    public void testUpdateAsyncTask_onPostExecute_setsIndexingComplete() {
1008be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        SearchFeatureProviderImpl provider = new SearchFeatureProviderImpl();
1009be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        DatabaseIndexingManager manager = spy(provider.getIndexingManager(mContext));
1010be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        DatabaseIndexingManager.IndexingTask task = manager.new IndexingTask(null);
1011be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        doNothing().when(manager).performIndexing();
1012be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze
1013be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        task.execute();
1014be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        Robolectric.flushForegroundThreadScheduler();
1015be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze
1016be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        assertThat(provider.isIndexingComplete(mContext)).isTrue();
1017be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze    }
1018be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze
10191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    // Util functions
10201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
10211dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private SearchIndexableRaw getFakeRaw() {
10221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        return getFakeRaw(localeStr);
10231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
10241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
10251dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private SearchIndexableRaw getFakeRaw(String localeStr) {
10261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableRaw data = new SearchIndexableRaw(mContext);
10271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.locale = new Locale(localeStr);
10281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.rank = rank;
10291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.title = title;
10301dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.summaryOn = summaryOn;
10311dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.summaryOff = summaryOff;
10321dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.entries = entries;
10331dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.keywords = keywords;
10341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.screenTitle = screenTitle;
10351dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.className = className;
10361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.packageName = packageName;
10371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.iconResId = iconResId;
10381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.intentAction = action;
10391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.intentTargetPackage = targetPackage;
10401dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.intentTargetClass = targetClass;
10411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.key = key;
10421dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.userId = userId;
10431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.enabled = enabled;
10441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        return data;
10451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
10461dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
10471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private SearchIndexableResource getFakeResource(int xml) {
10481dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableResource sir = new SearchIndexableResource(mContext);
10491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.rank = rank;
10501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.xmlResId = xml;
10511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.className = className;
10521dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.packageName = packageName;
10531dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.iconResId = iconResId;
10541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.intentAction = action;
10551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.intentTargetPackage = targetPackage;
10561dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.intentTargetClass = targetClass;
10571dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.enabled = enabled;
10581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        return sir;
10591dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
10603f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
1061ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private Map<String, Set<String>> getNonIndexableKeys(String[] keys) {
1062ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Map<String, Set<String>> niks = new HashMap<>();
1063ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Set<String> keysList = new HashSet<>();
1064ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        keysList.addAll(Arrays.asList(keys));
10653f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        niks.put(packageName, keysList);
10663f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        return niks;
10673f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze    }
1068ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1069ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private List<ResolveInfo> getDummyResolveInfo() {
1070ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        List<ResolveInfo> infoList = new ArrayList<>();
1071ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        ResolveInfo info = new ResolveInfo();
1072ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        info.providerInfo = new ProviderInfo();
1073ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        info.providerInfo.exported = true;
1074ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        info.providerInfo.authority = AUTHORITY_ONE;
1075ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        info.providerInfo.packageName = PACKAGE_ONE;
1076ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        infoList.add(info);
1077ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1078ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        return infoList;
1079ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
1080ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1081ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    // TODO move this method and its counterpart in CursorToSearchResultConverterTest into
1082ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    // a util class with public fields to assert values.
1083ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private Cursor getDummyCursor() {
10844f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        MatrixCursor cursor = new MatrixCursor(INDEXABLES_RAW_COLUMNS);
1085ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        final String BLANK = "";
1086ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1087ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        ArrayList<String> item =
10884f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze                new ArrayList<>(INDEXABLES_RAW_COLUMNS.length);
1089ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add("42"); // Rank
1090ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(TITLE_ONE); // Title
1091ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // Summary on
1092ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // summary off
1093ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // entries
1094ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // keywords
1095ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // screen title
1096ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // classname
1097ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add("123"); // Icon
1098ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // Intent action
1099ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // target package
1100ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // target class
1101ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(KEY_ONE); // Key
1102ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add("-1"); // userId
1103ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        cursor.addRow(item);
1104ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1105ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        return cursor;
1106ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
1107ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1108ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private void insertSpecialCase(String specialCase, boolean enabled, String key) {
1109ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        ContentValues values = new ContentValues();
1110ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DOCID, specialCase.hashCode());
1111ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.LOCALE, localeStr);
1112ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_RANK, 1);
1113ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE, specialCase);
1114ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE_NORMALIZED, "");
1115ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON, "");
1116ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON_NORMALIZED, "");
1117ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF, "");
1118ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF_NORMALIZED, "");
1119ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_ENTRIES, "");
1120ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_KEYWORDS, "");
1121ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.CLASS_NAME, "");
1122ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.SCREEN_TITLE, "Moves");
1123ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.INTENT_ACTION, "");
1124ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.INTENT_TARGET_PACKAGE, targetPackage);
1125ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.INTENT_TARGET_CLASS, "");
1126ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.ICON, "");
1127ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.ENABLED, enabled);
1128ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_KEY_REF, key);
1129ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.USER_ID, 0);
1130ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.PAYLOAD_TYPE, 0);
1131ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.PAYLOAD, (String) null);
1132ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1133ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mDb.replaceOrThrow(IndexDatabaseHelper.Tables.TABLE_PREFS_INDEX, null, values);
1134ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
1135ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1136ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private class DummyProvider extends ContentProvider {
1137ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1138ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1139ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public boolean onCreate() {
1140ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return false;
1141ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1142ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1143ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1144ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public Cursor query(@NonNull Uri uri, @Nullable String[] projection,
1145ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                @Nullable String selection, @Nullable String[] selectionArgs,
1146ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                @Nullable String sortOrder) {
1147ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            if (uri.toString().contains("xml")) {
1148ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                return null;
1149ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            }
1150ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return getDummyCursor();
1151ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1152ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1153ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1154ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public String getType(@NonNull Uri uri) {
1155ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return null;
1156ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1157ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1158ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1159ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
1160ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return null;
1161ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1162ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1163ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1164ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public int delete(@NonNull Uri uri, @Nullable String selection,
1165ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                @Nullable String[] selectionArgs) {
1166ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return 0;
1167ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1168ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1169ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1170ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public int update(@NonNull Uri uri, @Nullable ContentValues values,
1171ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                @Nullable String selection, @Nullable String[] selectionArgs) {
1172ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return 0;
1173ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1174ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
1175a9831d40d081cc8c7ca32891e64c09b5e1d19abbPhilip Quinn}
1176