diff options
author | Sunny Goyal <sunnygoyal@google.com> | 2016-07-30 05:13:18 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2016-07-30 05:13:18 +0000 |
commit | a4c7c13e2af692794709a9896018c0b403041328 (patch) | |
tree | 06cb0a8d24c999343a2d0318923c6617d765e82c /src | |
parent | 1bd6a5b6f8c7d4bd294523602780a7ada013eb12 (diff) | |
parent | 79cf718fcdf39d0e60743b32c6611fbb971ff38c (diff) | |
download | android_packages_apps_Trebuchet-a4c7c13e2af692794709a9896018c0b403041328.tar.gz android_packages_apps_Trebuchet-a4c7c13e2af692794709a9896018c0b403041328.tar.bz2 android_packages_apps_Trebuchet-a4c7c13e2af692794709a9896018c0b403041328.zip |
Badging shortcuts with app icons
am: 79cf718fcd
Change-Id: I970ef85a1b6296d7f6d1387d5d7e283ef3ab6639
Diffstat (limited to 'src')
5 files changed, 143 insertions, 26 deletions
diff --git a/src/com/android/launcher3/ShortcutInfo.java b/src/com/android/launcher3/ShortcutInfo.java index 00ac9bda4..d4c3c9d1d 100644 --- a/src/com/android/launcher3/ShortcutInfo.java +++ b/src/com/android/launcher3/ShortcutInfo.java @@ -305,16 +305,33 @@ public class ShortcutInfo extends ItemInfo { isDisabled |= FLAG_DISABLED_BY_PUBLISHER; } + // TODO: Use cache for this LauncherAppState launcherAppState = LauncherAppState.getInstance(); - Drawable unbadgedIcon = launcherAppState.getShortcutManager() + Drawable unbadgedDrawable = launcherAppState.getShortcutManager() .getShortcutIconDrawable(shortcutInfo, launcherAppState.getInvariantDeviceProfile().fillResIconDpi); - Bitmap icon = unbadgedIcon == null ? null : getBadgedIcon(unbadgedIcon, context); - setIcon(icon != null ? icon : launcherAppState.getIconCache().getDefaultIcon(user)); + + IconCache cache = launcherAppState.getIconCache(); + Bitmap unbadgedBitmap = unbadgedDrawable == null + ? cache.getDefaultIcon(UserHandleCompat.myUserHandle()) + : Utilities.createScaledBitmapWithoutShadow(unbadgedDrawable, context); + setIcon(getBadgedIcon(unbadgedBitmap, shortcutInfo, cache, context)); } - protected Bitmap getBadgedIcon(Drawable unbadgedIcon, Context context) { - return Utilities.createBadgedIconBitmapWithShadow(unbadgedIcon, user, context); + protected Bitmap getBadgedIcon(Bitmap unbadgedBitmap, ShortcutInfoCompat shortcutInfo, + IconCache cache, Context context) { + unbadgedBitmap = Utilities.addShadowToIcon(unbadgedBitmap); + // Get the app info for the source activity. + AppInfo appInfo = new AppInfo(); + appInfo.user = user; + appInfo.componentName = shortcutInfo.getActivity(); + try { + cache.getTitleAndIcon(appInfo, shortcutInfo.getActivityInfo(context), false); + } catch (NullPointerException e) { + // This may happen when we fail to load the activity info. Worst case ignore badging. + return Utilities.badgeIconForUser(unbadgedBitmap, user, context); + } + return Utilities.badgeWithBitmap(unbadgedBitmap, appInfo.iconBitmap, context); } /** Returns the ShortcutInfo id associated with the deep shortcut. */ diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index f09b7cce7..2cbad53dc 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -248,9 +248,16 @@ public final class Utilities { float scale = FeatureFlags.LAUNCHER3_DISABLE_ICON_NORMALIZATION ? 1 : IconNormalizer.getInstance().getScale(icon, null); Bitmap bitmap = createIconBitmap(icon, context, scale); + return badgeIconForUser(bitmap, user, context); + } + + /** + * Badges the provided icon with the user badge if required. + */ + public static Bitmap badgeIconForUser(Bitmap icon, UserHandleCompat user, Context context) { if (Utilities.ATLEAST_LOLLIPOP && user != null && !UserHandleCompat.myUserHandle().equals(user)) { - BitmapDrawable drawable = new FixedSizeBitmapDrawable(bitmap); + BitmapDrawable drawable = new FixedSizeBitmapDrawable(icon); Drawable badged = context.getPackageManager().getUserBadgedIcon( drawable, user.getUser()); if (badged instanceof BitmapDrawable) { @@ -259,7 +266,7 @@ public final class Utilities { return createIconBitmap(badged, context); } } else { - return bitmap; + return icon; } } @@ -276,26 +283,28 @@ public final class Utilities { } /** - * Same as {@link #createBadgedIconBitmap} but adds a shadow before badging the icon + * Adds a shadow to the provided icon. It assumes that the icon has already been scaled using + * {@link #createScaledBitmapWithoutShadow(Drawable, Context)} + */ + public static Bitmap addShadowToIcon(Bitmap icon) { + return ShadowGenerator.getInstance().recreateIcon(icon); + } + + /** + * Adds the {@param badge} on top of {@param srcTgt} using the badge dimensions. */ @TargetApi(Build.VERSION_CODES.LOLLIPOP) - public static Bitmap createBadgedIconBitmapWithShadow( - Drawable icon, UserHandleCompat user, Context context) { - Bitmap bitmap = ShadowGenerator.getInstance().recreateIcon( - createScaledBitmapWithoutShadow(icon, context)); - if (Utilities.ATLEAST_LOLLIPOP && user != null - && !UserHandleCompat.myUserHandle().equals(user)) { - BitmapDrawable drawable = new FixedSizeBitmapDrawable(bitmap); - Drawable badged = context.getPackageManager().getUserBadgedIcon( - drawable, user.getUser()); - if (badged instanceof BitmapDrawable) { - return ((BitmapDrawable) badged).getBitmap(); - } else { - return createIconBitmap(badged, context); - } - } else { - return bitmap; + public static Bitmap badgeWithBitmap(Bitmap srcTgt, Bitmap badge, Context context) { + int badgeSize = context.getResources().getDimensionPixelSize(R.dimen.profile_badge_size); + synchronized (sCanvas) { + sCanvas.setBitmap(srcTgt); + sCanvas.drawBitmap(badge, new Rect(0, 0, badge.getWidth(), badge.getHeight()), + new Rect(srcTgt.getWidth() - badgeSize, + srcTgt.getHeight() - badgeSize, srcTgt.getWidth(), srcTgt.getHeight()), + new Paint(Paint.FILTER_BITMAP_FLAG)); + sCanvas.setBitmap(null); } + return srcTgt; } /** diff --git a/src/com/android/launcher3/compat/DeferredLauncherActivityInfo.java b/src/com/android/launcher3/compat/DeferredLauncherActivityInfo.java new file mode 100644 index 000000000..46d36d1b0 --- /dev/null +++ b/src/com/android/launcher3/compat/DeferredLauncherActivityInfo.java @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.launcher3.compat; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.graphics.drawable.Drawable; +import android.util.Log; + +/** + * {@link LauncherActivityInfoCompat} which loads its data only when needed. + */ +public class DeferredLauncherActivityInfo extends LauncherActivityInfoCompat { + + private final ComponentName mComponent; + private final UserHandleCompat mUser; + private final Context mContext; + + private LauncherActivityInfoCompat mActualInfo; + + public DeferredLauncherActivityInfo( + ComponentName component, UserHandleCompat user, Context context) { + mComponent = component; + mUser = user; + mContext = context; + } + + @Override + public ComponentName getComponentName() { + return mComponent; + } + + @Override + public UserHandleCompat getUser() { + return mUser; + } + + private synchronized LauncherActivityInfoCompat getActualInfo() { + if (mActualInfo == null) { + Intent intent = new Intent(Intent.ACTION_MAIN) + .addCategory(Intent.CATEGORY_LAUNCHER) + .setComponent(mComponent); + mActualInfo = LauncherAppsCompat.getInstance(mContext).resolveActivity(intent, mUser); + } + return mActualInfo; + } + + @Override + public CharSequence getLabel() { + return getActualInfo().getLabel(); + } + + @Override + public Drawable getIcon(int density) { + return getActualInfo().getIcon(density); + } + + @Override + public ApplicationInfo getApplicationInfo() { + return getActualInfo().getApplicationInfo(); + } + + @Override + public long getFirstInstallTime() { + return getActualInfo().getFirstInstallTime(); + } +} diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java index 7b24c2676..8bb0e081f 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java @@ -47,6 +47,7 @@ import com.android.launcher3.AppInfo; 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; @@ -748,8 +749,9 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC } @Override - protected Bitmap getBadgedIcon(Drawable unbadgedIcon, Context context) { - return Utilities.createScaledBitmapWithoutShadow(unbadgedIcon, context); + protected Bitmap getBadgedIcon(Bitmap unbadgedBitmap, ShortcutInfoCompat shortcutInfo, + IconCache cache, Context context) { + return unbadgedBitmap; } } } diff --git a/src/com/android/launcher3/shortcuts/ShortcutInfoCompat.java b/src/com/android/launcher3/shortcuts/ShortcutInfoCompat.java index d7fcda6b7..410693ada 100644 --- a/src/com/android/launcher3/shortcuts/ShortcutInfoCompat.java +++ b/src/com/android/launcher3/shortcuts/ShortcutInfoCompat.java @@ -24,6 +24,8 @@ import android.content.pm.ShortcutInfo; import android.os.Build; import com.android.launcher3.ItemInfo; +import com.android.launcher3.compat.DeferredLauncherActivityInfo; +import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.compat.UserManagerCompat; @@ -116,4 +118,8 @@ public class ShortcutInfoCompat { public String toString() { return mShortcutInfo.toString(); } + + public LauncherActivityInfoCompat getActivityInfo(Context context) { + return new DeferredLauncherActivityInfo(getActivity(), getUserHandle(), context); + } } |