From 4a6c2591791ae4b81f58248f2c9d9f4379e91610 Mon Sep 17 00:00:00 2001 From: Christopher Tate Date: Wed, 16 Mar 2016 13:45:03 -0700 Subject: [PATCH] Don't crash if the backup transport supplies bogus intents Preflight the (activity) intents supplied by the transport so that when clicked, they don't crash the Preference that called startActivity(). Bug 27689847 Change-Id: I7cbdd6077ac74500ecdf9607310727af56d55a3c --- src/com/android/settings/PrivacySettings.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/PrivacySettings.java b/src/com/android/settings/PrivacySettings.java index 03e569b375a..7732837c9b9 100644 --- a/src/com/android/settings/PrivacySettings.java +++ b/src/com/android/settings/PrivacySettings.java @@ -21,6 +21,8 @@ import android.app.backup.IBackupManager; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.os.Bundle; import android.os.RemoteException; import android.os.ServiceManager; @@ -155,9 +157,11 @@ public class PrivacySettings extends SettingsPreferenceFragment implements Index try { backupEnabled = mBackupManager.isBackupEnabled(); String transport = mBackupManager.getCurrentTransport(); - configIntent = mBackupManager.getConfigurationIntent(transport); + configIntent = validatedActivityIntent( + mBackupManager.getConfigurationIntent(transport), "config"); configSummary = mBackupManager.getDestinationString(transport); - manageIntent = mBackupManager.getDataManagementIntent(transport); + manageIntent = validatedActivityIntent( + mBackupManager.getDataManagementIntent(transport), "management"); manageLabel = mBackupManager.getDataManagementLabel(transport); mBackup.setSummary(backupEnabled @@ -189,6 +193,19 @@ public class PrivacySettings extends SettingsPreferenceFragment implements Index } } + private Intent validatedActivityIntent(Intent intent, String logLabel) { + if (intent != null) { + PackageManager pm = getPackageManager(); + List resolved = pm.queryIntentActivities(intent, 0); + if (resolved == null || resolved.isEmpty()) { + intent = null; + Log.e(TAG, "Backup " + logLabel + " intent " + intent + + " fails to resolve; ignoring"); + } + } + return intent; + } + private void setConfigureSummary(String summary) { if (summary != null) { mConfigure.setSummary(summary);