From 04615bc1b6a10edad13754c9e6be1197ad150901 Mon Sep 17 00:00:00 2001 From: Matthew Fritze Date: Wed, 15 Feb 2017 10:03:41 -0800 Subject: [PATCH] Blocks resources from adding headers that match settings Certain Xml resources have a single setting for the page which often means the header and setting have the same title. This CL stops the header from being indexed in that case. Bug: 33701673 Test: make RunSettingsRoboTests Change-Id: Ie617414010e654c41fd014aa2fe297e6d2088ca5 --- .../search2/DatabaseIndexingManager.java | 34 ++++++++++++++----- .../DatabaseIndexingManagerTest.java | 17 +++++++--- 2 files changed, 38 insertions(+), 13 deletions(-) rename tests/robotests/src/com/android/settings/{search => search2}/DatabaseIndexingManagerTest.java (97%) diff --git a/src/com/android/settings/search2/DatabaseIndexingManager.java b/src/com/android/settings/search2/DatabaseIndexingManager.java index d7c87467a28..d6e6959a728 100644 --- a/src/com/android/settings/search2/DatabaseIndexingManager.java +++ b/src/com/android/settings/search2/DatabaseIndexingManager.java @@ -33,6 +33,7 @@ import android.os.AsyncTask; import android.provider.SearchIndexableData; import android.provider.SearchIndexableResource; import android.provider.SearchIndexablesContract; +import android.support.annotation.VisibleForTesting; import android.text.TextUtils; import android.util.AttributeSet; import android.util.Log; @@ -545,7 +546,8 @@ public class DatabaseIndexingManager { } } - private void indexFromResource(SQLiteDatabase database, String localeStr, + @VisibleForTesting + void indexFromResource(SQLiteDatabase database, String localeStr, SearchIndexableResource sir, List nonIndexableKeys) { final Context context = sir.context; XmlResourceParser parser = null; @@ -573,8 +575,11 @@ public class DatabaseIndexingManager { String key = XmlParserUtils.getDataKey(context, attrs); String title; + String headerTitle; String summary; + String headerSummary; String keywords; + String headerKeywords; String childFragment; ResultPayload payload; boolean enabled; @@ -595,13 +600,13 @@ public class DatabaseIndexingManager { // Insert rows for the main PreferenceScreen node. Rewrite the data for removing // hyphens. - title = XmlParserUtils.getDataTitle(context, attrs); - summary = XmlParserUtils.getDataSummary(context, attrs); - keywords = XmlParserUtils.getDataKeywords(context, attrs); + headerTitle = XmlParserUtils.getDataTitle(context, attrs); + headerSummary = XmlParserUtils.getDataSummary(context, attrs); + headerKeywords = XmlParserUtils.getDataKeywords(context, attrs); enabled = !nonIndexableKeys.contains(key); - DatabaseRow.Builder builder = new DatabaseRow.Builder(); - builder.setLocale(localeStr) + DatabaseRow.Builder headerBuilder = new DatabaseRow.Builder(); + headerBuilder.setLocale(localeStr) .setEntries(null) .setClassName(fragmentName) .setScreenTitle(screenTitle) @@ -614,8 +619,9 @@ public class DatabaseIndexingManager { .setKey(key) .setUserId(-1 /* default user id */); - updateOneRowWithFilteredData(database, builder, title, summary, - null /* summary off */, keywords); + // Flag for XML headers which a child element's title. + boolean isHeaderUnique = true; + DatabaseRow.Builder builder; while ((type = parser.next()) != XmlPullParser.END_DOCUMENT && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { @@ -625,11 +631,15 @@ public class DatabaseIndexingManager { nodeName = parser.getName(); + title = XmlParserUtils.getDataTitle(context, attrs); key = XmlParserUtils.getDataKey(context, attrs); enabled = ! nonIndexableKeys.contains(key); - title = XmlParserUtils.getDataTitle(context, attrs); keywords = XmlParserUtils.getDataKeywords(context, attrs); + if (isHeaderUnique && TextUtils.equals(headerTitle, title)) { + isHeaderUnique = false; + } + builder = new DatabaseRow.Builder(); builder.setLocale(localeStr) .setClassName(fragmentName) @@ -674,6 +684,12 @@ public class DatabaseIndexingManager { keywords); } } + + // The xml header's title does not match the title of one of the child settings. + if (isHeaderUnique) { + updateOneRowWithFilteredData(database, headerBuilder, headerTitle, headerSummary, + null /* summary off */, headerKeywords); + } } catch (XmlPullParserException e) { throw new RuntimeException("Error parsing PreferenceScreen", e); } catch (IOException e) { diff --git a/tests/robotests/src/com/android/settings/search/DatabaseIndexingManagerTest.java b/tests/robotests/src/com/android/settings/search2/DatabaseIndexingManagerTest.java similarity index 97% rename from tests/robotests/src/com/android/settings/search/DatabaseIndexingManagerTest.java rename to tests/robotests/src/com/android/settings/search2/DatabaseIndexingManagerTest.java index f109a090f82..eaaa00ef142 100644 --- a/tests/robotests/src/com/android/settings/search/DatabaseIndexingManagerTest.java +++ b/tests/robotests/src/com/android/settings/search2/DatabaseIndexingManagerTest.java @@ -15,7 +15,7 @@ * */ -package com.android.settings.search; +package com.android.settings.search2; import android.content.Context; import android.database.Cursor; @@ -25,8 +25,8 @@ import android.provider.SearchIndexableResource; import com.android.settings.R; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; -import com.android.settings.search.IndexDatabaseHelper.SiteMapColumns; -import com.android.settings.search2.DatabaseIndexingManager; +import com.android.settings.search.IndexDatabaseHelper; +import com.android.settings.search.SearchIndexableRaw; import com.android.settings.testutils.DatabaseTestUtils; import org.junit.After; @@ -43,7 +43,6 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import static com.android.settings.dashboard.SiteMapManager.SITE_MAP_COLUMNS; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.spy; @@ -625,6 +624,16 @@ public class DatabaseIndexingManagerTest { assertThat(cursor.getCount()).isEqualTo(4); } + @Test + public void testResourceWithTitleAndSettingName_TitleNotInserted() { + SearchIndexableResource resource = getFakeResource(R.xml.swipe_to_notification_settings); + mManager.indexFromResource(mDb, localeStr, resource, new ArrayList()); + + Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE" + + " enabled = 1", null); + assertThat(cursor.getCount()).isEqualTo(1); + } + // Util functions private SearchIndexableRaw getFakeRaw() {