From 9c3c7d8ccd71ddd9f01ac003de1a4b6ba49933b2 Mon Sep 17 00:00:00 2001 From: Matthew Fritze Date: Thu, 19 Oct 2017 10:38:08 -0700 Subject: [PATCH] Fix crash from Settings Search Security Settings was returning a search indexable resource without an xml resource (in this case id = 0). Settings search did not handle this exception and crashed. This patch catches the exception, and adds a TODO to fix the indexing in security settings. Change-Id: Ic7f05c98d99cc45fbebbdc672c7e346c27daa0f0 Fixes: 67967367 Test: robotests --- src/com/android/settings/SecuritySettings.java | 2 ++ .../settings/search/indexing/IndexDataConverter.java | 7 +++++-- .../search/indexing/IndexDataConverterTest.java | 11 +++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java index 822a60d1836..26a9ecbf355 100644 --- a/src/com/android/settings/SecuritySettings.java +++ b/src/com/android/settings/SecuritySettings.java @@ -834,6 +834,8 @@ public class SecuritySettings extends SettingsPreferenceFragment private static class SecuritySearchIndexProvider extends BaseSearchIndexProvider { + // TODO (b/68001777) Refactor indexing to include all XML and block other settings. + @Override public List getXmlResourcesToIndex( Context context, boolean enabled) { diff --git a/src/com/android/settings/search/indexing/IndexDataConverter.java b/src/com/android/settings/search/indexing/IndexDataConverter.java index 487132b8e7b..8010db9bfc0 100644 --- a/src/com/android/settings/search/indexing/IndexDataConverter.java +++ b/src/com/android/settings/search/indexing/IndexDataConverter.java @@ -19,6 +19,7 @@ package com.android.settings.search.indexing; import android.annotation.Nullable; import android.content.Context; +import android.content.res.Resources; import android.content.res.XmlResourceParser; import android.provider.SearchIndexableData; import android.provider.SearchIndexableResource; @@ -307,9 +308,11 @@ public class IndexDataConverter { resourceIndexData.add(headerBuilder.build(mContext)); } } catch (XmlPullParserException e) { - throw new RuntimeException("Error parsing PreferenceScreen", e); + Log.w(LOG_TAG, "XML Error parsing PreferenceScreen: ", e); } catch (IOException e) { - throw new RuntimeException("Error parsing PreferenceScreen", e); + Log.w(LOG_TAG, "IO Error parsing PreferenceScreen: " , e); + } catch (Resources.NotFoundException e ) { + Log.w(LOG_TAG, "Resoucre not found error parsing PreferenceScreen: ", e); } finally { if (parser != null) parser.close(); } 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 cac6f3a530d..1612036d945 100644 --- a/tests/robotests/src/com/android/settings/search/indexing/IndexDataConverterTest.java +++ b/tests/robotests/src/com/android/settings/search/indexing/IndexDataConverterTest.java @@ -334,6 +334,17 @@ public class IndexDataConverterTest { assertThat(nonTitlePref.enabled).isTrue(); } + @Test + public void testResourceWithoutXml_shouldNotCrash() { + final SearchIndexableResource resource = getFakeResource(0); + final PreIndexData preIndexData = new PreIndexData(); + preIndexData.dataToUpdate.add(resource); + + List indexData = mConverter.convertPreIndexDataToIndexData(preIndexData); + + assertThat(indexData).isEmpty(); + } + private void assertDisplaySetting(IndexData row, String title, String summaryOn, String summaryOff, String key) { assertThat(row.normalizedTitle).isEqualTo(title);