From 88699b6191c6e8f75b0cc64cce5313fc31ed1348 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 6 Oct 2014 16:23:56 -0700 Subject: Updating icons for sortcuts when the target app updates. Bug: 17398260 Change-Id: I055abb971d1f72245e8616ac2ce07bcdf37cdd52 --- src/com/android/launcher3/AllAppsList.java | 11 ++--- src/com/android/launcher3/IconCache.java | 2 +- src/com/android/launcher3/Launcher.java | 20 +++++++++ src/com/android/launcher3/LauncherModel.java | 67 ++++++++++++++++++---------- src/com/android/launcher3/Utilities.java | 21 +++++++++ src/com/android/launcher3/Workspace.java | 22 +++++++++ 6 files changed, 111 insertions(+), 32 deletions(-) (limited to 'src/com/android/launcher3') diff --git a/src/com/android/launcher3/AllAppsList.java b/src/com/android/launcher3/AllAppsList.java index f9900e604..36d0ee78b 100644 --- a/src/com/android/launcher3/AllAppsList.java +++ b/src/com/android/launcher3/AllAppsList.java @@ -18,6 +18,7 @@ package com.android.launcher3; import android.content.ComponentName; import android.content.Context; + import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.LauncherAppsCompat; import com.android.launcher3.compat.UserHandleCompat; @@ -96,10 +97,8 @@ class AllAppsList { final List matches = launcherApps.getActivityList(packageName, user); - if (matches.size() > 0) { - for (LauncherActivityInfoCompat info : matches) { - add(new AppInfo(context, info, user, mIconCache, null)); - } + for (LauncherActivityInfoCompat info : matches) { + add(new AppInfo(context, info, user, mIconCache, null)); } } @@ -144,9 +143,7 @@ class AllAppsList { // Find enabled activities and add them to the adapter // Also updates existing activities with new labels/icons - int count = matches.size(); - for (int i = 0; i < count; i++) { - final LauncherActivityInfoCompat info = matches.get(i); + for (final LauncherActivityInfoCompat info : matches) { AppInfo applicationInfo = findApplicationInfoLocked( info.getComponentName().getPackageName(), user, info.getComponentName().getClassName()); diff --git a/src/com/android/launcher3/IconCache.java b/src/com/android/launcher3/IconCache.java index 539efa407..72b6d8951 100644 --- a/src/com/android/launcher3/IconCache.java +++ b/src/com/android/launcher3/IconCache.java @@ -122,7 +122,7 @@ public class IconCache { android.R.mipmap.sym_def_app_icon); } - public Drawable getFullResIcon(Resources resources, int iconId) { + private Drawable getFullResIcon(Resources resources, int iconId) { Drawable d; try { d = resources.getDrawableForDensity(iconId, mIconDpi); diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index d3be726e6..39386191e 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -5605,6 +5605,26 @@ public class Launcher extends Activity } } + /** + * Some shortcuts were updated in the background. + * + * Implementation of the method from LauncherModel.Callbacks. + */ + public void bindShortcutsUpdated(final ArrayList shortcuts) { + Runnable r = new Runnable() { + public void run() { + bindShortcutsUpdated(shortcuts); + } + }; + if (waitUntilResume(r)) { + return; + } + + if (mWorkspace != null) { + mWorkspace.updateShortcuts(shortcuts); + } + } + /** * Update the state of a package, typically related to install state. * diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 26bbbe045..ec705aa0e 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -207,6 +207,7 @@ public class LauncherModel extends BroadcastReceiver ArrayList addedApps); public void bindAppsUpdated(ArrayList apps); public void bindAppsRestored(ArrayList apps); + public void bindShortcutsUpdated(ArrayList shortcuts); public void updatePackageState(ArrayList installInfo); public void updatePackageBadge(String packageName); public void bindComponentsRemoved(ArrayList packageNames, @@ -3473,6 +3474,43 @@ public class LauncherModel extends BroadcastReceiver }); } + // Update shortcuts which use an iconResource + if (mOp == OP_ADD || mOp == OP_UPDATE) { + final ArrayList iconsChanged = new ArrayList(); + HashSet packageSet = new HashSet(Arrays.asList(packages)); + // We need to iteration over the items here, so that we can avoid new Bitmap + // creation on the UI thread. + synchronized (sBgLock) { + for (ItemInfo info : sBgWorkspaceItems) { + if (info instanceof ShortcutInfo && mUser.equals(info.user)) { + ShortcutInfo si = (ShortcutInfo) info; + if ((si.iconResource != null) + && packageSet.contains(si.getTargetComponent().getPackageName())){ + Bitmap icon = Utilities.createIconBitmap(si.iconResource.packageName, + si.iconResource.resourceName, mIconCache, context); + if (icon != null) { + si.setIcon(icon); + si.usingFallbackIcon = false; + iconsChanged.add(si); + updateItemInDatabase(context, si); + } + } + } + } + } + + if (!iconsChanged.isEmpty()) { + mHandler.post(new Runnable() { + public void run() { + Callbacks cb = mCallbacks != null ? mCallbacks.get() : null; + if (callbacks == cb && cb != null) { + callbacks.bindShortcutsUpdated(iconsChanged); + } + } + }); + } + } + final ArrayList removedPackageNames = new ArrayList(); if (mOp == OP_REMOVE) { @@ -3810,19 +3848,9 @@ public class LauncherModel extends BroadcastReceiver case LauncherSettings.Favorites.ICON_TYPE_RESOURCE: String packageName = c.getString(iconPackageIndex); String resourceName = c.getString(iconResourceIndex); - PackageManager packageManager = context.getPackageManager(); info.customIcon = false; // the resource - try { - Resources resources = packageManager.getResourcesForApplication(packageName); - if (resources != null) { - final int id = resources.getIdentifier(resourceName, null, null); - icon = Utilities.createIconBitmap( - mIconCache.getFullResIcon(resources, id), context); - } - } catch (Exception e) { - // drop this. we have other places to look for icons - } + icon = Utilities.createIconBitmap(packageName, resourceName, mIconCache, context); // the db if (icon == null) { icon = getIconFromCursor(c, iconIndex, context); @@ -3904,19 +3932,10 @@ public class LauncherModel extends BroadcastReceiver customIcon = true; } else { Parcelable extra = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE); - if (extra != null && extra instanceof ShortcutIconResource) { - try { - iconResource = (ShortcutIconResource) extra; - final PackageManager packageManager = context.getPackageManager(); - Resources resources = packageManager.getResourcesForApplication( - iconResource.packageName); - final int id = resources.getIdentifier(iconResource.resourceName, null, null); - icon = Utilities.createIconBitmap( - mIconCache.getFullResIcon(resources, id), - context); - } catch (Exception e) { - Log.w(TAG, "Could not load shortcut icon: " + extra); - } + if (extra instanceof ShortcutIconResource) { + iconResource = (ShortcutIconResource) extra; + icon = Utilities.createIconBitmap(iconResource.packageName, + iconResource.resourceName, mIconCache, context); } } diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index a75ddf6a1..862a96d1e 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -155,6 +155,27 @@ public final class Utilities { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.L; } + /** + * Returns a bitmap suitable for the all apps view. If the package or the resource do not + * exist, it returns null. + */ + static Bitmap createIconBitmap(String packageName, String resourceName, IconCache cache, + Context context) { + PackageManager packageManager = context.getPackageManager(); + // the resource + try { + Resources resources = packageManager.getResourcesForApplication(packageName); + if (resources != null) { + final int id = resources.getIdentifier(resourceName, null, null); + return createIconBitmap( + resources.getDrawableForDensity(id, cache.getFullResIconDpi()), context); + } + } catch (Exception e) { + // Icon not found. + } + return null; + } + /** * Returns a bitmap which is of the appropriate size to be displayed as an icon */ diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index acb1d3965..5efe8d41c 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -5086,6 +5086,28 @@ public class Workspace extends SmoothPagedView } } + + void updateShortcuts(ArrayList shortcuts) { + final HashSet updates = new HashSet(shortcuts); + mapOverItems(MAP_RECURSE, new ItemOperator() { + @Override + public boolean evaluate(ItemInfo info, View v, View parent) { + if (info instanceof ShortcutInfo && v instanceof BubbleTextView && + updates.contains(info)) { + ShortcutInfo shortcutInfo = (ShortcutInfo) info; + BubbleTextView shortcut = (BubbleTextView) v; + shortcut.applyFromShortcutInfo(shortcutInfo, mIconCache, true, false); + + if (parent != null) { + parent.invalidate(); + } + } + // process all the shortcuts + return false; + } + }); + } + void updateShortcutsAndWidgets(ArrayList apps) { // Break the appinfo list per user final HashMap> appsPerUser = -- cgit v1.2.3