Settings crash if android:settingsActivity AccessibilityServiceInfo XML is incorrect.

1. The code was not checking whether the settings activity exists
   before passing in to the SettingCheckboxClass.

bug:5038386

Change-Id: Iba4f5e2e5f6f3ed9c0fed5a5103d2e9a34399d97
diff --git a/src/com/android/settings/AccessibilitySettings.java b/src/com/android/settings/AccessibilitySettings.java
index bbb3678..06fc5d6 100644
--- a/src/com/android/settings/AccessibilitySettings.java
+++ b/src/com/android/settings/AccessibilitySettings.java
@@ -51,6 +51,7 @@
  */
 public class AccessibilitySettings extends SettingsPreferenceFragment implements DialogCreatable,
         Preference.OnPreferenceChangeListener {
+
     private static final String DEFAULT_SCREENREADER_MARKET_LINK =
         "market://search?q=pname:com.google.android.marvin.talkback";
 
@@ -362,7 +363,6 @@
     private void persistEnabledAccessibilityServices() {
         StringBuilder builder = new StringBuilder(256);
 
-        int firstEnabled = -1;
         for (String key : mAccessibilityServices.keySet()) {
             CheckBoxPreference preference = (CheckBoxPreference) findPreference(key);
             if (preference.isChecked()) {
@@ -399,16 +399,18 @@
             String key = accessibilityServiceInfo.getId();
 
             if (mAccessibilityServices.put(key, accessibilityServiceInfo) == null) {
-                String settingsActivityName = accessibilityServiceInfo.getSettingsActivityName();
+                SettingsCheckBoxPreference preference = null;
                 Intent settingsIntent = null;
+                String settingsActivityName = accessibilityServiceInfo.getSettingsActivityName();
+
                 if (!TextUtils.isEmpty(settingsActivityName)) {
-                    String packageName = accessibilityServiceInfo.getResolveInfo()
-                        .serviceInfo.packageName;
                     settingsIntent = new Intent(Intent.ACTION_MAIN);
-                    settingsIntent.setClassName(packageName, settingsActivityName);
+                    settingsIntent.setClassName(
+                            accessibilityServiceInfo.getResolveInfo().serviceInfo.packageName,
+                            settingsActivityName);
                 }
-                SettingsCheckBoxPreference preference = new SettingsCheckBoxPreference(
-                        getActivity(), settingsIntent);
+
+                preference = new SettingsCheckBoxPreference(getActivity(), settingsIntent);
                 preference.setKey(key);
                 preference.setOrder(i);
                 ServiceInfo serviceInfo = accessibilityServiceInfo.getResolveInfo().serviceInfo;
diff --git a/src/com/android/settings/SettingsCheckBoxPreference.java b/src/com/android/settings/SettingsCheckBoxPreference.java
index 026e4e6..70b5ac1 100644
--- a/src/com/android/settings/SettingsCheckBoxPreference.java
+++ b/src/com/android/settings/SettingsCheckBoxPreference.java
@@ -38,14 +38,15 @@
     private final Intent mSettingsIntent;
 
     /**
-     * Creates a new instance.
+     * Creates a new instance. The constructor is checking whether the
+     * settings intent is resolved to an activity and acts accordingly.
      *
      * @param context Context for accessing resources.
-     * @param settingsIntent Intent to use as settings for the item represented by
+     * @param intent Intent to use as settings for the item represented by
      *        this preference. Pass <code>null</code> if there is no associated 
      *        settings activity.
      */
-    public SettingsCheckBoxPreference(Context context, Intent settingsIntent) {
+    public SettingsCheckBoxPreference(Context context, Intent intent) {
         super(context);
 
         if (sDimAlpha == Integer.MIN_VALUE) {
@@ -54,7 +55,13 @@
             sDimAlpha = (int) (outValue.getFloat() * 255);
         }
 
-        mSettingsIntent = settingsIntent;
+        if (intent != null
+                && !context.getPackageManager().queryIntentActivities(intent, 0).isEmpty()) {
+            mSettingsIntent = intent;
+        } else {
+            mSettingsIntent = null;
+        }
+
         setWidgetLayoutResource(R.layout.preference_settings_checkbox_widget);
     }