DatabaseIndexingManagerTest.java revision 473b6b45de00dbb24423747173cbcf09737d53ff
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();
1801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, raw, null /* Non-indexable keys */);
1811dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
1821dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(1);
1831dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
1841dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
1851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
186ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testInsertRawColumn_rowMatches() {
1871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableRaw raw = getFakeRaw();
1881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, raw, null /* Non-indexable keys */);
1891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
1901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(0);
1911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
1921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
1931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
1941dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
1951dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(raw.rank);
1961dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
1971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(2)).isEqualTo(updatedTitle);
1981dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
1991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(3)).isEqualTo(normalizedTitle);
2001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
2011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(4)).isEqualTo(updatedSummaryOn);
2021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
2031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(5)).isEqualTo(normalizedSummaryOn);
2041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off
2051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEqualTo(updatedSummaryOff);
2061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized
2071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEqualTo(normalizedSummaryOff);
2081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries
2091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isEqualTo(raw.entries);
2101dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
2111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(9)).isEqualTo(spaceDelimittedKeywords);
2121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
2131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(10)).isEqualTo(raw.screenTitle);
2141dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
2151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11)).isEqualTo(raw.className);
2161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
2171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(raw.iconResId);
2181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
2191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isEqualTo(raw.intentAction);
2201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
2211dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isEqualTo(raw.intentTargetPackage);
2221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
2231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isEqualTo(raw.intentTargetClass);
2241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
2251dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(raw.enabled);
2261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
2271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isNotNull();
2281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
2291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(raw.userId);
2301dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
2311dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
2321dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload
2333746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        byte[] payload = cursor.getBlob(20);
2343746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
2353746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze                ResultPayload.CREATOR);
2363746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
2371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
2381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
240ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testInsertRawColumn_mismatchedLocale_noRowInserted() {
2411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableRaw raw = getFakeRaw("ca-fr");
2421dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, raw, null /* Non-indexable keys */);
2431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
2441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(0);
2451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
2461dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    // Tests for the flow: IndexOneResource -> IndexFromResource ->
2481dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    //                     UpdateOneRowWithFilteredData -> UpdateOneRow
2491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
2511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    public void testNullResource_NothingInserted() {
2521dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, null /* searchIndexableResource */,
253248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang                new HashMap<>());
2541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
2551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(0);
2561dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
2571dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
2591dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    public void testAddResource_RowsInserted() {
260dc9a82f5b017f430aa7d50f12450082f1bdc871eFan Zhang        SearchIndexableResource resource = getFakeResource(R.xml.display_settings);
261ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
2621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
263305f900bfa42a4ecc3a7b8d1454331d8ad8d76a9Romain Guy        assertThat(cursor.getCount()).isEqualTo(17);
2641dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
2651dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2661dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
267ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResource_withNIKs_rowsInsertedDisabled() {
268dc9a82f5b017f430aa7d50f12450082f1bdc871eFan Zhang        SearchIndexableResource resource = getFakeResource(R.xml.display_settings);
269d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling        // Only add 2 of 16 items to be disabled.
270d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling        String[] keys = {"brightness", "wallpaper"};
271ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Map<String, Set<String>> niks = getNonIndexableKeys(keys);
272ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
2733f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, niks);
2743f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
2753f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 0", null);
2763f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(2);
2773f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 1", null);
278305f900bfa42a4ecc3a7b8d1454331d8ad8d76a9Romain Guy        assertThat(cursor.getCount()).isEqualTo(15);
2793f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze    }
2803f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
2813f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze    @Test
282ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResourceHeader_rowsMatch() {
2831dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableResource resource = getFakeResource(R.xml.application_settings);
284ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
2851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2861dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
2871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(1);
2881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
2891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
2901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
2911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
2921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
2931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
294015a50bef99a23a8c795486b99021a5784d65d64Doris Ling        assertThat(cursor.getString(2)).isEqualTo("App info");
2951dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
296015a50bef99a23a8c795486b99021a5784d65d64Doris Ling        assertThat(cursor.getString(3)).isEqualTo("app info");
2971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
2981dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(4)).isEqualTo("Manage apps, set up quick launch shortcuts");
2991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
3001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(5)).isEqualTo("manage apps, set up quick launch shortcuts");
3011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off - only on for checkbox preferences
3021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEmpty();
3031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized - only on for checkbox preferences
3041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEmpty();
3051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
3061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isNull();
3071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
3081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(9)).isEmpty();
3091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
310015a50bef99a23a8c795486b99021a5784d65d64Doris Ling        assertThat(cursor.getString(10)).isEqualTo("App info");
3111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
3121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11)).isEqualTo(className);
3131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
314d0b42b03229225571ed060a377a0f72264058db6Matthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(0);
3151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
3161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isEqualTo(action);
3171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
3181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isEqualTo(targetPackage);
3191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
3201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isEqualTo(targetClass);
3211dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
3221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
3231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
3241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isEqualTo("applications_settings");
3251dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
3261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
3271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
3281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
3291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
3303746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        byte[] payload = cursor.getBlob(20);
3313746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
3323746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze                ResultPayload.CREATOR);
3333746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
3341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
3351dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
3361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
337ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResource_withChildFragment_shouldUpdateSiteMapDb() {
338f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam        // FIXME: This test was failing. (count = 6 at the end)
339f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam
340f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        SearchIndexableResource resource = getFakeResource(R.xml.network_and_internet);
341f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        mManager.indexOneSearchIndexableData(mDb, localeStr, resource,
342f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                new HashMap<>());
343f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        Cursor query = mDb.query(IndexDatabaseHelper.Tables.TABLE_SITE_MAP, SITE_MAP_COLUMNS,
344f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                null, null, null, null, null);
345f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        query.moveToPosition(-1);
346f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        int count = 0;
347f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        while (query.moveToNext()) {
348f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//            count++;
349f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//            assertThat(query.getString(query.getColumnIndex(SiteMapColumns.PARENT_CLASS)))
350f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                    .isEqualTo(className);
351f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//            assertThat(query.getString(query.getColumnIndex(SiteMapColumns.PARENT_TITLE)))
352f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                    .isEqualTo(mContext.getString(R.string.network_dashboard_title));
353f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//            assertThat(query.getString(query.getColumnIndex(SiteMapColumns.CHILD_CLASS)))
354f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                    .isNotEmpty();
355f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//            assertThat(query.getString(query.getColumnIndex(SiteMapColumns.CHILD_TITLE)))
356f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//                    .isNotEmpty();
357f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        }
358f04ff76af05823619f1c522f22d8193edbb56bfaMaurice Lam//        assertThat(count).isEqualTo(5);
359a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang    }
360a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang
361a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang    @Test
362ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResource_customSetting_rowsMatch() {
363d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling        SearchIndexableResource resource = getFakeResource(R.xml.swipe_to_notification_settings);
364ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
365248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        final String prefTitle =
366248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang                mContext.getString(R.string.fingerprint_swipe_for_notifications_title);
367248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        final String prefSummary =
368248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang                mContext.getString(R.string.fingerprint_swipe_for_notifications_summary);
36982be5f0c3fa4b9511e1e7e4c4e9c20cf31a8294fFan Zhang        final String keywords = mContext.getString(R.string.keywords_gesture);
370248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        Cursor cursor = mDb.rawQuery(
371248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang                "SELECT * FROM prefs_index where data_title='" + prefTitle + "'", null);
372248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        cursor.moveToFirst();
3731dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
3741dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
3751dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
3761dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
3771dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
3781dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
379248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        assertThat(cursor.getString(2)).isEqualTo(prefTitle);
3801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
381248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        assertThat(cursor.getString(3)).isEqualTo(prefTitle.toLowerCase());
3821dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
383248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        assertThat(cursor.getString(4)).isEqualTo(prefSummary);
3841dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
385248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        assertThat(cursor.getString(5)).isEqualTo(prefSummary.toLowerCase());
3861dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off - only on for checkbox preferences
3871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEmpty();
3881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized - only on for checkbox preferences
3891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEmpty();
3901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
3911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isNull();
3921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
39382be5f0c3fa4b9511e1e7e4c4e9c20cf31a8294fFan Zhang        assertThat(cursor.getString(9)).isEqualTo(keywords);
3941dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
395248d95c61809b253eb16fb1d597ed5e2f83ada78Fan Zhang        assertThat(cursor.getString(10)).isEqualTo(
396d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling                mContext.getString(R.string.fingerprint_swipe_for_notifications_title));
3971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
3981dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11)).isEqualTo(className);
3991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
4005416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(noIcon);
4011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
4021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isEqualTo(action);
4031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
4041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isEqualTo(targetPackage);
4051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
4061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isEqualTo(targetClass);
4071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
4081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
4091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
4101dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isEqualTo("gesture_swipe_down_fingerprint");
4111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
4121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
4131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
4141dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
4151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
4163746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        byte[] payload = cursor.getBlob(20);
4173746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
4183746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze                ResultPayload.CREATOR);
4193746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
4201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
4211dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
4221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
423ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResource_checkboxPreference_rowsMatch() {
4241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableResource resource = getFakeResource(R.xml.application_settings);
425ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
4261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
4271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        /* Should return 6 results, with the following titles:
4281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze         * Advanced Settings, Apps, Manage Apps, Preferred install location, Running Services
4291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze         */
4301dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
4311dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(0);
4321dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
4331dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
4341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
4351dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
4361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
4371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(2)).isEqualTo("Advanced settings");
4381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
4391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(3)).isEqualTo("advanced settings");
4401dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
4411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(4)).isEqualTo("Enable more settings options");
4421dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
4431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(5)).isEqualTo("enable more settings options");
4441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off
4451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEqualTo("Enable more settings options");
4461dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off
4471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEqualTo("enable more settings options");
4481dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
4491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isNull();
4501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
4511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(9)).isEmpty();
4521dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
453015a50bef99a23a8c795486b99021a5784d65d64Doris Ling        assertThat(cursor.getString(10)).isEqualTo("App info");
4541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
4551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11)).isEqualTo(className);
4561dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
4575416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(noIcon);
4581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
4591dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isEqualTo(action);
4601dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
4611dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isEqualTo(targetPackage);
4621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
4631dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isEqualTo(targetClass);
4641dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
4651dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
4661dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
4671dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isEqualTo("toggle_advanced_settings");
4681dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
4691dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
4701dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
4711dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
4721dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
4733746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        byte[] payload = cursor.getBlob(20);
4743746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
4753746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze                ResultPayload.CREATOR);
4763746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
4771dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
4781dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
4791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
480ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testAddResource_listPreference_rowsMatch() {
4811dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableResource resource = getFakeResource(R.xml.application_settings);
482ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
4831dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
4841dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
4851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(3);
4861dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
4871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
4881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
4891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
4901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
4911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(2)).isEqualTo("Preferred install location");
4921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
4931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(3)).isEqualTo("preferred install location");
4941dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
495a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang        assertThat(cursor.getString(4)).isEqualTo(
496a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang                "Change the preferred installation location for new apps");
4971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
498a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang        assertThat(cursor.getString(5)).isEqualTo(
499a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang                "change the preferred installation location for new apps");
5001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off - only on for checkbox preferences
5011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEmpty();
5021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized - only on for checkbox preferences
5031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEmpty();
5041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
5051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isEqualTo("Internal device storage|Removable SD card|" +
506a96b11f65d9f29dd4037da85e12f5cf9dcfa0176Fan Zhang                "Let the system decide|");
5071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
5081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(9)).isEmpty();
5091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
510015a50bef99a23a8c795486b99021a5784d65d64Doris Ling        assertThat(cursor.getString(10)).isEqualTo("App info");
5111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
5121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11)).isEqualTo(className);
5131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
5145416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(noIcon);
5151dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
5161dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isEqualTo(action);
5171dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
5181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isEqualTo(targetPackage);
5191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
5201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isEqualTo(targetClass);
5211dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
5221dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
5231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
5241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isEqualTo("app_install_location");
5251dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
5261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
5271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
5281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
5291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
5303746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        byte[] payload = cursor.getBlob(20);
5313746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
5323746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze                ResultPayload.CREATOR);
5333746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
5341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
5351dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
5365416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze    @Test
5375416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze    public void testAddResource_iconAddedFromXml() {
5385416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        SearchIndexableResource resource = getFakeResource(R.xml.connected_devices);
5395416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
5405416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze
5415416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
5425416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        cursor.moveToPosition(0);
5435416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze
5445416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        // Icon
5455416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        assertThat(cursor.getInt(12)).isNotEqualTo(noIcon);
5465416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze    }
5475416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze
5481dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    // Tests for the flow: IndexOneResource -> IndexFromProvider -> IndexFromResource ->
5491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    //                     UpdateOneRowWithFilteredData -> UpdateOneRow
5501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
5511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
552ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResourceProvider_rowInserted() {
553d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling        SearchIndexableResource resource = getFakeResource(R.xml.swipe_to_notification_settings);
5541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        resource.xmlResId = 0;
5551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        resource.className = "com.android.settings.display.ScreenZoomSettings";
5561dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
557ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
5581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
5591dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(1);
5601dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
5611dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
5621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
563ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResourceProvider_rowMatches() {
564d299b03f28fd23973b32931c3ae9a254a37d474dDoris Ling        SearchIndexableResource resource = getFakeResource(R.xml.swipe_to_notification_settings);
5651dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        resource.xmlResId = 0;
5661dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        resource.className = "com.android.settings.display.ScreenZoomSettings";
5671dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
568ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
5691dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
5701dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(0);
5711dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
5721dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
5731dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
5741dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
575473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(0);
5761dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
5771dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(2)).isEqualTo("Display size");
5781dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
5791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(3)).isEqualTo("display size");
5801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
5811dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(4)).isEmpty();
5821dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
5831dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(5)).isEmpty();
5841dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off - only on for checkbox preferences
5851dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEmpty();
5861dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized - only on for checkbox preferences
5871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEmpty();
5881dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
5891dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isNull();
5901dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
5911dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(9)).isEqualTo("display density screen zoom scale scaling");
5921dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
5931dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(10)).isEqualTo("Display size");
5941dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
5951dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11))
5961dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze                .isEqualTo("com.android.settings.display.ScreenZoomSettings");
5971dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
5985416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(noIcon);
5991dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
6001dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isNull();
6011dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
6021dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isNull();
6031dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
6041dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isNull();
6051dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
6061dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
6071dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
6081dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isNull();
6091dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
6101dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
6111dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
6121dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
6131dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
6143746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        byte[] payload = cursor.getBlob(20);
6153746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
6163746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze                ResultPayload.CREATOR);
6173746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
6181dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
6191dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
6201dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
621ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResourceProvider_resourceRowInserted() {
6223f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        SearchIndexableResource resource = getFakeResource(0);
6231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        resource.className = "com.android.settings.LegalSettings";
6241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
625ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
6261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
6273f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getCount()).isEqualTo(6);
6281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
6291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
6301dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    @Test
631ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResourceProvider_resourceRowMatches() {
632473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze        SearchIndexableResource resource = getFakeResource(0 /* xml */);
6333f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        resource.className = "com.android.settings.display.ScreenZoomSettings";
6341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
635ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
6361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
6371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        cursor.moveToPosition(0);
6381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
6391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Locale
6401dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
6411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Rank
642473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(0);
6431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data Title
6443f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getString(2)).isEqualTo("Display size");
6451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Normalized Title
6463f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getString(3)).isEqualTo("display size");
6471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On
6481dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(4)).isEmpty();
6491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary On Normalized
6501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(5)).isEmpty();
6511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary Off - only on for checkbox preferences
6521dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(6)).isEmpty();
6531dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Summary off normalized - only on for checkbox preferences
6541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(7)).isEmpty();
6551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Entries - only on for list preferences
6561dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(8)).isNull();
6571dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Keywords
6583f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getString(9)).isEqualTo(
6593f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze                "display density screen zoom scale scaling");
6601dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Screen Title
6613f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        assertThat(cursor.getString(10)).isEqualTo("Display size");
6621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Class Name
6631dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(11))
6643f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze                .isEqualTo("com.android.settings.display.ScreenZoomSettings");
6651dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Icon
6665416a5992bceb91bd3eda63629ba5420a714747bMatthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(noIcon);
6671dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Intent Action
6681dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(13)).isNull();
6691dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Package
6701dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(14)).isNull();
6711dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Target Class
6721dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(15)).isNull();
6731dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Enabled
6741dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
6751dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Data ref key
6761dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getString(17)).isNull();
6771dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // User Id
6781dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
6791dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload Type - default is 0
6801dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
6811dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        // Payload - should be updated to real payloads as controllers are added
6823746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        byte[] payload = cursor.getBlob(20);
6833746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
6843746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze                ResultPayload.CREATOR);
6853746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
6861dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
6871dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
6883f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze    @Test
689ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResourceProvider_disabledResource_rowsInserted() {
690473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze        SearchIndexableResource resource = getFakeResource(0 /* xml */);
6913f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        resource.className = "com.android.settings.LegalSettings";
6923f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
6933f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource,
694ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                new HashMap<String, Set<String>>());
6953f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
6963f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 1", null);
697031af9f287de17384bd7b7498cda44a804ef8091Matthew Fritze        assertThat(cursor.getCount()).isEqualTo(1);
6983f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 0", null);
699031af9f287de17384bd7b7498cda44a804ef8091Matthew Fritze        assertThat(cursor.getCount()).isEqualTo(5);
7003f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze    }
7013f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
70204615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze    @Test
703ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testResource_withTitleAndSettingName_titleNotInserted() {
70404615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze        SearchIndexableResource resource = getFakeResource(R.xml.swipe_to_notification_settings);
70504615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze        mManager.indexFromResource(mDb, localeStr, resource, new ArrayList<String>());
70604615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze
70704615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE" +
70804615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze                " enabled = 1", null);
70904615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze        assertThat(cursor.getCount()).isEqualTo(1);
71004615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze    }
71104615bc1b6a10edad13754c9e6be1197ad150901Matthew Fritze
712473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze    @Test
713473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze    public void testResourceProvider_nonSubsettingIntent() {
714473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze        SearchIndexableResource resource = getFakeResource(0 /* xml */);
715473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze        String fakeAction = "fake_action";
716473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze        resource.className = "com.android.settings.LegalSettings";
717473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze        resource.intentAction = fakeAction;
718473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze        resource.intentTargetPackage = SearchIndexableResources.SUBSETTING_TARGET_PACKAGE;
719473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze
720473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
721473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
722473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze        cursor.moveToPosition(0);
723473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze
724473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze        // Intent Action
725473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze        assertThat(cursor.getString(13)).isEqualTo(fakeAction);
726473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze        // Target Package
727473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze        assertThat(cursor.getString(14))
728473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze                .isEqualTo(SearchIndexableResources.SUBSETTING_TARGET_PACKAGE);
729473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze    }
730473b6b45de00dbb24423747173cbcf09737d53ffMatthew Fritze
731ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    // Test new public indexing flow
732ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
733ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
734a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Config(shadows = {ShadowDatabaseIndexingUtils.class,})
735ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testPerformIndexing_fullIndex_getsDataFromProviders() {
736ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        DummyProvider provider = new DummyProvider();
737ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        provider.onCreate();
738a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        ShadowContentResolver.registerProvider(AUTHORITY_ONE, provider);
739ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
740ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Test that Indexables are added for Full indexing
741ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt()))
742ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                .thenReturn(getDummyResolveInfo());
743ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
744ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        DatabaseIndexingManager manager =
745a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE));
746a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        doReturn(true).when(manager).isFullIndex(anyString(), anyString());
747ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
748ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        manager.performIndexing();
749ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
750a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager).addIndexablesFromRemoteProvider(PACKAGE_ONE, AUTHORITY_ONE);
751a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager).updateDatabase(true /* isFullIndex */, Locale.getDefault().toString());
752a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    }
753ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
754a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Test
755a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Config(shadows = {ShadowDatabaseIndexingUtils.class,})
756a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    public void testPerformIndexing_incrementalIndex_noDataAdded() {
757a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DummyProvider provider = new DummyProvider();
758a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        provider.onCreate();
759a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        ShadowContentResolver.registerProvider(AUTHORITY_ONE, provider);
760ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
761a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Test that Indexables are added for Full indexing
762a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt()))
763a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                .thenReturn(getDummyResolveInfo());
764a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
765a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DatabaseIndexingManager manager =
766a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE));
767a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        doReturn(false).when(manager).isFullIndex(anyString(), anyString());
768a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
769a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        manager.mDataToProcess.dataToUpdate.clear();
770a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
771a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        manager.performIndexing();
772a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
773a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager, times(0)).addDataToDatabase(any(SQLiteDatabase.class), anyString(),
774a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                anyList(), anyMap());
775a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager, times(0)).addIndexablesFromRemoteProvider(PACKAGE_ONE, AUTHORITY_ONE);
776a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager).updateDataInDatabase(any(SQLiteDatabase.class), anyMap());
777ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
778ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
779ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
780a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Config(shadows = {ShadowDatabaseIndexingUtils.class,})
781a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    public void testPerformIndexing_localeChanged_databaseDropped() {
782a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DummyProvider provider = new DummyProvider();
783a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        provider.onCreate();
784a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        ShadowContentResolver.registerProvider(AUTHORITY_ONE, provider);
785a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
786a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Test that Indexables are added for Full indexing
787a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt()))
788a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                .thenReturn(getDummyResolveInfo());
789a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
790a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Initialize the Manager
791a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DatabaseIndexingManager manager =
792a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE));
793a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        doReturn(true).when(manager).isFullIndex(anyString(), anyString());
794a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
795a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Insert data point which will be dropped
796a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        final String oldTitle = "This is French";
797a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        insertSpecialCase(oldTitle, true, "key");
798a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
799a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Add a data point to be added by the indexing
800a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        SearchIndexableRaw raw = new SearchIndexableRaw(mContext);
801a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        final String newTitle = "This is English";
802a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        raw.title = newTitle;
803a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        manager.mDataToProcess.dataToUpdate.add(raw);
804a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
805a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        manager.performIndexing();
806a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
807a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Assert that the New Title is inserted
808a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        final Cursor newCursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE data_title = '" +
809a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                newTitle + "'", null);
810a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        assertThat(newCursor.getCount()).isEqualTo(1);
811a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
812a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Assert that the Old Title is no longer in the database, since it was dropped
813a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        final Cursor oldCursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE data_title = '" +
814a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                oldTitle + "'", null);
815a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        assertThat(oldCursor.getCount()).isEqualTo(0);
816a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    }
817a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
818a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Test
819a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Config(shadows = {ShadowDatabaseIndexingUtils.class,})
820a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    public void testPerformIndexing_onOta_FullIndex() {
821ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        DummyProvider provider = new DummyProvider();
822ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        provider.onCreate();
823ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        ShadowContentResolver.registerProvider(
824ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                AUTHORITY_ONE, provider
825ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        );
826ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
827ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Test that Indexables are added for Full indexing
828ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt()))
829ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                .thenReturn(getDummyResolveInfo());
830ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
831ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        DatabaseIndexingManager manager =
832a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE));
833a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        doReturn(true).when(manager).isFullIndex(anyString(), anyString());
834ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
835ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        manager.performIndexing();
836ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
837a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        verify(manager).updateDatabase(true /* isFullIndex */, Locale.getDefault().toString());
838a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    }
839ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
840a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Test
841a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    @Config(shadows = {ShadowDatabaseIndexingUtils.class,})
842a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze    public void testPerformIndexing_onOta_buildNumberIsCached() {
843a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DummyProvider provider = new DummyProvider();
844a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        provider.onCreate();
845a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        ShadowContentResolver.registerProvider(
846a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                AUTHORITY_ONE, provider
847a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        );
848a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
849a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        // Test that Indexables are added for Full indexing
850a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        when(mPackageManager.queryIntentContentProviders(any(Intent.class), anyInt()))
851a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                .thenReturn(getDummyResolveInfo());
852a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
853a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        DatabaseIndexingManager manager =
854a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                spy(new DatabaseIndexingManager(mContext, PACKAGE_ONE));
855a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        doReturn(true).when(manager).isFullIndex(anyString(), anyString());
856a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
857a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        manager.performIndexing();
858a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze
859a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        assertThat(IndexDatabaseHelper.getInstance(mContext).isBuildIndexed(mContext,
860a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze                Build.FINGERPRINT)).isTrue();
861ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
862ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
863ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
864ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testFullUpdatedDatabase_noData_addDataToDatabaseNotCalled() {
865a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        mManager.updateDatabase(true /* isFullIndex */, localeStr);
866ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.mDataToProcess.dataToUpdate.clear();
867ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        verify(mManager, times(0)).addDataToDatabase(any(SQLiteDatabase.class), anyString(),
868ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                anyList(), anyMap());
869ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
870ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
871ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
872ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testFullUpdatedDatabase_updatedDataInDatabaseNotCalled() {
873a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        mManager.updateDatabase(true /* isFullIndex */, localeStr);
874ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        verify(mManager, times(0)).updateDataInDatabase(any(SQLiteDatabase.class), anyMap());
875ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
876ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
877ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
8788a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze    public void testLocaleUpdated_afterIndexing_localeNotAdded() {
879a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        mManager.updateDatabase(true /* isFullIndex */, localeStr);
880ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(IndexDatabaseHelper.getInstance(mContext)
8818a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze                .isLocaleAlreadyIndexed(mContext, localeStr)).isFalse();
8828a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze    }
8838a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze
8848a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze    @Test
8858a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze    public void testLocaleUpdated_afterFullIndexing_localeAdded() {
8868a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze        mManager.performIndexing();
8878a42b074a7ccaf8325b571d261fda5b9a494a059Matthew Fritze        assertThat(IndexDatabaseHelper.getInstance(mContext)
888ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                .isLocaleAlreadyIndexed(mContext, localeStr)).isTrue();
889ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
890ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
891ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
892ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testUpdateDatabase_newEligibleData_addedToDatabase() {
893ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Test that addDataToDatabase is called when dataToUpdate is non-empty
894ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.mDataToProcess.dataToUpdate.add(getFakeRaw());
895a0d03178d094a58108f963c66f2d9886b72b8113Matthew Fritze        mManager.updateDatabase(true /* isFullIndex */, localeStr);
896ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
897ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
898ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        cursor.moveToPosition(0);
899ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
900ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Locale
901ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(0)).isEqualTo(localeStr);
902ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Data Rank
903ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getInt(1)).isEqualTo(rank);
904ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Data Title
905ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(2)).isEqualTo(updatedTitle);
906ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Normalized Title
907ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(3)).isEqualTo(normalizedTitle);
908ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Summary On
909ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(4)).isEqualTo(updatedSummaryOn);
910ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Summary On Normalized
911ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(5)).isEqualTo(normalizedSummaryOn);
912ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Summary Off
913ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(6)).isEqualTo(updatedSummaryOff);
914ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Summary off normalized
915ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(7)).isEqualTo(normalizedSummaryOff);
916ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Entries
917ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(8)).isEqualTo(entries);
918ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Keywords
919ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(9)).isEqualTo(spaceDelimittedKeywords);
920ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Screen Title
921ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(10)).isEqualTo(screenTitle);
922ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Class Name
923ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(11)).isEqualTo(className);
924ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Icon
925ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getInt(12)).isEqualTo(iconResId);
926ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Intent Action
927ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(13)).isEqualTo(action);
928ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Target Package
929ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(14)).isEqualTo(targetPackage);
930ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Target Class
931ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(15)).isEqualTo(targetClass);
932ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Enabled
933ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
934ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Data ref key
935ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(17)).isNotNull();
936ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // User Id
937ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getInt(18)).isEqualTo(userId);
938ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Payload Type - default is 0
939ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getInt(19)).isEqualTo(0);
940ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Payload
9413746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        byte[] payload = cursor.getBlob(20);
9423746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
9433746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze                ResultPayload.CREATOR);
9443746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze        assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
945ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
946ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
947ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
948ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    public void testUpdateDataInDatabase_enabledResultsAreNonIndexable_becomeDisabled() {
949ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Both results are enabled, and then TITLE_ONE gets disabled.
950ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        final boolean enabled = true;
951ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        insertSpecialCase(TITLE_ONE, enabled, KEY_ONE);
952ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        insertSpecialCase(TITLE_TWO, enabled, KEY_TWO);
953ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Map<String, Set<String>> niks = new ArrayMap<>();
954ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Set<String> keys = new HashSet<>();
955ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        keys.add(KEY_ONE);
956ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        niks.put(targetPackage, keys);
957ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
958ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.updateDataInDatabase(mDb, niks);
959ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
960ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 0", null);
961ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        cursor.moveToPosition(0);
962ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
963ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(2)).isEqualTo(TITLE_ONE);
964ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
965ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
966ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    @Test
9674f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze    public void testUpdateDataInDatabase_disabledResultsAreIndexable_becomeEnabled() {
968ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        // Both results are initially disabled, and then TITLE_TWO gets enabled.
969ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        final boolean enabled = false;
970ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        insertSpecialCase(TITLE_ONE, enabled, KEY_ONE);
971ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        insertSpecialCase(TITLE_TWO, enabled, KEY_TWO);
972ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Map<String, Set<String>> niks = new ArrayMap<>();
973ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Set<String> keys = new HashSet<>();
974ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        keys.add(KEY_ONE);
975ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        niks.put(targetPackage, keys);
976ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
977ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mManager.updateDataInDatabase(mDb, niks);
978ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
979ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 1", null);
980ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        cursor.moveToPosition(0);
981ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
982ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        assertThat(cursor.getString(2)).isEqualTo(TITLE_TWO);
983ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
984ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
9854f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze    @Test
9864f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze    @Config(shadows = {ShadowContentResolver.class})
9874f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze    public void testEmptyNonIndexableKeys_emptyDataKeyResources_addedToDatabase() {
9884f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        insertSpecialCase(TITLE_ONE, true /* enabled */, null /* dataReferenceKey */);
9894f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze
9904f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        mManager.updateDatabase(false, localeStr);
9914f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze
9924f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 1", null);
9934f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        cursor.moveToPosition(0);
9944f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        assertThat(cursor.getCount()).isEqualTo(1);
9954f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        assertThat(cursor.getString(2)).isEqualTo(TITLE_ONE);
9964f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze    }
997be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze
998be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze    @Test
999be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze    public void testUpdateAsyncTask_onPostExecute_performsCallback() {
1000be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        IndexingCallback callback = mock(IndexingCallback.class);
1001be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze
1002be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        DatabaseIndexingManager.IndexingTask task = mManager.new IndexingTask(callback);
1003be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        task.execute();
1004be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze
1005be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        Robolectric.flushForegroundThreadScheduler();
1006be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze
1007be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        verify(callback).onIndexingFinished();
1008be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze    }
1009be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze
1010be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze    @Test
1011be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze    public void testUpdateAsyncTask_onPostExecute_setsIndexingComplete() {
1012be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        SearchFeatureProviderImpl provider = new SearchFeatureProviderImpl();
1013be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        DatabaseIndexingManager manager = spy(provider.getIndexingManager(mContext));
1014be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        DatabaseIndexingManager.IndexingTask task = manager.new IndexingTask(null);
1015be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        doNothing().when(manager).performIndexing();
1016be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze
1017be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        task.execute();
1018be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        Robolectric.flushForegroundThreadScheduler();
1019be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze
1020be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze        assertThat(provider.isIndexingComplete(mContext)).isTrue();
1021be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze    }
1022be0989cc615724f07f5717c9bf17e12560872bb4Matthew Fritze
10231dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    // Util functions
10241dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
10251dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private SearchIndexableRaw getFakeRaw() {
10261dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        return getFakeRaw(localeStr);
10271dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
10281dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
10291dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private SearchIndexableRaw getFakeRaw(String localeStr) {
10301dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableRaw data = new SearchIndexableRaw(mContext);
10311dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.locale = new Locale(localeStr);
10321dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.rank = rank;
10331dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.title = title;
10341dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.summaryOn = summaryOn;
10351dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.summaryOff = summaryOff;
10361dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.entries = entries;
10371dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.keywords = keywords;
10381dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.screenTitle = screenTitle;
10391dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.className = className;
10401dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.packageName = packageName;
10411dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.iconResId = iconResId;
10421dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.intentAction = action;
10431dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.intentTargetPackage = targetPackage;
10441dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.intentTargetClass = targetClass;
10451dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.key = key;
10461dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.userId = userId;
10471dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        data.enabled = enabled;
10481dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        return data;
10491dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
10501dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze
10511dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    private SearchIndexableResource getFakeResource(int xml) {
10521dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        SearchIndexableResource sir = new SearchIndexableResource(mContext);
10531dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.rank = rank;
10541dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.xmlResId = xml;
10551dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.className = className;
10561dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.packageName = packageName;
10571dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.iconResId = iconResId;
10581dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.intentAction = action;
10591dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.intentTargetPackage = targetPackage;
10601dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.intentTargetClass = targetClass;
10611dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        sir.enabled = enabled;
10621dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze        return sir;
10631dec073528352fcf036c5ba52d5d535ba32c472cMatthew Fritze    }
10643f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze
1065ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private Map<String, Set<String>> getNonIndexableKeys(String[] keys) {
1066ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Map<String, Set<String>> niks = new HashMap<>();
1067ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        Set<String> keysList = new HashSet<>();
1068ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        keysList.addAll(Arrays.asList(keys));
10693f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        niks.put(packageName, keysList);
10703f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze        return niks;
10713f3b547e4a2eeeb362d9b7c98b05f9a244cd754eMatthew Fritze    }
1072ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1073ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private List<ResolveInfo> getDummyResolveInfo() {
1074ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        List<ResolveInfo> infoList = new ArrayList<>();
1075ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        ResolveInfo info = new ResolveInfo();
1076ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        info.providerInfo = new ProviderInfo();
1077ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        info.providerInfo.exported = true;
1078ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        info.providerInfo.authority = AUTHORITY_ONE;
1079ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        info.providerInfo.packageName = PACKAGE_ONE;
1080ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        infoList.add(info);
1081ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1082ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        return infoList;
1083ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
1084ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1085ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    // TODO move this method and its counterpart in CursorToSearchResultConverterTest into
1086ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    // a util class with public fields to assert values.
1087ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private Cursor getDummyCursor() {
10884f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze        MatrixCursor cursor = new MatrixCursor(INDEXABLES_RAW_COLUMNS);
1089ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        final String BLANK = "";
1090ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1091ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        ArrayList<String> item =
10924f198813ed0d513ddb1461315bae1c881904ebf0Matthew Fritze                new ArrayList<>(INDEXABLES_RAW_COLUMNS.length);
1093ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add("42"); // Rank
1094ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(TITLE_ONE); // Title
1095ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // Summary on
1096ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // summary off
1097ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // entries
1098ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // keywords
1099ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // screen title
1100ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // classname
1101ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add("123"); // Icon
1102ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // Intent action
1103ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // target package
1104ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(BLANK); // target class
1105ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add(KEY_ONE); // Key
1106ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        item.add("-1"); // userId
1107ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        cursor.addRow(item);
1108ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1109ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        return cursor;
1110ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
1111ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1112ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private void insertSpecialCase(String specialCase, boolean enabled, String key) {
1113ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        ContentValues values = new ContentValues();
1114ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DOCID, specialCase.hashCode());
1115ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.LOCALE, localeStr);
1116ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_RANK, 1);
1117ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE, specialCase);
1118ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE_NORMALIZED, "");
1119ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON, "");
1120ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON_NORMALIZED, "");
1121ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF, "");
1122ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF_NORMALIZED, "");
1123ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_ENTRIES, "");
1124ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_KEYWORDS, "");
1125ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.CLASS_NAME, "");
1126ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.SCREEN_TITLE, "Moves");
1127ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.INTENT_ACTION, "");
1128ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.INTENT_TARGET_PACKAGE, targetPackage);
1129ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.INTENT_TARGET_CLASS, "");
1130ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.ICON, "");
1131ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.ENABLED, enabled);
1132ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.DATA_KEY_REF, key);
1133ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.USER_ID, 0);
1134ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.PAYLOAD_TYPE, 0);
1135ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        values.put(IndexDatabaseHelper.IndexColumns.PAYLOAD, (String) null);
1136ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1137ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        mDb.replaceOrThrow(IndexDatabaseHelper.Tables.TABLE_PREFS_INDEX, null, values);
1138ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
1139ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1140ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    private class DummyProvider extends ContentProvider {
1141ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1142ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1143ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public boolean onCreate() {
1144ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return false;
1145ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1146ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1147ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1148ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public Cursor query(@NonNull Uri uri, @Nullable String[] projection,
1149ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                @Nullable String selection, @Nullable String[] selectionArgs,
1150ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                @Nullable String sortOrder) {
1151ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            if (uri.toString().contains("xml")) {
1152ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                return null;
1153ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            }
1154ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return getDummyCursor();
1155ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1156ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1157ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1158ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public String getType(@NonNull Uri uri) {
1159ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return null;
1160ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1161ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1162ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1163ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
1164ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return null;
1165ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1166ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1167ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1168ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public int delete(@NonNull Uri uri, @Nullable String selection,
1169ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                @Nullable String[] selectionArgs) {
1170ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return 0;
1171ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1172ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze
1173ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        @Override
1174ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        public int update(@NonNull Uri uri, @Nullable ContentValues values,
1175ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze                @Nullable String selection, @Nullable String[] selectionArgs) {
1176ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze            return 0;
1177ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze        }
1178ebb5b7f73d24e060ffb838d0fc4c6301eb900923Matthew Fritze    }
1179a9831d40d081cc8c7ca32891e64c09b5e1d19abbPhilip Quinn}
1180