Merge "Move the indexing back into DatabaseIndexingManager"
diff --git a/src/com/android/settings/search/DatabaseIndexingManager.java b/src/com/android/settings/search/DatabaseIndexingManager.java
index de71f0a..d540d2f 100644
--- a/src/com/android/settings/search/DatabaseIndexingManager.java
+++ b/src/com/android/settings/search/DatabaseIndexingManager.java
@@ -23,7 +23,24 @@
import static com.android.settings.search.DatabaseResultLoader.COLUMN_INDEX_KEY;
import static com.android.settings.search.DatabaseResultLoader.SELECT_COLUMNS;
import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DOCID;
+import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.CLASS_NAME;
+import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_ENTRIES;
+import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_KEYWORDS;
+import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_KEY_REF;
+import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON;
+import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON_NORMALIZED;
+import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_TITLE;
+import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_TITLE_NORMALIZED;
import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.ENABLED;
+import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.ICON;
+import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.INTENT_ACTION;
+import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.INTENT_TARGET_CLASS;
+import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.INTENT_TARGET_PACKAGE;
+import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.LOCALE;
+import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.PAYLOAD;
+import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.PAYLOAD_TYPE;
+import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.SCREEN_TITLE;
+import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.USER_ID;
import static com.android.settings.search.IndexDatabaseHelper.Tables.TABLE_PREFS_INDEX;
import android.content.ContentValues;
@@ -38,10 +55,12 @@
import android.provider.SearchIndexableResource;
import android.provider.SearchIndexablesContract;
import android.support.annotation.VisibleForTesting;
+import android.text.TextUtils;
import android.util.Log;
import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.search.indexing.IndexData;
import com.android.settings.search.indexing.IndexDataConverter;
import com.android.settings.search.indexing.PreIndexData;
import com.android.settings.search.indexing.PreIndexDataCollector;
@@ -49,6 +68,7 @@
import java.util.List;
import java.util.Locale;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -72,6 +92,7 @@
final AtomicBoolean mIsIndexingComplete = new AtomicBoolean(false);
private PreIndexDataCollector mCollector;
+ private IndexDataConverter mConverter;
private Context mContext;
@@ -182,8 +203,8 @@
* @param localeStr the default locale for the device.
*/
@VisibleForTesting
- void updateDatabase(PreIndexData indexData, boolean needsReindexing, String localeStr) {
- final Map<String, Set<String>> nonIndexableKeys = indexData.nonIndexableKeys;
+ void updateDatabase(PreIndexData preIndexData, boolean needsReindexing, String localeStr) {
+ final Map<String, Set<String>> nonIndexableKeys = preIndexData.nonIndexableKeys;
final SQLiteDatabase database = getWritableDatabase();
if (database == null) {
@@ -194,8 +215,9 @@
try {
database.beginTransaction();
- // Add new data from Providers at initial index time, or inserted later.
- addIndaxebleDataToDatabase(database, localeStr, indexData);
+ // Convert all Pre-index data to Index data.
+ List<IndexData> indexData = getIndexData(localeStr, preIndexData);
+ insertIndexData(database, indexData);
// Only check for non-indexable key updates after initial index.
// Enabled state with non-indexable keys is checked when items are first inserted.
@@ -209,14 +231,64 @@
}
}
-
@VisibleForTesting
- void addIndaxebleDataToDatabase(SQLiteDatabase database, String locale, PreIndexData data) {
- if (data.dataToUpdate.size() == 0) {
- return;
+ List<IndexData> getIndexData(String locale, PreIndexData data) {
+ if (mConverter == null) {
+ mConverter = new IndexDataConverter(mContext);
}
- IndexDataConverter manager = new IndexDataConverter(mContext, database);
- manager.addDataToDatabase(locale, data.dataToUpdate, data.nonIndexableKeys);
+ return mConverter.convertPreIndexDataToIndexData(data, locale);
+ }
+
+ /**
+ * Inserts all of the entries in {@param indexData} into the {@param database}
+ * as Search Data and as part of the Information Hierarchy.
+ */
+ @VisibleForTesting
+ void insertIndexData(SQLiteDatabase database, List<IndexData> indexData) {
+ ContentValues values;
+
+ for (IndexData dataRow : indexData) {
+ values = new ContentValues();
+ values.put(IndexDatabaseHelper.IndexColumns.DOCID, dataRow.getDocId());
+ values.put(LOCALE, dataRow.locale);
+ values.put(DATA_TITLE, dataRow.updatedTitle);
+ values.put(DATA_TITLE_NORMALIZED, dataRow.normalizedTitle);
+ values.put(DATA_SUMMARY_ON, dataRow.updatedSummaryOn);
+ values.put(DATA_SUMMARY_ON_NORMALIZED, dataRow.normalizedSummaryOn);
+ values.put(DATA_ENTRIES, dataRow.entries);
+ values.put(DATA_KEYWORDS, dataRow.spaceDelimitedKeywords);
+ values.put(CLASS_NAME, dataRow.className);
+ values.put(SCREEN_TITLE, dataRow.screenTitle);
+ values.put(INTENT_ACTION, dataRow.intentAction);
+ values.put(INTENT_TARGET_PACKAGE, dataRow.intentTargetPackage);
+ values.put(INTENT_TARGET_CLASS, dataRow.intentTargetClass);
+ values.put(ICON, dataRow.iconResId);
+ values.put(ENABLED, dataRow.enabled);
+ values.put(DATA_KEY_REF, dataRow.key);
+ values.put(USER_ID, dataRow.userId);
+ values.put(PAYLOAD_TYPE, dataRow.payloadType);
+ values.put(PAYLOAD, dataRow.payload);
+
+ database.replaceOrThrow(TABLE_PREFS_INDEX, null, values);
+
+ if (!TextUtils.isEmpty(dataRow.className)
+ && !TextUtils.isEmpty(dataRow.childClassName)) {
+ ContentValues siteMapPair = new ContentValues();
+ final int pairDocId = Objects.hash(dataRow.className, dataRow.childClassName);
+ siteMapPair.put(IndexDatabaseHelper.SiteMapColumns.DOCID, pairDocId);
+ siteMapPair.put(IndexDatabaseHelper.SiteMapColumns.PARENT_CLASS,
+ dataRow.className);
+ siteMapPair.put(IndexDatabaseHelper.SiteMapColumns.PARENT_TITLE,
+ dataRow.screenTitle);
+ siteMapPair.put(IndexDatabaseHelper.SiteMapColumns.CHILD_CLASS,
+ dataRow.childClassName);
+ siteMapPair.put(IndexDatabaseHelper.SiteMapColumns.CHILD_TITLE,
+ dataRow.updatedTitle);
+
+ database.replaceOrThrow(IndexDatabaseHelper.Tables.TABLE_SITE_MAP,
+ null /* nullColumnHack */, siteMapPair);
+ }
+ }
}
/**
@@ -288,7 +360,6 @@
disabledResults.close();
}
-
/**
* TODO (b/64951285): Deprecate this method
*
diff --git a/src/com/android/settings/search/indexing/IndexDataConverter.java b/src/com/android/settings/search/indexing/IndexDataConverter.java
index f900b83..90430a8 100644
--- a/src/com/android/settings/search/indexing/IndexDataConverter.java
+++ b/src/com/android/settings/search/indexing/IndexDataConverter.java
@@ -17,10 +17,8 @@
package com.android.settings.search.indexing;
-import android.content.ContentValues;
import android.content.Context;
import android.content.res.XmlResourceParser;
-import android.database.sqlite.SQLiteDatabase;
import android.provider.SearchIndexableData;
import android.provider.SearchIndexableResource;
import android.support.annotation.DrawableRes;
@@ -32,7 +30,6 @@
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.search.DatabaseIndexingUtils;
-import com.android.settings.search.IndexDatabaseHelper;
import com.android.settings.search.Indexable;
import com.android.settings.search.ResultPayload;
import com.android.settings.search.SearchIndexableRaw;
@@ -44,33 +41,10 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
-import java.util.Objects;
import java.util.Set;
-import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.CLASS_NAME;
-import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_ENTRIES;
-import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_KEYWORDS;
-import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_KEY_REF;
-import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_RANK;
-import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF;
-import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF_NORMALIZED;
-import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON;
-import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON_NORMALIZED;
-import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_TITLE;
-import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_TITLE_NORMALIZED;
-import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.ENABLED;
-import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.ICON;
-import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.INTENT_ACTION;
-import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.INTENT_TARGET_CLASS;
-import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.INTENT_TARGET_PACKAGE;
-import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.LOCALE;
-import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.PAYLOAD;
-import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.PAYLOAD_TYPE;
-import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.SCREEN_TITLE;
-import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.USER_ID;
-import static com.android.settings.search.IndexDatabaseHelper.Tables.TABLE_PREFS_INDEX;
-
/**
* Helper class to convert {@link PreIndexData} to {@link IndexData}.
*
@@ -86,56 +60,65 @@
private static final String NODE_NAME_CHECK_BOX_PREFERENCE = "CheckBoxPreference";
private static final String NODE_NAME_LIST_PREFERENCE = "ListPreference";
- private Context mContext;
+ private final Context mContext;
- private SQLiteDatabase mDb;
+ private String mLocale;
- public IndexDataConverter(Context context, SQLiteDatabase database) {
+ private List<IndexData> mIndexData;
+
+ public IndexDataConverter(Context context) {
mContext = context;
- mDb = database;
+ mLocale = Locale.getDefault().toString();
+ }
+
+ public List<IndexData> convertPreIndexDataToIndexData(PreIndexData preIndexData,
+ String locale) {
+ mLocale = locale;
+ mIndexData = new ArrayList<>();
+ List<SearchIndexableData> dataToUpdate = preIndexData.dataToUpdate;
+ Map<String, Set<String>> nonIndexableKeys = preIndexData.nonIndexableKeys;
+ parsePreIndexData(dataToUpdate, nonIndexableKeys);
+ return mIndexData;
}
/**
* Inserts {@link SearchIndexableData} into the database.
*
- * @param localeStr is the locale of the data to be inserted.
* @param dataToUpdate is a {@link List} of the data to be inserted.
* @param nonIndexableKeys is a {@link Map} from Package Name to a {@link Set} of keys which
* identify search results which should not be surfaced.
*/
- public void addDataToDatabase(String localeStr, List<SearchIndexableData> dataToUpdate,
+ private void parsePreIndexData(List<SearchIndexableData> dataToUpdate,
Map<String, Set<String>> nonIndexableKeys) {
final long current = System.currentTimeMillis();
for (SearchIndexableData data : dataToUpdate) {
try {
- indexOneSearchIndexableData(localeStr, data, nonIndexableKeys);
+ addOneIndexData(data, nonIndexableKeys);
} catch (Exception e) {
Log.e(LOG_TAG, "Cannot index: " + (data != null ? data.className : data)
- + " for locale: " + localeStr, e);
+ + " for locale: " + mLocale, e);
}
}
final long now = System.currentTimeMillis();
- Log.d(LOG_TAG, "Indexing locale '" + localeStr + "' took " +
+ Log.d(LOG_TAG, "Indexing locale '" + mLocale + "' took " +
(now - current) + " millis");
}
- @VisibleForTesting
- void indexOneSearchIndexableData(String localeStr, SearchIndexableData data,
+ private void addOneIndexData(SearchIndexableData data,
Map<String, Set<String>> nonIndexableKeys) {
if (data instanceof SearchIndexableResource) {
- indexOneResource(localeStr, (SearchIndexableResource) data, nonIndexableKeys);
+ addOneResource((SearchIndexableResource) data, nonIndexableKeys);
} else if (data instanceof SearchIndexableRaw) {
- indexOneRaw(localeStr, (SearchIndexableRaw) data, nonIndexableKeys);
+ addOneRaw((SearchIndexableRaw) data, nonIndexableKeys);
}
}
- @VisibleForTesting
- void indexOneRaw(String localeStr, SearchIndexableRaw raw, Map<String,
+ private void addOneRaw(SearchIndexableRaw raw, Map<String,
Set<String>> nonIndexableKeysFromResource) {
// Should be the same locale as the one we are processing
- if (!raw.locale.toString().equalsIgnoreCase(localeStr)) {
+ if (!raw.locale.toString().equalsIgnoreCase(mLocale)) {
return;
}
@@ -149,7 +132,7 @@
IndexData.Builder builder = new IndexData.Builder();
builder.setTitle(raw.title)
.setSummaryOn(raw.summaryOn)
- .setLocale(localeStr)
+ .setLocale(mLocale)
.setEntries(raw.entries)
.setKeywords(raw.keywords)
.setClassName(raw.className)
@@ -162,12 +145,11 @@
.setKey(raw.key)
.setUserId(raw.userId);
- updateOneRow(builder.build(mContext));
+ addRowToData(builder.build(mContext));
}
- @VisibleForTesting
- void indexOneResource(String localeStr, SearchIndexableResource sir,
- Map<String, Set<String>> nonIndexableKeysFromResource) {
+ private void addOneResource(SearchIndexableResource sir,
+ Map<String, Set<String>> nonIndexableKeysFromResource) {
if (sir == null) {
Log.e(LOG_TAG, "Cannot index a null resource!");
@@ -182,7 +164,7 @@
nonIndexableKeys.addAll(resNonIndexableKeys);
}
- indexFromResource(localeStr, sir, nonIndexableKeys);
+ addIndexDataFromResource(sir, nonIndexableKeys);
} else {
if (TextUtils.isEmpty(sir.className)) {
Log.w(LOG_TAG, "Cannot index an empty Search Provider name!");
@@ -202,17 +184,16 @@
DatabaseIndexingUtils.getSearchIndexProvider(clazz);
if (provider != null) {
List<String> providerNonIndexableKeys = provider.getNonIndexableKeys(sir.context);
- if (providerNonIndexableKeys != null && providerNonIndexableKeys.size() > 0) {
+ if (providerNonIndexableKeys != null) {
nonIndexableKeys.addAll(providerNonIndexableKeys);
}
- indexFromProvider(localeStr, provider, sir, nonIndexableKeys);
+ addIndexDataFromProvider(provider, sir, nonIndexableKeys);
}
}
}
- @VisibleForTesting
- void indexFromResource(String localeStr, SearchIndexableResource sir,
+ private void addIndexDataFromResource(SearchIndexableResource sir,
List<String> nonIndexableKeys) {
final Context context = sir.context;
XmlResourceParser parser = null;
@@ -274,7 +255,7 @@
headerBuilder.setTitle(headerTitle)
.setSummaryOn(headerSummary)
.setKeywords(headerKeywords)
- .setLocale(localeStr)
+ .setLocale(mLocale)
.setClassName(fragmentName)
.setScreenTitle(screenTitle)
.setIntentAction(intentAction)
@@ -308,7 +289,7 @@
builder = new IndexData.Builder();
builder.setTitle(title)
- .setLocale(localeStr)
+ .setLocale(mLocale)
.setKeywords(keywords)
.setClassName(fragmentName)
.setScreenTitle(screenTitle)
@@ -339,7 +320,7 @@
.setPayload(payload);
// Insert rows for the child nodes of PreferenceScreen
- updateOneRow(builder.build(mContext));
+ addRowToData(builder.build(mContext));
} else {
// TODO (b/33577327) We removed summary off here. We should check if we can
// merge this 'else' section with the one above. Put a break point to
@@ -353,13 +334,13 @@
builder.setSummaryOn(summaryOn);
- updateOneRow(builder.build(mContext));
+ addRowToData(builder.build(mContext));
}
}
// The xml header's title does not match the title of one of the child settings.
if (isHeaderUnique) {
- updateOneRow(headerBuilder.build(mContext));
+ addRowToData(headerBuilder.build(mContext));
}
} catch (XmlPullParserException e) {
throw new RuntimeException("Error parsing PreferenceScreen", e);
@@ -370,8 +351,7 @@
}
}
- @VisibleForTesting
- void indexFromProvider(String localeStr, Indexable.SearchIndexProvider provider,
+ private void addIndexDataFromProvider(Indexable.SearchIndexProvider provider,
SearchIndexableResource sir, List<String> nonIndexableKeys) {
final String className = sir.className;
@@ -393,7 +373,7 @@
SearchIndexableRaw raw = rawList.get(i);
// Should be the same locale as the one we are processing
- if (!raw.locale.toString().equalsIgnoreCase(localeStr)) {
+ if (!raw.locale.toString().equalsIgnoreCase(mLocale)) {
continue;
}
boolean enabled = !nonIndexableKeys.contains(raw.key);
@@ -401,7 +381,7 @@
IndexData.Builder builder = new IndexData.Builder();
builder.setTitle(raw.title)
.setSummaryOn(raw.summaryOn)
- .setLocale(localeStr)
+ .setLocale(mLocale)
.setEntries(raw.entries)
.setKeywords(raw.keywords)
.setClassName(className)
@@ -414,7 +394,7 @@
.setKey(raw.key)
.setUserId(raw.userId);
- updateOneRow(builder.build(mContext));
+ addRowToData(builder.build(mContext));
}
}
@@ -426,7 +406,7 @@
SearchIndexableResource item = resList.get(i);
// Should be the same locale as the one we are processing
- if (!item.locale.toString().equalsIgnoreCase(localeStr)) {
+ if (!item.locale.toString().equalsIgnoreCase(mLocale)) {
continue;
}
@@ -440,49 +420,16 @@
? intentTargetPackage
: item.intentTargetPackage;
- indexFromResource(localeStr, item, nonIndexableKeys);
+ addIndexDataFromResource(item, nonIndexableKeys);
}
}
}
- private void updateOneRow(IndexData row) {
+ private void addRowToData(IndexData row) {
if (TextUtils.isEmpty(row.updatedTitle)) {
return;
}
- ContentValues values = new ContentValues();
- values.put(IndexDatabaseHelper.IndexColumns.DOCID, row.getDocId());
- values.put(LOCALE, row.locale);
- values.put(DATA_TITLE, row.updatedTitle);
- values.put(DATA_TITLE_NORMALIZED, row.normalizedTitle);
- values.put(DATA_SUMMARY_ON, row.updatedSummaryOn);
- values.put(DATA_SUMMARY_ON_NORMALIZED, row.normalizedSummaryOn);
- values.put(DATA_ENTRIES, row.entries);
- values.put(DATA_KEYWORDS, row.spaceDelimitedKeywords);
- values.put(CLASS_NAME, row.className);
- values.put(SCREEN_TITLE, row.screenTitle);
- values.put(INTENT_ACTION, row.intentAction);
- values.put(INTENT_TARGET_PACKAGE, row.intentTargetPackage);
- values.put(INTENT_TARGET_CLASS, row.intentTargetClass);
- values.put(ICON, row.iconResId);
- values.put(ENABLED, row.enabled);
- values.put(DATA_KEY_REF, row.key);
- values.put(USER_ID, row.userId);
- values.put(PAYLOAD_TYPE, row.payloadType);
- values.put(PAYLOAD, row.payload);
-
- mDb.replaceOrThrow(TABLE_PREFS_INDEX, null, values);
-
- if (!TextUtils.isEmpty(row.className) && !TextUtils.isEmpty(row.childClassName)) {
- ContentValues siteMapPair = new ContentValues();
- final int pairDocId = Objects.hash(row.className, row.childClassName);
- siteMapPair.put(IndexDatabaseHelper.SiteMapColumns.DOCID, pairDocId);
- siteMapPair.put(IndexDatabaseHelper.SiteMapColumns.PARENT_CLASS, row.className);
- siteMapPair.put(IndexDatabaseHelper.SiteMapColumns.PARENT_TITLE, row.screenTitle);
- siteMapPair.put(IndexDatabaseHelper.SiteMapColumns.CHILD_CLASS, row.childClassName);
- siteMapPair.put(IndexDatabaseHelper.SiteMapColumns.CHILD_TITLE, row.updatedTitle);
-
- mDb.replaceOrThrow(IndexDatabaseHelper.Tables.TABLE_SITE_MAP, null, siteMapPair);
- }
+ mIndexData.add(row);
}
}
diff --git a/tests/robotests/assets/grandfather_not_in_search_index_provider_registry b/tests/robotests/assets/grandfather_not_in_search_index_provider_registry
index a2a772b..4ee97fa 100644
--- a/tests/robotests/assets/grandfather_not_in_search_index_provider_registry
+++ b/tests/robotests/assets/grandfather_not_in_search_index_provider_registry
@@ -1,2 +1,3 @@
com.android.settings.development.DevelopmentSettingsDashboardFragment
com.android.settings.display.ScreenZoomPreferenceFragmentForSetupWizard
+com.android.settings.search.indexing.FakeSettingsFragment
diff --git a/tests/robotests/res/xml-mcc999/about_legal.xml b/tests/robotests/res/xml-mcc999/about_legal.xml
new file mode 100644
index 0000000..53a2b89
--- /dev/null
+++ b/tests/robotests/res/xml-mcc999/about_legal.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ -->
+
+<!--
+ WARNING: This resource file is used to test Settings Search indexing.
+ If you change something in here, please run the settings robotests and
+ make sure they still pass.
+ -->
+
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
+ android:title="bears_bears_bears"
+ settings:keywords="keywords">
+
+ <Preference
+ android:key="pref_key_1"
+ android:title="bears_bears_bears"/>
+</PreferenceScreen>
\ No newline at end of file
diff --git a/tests/robotests/res/xml-mcc999/display_settings.xml b/tests/robotests/res/xml-mcc999/display_settings.xml
new file mode 100644
index 0000000..4e0ce6b
--- /dev/null
+++ b/tests/robotests/res/xml-mcc999/display_settings.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<!--
+ WARNING: This resource file is used to test Settings Search indexing.
+ If you change something in here, please run the settings robotests and
+ make sure they still pass.
+ -->
+
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
+ android:title="page_title"
+ settings:keywords="keywords">
+
+ <Preference
+ android:key="pref_key_1"
+ android:title="pref_title_1"
+ android:summary="summary_1"
+ settings:keywords="keywords1, keywords2, keywords3" />
+
+ <SwitchPreference
+ android:key="pref_key_2"
+ android:title="pref_title_2"
+ android:summary="summary_2"
+ settings:keywords="keywords1, keywords2, keywords3" />
+
+ <Preference
+ android:key="pref_key_3"
+ android:title="pref_title_3"
+ android:summary="summary_3"
+ android:icon="@drawable/ic_android"
+ settings:keywords="keywords1, keywords2, keywords3" />
+
+ <ListPreference
+ android:key="pref_key_4"
+ android:title="pref_title_4"
+ android:summary="summary_4"
+ settings:keywords="keywords1, keywords2, keywords3" />
+
+ <CheckBoxPreference
+ android:key="pref_key_5"
+ android:title="pref_title_5"
+ android:summaryOn="summary_on"
+ android:summaryOff="summary_off"
+ settings:keywords="keywords1, keywords2, keywords3" />
+</PreferenceScreen>
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/search/indexing/FakeSettingsFragment.java b/tests/robotests/src/com/android/settings/search/indexing/FakeSettingsFragment.java
new file mode 100644
index 0000000..72df771
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/search/indexing/FakeSettingsFragment.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.android.settings.search.indexing;
+
+import android.content.Context;
+import android.provider.SearchIndexableResource;
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.search.SearchIndexableRaw;
+import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Test class for Settings Search Indexing.
+ * If you change this class, please run robotests to make sure they still pass.
+ */
+public class FakeSettingsFragment extends DashboardFragment {
+
+ public static final String TITLE = "raw title";
+ public static final String SUMMARY_ON = "raw summary on";
+ public static final String SUMMARY_OFF = "raw summary off";
+ public static final String ENTRIES = "rawentries";
+ public static final String KEYWORDS = "keywords, keywordss, keywordsss";
+ public static final String SPACE_KEYWORDS = "keywords keywordss keywordsss";
+ public static final String SCREEN_TITLE = "raw screen title";
+ public static final String CLASS_NAME = FakeSettingsFragment.class.getName();
+ public static final int ICON = 0xff;
+ public static final String INTENT_ACTION = "raw action";
+ public static final String PACKAGE_NAME = "raw target package";
+ public static final String TARGET_CLASS = "raw target class";
+ public static final String TARGET_PACKAGE = "raw package name";
+ public static final String KEY = "raw key";
+ public static final boolean ENABLED = true;
+
+
+ @Override
+ public int getMetricsCategory() {
+ return MetricsProto.MetricsEvent.DISPLAY;
+ }
+
+ @Override
+ protected String getLogTag() {
+ return "";
+ }
+
+ @Override
+ protected int getPreferenceScreenResId() {
+ return com.android.settings.R.xml.display_settings;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ return null;
+ }
+
+ /** Index provider used to expose this fragment in search. */
+ public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+ new BaseSearchIndexProvider() {
+ @Override
+ public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) {
+ final SearchIndexableRaw data = new SearchIndexableRaw(context);
+ data.title = TITLE;
+ data.summaryOn = SUMMARY_ON;
+ data.summaryOff = SUMMARY_OFF;
+ data.entries = ENTRIES;
+ data.keywords = KEYWORDS;
+ data.screenTitle = SCREEN_TITLE;
+ data.packageName = PACKAGE_NAME;
+ data.intentAction = INTENT_ACTION;
+ data.intentTargetClass = TARGET_CLASS;
+ data.intentTargetPackage = TARGET_PACKAGE;
+ data.key = KEY;
+ data.iconResId = ICON;
+ data.enabled = ENABLED;
+
+ final List<SearchIndexableRaw> result = new ArrayList<>(1);
+ result.add(data);
+ return result;
+ }
+
+ @Override
+ public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
+ boolean enabled) {
+ final ArrayList<SearchIndexableResource> result = new ArrayList<>();
+
+ final SearchIndexableResource sir = new SearchIndexableResource(context);
+ sir.xmlResId = com.android.settings.R.xml.display_settings;
+ result.add(sir);
+ return result;
+ }
+
+ @Override
+ public List<String> getNonIndexableKeys(Context context) {
+ List<String> keys = super.getNonIndexableKeys(context);
+ keys.add("pref_key_1");
+ keys.add("pref_key_3");
+ return keys;
+ }
+
+ @Override
+ public List<AbstractPreferenceController>
+ getPreferenceControllers(Context context) {
+ return null;
+ }
+ };
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/search/indexing/IndexDataConverterTest.java b/tests/robotests/src/com/android/settings/search/indexing/IndexDataConverterTest.java
index ca04d2c..b5bfea0 100644
--- a/tests/robotests/src/com/android/settings/search/indexing/IndexDataConverterTest.java
+++ b/tests/robotests/src/com/android/settings/search/indexing/IndexDataConverterTest.java
@@ -18,15 +18,13 @@
package com.android.settings.search.indexing;
import android.content.Context;
-import android.database.Cursor;
-import android.database.sqlite.SQLiteDatabase;
import android.provider.SearchIndexableResource;
+import android.text.TextUtils;
import com.android.settings.TestConfig;
-import com.android.settings.search.IndexDatabaseHelper;
+import com.android.settings.R;
import com.android.settings.search.ResultPayload;
import com.android.settings.search.ResultPayloadUtils;
import com.android.settings.search.SearchIndexableRaw;
-import com.android.settings.search.SearchIndexableResources;
import com.android.settings.testutils.DatabaseTestUtils;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.After;
@@ -36,58 +34,70 @@
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
import java.util.HashSet;
+import java.util.List;
import java.util.Locale;
-import java.util.Map;
import java.util.Set;
-import static com.android.settings.R.*;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.spy;
@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, qualifiers = "mcc999")
public class IndexDataConverterTest {
private final String localeStr = "en_US";
- private final String title = "title\u2011title";
- private final String updatedTitle = "title-title";
- private final String normalizedTitle = "titletitle";
- private final String summaryOn = "summary\u2011on";
- private final String updatedSummaryOn = "summary-on";
- private final String normalizedSummaryOn = "summaryon";
- private final String summaryOff = "summary\u2011off";
- private final String updatedSummaryOff = "summary-off";
- private final String normalizedSummaryOff = "summaryoff";
- private final String entries = "entries";
- private final String keywords = "keywords, keywordss, keywordsss";
- private final String spaceDelimittedKeywords = "keywords keywordss keywordsss";
- private final String screenTitle = "screen title";
- private final String className = "class name";
- private final int iconResId = 0xff;
- private final int noIcon = 0;
- private final String action = "action";
- private final String targetPackage = "target package";
- private final String targetClass = "target class";
- private final String packageName = "package name";
- private final String key = "key";
- private final int userId = -1;
- private final boolean enabled = true;
+ private static final String title = "title\u2011title";
+ private static final String updatedTitle = "title-title";
+ private static final String normalizedTitle = "titletitle";
+ private static final String summaryOn = "summary\u2011on";
+ private static final String updatedSummaryOn = "summary-on";
+ private static final String normalizedSummaryOn = "summaryon";
+ private static final String summaryOff = "summary\u2011off";
+ private static final String updatedSummaryOff = "summary-off";
+ private static final String normalizedSummaryOff = "summaryoff";
+ private static final String entries = "entries";
+ private static final String keywords = "keywords, keywordss, keywordsss";
+ private static final String spaceDelimittedKeywords = "keywords keywordss keywordsss";
+ private static final String screenTitle = "screen title";
+ private static final String className = "class name";
+ private static final int iconResId = 0xff;
+ private static final String action = "action";
+ private static final String targetPackage = "target package";
+ private static final String targetClass = "target class";
+ private static final String packageName = "package name";
+ private static final String key = "key";
+ private static final int userId = -1;
+ private static final boolean enabled = true;
+
+ // There are 6 entries in the fake display_settings.xml preference.
+ private final int NUM_DISPLAY_ENTRIES = 6;
+ private static final String PAGE_TITLE = "page_title";
+ private static final String TITLE_ONE = "pref_title_1";
+ private static final String TITLE_TWO = "pref_title_2";
+ private static final String TITLE_THREE = "pref_title_3";
+ private static final String TITLE_FOUR = "pref_title_4";
+ private static final String TITLE_FIVE = "pref_title_5";
+ private static final String DISPLAY_SPACE_DELIM_KEYWORDS = "keywords1 keywords2 keywords3";
+
+ // There are 6 display entries from resources, and 1 raw.
+ private static final int NUM_FAKE_FRAGMENT_ENTRIES = 7;
+ private static final int NUM_ENABLED_FAKE_FRAGMENT_ENTRIES = 5;
+ private static final String FAKE_CLASS_NAME =
+ "com.android.settings.search.indexing.FakeSettingsFragment";
+
+ // There is a title and one preference.
+ private final int NUM_LEGAL_SETTINGS = 2;
private Context mContext;
private IndexDataConverter mConverter;
- private SQLiteDatabase mDb;
@Before
public void setUp() {
mContext = spy(RuntimeEnvironment.application);
- mDb = IndexDatabaseHelper.getInstance(mContext).getWritableDatabase();
- mConverter = spy(new IndexDataConverter(mContext, mDb));
+ mConverter = spy(new IndexDataConverter(mContext));
}
@After
@@ -96,82 +106,67 @@
}
@Test
- public void testInsertRawColumn_rowInserted() {
- SearchIndexableRaw raw = getFakeRaw();
- mConverter.indexOneSearchIndexableData(localeStr, raw,
- new HashMap<>()/* Non-indexable keys */);
- Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
- assertThat(cursor.getCount()).isEqualTo(1);
- }
+ public void testInsertRawColumn_rowConverted() {
+ final SearchIndexableRaw raw = getFakeRaw();
+ final PreIndexData preIndexData = new PreIndexData();
+ preIndexData.dataToUpdate.add(raw);
+ List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData,
+ localeStr);
- @Test
- public void testInsertRawColumn_nonIndexableKey_resultIsDisabled() {
- SearchIndexableRaw raw = getFakeRaw();
- Map<String, Set<String>> niks = new HashMap<>();
- Set<String> keys = new HashSet<>();
- keys.add(raw.key);
- niks.put(raw.intentTargetPackage, keys);
+ assertThat(indexData.size()).isEqualTo(1);
+ final IndexData row = indexData.get(0);
- mConverter.indexOneSearchIndexableData(localeStr, raw, niks);
- Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 0", null);
- assertThat(cursor.getCount()).isEqualTo(1);
- }
-
- @Test
- public void testInsertRawColumn_rowMatches() {
- SearchIndexableRaw raw = getFakeRaw();
- mConverter.indexOneSearchIndexableData(localeStr, raw,
- new HashMap<>()/* Non-indexable keys */);
- Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
- cursor.moveToPosition(0);
-
- // Locale
- assertThat(cursor.getString(0)).isEqualTo(localeStr);
- // Data Title
- assertThat(cursor.getString(2)).isEqualTo(updatedTitle);
- // Normalized Title
- assertThat(cursor.getString(3)).isEqualTo(normalizedTitle);
- // Summary On
- assertThat(cursor.getString(4)).isEqualTo(updatedSummaryOn);
- // Summary On Normalized
- assertThat(cursor.getString(5)).isEqualTo(normalizedSummaryOn);
- // Entries
- assertThat(cursor.getString(8)).isEqualTo(raw.entries);
- // Keywords
- assertThat(cursor.getString(9)).isEqualTo(spaceDelimittedKeywords);
- // Screen Title
- assertThat(cursor.getString(10)).isEqualTo(raw.screenTitle);
- // Class Name
- assertThat(cursor.getString(11)).isEqualTo(raw.className);
- // Icon
- assertThat(cursor.getInt(12)).isEqualTo(raw.iconResId);
- // Intent Action
- assertThat(cursor.getString(13)).isEqualTo(raw.intentAction);
- // Target Package
- assertThat(cursor.getString(14)).isEqualTo(raw.intentTargetPackage);
- // Target Class
- assertThat(cursor.getString(15)).isEqualTo(raw.intentTargetClass);
- // Enabled
- assertThat(cursor.getInt(16) == 1).isEqualTo(raw.enabled);
- // Data ref key
- assertThat(cursor.getString(17)).isNotNull();
- // User Id
- assertThat(cursor.getInt(18)).isEqualTo(raw.userId);
- // Payload Type - default is 0
- assertThat(cursor.getInt(19)).isEqualTo(0);
- // Payload
- byte[] payload = cursor.getBlob(20);
- ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
+ assertThat(row.normalizedTitle).isEqualTo(normalizedTitle);
+ assertThat(row.updatedTitle).isEqualTo(updatedTitle);
+ assertThat(row.locale).isEqualTo(localeStr);
+ assertThat(row.updatedSummaryOn).isEqualTo(updatedSummaryOn);
+ assertThat(row.entries).isEqualTo(entries);
+ assertThat(row.spaceDelimitedKeywords).isEqualTo(spaceDelimittedKeywords);
+ assertThat(row.screenTitle).isEqualTo(screenTitle);
+ assertThat(row.className).isEqualTo(className);
+ assertThat(row.iconResId).isEqualTo(iconResId);
+ assertThat(row.intentAction).isEqualTo(action);
+ assertThat(row.intentTargetPackage).isEqualTo(targetPackage);
+ assertThat(row.intentTargetClass).isEqualTo(targetClass);
+ assertThat(row.enabled).isEqualTo(enabled);
+ assertThat(row.key).isEqualTo(key);
+ assertThat(row.userId).isEqualTo(userId);
+ assertThat(row.payloadType).isEqualTo(0);
+ ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(row.payload,
ResultPayload.CREATOR);
assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
}
@Test
+ public void testInsertRawColumn_nonIndexableKey_resultIsDisabled() {
+ final SearchIndexableRaw raw = getFakeRaw();
+ // Add non-indexable key for raw row.
+ Set<String> keys = new HashSet<>();
+ keys.add(raw.key);
+
+ final PreIndexData preIndexData = new PreIndexData();
+ preIndexData.dataToUpdate.add(raw);
+ preIndexData.nonIndexableKeys.put(raw.intentTargetPackage, keys);
+
+ List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData,
+ localeStr);
+
+ assertThat(indexData.size()).isEqualTo(1);
+ assertThat(indexData.get(0).enabled).isFalse();
+ }
+
+ /**
+ * TODO (b/66916397) investigate why locale is attached to IndexData
+ */
+ @Test
public void testInsertRawColumn_mismatchedLocale_noRowInserted() {
- SearchIndexableRaw raw = getFakeRaw("ca-fr");
- mConverter.indexOneSearchIndexableData(localeStr, raw, null /* Non-indexable keys */);
- Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
- assertThat(cursor.getCount()).isEqualTo(0);
+ final SearchIndexableRaw raw = getFakeRaw("ca-fr");
+ PreIndexData preIndexData = new PreIndexData();
+ preIndexData.dataToUpdate.add(raw);
+ List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData,
+ localeStr);
+
+ assertThat(indexData).isEmpty();
}
// Tests for the flow: IndexOneResource -> IndexFromResource ->
@@ -179,421 +174,202 @@
@Test
public void testNullResource_NothingInserted() {
- mConverter.indexOneSearchIndexableData(localeStr, null /* searchIndexableResource */,
- new HashMap<>());
- Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
- assertThat(cursor.getCount()).isEqualTo(0);
+ PreIndexData preIndexData = new PreIndexData();
+ List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData,
+ localeStr);
+
+ assertThat(indexData).isEmpty();
}
@Test
public void testAddResource_RowsInserted() {
- SearchIndexableResource resource = getFakeResource(xml.display_settings);
- mConverter.indexOneSearchIndexableData(localeStr, resource, new HashMap<>());
- Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
- assertThat(cursor.getCount()).isEqualTo(17);
+ final SearchIndexableResource resource = getFakeResource(R.xml.display_settings);
+ final PreIndexData preIndexData = new PreIndexData();
+ preIndexData.dataToUpdate.add(resource);
+
+ final List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData,
+ localeStr);
+ int numEnabled = getEnabledResultCount(indexData);
+
+ assertThat(numEnabled).isEqualTo(NUM_DISPLAY_ENTRIES);
}
@Test
public void testAddResource_withNIKs_rowsInsertedDisabled() {
- SearchIndexableResource resource = getFakeResource(xml.display_settings);
- // Only add 2 of 16 items to be disabled.
- String[] keys = {"brightness", "wallpaper"};
- Map<String, Set<String>> niks = getNonIndexableKeys(keys);
+ final SearchIndexableResource resource = getFakeResource(R.xml.display_settings);
+ Set<String> keys = new HashSet<>();
+ keys.add("pref_key_1");
+ keys.add("pref_key_3");
- mConverter.indexOneSearchIndexableData(localeStr, resource, niks);
+ final PreIndexData preIndexData = new PreIndexData();
+ preIndexData.dataToUpdate.add(resource);
+ preIndexData.nonIndexableKeys.put(packageName, keys);
- Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 0", null);
- assertThat(cursor.getCount()).isEqualTo(2);
- cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 1", null);
- assertThat(cursor.getCount()).isEqualTo(15);
+ List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData,
+ localeStr);
+
+ assertThat(indexData.size()).isEqualTo(NUM_DISPLAY_ENTRIES);
+ assertThat(getEnabledResultCount(indexData)).isEqualTo(NUM_DISPLAY_ENTRIES - 2);
}
@Test
public void testAddResourceHeader_rowsMatch() {
- SearchIndexableResource resource = getFakeResource(xml.application_settings);
- mConverter.indexOneSearchIndexableData(localeStr, resource, new HashMap<>());
+ final SearchIndexableResource resource = getFakeResource(R.xml.display_settings);
+ final PreIndexData preIndexData = new PreIndexData();
+ preIndexData.dataToUpdate.add(resource);
- Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
- cursor.moveToPosition(1);
+ List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData,
+ localeStr);
- // Locale
- assertThat(cursor.getString(0)).isEqualTo(localeStr);
- // Data Title
- assertThat(cursor.getString(2)).isEqualTo("App info");
- // Normalized Title
- assertThat(cursor.getString(3)).isEqualTo("app info");
- // Summary On
- assertThat(cursor.getString(4)).isEqualTo("Manage apps, set up quick launch shortcuts");
- // Summary On Normalized
- assertThat(cursor.getString(5)).isEqualTo("manage apps, set up quick launch shortcuts");
- // Entries - only on for list preferences
- assertThat(cursor.getString(8)).isNull();
- // Keywords
- assertThat(cursor.getString(9)).isEmpty();
- // Screen Title
- assertThat(cursor.getString(10)).isEqualTo("App info");
- // Class Name
- assertThat(cursor.getString(11)).isEqualTo(className);
- // Icon
- assertThat(cursor.getInt(12)).isEqualTo(0);
- // Intent Action
- assertThat(cursor.getString(13)).isEqualTo(action);
- // Target Package
- assertThat(cursor.getString(14)).isEqualTo(targetPackage);
- // Target Class
- assertThat(cursor.getString(15)).isEqualTo(targetClass);
- // Enabled
- assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
- // Data ref key
- assertThat(cursor.getString(17)).isEqualTo("applications_settings");
- // User Id
- assertThat(cursor.getInt(18)).isEqualTo(userId);
- // Payload Type - default is 0
- assertThat(cursor.getInt(19)).isEqualTo(0);
- // Payload - should be updated to real payloads as controllers are added
- byte[] payload = cursor.getBlob(20);
- ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
- ResultPayload.CREATOR);
- assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
- }
+ final IndexData row = findIndexDataForTitle(indexData, PAGE_TITLE);
- @Test
- public void testAddResource_customSetting_rowsMatch() {
- SearchIndexableResource resource = getFakeResource(xml.swipe_to_notification_settings);
- mConverter.indexOneSearchIndexableData(localeStr, resource, new HashMap<>());
- final String prefTitle =
- mContext.getString(string.fingerprint_swipe_for_notifications_title);
- final String prefSummary =
- mContext.getString(string.fingerprint_swipe_for_notifications_summary);
- final String keywords = mContext.getString(string.keywords_gesture);
- Cursor cursor = mDb.rawQuery(
- "SELECT * FROM prefs_index where data_title='" + prefTitle + "'", null);
- cursor.moveToFirst();
-
- // Locale
- assertThat(cursor.getString(0)).isEqualTo(localeStr);
- // Data Title
- assertThat(cursor.getString(2)).isEqualTo(prefTitle);
- // Normalized Title
- assertThat(cursor.getString(3)).isEqualTo(prefTitle.toLowerCase());
- // Summary On
- assertThat(cursor.getString(4)).isEqualTo(prefSummary);
- // Summary On Normalized
- assertThat(cursor.getString(5)).isEqualTo(prefSummary.toLowerCase());
- // Entries - only on for list preferences
- assertThat(cursor.getString(8)).isNull();
- // Keywords
- assertThat(cursor.getString(9)).isEqualTo(keywords);
- // Screen Title
- assertThat(cursor.getString(10)).isEqualTo(
- mContext.getString(string.fingerprint_swipe_for_notifications_title));
- // Class Name
- assertThat(cursor.getString(11)).isEqualTo(className);
- // Icon
- assertThat(cursor.getInt(12)).isEqualTo(noIcon);
- // Intent Action
- assertThat(cursor.getString(13)).isEqualTo(action);
- // Target Package
- assertThat(cursor.getString(14)).isEqualTo(targetPackage);
- // Target Class
- assertThat(cursor.getString(15)).isEqualTo(targetClass);
- // Enabled
- assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
- // Data ref key
- assertThat(cursor.getString(17)).isEqualTo("gesture_swipe_down_fingerprint");
- // User Id
- assertThat(cursor.getInt(18)).isEqualTo(userId);
- // Payload Type - default is 0
- assertThat(cursor.getInt(19)).isEqualTo(0);
- // Payload - should be updated to real payloads as controllers are added
- byte[] payload = cursor.getBlob(20);
- ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
- ResultPayload.CREATOR);
- assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
+ // Header exists
+ assertThat(row).isNotNull();
+ assertThat(row.spaceDelimitedKeywords).isEqualTo("keywords");
}
@Test
public void testAddResource_checkboxPreference_rowsMatch() {
- SearchIndexableResource resource = getFakeResource(xml.application_settings);
- mConverter.indexOneSearchIndexableData(localeStr, resource, new HashMap<>());
+ final SearchIndexableResource resource = getFakeResource(R.xml.display_settings);
+ final PreIndexData preIndexData = new PreIndexData();
+ preIndexData.dataToUpdate.add(resource);
- /* Should return 6 results, with the following titles:
- * Advanced Settings, Apps, Manage Apps, Preferred install location, Running Services
- */
- Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
- cursor.moveToPosition(0);
- // Locale
- assertThat(cursor.getString(0)).isEqualTo(localeStr);
- // Data Title
- assertThat(cursor.getString(2)).isEqualTo("Advanced settings");
- // Normalized Title
- assertThat(cursor.getString(3)).isEqualTo("advanced settings");
- // Summary On
- assertThat(cursor.getString(4)).isEqualTo("Enable more settings options");
- // Summary On Normalized
- assertThat(cursor.getString(5)).isEqualTo("enable more settings options");
- // Entries - only on for list preferences
- assertThat(cursor.getString(8)).isNull();
- // Keywords
- assertThat(cursor.getString(9)).isEmpty();
- // Screen Title
- assertThat(cursor.getString(10)).isEqualTo("App info");
- // Class Name
- assertThat(cursor.getString(11)).isEqualTo(className);
- // Icon
- assertThat(cursor.getInt(12)).isEqualTo(noIcon);
- // Intent Action
- assertThat(cursor.getString(13)).isEqualTo(action);
- // Target Package
- assertThat(cursor.getString(14)).isEqualTo(targetPackage);
- // Target Class
- assertThat(cursor.getString(15)).isEqualTo(targetClass);
- // Enabled
- assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
- // Data ref key
- assertThat(cursor.getString(17)).isEqualTo("toggle_advanced_settings");
- // User Id
- assertThat(cursor.getInt(18)).isEqualTo(userId);
- // Payload Type - default is 0
- assertThat(cursor.getInt(19)).isEqualTo(0);
- // Payload - should be updated to real payloads as controllers are added
- byte[] payload = cursor.getBlob(20);
- ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
- ResultPayload.CREATOR);
- assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
+ List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData,
+ localeStr);
+
+ String checkBoxSummaryOn = "summary_on";
+ String checkBoxSummaryOff = "summary_off";
+ String checkBoxKey = "pref_key_5";
+ final IndexData row = findIndexDataForTitle(indexData, TITLE_FIVE);
+
+ assertDisplaySetting(row, TITLE_FIVE, checkBoxSummaryOn, checkBoxSummaryOff,
+ checkBoxKey);
}
@Test
public void testAddResource_listPreference_rowsMatch() {
- SearchIndexableResource resource = getFakeResource(xml.application_settings);
- mConverter.indexOneSearchIndexableData(localeStr, resource, new HashMap<>());
+ final SearchIndexableResource resource = getFakeResource(R.xml.display_settings);
+ final PreIndexData preIndexData = new PreIndexData();
+ preIndexData.dataToUpdate.add(resource);
- Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
- cursor.moveToPosition(3);
- // Locale
- assertThat(cursor.getString(0)).isEqualTo(localeStr);
- // Data Title
- assertThat(cursor.getString(2)).isEqualTo("Preferred install location");
- // Normalized Title
- assertThat(cursor.getString(3)).isEqualTo("preferred install location");
- // Summary On
- assertThat(cursor.getString(4)).isEqualTo(
- "Change the preferred installation location for new apps");
- // Summary On Normalized
- assertThat(cursor.getString(5)).isEqualTo(
- "change the preferred installation location for new apps");
- // Entries - only on for list preferences
- assertThat(cursor.getString(8)).isEqualTo("Internal device storage|Removable SD card|" +
- "Let the system decide|");
- // Keywords
- assertThat(cursor.getString(9)).isEmpty();
- // Screen Title
- assertThat(cursor.getString(10)).isEqualTo("App info");
- // Class Name
- assertThat(cursor.getString(11)).isEqualTo(className);
- // Icon
- assertThat(cursor.getInt(12)).isEqualTo(noIcon);
- // Intent Action
- assertThat(cursor.getString(13)).isEqualTo(action);
- // Target Package
- assertThat(cursor.getString(14)).isEqualTo(targetPackage);
- // Target Class
- assertThat(cursor.getString(15)).isEqualTo(targetClass);
- // Enabled
- assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
- // Data ref key
- assertThat(cursor.getString(17)).isEqualTo("app_install_location");
- // User Id
- assertThat(cursor.getInt(18)).isEqualTo(userId);
- // Payload Type - default is 0
- assertThat(cursor.getInt(19)).isEqualTo(0);
- // Payload - should be updated to real payloads as controllers are added
- byte[] payload = cursor.getBlob(20);
- ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
- ResultPayload.CREATOR);
- assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
+ List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData,
+ localeStr);
+
+ String listSummary = "summary_4";
+ String listKey = "pref_key_4";
+ final IndexData row = findIndexDataForTitle(indexData, TITLE_FOUR);
+
+ assertDisplaySetting(row, TITLE_FOUR, listSummary, "", listKey);
}
@Test
public void testAddResource_iconAddedFromXml() {
- SearchIndexableResource resource = getFakeResource(xml.connected_devices);
- mConverter.indexOneSearchIndexableData(localeStr, resource, new HashMap<>());
+ final SearchIndexableResource resource = getFakeResource(R.xml.display_settings);
+ final PreIndexData preIndexData = new PreIndexData();
+ preIndexData.dataToUpdate.add(resource);
- Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
- cursor.moveToPosition(0);
+ List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData,
+ localeStr);
- // Icon
- assertThat(cursor.getInt(12)).isNotEqualTo(noIcon);
+ final IndexData row = findIndexDataForTitle(indexData, TITLE_THREE);
+
+ assertThat(row.iconResId).isGreaterThan(0);
}
// Tests for the flow: IndexOneResource -> IndexFromProvider -> IndexFromResource ->
// UpdateOneRowWithFilteredData -> UpdateOneRow
@Test
- public void testResourceProvider_rowInserted() {
- SearchIndexableResource resource = getFakeResource(xml.swipe_to_notification_settings);
- resource.xmlResId = 0;
- resource.className = "com.android.settings.display.ScreenZoomSettings";
+ public void testAddProviderWithResource_rowInserted() {
+ final SearchIndexableResource resource = getFakeResource(0 /* xml */);
+ resource.className = FAKE_CLASS_NAME;
+ final PreIndexData preIndexData = new PreIndexData();
+ preIndexData.dataToUpdate.add(resource);
- mConverter.indexOneSearchIndexableData(localeStr, resource, new HashMap<>());
- Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
- assertThat(cursor.getCount()).isEqualTo(1);
+ List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData,
+ localeStr);
+
+ assertThat(indexData.size()).isEqualTo(NUM_FAKE_FRAGMENT_ENTRIES);
+ assertThat(findIndexDataForTitle(indexData, PAGE_TITLE)).isNotNull();
+ assertThat(findIndexDataForTitle(indexData, TITLE_ONE)).isNotNull();
+ assertThat(findIndexDataForTitle(indexData, TITLE_TWO)).isNotNull();
+ assertThat(findIndexDataForTitle(indexData, TITLE_THREE)).isNotNull();
+ assertThat(findIndexDataForTitle(indexData, TITLE_FOUR)).isNotNull();
+ assertThat(findIndexDataForTitle(indexData, TITLE_FIVE)).isNotNull();
+ assertThat(findIndexDataForTitle(indexData, FakeSettingsFragment.TITLE)).isNotNull();
}
@Test
- public void testResourceProvider_rowMatches() {
- SearchIndexableResource resource = getFakeResource(xml.swipe_to_notification_settings);
- resource.xmlResId = 0;
- resource.className = "com.android.settings.display.ScreenZoomSettings";
+ public void testAddProviderWithRaw_rowInserted() {
+ final SearchIndexableResource resource = getFakeResource(0 /* xml */);
+ resource.className = FAKE_CLASS_NAME;
+ final PreIndexData preIndexData = new PreIndexData();
+ preIndexData.dataToUpdate.add(resource);
- mConverter.indexOneSearchIndexableData(localeStr, resource, new HashMap<>());
- Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
- cursor.moveToPosition(0);
+ List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData,
+ localeStr);
- // Locale
- assertThat(cursor.getString(0)).isEqualTo(localeStr);
- // Data Title
- assertThat(cursor.getString(2)).isEqualTo("Display size");
- // Normalized Title
- assertThat(cursor.getString(3)).isEqualTo("display size");
- // Summary On
- assertThat(cursor.getString(4)).isEmpty();
- // Summary On Normalized
- assertThat(cursor.getString(5)).isEmpty();
- // Entries - only on for list preferences
- assertThat(cursor.getString(8)).isNull();
- // Keywords
- assertThat(cursor.getString(9)).isEqualTo("display density screen zoom scale scaling");
- // Screen Title
- assertThat(cursor.getString(10)).isEqualTo("Display size");
- // Class Name
- assertThat(cursor.getString(11))
- .isEqualTo("com.android.settings.display.ScreenZoomSettings");
- // Icon
- assertThat(cursor.getInt(12)).isEqualTo(noIcon);
- // Intent Action
- assertThat(cursor.getString(13)).isNull();
- // Target Package
- assertThat(cursor.getString(14)).isNull();
- // Target Class
- assertThat(cursor.getString(15)).isNull();
- // Enabled
- assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
- // Data ref key
- assertThat(cursor.getString(17)).isNull();
- // User Id
- assertThat(cursor.getInt(18)).isEqualTo(userId);
- // Payload Type - default is 0
- assertThat(cursor.getInt(19)).isEqualTo(0);
- // Payload - should be updated to real payloads as controllers are added
- byte[] payload = cursor.getBlob(20);
- ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
+ final IndexData data = findIndexDataForTitle(indexData, FakeSettingsFragment.TITLE);
+ assertFakeFragment(data);
+ }
+
+ @Test
+ public void testAddProvider_disabledRows() {
+ // Note that in FakeSettingsFragment, preferences 1 and 3 are disabled.
+ final SearchIndexableResource resource = getFakeResource(0 /* xml */);
+ resource.className = FAKE_CLASS_NAME;
+
+ final PreIndexData preIndexData = new PreIndexData();
+ preIndexData.dataToUpdate.add(resource);
+
+ List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData,
+ localeStr);
+
+ assertThat(getEnabledResultCount(indexData)).isEqualTo(NUM_ENABLED_FAKE_FRAGMENT_ENTRIES);
+ }
+
+ @Test
+ public void testResource_sameTitleForSettingAndPage_titleNotInserted() {
+ final SearchIndexableResource resource = getFakeResource(R.xml.about_legal);
+ final PreIndexData preIndexData = new PreIndexData();
+ preIndexData.dataToUpdate.add(resource);
+
+ List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData,
+ localeStr);
+
+ int numEnabled = getEnabledResultCount(indexData);
+ final IndexData nonTitlePref = findIndexDataForKey(indexData, "pref_key_1");
+
+ assertThat(indexData.size()).isEqualTo(NUM_LEGAL_SETTINGS - 1);
+ assertThat(numEnabled).isEqualTo(NUM_LEGAL_SETTINGS - 1);
+ assertThat(nonTitlePref.enabled).isTrue();
+ }
+
+ private void assertDisplaySetting(IndexData row, String title, String summaryOn,
+ String summaryOff, String key) {
+ assertThat(row.normalizedTitle).isEqualTo(title);
+ assertThat(row.locale).isEqualTo(localeStr);
+ assertThat(row.updatedSummaryOn).isEqualTo(summaryOn);
+ assertThat(row.spaceDelimitedKeywords).isEqualTo(DISPLAY_SPACE_DELIM_KEYWORDS);
+ assertThat(row.screenTitle).isEqualTo(PAGE_TITLE);
+ assertThat(row.className).isEqualTo(className);
+ assertThat(row.enabled).isEqualTo(true);
+ assertThat(row.key).isEqualTo(key);
+ assertThat(row.payloadType).isEqualTo(0);
+ ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(row.payload,
ResultPayload.CREATOR);
assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
}
- @Test
- public void testResourceProvider_resourceRowInserted() {
- SearchIndexableResource resource = getFakeResource(0);
- resource.className = "com.android.settings.LegalSettings";
-
- mConverter.indexOneSearchIndexableData(localeStr, resource, new HashMap<>());
- Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
- assertThat(cursor.getCount()).isEqualTo(6);
- }
-
- @Test
- public void testResourceProvider_resourceRowMatches() {
- SearchIndexableResource resource = getFakeResource(0 /* xml */);
- resource.className = "com.android.settings.display.ScreenZoomSettings";
-
- mConverter.indexOneSearchIndexableData(localeStr, resource, new HashMap<>());
- Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
- cursor.moveToPosition(0);
-
- // Locale
- assertThat(cursor.getString(0)).isEqualTo(localeStr);
- // Data Title
- assertThat(cursor.getString(2)).isEqualTo("Display size");
- // Normalized Title
- assertThat(cursor.getString(3)).isEqualTo("display size");
- // Summary On
- assertThat(cursor.getString(4)).isEmpty();
- // Summary On Normalized
- assertThat(cursor.getString(5)).isEmpty();
- // Entries - only on for list preferences
- assertThat(cursor.getString(8)).isNull();
- // Keywords
- assertThat(cursor.getString(9)).isEqualTo(
- "display density screen zoom scale scaling");
- // Screen Title
- assertThat(cursor.getString(10)).isEqualTo("Display size");
- // Class Name
- assertThat(cursor.getString(11))
- .isEqualTo("com.android.settings.display.ScreenZoomSettings");
- // Icon
- assertThat(cursor.getInt(12)).isEqualTo(noIcon);
- // Intent Action
- assertThat(cursor.getString(13)).isNull();
- // Target Package
- assertThat(cursor.getString(14)).isNull();
- // Target Class
- assertThat(cursor.getString(15)).isNull();
- // Enabled
- assertThat(cursor.getInt(16) == 1).isEqualTo(enabled);
- // Data ref key
- assertThat(cursor.getString(17)).isNull();
- // User Id
- assertThat(cursor.getInt(18)).isEqualTo(userId);
- // Payload Type - default is 0
- assertThat(cursor.getInt(19)).isEqualTo(0);
- // Payload - should be updated to real payloads as controllers are added
- byte[] payload = cursor.getBlob(20);
- ResultPayload unmarshalledPayload = ResultPayloadUtils.unmarshall(payload,
- ResultPayload.CREATOR);
- assertThat(unmarshalledPayload).isInstanceOf(ResultPayload.class);
- }
-
- @Test
- public void testResourceProvider_disabledResource_rowsInserted() {
- SearchIndexableResource resource = getFakeResource(0 /* xml */);
- resource.className = "com.android.settings.LegalSettings";
-
- mConverter.indexOneSearchIndexableData(localeStr, resource, new HashMap<>());
-
- Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 1", null);
- assertThat(cursor.getCount()).isEqualTo(1);
- cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 0", null);
- assertThat(cursor.getCount()).isEqualTo(5);
- }
-
- @Test
- public void testResource_withTitleAndSettingName_titleNotInserted() {
- SearchIndexableResource resource = getFakeResource(xml.swipe_to_notification_settings);
- mConverter.indexFromResource(localeStr, resource, new ArrayList<>());
-
- Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE" +
- " enabled = 1", null);
- assertThat(cursor.getCount()).isEqualTo(1);
- }
-
- @Test
- public void testResourceProvider_nonSubsettingIntent() {
- SearchIndexableResource resource = getFakeResource(0 /* xml */);
- String fakeAction = "fake_action";
- resource.className = "com.android.settings.LegalSettings";
- resource.intentAction = fakeAction;
- resource.intentTargetPackage = SearchIndexableResources.SUBSETTING_TARGET_PACKAGE;
-
- mConverter.indexOneSearchIndexableData(localeStr, resource, new HashMap<>());
- Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
- cursor.moveToPosition(0);
-
- // Intent Action
- assertThat(cursor.getString(13)).isEqualTo(fakeAction);
- // Target Package
- assertThat(cursor.getString(14))
- .isEqualTo(SearchIndexableResources.SUBSETTING_TARGET_PACKAGE);
+ private void assertFakeFragment(IndexData row) {
+ assertThat(row.normalizedTitle).isEqualTo(FakeSettingsFragment.TITLE);
+ assertThat(row.updatedSummaryOn).isEqualTo(FakeSettingsFragment.SUMMARY_ON);
+ assertThat(row.spaceDelimitedKeywords)
+ .isEqualTo(FakeSettingsFragment.SPACE_KEYWORDS);
+ assertThat(row.screenTitle).isEqualTo(FakeSettingsFragment.SCREEN_TITLE);
+ assertThat(row.className).isEqualTo(FakeSettingsFragment.CLASS_NAME);
+ assertThat(row.enabled).isEqualTo(FakeSettingsFragment.ENABLED);
+ assertThat(row.key).isEqualTo(FakeSettingsFragment.KEY);
}
private SearchIndexableRaw getFakeRaw() {
@@ -634,11 +410,34 @@
return sir;
}
- private Map<String, Set<String>> getNonIndexableKeys(String[] keys) {
- Map<String, Set<String>> niks = new HashMap<>();
- Set<String> keysList = new HashSet<>();
- keysList.addAll(Arrays.asList(keys));
- niks.put(packageName, keysList);
- return niks;
+ private static int getEnabledResultCount(List<IndexData> indexData) {
+ int enabledCount = 0;
+ for (IndexData data : indexData) {
+ if (data.enabled) {
+ enabledCount++;
+ }
+ }
+ return enabledCount;
+ }
+
+ private static IndexData findIndexDataForTitle(List<IndexData> indexData,
+ String indexDataTitle) {
+ for (int i = 0; i < indexData.size(); i++) {
+ IndexData row = indexData.get(i);
+ if (TextUtils.equals(row.updatedTitle, indexDataTitle)) {
+ return row;
+ }
+ }
+ return null;
+ }
+
+ private static IndexData findIndexDataForKey(List<IndexData> indexData, String indexDataKey) {
+ for (int i = 0; i < indexData.size(); i++) {
+ IndexData row = indexData.get(i);
+ if (TextUtils.equals(row.key, indexDataKey)) {
+ return row;
+ }
+ }
+ return null;
}
}