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:
@@ -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 static com.android.settings.core.PreferenceXmlParserUtils.METADATA_UNAVAILABLE_SLICE_SUBTITLE;
|
||||||
|
|
||||||
import android.accessibilityservice.AccessibilityServiceInfo;
|
import android.accessibilityservice.AccessibilityServiceInfo;
|
||||||
|
import android.app.settings.SettingsEnums;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.pm.PackageManager;
|
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.overlay.FeatureFactory;
|
||||||
import com.android.settings.search.DatabaseIndexingUtils;
|
import com.android.settings.search.DatabaseIndexingUtils;
|
||||||
import com.android.settings.search.Indexable.SearchIndexProvider;
|
import com.android.settings.search.Indexable.SearchIndexProvider;
|
||||||
|
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||||
|
|
||||||
import org.xmlpull.v1.XmlPullParser;
|
import org.xmlpull.v1.XmlPullParser;
|
||||||
import org.xmlpull.v1.XmlPullParserException;
|
import org.xmlpull.v1.XmlPullParserException;
|
||||||
@@ -76,10 +78,12 @@ class SliceDataConverter {
|
|||||||
|
|
||||||
private static final String NODE_NAME_PREFERENCE_SCREEN = "PreferenceScreen";
|
private static final String NODE_NAME_PREFERENCE_SCREEN = "PreferenceScreen";
|
||||||
|
|
||||||
|
private final MetricsFeatureProvider mMetricsFeatureProvider;
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
|
|
||||||
public SliceDataConverter(Context context) {
|
public SliceDataConverter(Context context) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
|
mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -151,6 +155,7 @@ class SliceDataConverter {
|
|||||||
XmlResourceParser parser = null;
|
XmlResourceParser parser = null;
|
||||||
|
|
||||||
final List<SliceData> xmlSliceData = new ArrayList<>();
|
final List<SliceData> xmlSliceData = new ArrayList<>();
|
||||||
|
String controllerClassName = "";
|
||||||
|
|
||||||
try {
|
try {
|
||||||
parser = mContext.getResources().getXml(xmlResId);
|
parser = mContext.getResources().getXml(xmlResId);
|
||||||
@@ -188,7 +193,7 @@ class SliceDataConverter {
|
|||||||
for (Bundle bundle : metadata) {
|
for (Bundle bundle : metadata) {
|
||||||
// TODO (b/67996923) Non-controller Slices should become intent-only slices.
|
// TODO (b/67996923) Non-controller Slices should become intent-only slices.
|
||||||
// Note that without a controller, dynamic summaries are impossible.
|
// 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)) {
|
if (TextUtils.isEmpty(controllerClassName)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -226,12 +231,25 @@ class SliceDataConverter {
|
|||||||
}
|
}
|
||||||
} catch (SliceData.InvalidSliceDataException e) {
|
} catch (SliceData.InvalidSliceDataException e) {
|
||||||
Log.w(TAG, "Invalid data when building SliceData for " + fragmentName, e);
|
Log.w(TAG, "Invalid data when building SliceData for " + fragmentName, e);
|
||||||
} catch (XmlPullParserException e) {
|
mMetricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN,
|
||||||
Log.w(TAG, "XML Error parsing PreferenceScreen: ", e);
|
SettingsEnums.ACTION_VERIFY_SLICE_ERROR_INVALID_DATA,
|
||||||
} catch (IOException e) {
|
SettingsEnums.PAGE_UNKNOWN,
|
||||||
Log.w(TAG, "IO Error parsing PreferenceScreen: ", e);
|
controllerClassName,
|
||||||
} catch (Resources.NotFoundException e) {
|
1);
|
||||||
Log.w(TAG, "Resource not found error parsing PreferenceScreen: ", e);
|
} 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 {
|
} finally {
|
||||||
if (parser != null) parser.close();
|
if (parser != null) parser.close();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user