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
This commit is contained in:
tmfang
2019-04-29 13:32:22 +08:00
parent 28006039c5
commit 6410821f04

View File

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