diff --git a/src/com/android/launcher3/InstallShortcutReceiver.java b/src/com/android/launcher3/InstallShortcutReceiver.java index ad10523ef5..a35469e0cf 100644 --- a/src/com/android/launcher3/InstallShortcutReceiver.java +++ b/src/com/android/launcher3/InstallShortcutReceiver.java @@ -457,7 +457,9 @@ public class InstallShortcutReceiver extends BroadcastReceiver { } return si; } else if (shortcutInfo != null) { - return new ShortcutInfo(shortcutInfo, mContext); + ShortcutInfo si = new ShortcutInfo(shortcutInfo, mContext); + si.iconBitmap = LauncherIcons.createShortcutIcon(shortcutInfo, mContext); + return si; } else if (providerInfo != null) { LauncherAppWidgetProviderInfo info = LauncherAppWidgetProviderInfo .fromProviderInfo(mContext, providerInfo); diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 2fc1502196..247a295d65 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -49,6 +49,7 @@ import com.android.launcher3.config.ProviderConfig; import com.android.launcher3.dynamicui.ExtractionUtils; import com.android.launcher3.folder.Folder; import com.android.launcher3.folder.FolderIcon; +import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.logging.FileLog; import com.android.launcher3.model.AddWorkspaceItemsTask; import com.android.launcher3.model.BgDataModel; @@ -1330,6 +1331,8 @@ public class LauncherModel extends BroadcastReceiver continue; } info = new ShortcutInfo(pinnedShortcut, context); + info.iconBitmap = LauncherIcons + .createShortcutIcon(pinnedShortcut, context); intent = info.intent; } else { // Create a shortcut info in disabled mode for now. @@ -2201,6 +2204,17 @@ public class LauncherModel extends BroadcastReceiver } } + public void updateAndBindShortcutInfo(final ShortcutInfo si, final ShortcutInfoCompat info) { + updateAndBindShortcutInfo(new Provider() { + @Override + public ShortcutInfo get() { + si.updateFromDeepShortcutInfo(info, mApp.getContext()); + si.iconBitmap = LauncherIcons.createShortcutIcon(info, mApp.getContext()); + return si; + } + }); + } + /** * Utility method to update a shortcut on the background thread. */ diff --git a/src/com/android/launcher3/ShortcutInfo.java b/src/com/android/launcher3/ShortcutInfo.java index 976d733443..1a423957a5 100644 --- a/src/com/android/launcher3/ShortcutInfo.java +++ b/src/com/android/launcher3/ShortcutInfo.java @@ -17,21 +17,13 @@ package com.android.launcher3; import android.annotation.TargetApi; -import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.graphics.Bitmap; -import android.graphics.drawable.Drawable; import android.os.Build; -import android.os.Process; -import android.os.UserHandle; import android.text.TextUtils; import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.compat.UserManagerCompat; -import com.android.launcher3.graphics.LauncherIcons; -import com.android.launcher3.model.PackageItemInfo; -import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.ShortcutInfoCompat; import com.android.launcher3.util.ContentWriter; @@ -225,42 +217,6 @@ public class ShortcutInfo extends ItemInfoWithIcon { isDisabled |= FLAG_DISABLED_BY_PUBLISHER; } disabledMessage = shortcutInfo.getDisabledMessage(); - - // TODO: Use cache for this - LauncherAppState launcherAppState = LauncherAppState.getInstance(context); - Drawable unbadgedDrawable = DeepShortcutManager.getInstance(context) - .getShortcutIconDrawable(shortcutInfo, - launcherAppState.getInvariantDeviceProfile().fillResIconDpi); - - IconCache cache = launcherAppState.getIconCache(); - Bitmap unbadgedBitmap = unbadgedDrawable == null - ? cache.getDefaultIcon(Process.myUserHandle()) - : LauncherIcons.createScaledBitmapWithoutShadow(unbadgedDrawable, context); - iconBitmap = getBadgedIcon(unbadgedBitmap, shortcutInfo, cache, context); - } - - protected Bitmap getBadgedIcon(Bitmap unbadgedBitmap, ShortcutInfoCompat shortcutInfo, - IconCache cache, Context context) { - unbadgedBitmap = LauncherIcons.addShadowToIcon(unbadgedBitmap, context); - - final Bitmap badgeBitmap; - ComponentName cn = shortcutInfo.getActivity(); - if (cn != null) { - // Get the app info for the source activity. - AppInfo appInfo = new AppInfo(); - appInfo.user = user; - appInfo.componentName = cn; - appInfo.intent = new Intent(Intent.ACTION_MAIN) - .addCategory(Intent.CATEGORY_LAUNCHER) - .setComponent(cn); - cache.getTitleAndIcon(appInfo, false); - badgeBitmap = appInfo.iconBitmap; - } else { - PackageItemInfo pkgInfo = new PackageItemInfo(shortcutInfo.getPackage()); - cache.getTitleAndIconForApp(pkgInfo, false); - badgeBitmap = pkgInfo.iconBitmap; - } - return LauncherIcons.badgeWithBitmap(unbadgedBitmap, badgeBitmap, context); } /** Returns the ShortcutInfo id associated with the deep shortcut. */ diff --git a/src/com/android/launcher3/graphics/LauncherIcons.java b/src/com/android/launcher3/graphics/LauncherIcons.java index 8d8f3d9141..2ae7a4af49 100644 --- a/src/com/android/launcher3/graphics/LauncherIcons.java +++ b/src/com/android/launcher3/graphics/LauncherIcons.java @@ -16,7 +16,9 @@ package com.android.launcher3.graphics; +import android.content.ComponentName; import android.content.Context; +import android.content.Intent; import android.content.Intent.ShortcutIconResource; import android.content.pm.PackageManager; import android.content.res.Resources; @@ -32,11 +34,16 @@ import android.graphics.drawable.PaintDrawable; import android.os.Process; import android.os.UserHandle; +import com.android.launcher3.AppInfo; +import com.android.launcher3.IconCache; import com.android.launcher3.LauncherAppState; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.config.ProviderConfig; +import com.android.launcher3.model.PackageItemInfo; +import com.android.launcher3.shortcuts.DeepShortcutManager; +import com.android.launcher3.shortcuts.ShortcutInfoCompat; import java.lang.reflect.Method; @@ -230,6 +237,46 @@ public class LauncherIcons { } } + public static Bitmap createShortcutIcon(ShortcutInfoCompat shortcutInfo, Context context) { + return createShortcutIcon(shortcutInfo, context, true /* badged */); + } + + public static Bitmap createShortcutIcon(ShortcutInfoCompat shortcutInfo, Context context, + boolean badged) { + LauncherAppState app = LauncherAppState.getInstance(context); + Drawable unbadgedDrawable = DeepShortcutManager.getInstance(context) + .getShortcutIconDrawable(shortcutInfo, + app.getInvariantDeviceProfile().fillResIconDpi); + IconCache cache = app.getIconCache(); + Bitmap unbadgedBitmap = unbadgedDrawable == null + ? cache.getDefaultIcon(Process.myUserHandle()) + : LauncherIcons.createScaledBitmapWithoutShadow(unbadgedDrawable, context); + + if (!badged) { + return unbadgedBitmap; + } + unbadgedBitmap = LauncherIcons.addShadowToIcon(unbadgedBitmap, context); + + final Bitmap badgeBitmap; + ComponentName cn = shortcutInfo.getActivity(); + if (cn != null) { + // Get the app info for the source activity. + AppInfo appInfo = new AppInfo(); + appInfo.user = shortcutInfo.getUserHandle(); + appInfo.componentName = cn; + appInfo.intent = new Intent(Intent.ACTION_MAIN) + .addCategory(Intent.CATEGORY_LAUNCHER) + .setComponent(cn); + cache.getTitleAndIcon(appInfo, false); + badgeBitmap = appInfo.iconBitmap; + } else { + PackageItemInfo pkgInfo = new PackageItemInfo(shortcutInfo.getPackage()); + cache.getTitleAndIconForApp(pkgInfo, false); + badgeBitmap = pkgInfo.iconBitmap; + } + return badgeWithBitmap(unbadgedBitmap, badgeBitmap, context); + } + /** * An extension of {@link BitmapDrawable} which returns the bitmap pixel size as intrinsic size. * This allows the badging to be done based on the action bitmap size rather than diff --git a/src/com/android/launcher3/model/ShortcutsChangedTask.java b/src/com/android/launcher3/model/ShortcutsChangedTask.java index 67bec64379..ba7112fd9f 100644 --- a/src/com/android/launcher3/model/ShortcutsChangedTask.java +++ b/src/com/android/launcher3/model/ShortcutsChangedTask.java @@ -24,6 +24,7 @@ import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherSettings; import com.android.launcher3.ShortcutInfo; +import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.ShortcutInfoCompat; import com.android.launcher3.util.MultiHashMap; @@ -87,6 +88,8 @@ public class ShortcutsChangedTask extends ExtendedModelTask { } for (ShortcutInfo shortcutInfo : shortcutInfos) { shortcutInfo.updateFromDeepShortcutInfo(fullDetails, context); + shortcutInfo.iconBitmap = + LauncherIcons.createShortcutIcon(fullDetails, context); updatedShortcutInfos.add(shortcutInfo); } } diff --git a/src/com/android/launcher3/model/UserLockStateChangedTask.java b/src/com/android/launcher3/model/UserLockStateChangedTask.java index a214a2915e..25f2f9d50f 100644 --- a/src/com/android/launcher3/model/UserLockStateChangedTask.java +++ b/src/com/android/launcher3/model/UserLockStateChangedTask.java @@ -25,6 +25,7 @@ import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherSettings; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.compat.UserManagerCompat; +import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.ShortcutInfoCompat; import com.android.launcher3.shortcuts.ShortcutKey; @@ -85,6 +86,7 @@ public class UserLockStateChangedTask extends ExtendedModelTask { } si.isDisabled &= ~ShortcutInfo.FLAG_DISABLED_LOCKED_USER; si.updateFromDeepShortcutInfo(shortcut, context); + si.iconBitmap = LauncherIcons.createShortcutIcon(shortcut, context); } else { si.isDisabled |= ShortcutInfo.FLAG_DISABLED_LOCKED_USER; } diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutView.java b/src/com/android/launcher3/shortcuts/DeepShortcutView.java index 04c71ecd2d..6e98100077 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutView.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutView.java @@ -31,10 +31,8 @@ import com.android.launcher3.LogAccelerateInterpolator; import com.android.launcher3.R; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.Utilities; -import com.android.launcher3.shortcuts.DeepShortcutsContainer.UnbadgedShortcutInfo; import com.android.launcher3.util.PillRevealOutlineProvider; import com.android.launcher3.util.PillWidthRevealOutlineProvider; -import com.android.launcher3.util.Provider; /** * A {@link android.widget.FrameLayout} that contains a {@link DeepShortcutView}. @@ -50,7 +48,8 @@ public class DeepShortcutView extends FrameLayout implements ValueAnimator.Anima private View mIconView; private float mOpenAnimationProgress; - private UnbadgedShortcutInfo mInfo; + private ShortcutInfo mInfo; + private ShortcutInfoCompat mDetail; public DeepShortcutView(Context context) { this(context, null, 0); @@ -92,18 +91,20 @@ public class DeepShortcutView extends FrameLayout implements ValueAnimator.Anima } /** package private **/ - void applyShortcutInfo(UnbadgedShortcutInfo info, DeepShortcutsContainer container) { + void applyShortcutInfo(ShortcutInfo info, ShortcutInfoCompat detail, + DeepShortcutsContainer container) { mInfo = info; + mDetail = detail; mBubbleText.applyFromShortcutInfo(info); mIconView.setBackground(mBubbleText.getIcon()); // Use the long label as long as it exists and fits. - CharSequence longLabel = info.mDetail.getLongLabel(); + CharSequence longLabel = mDetail.getLongLabel(); int availableWidth = mBubbleText.getWidth() - mBubbleText.getTotalPaddingLeft() - mBubbleText.getTotalPaddingRight(); boolean usingLongLabel = !TextUtils.isEmpty(longLabel) && mBubbleText.getPaint().measureText(longLabel.toString()) <= availableWidth; - mBubbleText.setText(usingLongLabel ? longLabel : info.mDetail.getShortLabel()); + mBubbleText.setText(usingLongLabel ? longLabel : mDetail.getShortLabel()); // TODO: Add the click handler to this view directly and not the child view. mBubbleText.setOnClickListener(Launcher.getLauncher(getContext())); @@ -118,14 +119,8 @@ public class DeepShortcutView extends FrameLayout implements ValueAnimator.Anima final ShortcutInfo badged = new ShortcutInfo(mInfo); // Queue an update task on the worker thread. This ensures that the badged // shortcut eventually gets its icon updated. - Launcher.getLauncher(getContext()).getModel().updateAndBindShortcutInfo( - new Provider() { - @Override - public ShortcutInfo get() { - badged.updateFromDeepShortcutInfo(mInfo.mDetail, getContext()); - return badged; - } - }); + Launcher.getLauncher(getContext()).getModel() + .updateAndBindShortcutInfo(badged, mDetail); return badged; } diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java index e547f44689..172954e536 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java @@ -25,7 +25,6 @@ import android.annotation.TargetApi; import android.content.ComponentName; import android.content.Context; import android.content.res.Resources; -import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.Point; import android.graphics.PointF; @@ -49,7 +48,6 @@ import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.BubbleTextView; import com.android.launcher3.DragSource; import com.android.launcher3.DropTarget; -import com.android.launcher3.IconCache; import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAnimUtils; @@ -65,6 +63,7 @@ import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.dragndrop.DragView; +import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.graphics.TriangleShape; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.userevent.nano.LauncherLogProto.ItemType; @@ -174,8 +173,11 @@ public class DeepShortcutsContainer extends AbstractFloatingView } for (int i = 0; i < shortcuts.size(); i++) { final ShortcutInfoCompat shortcut = shortcuts.get(i); - uiHandler.post(new UpdateShortcutChild( - i, new UnbadgedShortcutInfo(shortcut, mLauncher))); + ShortcutInfo si = new ShortcutInfo(shortcut, mLauncher); + // Use unbadged icon for the menu. + si.iconBitmap = LauncherIcons.createShortcutIcon( + shortcut, mLauncher, false /* badged */); + uiHandler.post(new UpdateShortcutChild(i, si, shortcut)); } } }); @@ -183,18 +185,22 @@ public class DeepShortcutsContainer extends AbstractFloatingView /** Updates the child of this container at the given index based on the given shortcut info. */ private class UpdateShortcutChild implements Runnable { - private int mShortcutChildIndex; - private UnbadgedShortcutInfo mShortcutChildInfo; + private final int mShortcutChildIndex; + private final ShortcutInfo mShortcutChildInfo; + private final ShortcutInfoCompat mDetail; - public UpdateShortcutChild(int shortcutChildIndex, UnbadgedShortcutInfo shortcutChildInfo) { + + public UpdateShortcutChild(int shortcutChildIndex, ShortcutInfo shortcutChildInfo, + ShortcutInfoCompat detail) { mShortcutChildIndex = shortcutChildIndex; mShortcutChildInfo = shortcutChildInfo; + mDetail = detail; } @Override public void run() { getShortcutAt(mShortcutChildIndex) - .applyShortcutInfo(mShortcutChildInfo, DeepShortcutsContainer.this); + .applyShortcutInfo(mShortcutChildInfo, mDetail, DeepShortcutsContainer.this); } } @@ -676,24 +682,6 @@ public class DeepShortcutsContainer extends AbstractFloatingView return null; } - /** - * Extension of {@link ShortcutInfo} which does not badge the icons. - */ - static class UnbadgedShortcutInfo extends ShortcutInfo { - public final ShortcutInfoCompat mDetail; - - public UnbadgedShortcutInfo(ShortcutInfoCompat shortcutInfo, Context context) { - super(shortcutInfo, context); - mDetail = shortcutInfo; - } - - @Override - protected Bitmap getBadgedIcon(Bitmap unbadgedBitmap, ShortcutInfoCompat shortcutInfo, - IconCache cache, Context context) { - return unbadgedBitmap; - } - } - /** * Returns a DeepShortcutsContainer which is already open or null */