Merge "Refactor IndexData conversion flow"

This commit is contained in:
TreeHugger Robot
2017-09-28 17:43:04 +00:00
committed by Android (Google) Code Review
7 changed files with 160 additions and 195 deletions

View File

@@ -28,7 +28,8 @@ import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_
import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_KEYWORDS; 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_KEY_REF;
import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON; 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_SUMMARY_ON_NORMALIZED;
import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.DATA_TITLE; 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.DATA_TITLE_NORMALIZED;
import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.ENABLED; import static com.android.settings.search.IndexDatabaseHelper.IndexColumns.ENABLED;
@@ -234,9 +235,9 @@ public class DatabaseIndexingManager {
@VisibleForTesting @VisibleForTesting
List<IndexData> getIndexData(String locale, PreIndexData data) { List<IndexData> getIndexData(String locale, PreIndexData data) {
if (mConverter == null) { if (mConverter == null) {
mConverter = new IndexDataConverter(mContext); mConverter = new IndexDataConverter(mContext, locale);
} }
return mConverter.convertPreIndexDataToIndexData(data, locale); return mConverter.convertPreIndexDataToIndexData(data);
} }
/** /**
@@ -248,6 +249,10 @@ public class DatabaseIndexingManager {
ContentValues values; ContentValues values;
for (IndexData dataRow : indexData) { for (IndexData dataRow : indexData) {
if (TextUtils.isEmpty(dataRow.normalizedTitle)) {
continue;
}
values = new ContentValues(); values = new ContentValues();
values.put(IndexDatabaseHelper.IndexColumns.DOCID, dataRow.getDocId()); values.put(IndexDatabaseHelper.IndexColumns.DOCID, dataRow.getDocId());
values.put(LOCALE, dataRow.locale); values.put(LOCALE, dataRow.locale);

View File

@@ -93,7 +93,6 @@ public class DatabaseResultLoader extends AsyncLoader<Set<? extends SearchResult
* If the query matches the prefix of the other words in the title, the best rank it can be is 3 * If the query matches the prefix of the other words in the title, the best rank it can be is 3
* If the query only matches the summary, the best rank it can be is 7 * If the query only matches the summary, the best rank it can be is 7
* If the query only matches keywords or entries, the best rank it can be is 9 * If the query only matches keywords or entries, the best rank it can be is 9
*
*/ */
public static final int[] BASE_RANKS = {1, 3, 7, 9}; public static final int[] BASE_RANKS = {1, 3, 7, 9};
@@ -249,7 +248,7 @@ public class DatabaseResultLoader extends AsyncLoader<Set<? extends SearchResult
private String[] buildSingleWordSelection(String query, int size) { private String[] buildSingleWordSelection(String query, int size) {
String[] selection = new String[size]; String[] selection = new String[size];
for(int i = 0; i < size; i ++) { for (int i = 0; i < size; i++) {
selection[i] = query; selection[i] = query;
} }
return selection; return selection;
@@ -267,7 +266,7 @@ public class DatabaseResultLoader extends AsyncLoader<Set<? extends SearchResult
final String query = mQueryText + "%"; final String query = mQueryText + "%";
final String subStringQuery = "% " + mQueryText + "%"; final String subStringQuery = "% " + mQueryText + "%";
for(int i = 0; i < (size - 1); i += 2) { for (int i = 0; i < (size - 1); i += 2) {
selection[i] = query; selection[i] = query;
selection[i + 1] = subStringQuery; selection[i + 1] = subStringQuery;
} }

View File

@@ -21,6 +21,7 @@ import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.text.TextUtils; import android.text.TextUtils;
import com.android.settings.SettingsActivity; import com.android.settings.SettingsActivity;
import com.android.settings.search.DatabaseIndexingUtils; import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settings.search.ResultPayload; import com.android.settings.search.ResultPayload;

View File

@@ -17,29 +17,31 @@
package com.android.settings.search.indexing; package com.android.settings.search.indexing;
import android.annotation.Nullable;
import android.content.Context; import android.content.Context;
import android.content.res.XmlResourceParser; import android.content.res.XmlResourceParser;
import android.provider.SearchIndexableData; import android.provider.SearchIndexableData;
import android.provider.SearchIndexableResource; import android.provider.SearchIndexableResource;
import android.support.annotation.DrawableRes; import android.support.annotation.DrawableRes;
import android.support.annotation.VisibleForTesting;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.Log; import android.util.Log;
import android.util.Xml; import android.util.Xml;
import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.search.DatabaseIndexingUtils; import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settings.search.Indexable; import com.android.settings.search.Indexable;
import com.android.settings.search.ResultPayload; import com.android.settings.search.ResultPayload;
import com.android.settings.search.SearchIndexableRaw; import com.android.settings.search.SearchIndexableRaw;
import com.android.settings.search.SearchIndexableResources;
import com.android.settings.search.XmlParserUtils; import com.android.settings.search.XmlParserUtils;
import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
@@ -47,10 +49,6 @@ import java.util.Set;
/** /**
* Helper class to convert {@link PreIndexData} to {@link IndexData}. * Helper class to convert {@link PreIndexData} to {@link IndexData}.
*
* TODO (b/33577327) This is just copied straight from DatabaseIndexingManager. But it's still ugly.
* TODO This is currently a long chain of method calls. It needs to be broken up.
* TODO but for the sake of easy code reviews, that will happen later.
*/ */
public class IndexDataConverter { public class IndexDataConverter {
@@ -64,70 +62,77 @@ public class IndexDataConverter {
private String mLocale; private String mLocale;
private List<IndexData> mIndexData; public IndexDataConverter(Context context, String locale) {
public IndexDataConverter(Context context) {
mContext = context; mContext = context;
mLocale = Locale.getDefault().toString();
}
public List<IndexData> convertPreIndexDataToIndexData(PreIndexData preIndexData,
String locale) {
mLocale = 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. * Return the collection of {@param preIndexData} converted into {@link IndexData}.
* *
* @param dataToUpdate is a {@link List} of the data to be inserted. * @param preIndexData a collection of {@link SearchIndexableResource},
* @param nonIndexableKeys is a {@link Map} from Package Name to a {@link Set} of keys which * {@link SearchIndexableRaw} and non-indexable keys.
* identify search results which should not be surfaced.
*/ */
private void parsePreIndexData(List<SearchIndexableData> dataToUpdate, public List<IndexData> convertPreIndexDataToIndexData(PreIndexData preIndexData) {
Map<String, Set<String>> nonIndexableKeys) {
final long current = System.currentTimeMillis(); final long current = System.currentTimeMillis();
final List<SearchIndexableData> indexableData = preIndexData.dataToUpdate;
final Map<String, Set<String>> nonIndexableKeys = preIndexData.nonIndexableKeys;
final List<IndexData> indexData = new ArrayList<>();
for (SearchIndexableData data : indexableData) {
if (data instanceof SearchIndexableRaw) {
final SearchIndexableRaw rawData = (SearchIndexableRaw) data;
final Set<String> rawNonIndexableKeys = nonIndexableKeys.get(
rawData.intentTargetPackage);
final IndexData.Builder builder = convertRaw(rawData, rawNonIndexableKeys);
if (builder != null) {
indexData.add(builder.build(mContext));
}
} else if (data instanceof SearchIndexableResource) {
final SearchIndexableResource sir = (SearchIndexableResource) data;
final Set<String> resourceNonIndexableKeys =
getNonIndexableKeysForResource(nonIndexableKeys, sir.packageName);
if (sir.xmlResId == 0) {
// Index from provider
final Indexable.SearchIndexProvider provider = getSearchProvider(sir);
if (provider == null) {
continue;
}
indexData.addAll(convertIndexProvider(provider, sir, resourceNonIndexableKeys));
} else {
final List<IndexData> resourceData = convertResource(sir,
resourceNonIndexableKeys);
indexData.addAll(resourceData);
}
for (SearchIndexableData data : dataToUpdate) {
try {
addOneIndexData(data, nonIndexableKeys);
} catch (Exception e) {
Log.e(LOG_TAG, "Cannot index: " + (data != null ? data.className : data)
+ " for locale: " + mLocale, e);
} }
} }
final long now = System.currentTimeMillis(); final long endConversion = System.currentTimeMillis();
Log.d(LOG_TAG, "Indexing locale '" + mLocale + "' took " + Log.d(LOG_TAG, "Converting pre-index data to index data took: "
(now - current) + " millis"); + (endConversion - current));
return indexData;
} }
private void addOneIndexData(SearchIndexableData data, /**
Map<String, Set<String>> nonIndexableKeys) { * Return the conversion of {@link SearchIndexableRaw} to {@link IndexData}.
if (data instanceof SearchIndexableResource) { * The fields of {@link SearchIndexableRaw} are a subset of {@link IndexData},
addOneResource((SearchIndexableResource) data, nonIndexableKeys); * and there is some data sanitization in the conversion.
} else if (data instanceof SearchIndexableRaw) { */
addOneRaw((SearchIndexableRaw) data, nonIndexableKeys); @Nullable
} private IndexData.Builder convertRaw(SearchIndexableRaw raw, Set<String> nonIndexableKeys) {
}
private void addOneRaw(SearchIndexableRaw raw, Map<String,
Set<String>> nonIndexableKeysFromResource) {
// Should be the same locale as the one we are processing // Should be the same locale as the one we are processing
if (!raw.locale.toString().equalsIgnoreCase(mLocale)) { if (!raw.locale.toString().equalsIgnoreCase(mLocale)) {
return; return null;
} }
Set<String> packageKeys = nonIndexableKeysFromResource.get(raw.intentTargetPackage); // A row is enabled if it does not show up as an nonIndexableKey
boolean enabled = raw.enabled; boolean enabled = !(nonIndexableKeys != null && nonIndexableKeys.contains(raw.key));
if (packageKeys != null && packageKeys.contains(raw.key)) {
enabled = false;
}
IndexData.Builder builder = new IndexData.Builder(); IndexData.Builder builder = new IndexData.Builder();
builder.setTitle(raw.title) builder.setTitle(raw.title)
@@ -145,58 +150,22 @@ public class IndexDataConverter {
.setKey(raw.key) .setKey(raw.key)
.setUserId(raw.userId); .setUserId(raw.userId);
addRowToData(builder.build(mContext)); return builder;
} }
private void addOneResource(SearchIndexableResource sir, /**
Map<String, Set<String>> nonIndexableKeysFromResource) { * Return the conversion of the {@link SearchIndexableResource} to {@link IndexData}.
* Each of the elements in the xml layout attribute of {@param sir} is a candidate to be
if (sir == null) { * converted (including the header element).
Log.e(LOG_TAG, "Cannot index a null resource!"); *
return; * TODO (b/33577327) simplify this method.
} */
private List<IndexData> convertResource(SearchIndexableResource sir,
final List<String> nonIndexableKeys = new ArrayList<>(); Set<String> nonIndexableKeys) {
if (sir.xmlResId > SearchIndexableResources.NO_DATA_RES_ID) {
Set<String> resNonIndexableKeys = nonIndexableKeysFromResource.get(sir.packageName);
if (resNonIndexableKeys != null && resNonIndexableKeys.size() > 0) {
nonIndexableKeys.addAll(resNonIndexableKeys);
}
addIndexDataFromResource(sir, nonIndexableKeys);
} else {
if (TextUtils.isEmpty(sir.className)) {
Log.w(LOG_TAG, "Cannot index an empty Search Provider name!");
return;
}
final Class<?> clazz = DatabaseIndexingUtils.getIndexableClass(sir.className);
if (clazz == null) {
Log.d(LOG_TAG, "SearchIndexableResource '" + sir.className +
"' should implement the " + Indexable.class.getName() + " interface!");
return;
}
// Will be non null only for a Local provider implementing a
// SEARCH_INDEX_DATA_PROVIDER field
final Indexable.SearchIndexProvider provider =
DatabaseIndexingUtils.getSearchIndexProvider(clazz);
if (provider != null) {
List<String> providerNonIndexableKeys = provider.getNonIndexableKeys(sir.context);
if (providerNonIndexableKeys != null) {
nonIndexableKeys.addAll(providerNonIndexableKeys);
}
addIndexDataFromProvider(provider, sir, nonIndexableKeys);
}
}
}
private void addIndexDataFromResource(SearchIndexableResource sir,
List<String> nonIndexableKeys) {
final Context context = sir.context; final Context context = sir.context;
XmlResourceParser parser = null; XmlResourceParser parser = null;
List<IndexData> resourceIndexData = new ArrayList<>();
try { try {
parser = context.getResources().getXml(sir.xmlResId); parser = context.getResources().getXml(sir.xmlResId);
@@ -226,8 +195,7 @@ public class IndexDataConverter {
String keywords; String keywords;
String headerKeywords; String headerKeywords;
String childFragment; String childFragment;
@DrawableRes @DrawableRes int iconResId;
int iconResId;
ResultPayload payload; ResultPayload payload;
boolean enabled; boolean enabled;
final String fragmentName = sir.className; final String fragmentName = sir.className;
@@ -242,9 +210,6 @@ public class IndexDataConverter {
.getPreferenceControllerUriMap(fragmentName, context); .getPreferenceControllerUriMap(fragmentName, context);
} }
// Insert rows for the main PreferenceScreen node. Rewrite the data for removing
// hyphens.
headerTitle = XmlParserUtils.getDataTitle(context, attrs); headerTitle = XmlParserUtils.getDataTitle(context, attrs);
headerSummary = XmlParserUtils.getDataSummary(context, attrs); headerSummary = XmlParserUtils.getDataSummary(context, attrs);
headerKeywords = XmlParserUtils.getDataKeywords(context, attrs); headerKeywords = XmlParserUtils.getDataKeywords(context, attrs);
@@ -319,8 +284,7 @@ public class IndexDataConverter {
.setChildClassName(childFragment) .setChildClassName(childFragment)
.setPayload(payload); .setPayload(payload);
// Insert rows for the child nodes of PreferenceScreen resourceIndexData.add(builder.build(mContext));
addRowToData(builder.build(mContext));
} else { } else {
// TODO (b/33577327) We removed summary off here. We should check if we can // 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 // merge this 'else' section with the one above. Put a break point to
@@ -334,13 +298,13 @@ public class IndexDataConverter {
builder.setSummaryOn(summaryOn); builder.setSummaryOn(summaryOn);
addRowToData(builder.build(mContext)); resourceIndexData.add(builder.build(mContext));
} }
} }
// The xml header's title does not match the title of one of the child settings. // The xml header's title does not match the title of one of the child settings.
if (isHeaderUnique) { if (isHeaderUnique) {
addRowToData(headerBuilder.build(mContext)); resourceIndexData.add(headerBuilder.build(mContext));
} }
} catch (XmlPullParserException e) { } catch (XmlPullParserException e) {
throw new RuntimeException("Error parsing PreferenceScreen", e); throw new RuntimeException("Error parsing PreferenceScreen", e);
@@ -349,62 +313,44 @@ public class IndexDataConverter {
} finally { } finally {
if (parser != null) parser.close(); if (parser != null) parser.close();
} }
return resourceIndexData;
} }
private void addIndexDataFromProvider(Indexable.SearchIndexProvider provider, private List<IndexData> convertIndexProvider(Indexable.SearchIndexProvider provider,
SearchIndexableResource sir, List<String> nonIndexableKeys) { SearchIndexableResource sir, Set<String> nonIndexableKeys) {
final List<IndexData> indexData = new ArrayList<>();
final String className = sir.className; final String className = sir.className;
final String intentAction = sir.intentAction; final String intentAction = sir.intentAction;
final String intentTargetPackage = sir.intentTargetPackage; final String intentTargetPackage = sir.intentTargetPackage;
if (provider == null) { // TODO (b/65376542) Move provider conversion to PreIndexTime
Log.w(LOG_TAG, "Cannot find provider: " + className); // TODO (b/37741509) Providers don't use general non-indexable keys
return; nonIndexableKeys.addAll(provider.getNonIndexableKeys(mContext));
}
final List<SearchIndexableRaw> rawList = provider.getRawDataToIndex(mContext, final List<SearchIndexableRaw> rawList = provider.getRawDataToIndex(mContext,
true /* enabled */); true /* enabled */);
if (rawList != null) { if (rawList != null) {
for (SearchIndexableRaw raw : rawList) {
// The classname and intent information comes from the PreIndexData
// This will be more clear when provider conversion is done at PreIndex time.
raw.className = className;
raw.intentAction = intentAction;
raw.intentTargetPackage = intentTargetPackage;
final int rawSize = rawList.size(); IndexData.Builder builder = convertRaw(raw, nonIndexableKeys);
for (int i = 0; i < rawSize; i++) { if (builder != null) {
SearchIndexableRaw raw = rawList.get(i); indexData.add(builder.build(mContext));
// Should be the same locale as the one we are processing
if (!raw.locale.toString().equalsIgnoreCase(mLocale)) {
continue;
} }
boolean enabled = !nonIndexableKeys.contains(raw.key);
IndexData.Builder builder = new IndexData.Builder();
builder.setTitle(raw.title)
.setSummaryOn(raw.summaryOn)
.setLocale(mLocale)
.setEntries(raw.entries)
.setKeywords(raw.keywords)
.setClassName(className)
.setScreenTitle(raw.screenTitle)
.setIconResId(raw.iconResId)
.setIntentAction(raw.intentAction)
.setIntentTargetPackage(raw.intentTargetPackage)
.setIntentTargetClass(raw.intentTargetClass)
.setEnabled(enabled)
.setKey(raw.key)
.setUserId(raw.userId);
addRowToData(builder.build(mContext));
} }
} }
final List<SearchIndexableResource> resList = final List<SearchIndexableResource> resList =
provider.getXmlResourcesToIndex(mContext, true); provider.getXmlResourcesToIndex(mContext, true);
if (resList != null) {
final int resSize = resList.size();
for (int i = 0; i < resSize; i++) {
SearchIndexableResource item = resList.get(i);
if (resList != null) {
for (SearchIndexableResource item : resList) {
// Should be the same locale as the one we are processing // Should be the same locale as the one we are processing
if (!item.locale.toString().equalsIgnoreCase(mLocale)) { if (!item.locale.toString().equalsIgnoreCase(mLocale)) {
continue; continue;
@@ -420,16 +366,39 @@ public class IndexDataConverter {
? intentTargetPackage ? intentTargetPackage
: item.intentTargetPackage; : item.intentTargetPackage;
addIndexDataFromResource(item, nonIndexableKeys); indexData.addAll(convertResource(item, nonIndexableKeys));
}
} }
} }
private void addRowToData(IndexData row) { return indexData;
if (TextUtils.isEmpty(row.updatedTitle)) {
return;
} }
mIndexData.add(row); private Set<String> getNonIndexableKeysForResource(Map<String, Set<String>> nonIndexableKeys,
String packageName) {
return nonIndexableKeys.containsKey(packageName)
? nonIndexableKeys.get(packageName)
: new HashSet<>();
}
/**
* @return Return the {@link Indexable.SearchIndexProvider} corresponding to the
* class specified by the Class name specified by {@param sir}.
*/
private Indexable.SearchIndexProvider getSearchProvider(SearchIndexableResource sir) {
if (TextUtils.isEmpty(sir.className)) {
Log.w(LOG_TAG, "Cannot index an empty Search Provider name!");
return null;
}
final Class<?> clazz = DatabaseIndexingUtils.getIndexableClass(sir.className);
if (clazz == null) {
Log.d(LOG_TAG, "SearchIndexableResource '" + sir.className +
"' should implement the " + Indexable.class.getName() + " interface!");
return null;
}
// Will be non null only for a Local provider implementing a
// SEARCH_INDEX_DATA_PROVIDER field
return DatabaseIndexingUtils.getSearchIndexProvider(clazz);
} }
} }

View File

@@ -31,6 +31,7 @@ import android.provider.SearchIndexablesContract;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.ArraySet; import android.util.ArraySet;
import android.util.Log; import android.util.Log;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.search.SearchIndexableRaw; import com.android.settings.search.SearchIndexableRaw;
import com.android.settings.search.SettingsSearchIndexablesProvider; import com.android.settings.search.SettingsSearchIndexablesProvider;

View File

@@ -19,12 +19,12 @@ package com.android.settings.search.indexing;
import android.content.Context; import android.content.Context;
import android.provider.SearchIndexableResource; import android.provider.SearchIndexableResource;
import com.android.internal.logging.nano.MetricsProto; import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.SearchIndexableRaw; import com.android.settings.search.SearchIndexableRaw;
import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -76,7 +76,8 @@ public class FakeSettingsFragment extends DashboardFragment {
public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() { new BaseSearchIndexProvider() {
@Override @Override
public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) { public List<SearchIndexableRaw> getRawDataToIndex(Context context,
boolean enabled) {
final SearchIndexableRaw data = new SearchIndexableRaw(context); final SearchIndexableRaw data = new SearchIndexableRaw(context);
data.title = TITLE; data.title = TITLE;
data.summaryOn = SUMMARY_ON; data.summaryOn = SUMMARY_ON;

View File

@@ -20,6 +20,7 @@ package com.android.settings.search.indexing;
import android.content.Context; import android.content.Context;
import android.provider.SearchIndexableResource; import android.provider.SearchIndexableResource;
import android.text.TextUtils; import android.text.TextUtils;
import com.android.settings.TestConfig; import com.android.settings.TestConfig;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.search.ResultPayload; import com.android.settings.search.ResultPayload;
@@ -27,6 +28,7 @@ import com.android.settings.search.ResultPayloadUtils;
import com.android.settings.search.SearchIndexableRaw; import com.android.settings.search.SearchIndexableRaw;
import com.android.settings.testutils.DatabaseTestUtils; import com.android.settings.testutils.DatabaseTestUtils;
import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -40,6 +42,7 @@ import java.util.Locale;
import java.util.Set; import java.util.Set;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
@RunWith(SettingsRobolectricTestRunner.class) @RunWith(SettingsRobolectricTestRunner.class)
@@ -97,7 +100,7 @@ public class IndexDataConverterTest {
@Before @Before
public void setUp() { public void setUp() {
mContext = spy(RuntimeEnvironment.application); mContext = spy(RuntimeEnvironment.application);
mConverter = spy(new IndexDataConverter(mContext)); mConverter = spy(new IndexDataConverter(mContext, localeStr));
} }
@After @After
@@ -110,8 +113,7 @@ public class IndexDataConverterTest {
final SearchIndexableRaw raw = getFakeRaw(); final SearchIndexableRaw raw = getFakeRaw();
final PreIndexData preIndexData = new PreIndexData(); final PreIndexData preIndexData = new PreIndexData();
preIndexData.dataToUpdate.add(raw); preIndexData.dataToUpdate.add(raw);
List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData, List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData);
localeStr);
assertThat(indexData.size()).isEqualTo(1); assertThat(indexData.size()).isEqualTo(1);
final IndexData row = indexData.get(0); final IndexData row = indexData.get(0);
@@ -148,8 +150,7 @@ public class IndexDataConverterTest {
preIndexData.dataToUpdate.add(raw); preIndexData.dataToUpdate.add(raw);
preIndexData.nonIndexableKeys.put(raw.intentTargetPackage, keys); preIndexData.nonIndexableKeys.put(raw.intentTargetPackage, keys);
List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData, List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData);
localeStr);
assertThat(indexData.size()).isEqualTo(1); assertThat(indexData.size()).isEqualTo(1);
assertThat(indexData.get(0).enabled).isFalse(); assertThat(indexData.get(0).enabled).isFalse();
@@ -163,8 +164,7 @@ public class IndexDataConverterTest {
final SearchIndexableRaw raw = getFakeRaw("ca-fr"); final SearchIndexableRaw raw = getFakeRaw("ca-fr");
PreIndexData preIndexData = new PreIndexData(); PreIndexData preIndexData = new PreIndexData();
preIndexData.dataToUpdate.add(raw); preIndexData.dataToUpdate.add(raw);
List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData, List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData);
localeStr);
assertThat(indexData).isEmpty(); assertThat(indexData).isEmpty();
} }
@@ -175,8 +175,7 @@ public class IndexDataConverterTest {
@Test @Test
public void testNullResource_NothingInserted() { public void testNullResource_NothingInserted() {
PreIndexData preIndexData = new PreIndexData(); PreIndexData preIndexData = new PreIndexData();
List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData, List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData);
localeStr);
assertThat(indexData).isEmpty(); assertThat(indexData).isEmpty();
} }
@@ -187,8 +186,7 @@ public class IndexDataConverterTest {
final PreIndexData preIndexData = new PreIndexData(); final PreIndexData preIndexData = new PreIndexData();
preIndexData.dataToUpdate.add(resource); preIndexData.dataToUpdate.add(resource);
final List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData, final List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData);
localeStr);
int numEnabled = getEnabledResultCount(indexData); int numEnabled = getEnabledResultCount(indexData);
assertThat(numEnabled).isEqualTo(NUM_DISPLAY_ENTRIES); assertThat(numEnabled).isEqualTo(NUM_DISPLAY_ENTRIES);
@@ -205,8 +203,7 @@ public class IndexDataConverterTest {
preIndexData.dataToUpdate.add(resource); preIndexData.dataToUpdate.add(resource);
preIndexData.nonIndexableKeys.put(packageName, keys); preIndexData.nonIndexableKeys.put(packageName, keys);
List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData, List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData);
localeStr);
assertThat(indexData.size()).isEqualTo(NUM_DISPLAY_ENTRIES); assertThat(indexData.size()).isEqualTo(NUM_DISPLAY_ENTRIES);
assertThat(getEnabledResultCount(indexData)).isEqualTo(NUM_DISPLAY_ENTRIES - 2); assertThat(getEnabledResultCount(indexData)).isEqualTo(NUM_DISPLAY_ENTRIES - 2);
@@ -218,8 +215,7 @@ public class IndexDataConverterTest {
final PreIndexData preIndexData = new PreIndexData(); final PreIndexData preIndexData = new PreIndexData();
preIndexData.dataToUpdate.add(resource); preIndexData.dataToUpdate.add(resource);
List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData, List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData);
localeStr);
final IndexData row = findIndexDataForTitle(indexData, PAGE_TITLE); final IndexData row = findIndexDataForTitle(indexData, PAGE_TITLE);
@@ -234,8 +230,7 @@ public class IndexDataConverterTest {
final PreIndexData preIndexData = new PreIndexData(); final PreIndexData preIndexData = new PreIndexData();
preIndexData.dataToUpdate.add(resource); preIndexData.dataToUpdate.add(resource);
List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData, List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData);
localeStr);
String checkBoxSummaryOn = "summary_on"; String checkBoxSummaryOn = "summary_on";
String checkBoxSummaryOff = "summary_off"; String checkBoxSummaryOff = "summary_off";
@@ -252,8 +247,7 @@ public class IndexDataConverterTest {
final PreIndexData preIndexData = new PreIndexData(); final PreIndexData preIndexData = new PreIndexData();
preIndexData.dataToUpdate.add(resource); preIndexData.dataToUpdate.add(resource);
List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData, List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData);
localeStr);
String listSummary = "summary_4"; String listSummary = "summary_4";
String listKey = "pref_key_4"; String listKey = "pref_key_4";
@@ -268,8 +262,7 @@ public class IndexDataConverterTest {
final PreIndexData preIndexData = new PreIndexData(); final PreIndexData preIndexData = new PreIndexData();
preIndexData.dataToUpdate.add(resource); preIndexData.dataToUpdate.add(resource);
List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData, List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData);
localeStr);
final IndexData row = findIndexDataForTitle(indexData, TITLE_THREE); final IndexData row = findIndexDataForTitle(indexData, TITLE_THREE);
@@ -286,8 +279,7 @@ public class IndexDataConverterTest {
final PreIndexData preIndexData = new PreIndexData(); final PreIndexData preIndexData = new PreIndexData();
preIndexData.dataToUpdate.add(resource); preIndexData.dataToUpdate.add(resource);
List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData, List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData);
localeStr);
assertThat(indexData.size()).isEqualTo(NUM_FAKE_FRAGMENT_ENTRIES); assertThat(indexData.size()).isEqualTo(NUM_FAKE_FRAGMENT_ENTRIES);
assertThat(findIndexDataForTitle(indexData, PAGE_TITLE)).isNotNull(); assertThat(findIndexDataForTitle(indexData, PAGE_TITLE)).isNotNull();
@@ -306,8 +298,7 @@ public class IndexDataConverterTest {
final PreIndexData preIndexData = new PreIndexData(); final PreIndexData preIndexData = new PreIndexData();
preIndexData.dataToUpdate.add(resource); preIndexData.dataToUpdate.add(resource);
List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData, List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData);
localeStr);
final IndexData data = findIndexDataForTitle(indexData, FakeSettingsFragment.TITLE); final IndexData data = findIndexDataForTitle(indexData, FakeSettingsFragment.TITLE);
assertFakeFragment(data); assertFakeFragment(data);
@@ -322,8 +313,7 @@ public class IndexDataConverterTest {
final PreIndexData preIndexData = new PreIndexData(); final PreIndexData preIndexData = new PreIndexData();
preIndexData.dataToUpdate.add(resource); preIndexData.dataToUpdate.add(resource);
List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData, List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData);
localeStr);
assertThat(getEnabledResultCount(indexData)).isEqualTo(NUM_ENABLED_FAKE_FRAGMENT_ENTRIES); assertThat(getEnabledResultCount(indexData)).isEqualTo(NUM_ENABLED_FAKE_FRAGMENT_ENTRIES);
} }
@@ -334,8 +324,7 @@ public class IndexDataConverterTest {
final PreIndexData preIndexData = new PreIndexData(); final PreIndexData preIndexData = new PreIndexData();
preIndexData.dataToUpdate.add(resource); preIndexData.dataToUpdate.add(resource);
List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData, List<IndexData> indexData = mConverter.convertPreIndexDataToIndexData(preIndexData);
localeStr);
int numEnabled = getEnabledResultCount(indexData); int numEnabled = getEnabledResultCount(indexData);
final IndexData nonTitlePref = findIndexDataForKey(indexData, "pref_key_1"); final IndexData nonTitlePref = findIndexDataForKey(indexData, "pref_key_1");