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
This commit is contained in:
Matthew Fritze
2017-10-19 10:38:08 -07:00
parent ccee4218ea
commit 9c3c7d8ccd
3 changed files with 18 additions and 2 deletions

View File

@@ -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<SearchIndexableResource> getXmlResourcesToIndex(
Context context, boolean enabled) {

View File

@@ -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();
}

View File

@@ -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> 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);