From 6410821f04c2ec8effa4da08021192248a653932 Mon Sep 17 00:00:00 2001 From: tmfang Date: Mon, 29 Apr 2019 13:32:22 +0800 Subject: [PATCH] Catch another exception when we are building slices data for search We lose chance to build all Settings slices if we got an exception when settings was creating slice data for controllers. We should make sure the process goes well even we got an exception on an incorrect controller. Also, we log exceptions for each catch. Bug: 131449561 Test: Open Settings search and then we can see slice for some search result. Change-Id: Iac9f0e0a187f6d10cf53886afeb9cab479b6ce02 --- .../settings/slices/SliceDataConverter.java | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/src/com/android/settings/slices/SliceDataConverter.java b/src/com/android/settings/slices/SliceDataConverter.java index 14abd1b8118..7a8ab838f1d 100644 --- a/src/com/android/settings/slices/SliceDataConverter.java +++ b/src/com/android/settings/slices/SliceDataConverter.java @@ -25,6 +25,7 @@ import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_TITLE; import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_UNAVAILABLE_SLICE_SUBTITLE; import android.accessibilityservice.AccessibilityServiceInfo; +import android.app.settings.SettingsEnums; import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; @@ -52,6 +53,7 @@ import com.android.settings.dashboard.DashboardFragment; import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.DatabaseIndexingUtils; import com.android.settings.search.Indexable.SearchIndexProvider; +import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; @@ -76,10 +78,12 @@ class SliceDataConverter { private static final String NODE_NAME_PREFERENCE_SCREEN = "PreferenceScreen"; + private final MetricsFeatureProvider mMetricsFeatureProvider; private Context mContext; public SliceDataConverter(Context context) { mContext = context; + mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider(); } /** @@ -151,6 +155,7 @@ class SliceDataConverter { XmlResourceParser parser = null; final List xmlSliceData = new ArrayList<>(); + String controllerClassName = ""; try { parser = mContext.getResources().getXml(xmlResId); @@ -188,7 +193,7 @@ class SliceDataConverter { for (Bundle bundle : metadata) { // TODO (b/67996923) Non-controller Slices should become intent-only slices. // Note that without a controller, dynamic summaries are impossible. - final String controllerClassName = bundle.getString(METADATA_CONTROLLER); + controllerClassName = bundle.getString(METADATA_CONTROLLER); if (TextUtils.isEmpty(controllerClassName)) { continue; } @@ -226,12 +231,25 @@ class SliceDataConverter { } } catch (SliceData.InvalidSliceDataException e) { Log.w(TAG, "Invalid data when building SliceData for " + fragmentName, e); - } catch (XmlPullParserException e) { - Log.w(TAG, "XML Error parsing PreferenceScreen: ", e); - } catch (IOException e) { - Log.w(TAG, "IO Error parsing PreferenceScreen: ", e); - } catch (Resources.NotFoundException e) { - Log.w(TAG, "Resource not found error parsing PreferenceScreen: ", e); + mMetricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN, + SettingsEnums.ACTION_VERIFY_SLICE_ERROR_INVALID_DATA, + SettingsEnums.PAGE_UNKNOWN, + controllerClassName, + 1); + } catch (XmlPullParserException | IOException | Resources.NotFoundException e) { + Log.w(TAG, "Error parsing PreferenceScreen: ", e); + mMetricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN, + SettingsEnums.ACTION_VERIFY_SLICE_PARSING_ERROR, + SettingsEnums.PAGE_UNKNOWN, + fragmentName, + 1); + } catch (Exception e) { + Log.w(TAG, "Get slice data from XML failed ", e); + mMetricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN, + SettingsEnums.ACTION_VERIFY_SLICE_OTHER_EXCEPTION, + SettingsEnums.PAGE_UNKNOWN, + fragmentName + "_" + controllerClassName, + 1); } finally { if (parser != null) parser.close(); }