Merge "Show default a11y icon in shortcut menu" into pi-dev
diff --git a/src/com/android/settings/accessibility/ShortcutServicePickerFragment.java b/src/com/android/settings/accessibility/ShortcutServicePickerFragment.java
index 5b45cfa..a8a960f 100644
--- a/src/com/android/settings/accessibility/ShortcutServicePickerFragment.java
+++ b/src/com/android/settings/accessibility/ShortcutServicePickerFragment.java
@@ -26,7 +26,9 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
 import android.graphics.drawable.Drawable;
 import android.os.Binder;
 import android.os.Bundle;
@@ -34,7 +36,6 @@
 import android.os.UserHandle;
 import android.provider.Settings;
 import android.text.TextUtils;
-import android.util.IconDrawableFactory;
 import android.view.accessibility.AccessibilityManager;
 
 import com.android.internal.accessibility.AccessibilityShortcutController;
@@ -45,7 +46,6 @@
 import com.android.settings.widget.RadioButtonPickerFragment;
 import com.android.settings.widget.RadioButtonPreference;
 import com.android.settingslib.accessibility.AccessibilityUtils;
-import com.android.settingslib.applications.DefaultAppInfo;
 import com.android.settingslib.widget.CandidateInfo;
 import com.android.settingslib.wrapper.PackageManagerWrapper;
 
@@ -71,13 +71,11 @@
     @Override
     protected List<? extends CandidateInfo> getCandidates() {
         final Context context = getContext();
-        final PackageManager pm = context.getPackageManager();
         final AccessibilityManager accessibilityManager = context
                 .getSystemService(AccessibilityManager.class);
         final List<AccessibilityServiceInfo> installedServices =
                 accessibilityManager.getInstalledAccessibilityServiceList();
         final int numInstalledServices = installedServices.size();
-        final PackageManagerWrapper pmw = new PackageManagerWrapper(context.getPackageManager());
 
         final List<CandidateInfo> candidates = new ArrayList<>(numInstalledServices);
         Map<ComponentName, ToggleableFrameworkFeatureInfo> frameworkFeatureInfoMap =
@@ -95,10 +93,7 @@
                     iconId, componentName.flattenToString()));
         }
         for (int i = 0; i < numInstalledServices; i++) {
-            final AccessibilityServiceInfo installedServiceInfo = installedServices.get(i);
-            candidates.add(new DefaultAppInfo(context, pmw, UserHandle.myUserId(),
-                    installedServiceInfo.getComponentName(),
-                    (String) installedServiceInfo.loadSummary(pm), true /* enabled */));
+            candidates.add(new ServiceCandidateInfo(installedServices.get(i)));
         }
 
         return candidates;
@@ -196,9 +191,9 @@
     }
 
     private class FrameworkCandidateInfo extends CandidateInfo {
-        ToggleableFrameworkFeatureInfo mToggleableFrameworkFeatureInfo;
-        int mIconResId;
-        String mKey;
+        final ToggleableFrameworkFeatureInfo mToggleableFrameworkFeatureInfo;
+        final int mIconResId;
+        final String mKey;
 
         public FrameworkCandidateInfo(
                 ToggleableFrameworkFeatureInfo frameworkFeatureInfo, int iconResId, String key) {
@@ -223,4 +218,49 @@
             return mKey;
         }
     }
+
+    private class ServiceCandidateInfo extends CandidateInfo {
+        final AccessibilityServiceInfo mServiceInfo;
+
+        public ServiceCandidateInfo(AccessibilityServiceInfo serviceInfo) {
+            super(true /* enabled */);
+            mServiceInfo = serviceInfo;
+        }
+
+        @Override
+        public CharSequence loadLabel() {
+            final PackageManagerWrapper pmw =
+                    new PackageManagerWrapper(getContext().getPackageManager());
+            final CharSequence label =
+                    mServiceInfo.getResolveInfo().serviceInfo.loadLabel(pmw.getPackageManager());
+            if (label != null) {
+                return label;
+            }
+
+            final ComponentName componentName = mServiceInfo.getComponentName();
+            if (componentName != null) {
+                try {
+                    final ApplicationInfo appInfo = pmw.getApplicationInfoAsUser(
+                            componentName.getPackageName(), 0, UserHandle.myUserId());
+                    return appInfo.loadLabel(pmw.getPackageManager());
+                } catch (PackageManager.NameNotFoundException e) {
+                    return null;
+                }
+            }
+            return null;
+        }
+
+        @Override
+        public Drawable loadIcon() {
+            final ResolveInfo resolveInfo = mServiceInfo.getResolveInfo();
+            return (resolveInfo.getIconResource() == 0)
+                    ? getContext().getDrawable(R.mipmap.ic_accessibility_generic)
+                    : resolveInfo.loadIcon(getContext().getPackageManager());
+        }
+
+        @Override
+        public String getKey() {
+            return mServiceInfo.getComponentName().flattenToString();
+        }
+    }
 }