From abdeead11486a2a6f9c1b623035661b01b209d9f Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Tue, 17 Oct 2017 17:04:04 -0700 Subject: [PATCH] Convert more loadIcon() to IconDrawableFactory - AppGridView: used by preview chart in display size setting. - DefaultBrowserPreferenceController: default browser icon in default apps settings - Enterprise application list - Accessibility search result loader Change-Id: Ibd12cd8854c68760ea3428fffa735bcbba48a277 Fixes: 64336923 Test: robotests --- .../DefaultBrowserPreferenceController.java | 15 +++- .../android/settings/display/AppGridView.java | 29 +++++-- .../ApplicationListPreferenceController.java | 4 +- .../AccessibilityServiceResultLoader.java | 13 +++- .../settings/display/AppGridViewTest.java | 78 +++++++++++++++++++ 5 files changed, 129 insertions(+), 10 deletions(-) create mode 100644 tests/robotests/src/com/android/settings/display/AppGridViewTest.java diff --git a/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java index 6d603c5002f..916f9422f53 100644 --- a/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java +++ b/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java @@ -18,6 +18,7 @@ package com.android.settings.applications.defaultapps; import android.content.Context; import android.content.Intent; +import android.content.pm.ApplicationInfo; import android.content.pm.ComponentInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; @@ -25,6 +26,7 @@ import android.graphics.drawable.Drawable; import android.net.Uri; import android.support.v7.preference.Preference; import android.text.TextUtils; +import android.util.IconDrawableFactory; import android.util.Log; import java.util.List; @@ -124,8 +126,19 @@ public class DefaultBrowserPreferenceController extends DefaultAppPreferenceCont final ResolveInfo info = list.get(0); final ComponentInfo cn = info.getComponentInfo(); final String packageName = cn == null ? null : cn.packageName; + if (TextUtils.isEmpty(packageName)) { + return null; + } + final ApplicationInfo appInfo; + try { + appInfo = mPackageManager.getPackageManager().getApplicationInfo(packageName, 0); + } catch (PackageManager.NameNotFoundException e) { + Log.w(TAG, "Error getting app info for " + packageName); + return null; + } Log.d(TAG, "Getting icon for the only browser app: " + packageName); - return info.loadIcon(mPackageManager.getPackageManager()); + final IconDrawableFactory iconFactory = IconDrawableFactory.newInstance(mContext); + return iconFactory.getBadgedIcon(cn, appInfo, mUserId); } return null; } diff --git a/src/com/android/settings/display/AppGridView.java b/src/com/android/settings/display/AppGridView.java index 148ba83064f..4b814d0a5ed 100644 --- a/src/com/android/settings/display/AppGridView.java +++ b/src/com/android/settings/display/AppGridView.java @@ -21,7 +21,10 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.graphics.drawable.Drawable; +import android.os.UserHandle; +import android.support.annotation.VisibleForTesting; import android.util.AttributeSet; +import android.util.IconDrawableFactory; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; @@ -63,7 +66,8 @@ public class AppGridView extends GridView { /** * Loads application labels and icons. */ - private static class AppsAdapter extends ArrayAdapter { + @VisibleForTesting + public static class AppsAdapter extends ArrayAdapter { private final PackageManager mPackageManager; private final int mIconResId; @@ -80,9 +84,8 @@ public class AppGridView extends GridView { public View getView(int position, View convertView, ViewGroup parent) { final View view = super.getView(position, convertView, parent); final ActivityEntry entry = getItem(position); - final ImageView iconView = (ImageView) view.findViewById(mIconResId); - final Drawable icon = entry.info.loadIcon(mPackageManager); - iconView.setImageDrawable(icon); + final ImageView iconView = view.findViewById(mIconResId); + iconView.setImageDrawable(entry.getIcon()); return view; } @@ -108,10 +111,11 @@ public class AppGridView extends GridView { final PackageManager pm = mPackageManager; final ArrayList results = new ArrayList<>(); final List infos = pm.queryIntentActivities(mainIntent, 0); + final IconDrawableFactory iconFactory = IconDrawableFactory.newInstance(getContext()); for (ResolveInfo info : infos) { final CharSequence label = info.loadLabel(pm); if (label != null) { - results.add(new ActivityEntry(info, label.toString())); + results.add(new ActivityEntry(info, label.toString(), iconFactory)); } } @@ -124,13 +128,19 @@ public class AppGridView extends GridView { /** * Class used for caching the activity label and icon. */ - private static class ActivityEntry implements Comparable { + @VisibleForTesting + public static class ActivityEntry implements Comparable { + public final ResolveInfo info; public final String label; + private final IconDrawableFactory mIconFactory; + private final int mUserId; - public ActivityEntry(ResolveInfo info, String label) { + public ActivityEntry(ResolveInfo info, String label, IconDrawableFactory iconFactory) { this.info = info; this.label = label; + mIconFactory = iconFactory; + mUserId = UserHandle.myUserId(); } @Override @@ -142,5 +152,10 @@ public class AppGridView extends GridView { public String toString() { return label; } + + public Drawable getIcon() { + return mIconFactory.getBadgedIcon( + info.activityInfo, info.activityInfo.applicationInfo, mUserId); + } } } diff --git a/src/com/android/settings/enterprise/ApplicationListPreferenceController.java b/src/com/android/settings/enterprise/ApplicationListPreferenceController.java index eee9b33436f..dce6f570eca 100644 --- a/src/com/android/settings/enterprise/ApplicationListPreferenceController.java +++ b/src/com/android/settings/enterprise/ApplicationListPreferenceController.java @@ -20,6 +20,7 @@ import android.content.Context; import android.content.pm.PackageManager; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceScreen; +import android.util.IconDrawableFactory; import com.android.settings.R; import com.android.settings.SettingsPreferenceFragment; @@ -63,13 +64,14 @@ public class ApplicationListPreferenceController extends AbstractPreferenceContr if (screen == null) { return; } + final IconDrawableFactory iconDrawableFactory = IconDrawableFactory.newInstance(mContext); final Context prefContext = mParent.getPreferenceManager().getContext(); for (int position = 0; position < result.size(); position++) { final UserAppInfo item = result.get(position); final Preference preference = new Preference(prefContext); preference.setLayoutResource(R.layout.preference_app); preference.setTitle(item.appInfo.loadLabel(mPm)); - preference.setIcon(item.appInfo.loadIcon(mPm)); + preference.setIcon(iconDrawableFactory.getBadgedIcon(item.appInfo)); preference.setOrder(position); preference.setSelectable(false); screen.addPreference(preference); diff --git a/src/com/android/settings/search/AccessibilityServiceResultLoader.java b/src/com/android/settings/search/AccessibilityServiceResultLoader.java index 7ffbcfcf712..64cceb7b83b 100644 --- a/src/com/android/settings/search/AccessibilityServiceResultLoader.java +++ b/src/com/android/settings/search/AccessibilityServiceResultLoader.java @@ -26,8 +26,10 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.graphics.drawable.Drawable; +import android.os.UserHandle; import android.support.annotation.VisibleForTesting; import android.support.v4.content.ContextCompat; +import android.util.IconDrawableFactory; import android.view.accessibility.AccessibilityManager; import com.android.settings.R; @@ -44,17 +46,22 @@ public class AccessibilityServiceResultLoader extends AsyncLoader mBreadcrumb; private SiteMapManager mSiteMapManager; @VisibleForTesting final String mQuery; private final AccessibilityManager mAccessibilityManager; private final PackageManager mPackageManager; + private final int mUserId; public AccessibilityServiceResultLoader(Context context, String query, SiteMapManager mapManager) { super(context); + mContext = context; + mUserId = UserHandle.myUserId(); mSiteMapManager = mapManager; mPackageManager = context.getPackageManager(); mAccessibilityManager = @@ -68,6 +75,7 @@ public class AccessibilityServiceResultLoader extends AsyncLoader services = mAccessibilityManager .getInstalledAccessibilityServiceList(); + final IconDrawableFactory iconFactory = IconDrawableFactory.newInstance(mContext); final String screenTitle = context.getString(R.string.accessibility_settings); for (AccessibilityServiceInfo service : services) { if (service == null) { @@ -87,7 +95,10 @@ public class AccessibilityServiceResultLoader extends AsyncLoader