diff options
author | Jon Miranda <jonmiranda@google.com> | 2019-05-14 15:17:30 -0700 |
---|---|---|
committer | Jon Miranda <jonmiranda@google.com> | 2019-05-15 09:37:24 -0700 |
commit | 4028575ba0082a6d5ac2bff1a1800004d47b2637 (patch) | |
tree | 5eb76d00a0f499a93076af8afd51f5fa7518f5fb /src | |
parent | 66b82f5cf47c78005f8d222d854657505be0b371 (diff) | |
download | android_packages_apps_Trebuchet-4028575ba0082a6d5ac2bff1a1800004d47b2637.tar.gz android_packages_apps_Trebuchet-4028575ba0082a6d5ac2bff1a1800004d47b2637.tar.bz2 android_packages_apps_Trebuchet-4028575ba0082a6d5ac2bff1a1800004d47b2637.zip |
Fade in badges on top of icons after swipe up animation.
Bug: 123900446
Change-Id: I54e367e0be72781e24d13ec6ea64dbddd85fb0bd
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/launcher3/Utilities.java | 62 | ||||
-rw-r--r-- | src/com/android/launcher3/dragndrop/DragView.java | 63 | ||||
-rw-r--r-- | src/com/android/launcher3/views/FloatingIconView.java | 25 |
3 files changed, 88 insertions, 62 deletions
diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index 02fc84b9a..732aa9587 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -17,6 +17,7 @@ package com.android.launcher3; import android.animation.ValueAnimator; +import android.annotation.TargetApi; import android.app.ActivityManager; import android.app.WallpaperManager; import android.content.BroadcastReceiver; @@ -32,12 +33,16 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; import android.content.pm.ShortcutInfo; import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Point; import android.graphics.Rect; import android.graphics.RectF; +import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; +import android.graphics.drawable.InsetDrawable; import android.os.Build; import android.os.Bundle; import android.os.DeadObjectException; @@ -62,6 +67,7 @@ import com.android.launcher3.compat.ShortcutConfigActivityInfo; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.dragndrop.FolderAdaptiveIcon; import com.android.launcher3.graphics.RotationMode; +import com.android.launcher3.icons.LauncherIcons; import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.ShortcutKey; import com.android.launcher3.util.IntArray; @@ -82,6 +88,8 @@ import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static com.android.launcher3.ItemInfoWithIcon.FLAG_ICON_BADGED; + /** * Various utilities shared amongst the Launcher's classes. */ @@ -654,6 +662,40 @@ public final class Utilities { } } + /** + * For apps icons and shortcut icons that have badges, this method creates a drawable that can + * later on be rendered on top of the layers for the badges. For app icons, work profile badges + * can only be applied. For deep shortcuts, when dragged from the pop up container, there's no + * badge. When dragged from workspace or folder, it may contain app AND/OR work profile badge + **/ + @TargetApi(Build.VERSION_CODES.O) + public static Drawable getBadge(Launcher launcher, ItemInfo info, Object obj) { + LauncherAppState appState = LauncherAppState.getInstance(launcher); + int iconSize = appState.getInvariantDeviceProfile().iconBitmapSize; + if (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT) { + boolean iconBadged = (info instanceof ItemInfoWithIcon) + && (((ItemInfoWithIcon) info).runtimeStatusFlags & FLAG_ICON_BADGED) > 0; + if ((info.id == ItemInfo.NO_ID && !iconBadged) + || !(obj instanceof ShortcutInfo)) { + // The item is not yet added on home screen. + return new FixedSizeEmptyDrawable(iconSize); + } + ShortcutInfo si = (ShortcutInfo) obj; + LauncherIcons li = LauncherIcons.obtain(appState.getContext()); + Bitmap badge = li.getShortcutInfoBadge(si, appState.getIconCache()).iconBitmap; + li.recycle(); + float badgeSize = launcher.getResources().getDimension(R.dimen.profile_badge_size); + float insetFraction = (iconSize - badgeSize) / iconSize; + return new InsetDrawable(new FastBitmapDrawable(badge), + insetFraction, insetFraction, 0, 0); + } else if (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_FOLDER) { + return ((FolderAdaptiveIcon) obj).getBadge(); + } else { + return launcher.getPackageManager() + .getUserBadgedIcon(new FixedSizeEmptyDrawable(iconSize), info.user); + } + } + public static int[] getIntArrayFromString(String tokenized) { StringTokenizer tokenizer = new StringTokenizer(tokenized, ","); int[] array = new int[tokenizer.countTokens()]; @@ -672,4 +714,24 @@ public final class Utilities { } return str.toString(); } + + private static class FixedSizeEmptyDrawable extends ColorDrawable { + + private final int mSize; + + public FixedSizeEmptyDrawable(int size) { + super(Color.TRANSPARENT); + mSize = size; + } + + @Override + public int getIntrinsicHeight() { + return mSize; + } + + @Override + public int getIntrinsicWidth() { + return mSize; + } + } } diff --git a/src/com/android/launcher3/dragndrop/DragView.java b/src/com/android/launcher3/dragndrop/DragView.java index 3ab97b0d9..77b2cdc34 100644 --- a/src/com/android/launcher3/dragndrop/DragView.java +++ b/src/com/android/launcher3/dragndrop/DragView.java @@ -16,7 +16,7 @@ package com.android.launcher3.dragndrop; -import static com.android.launcher3.ItemInfoWithIcon.FLAG_ICON_BADGED; +import static com.android.launcher3.Utilities.getBadge; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -24,7 +24,6 @@ import android.animation.FloatArrayEvaluator; import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; import android.annotation.TargetApi; -import android.content.pm.ShortcutInfo; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; @@ -37,7 +36,6 @@ import android.graphics.Rect; import android.graphics.drawable.AdaptiveIconDrawable; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; -import android.graphics.drawable.InsetDrawable; import android.os.Build; import android.os.Handler; import android.os.Looper; @@ -45,9 +43,7 @@ import android.view.View; import com.android.launcher3.FastBitmapDrawable; import com.android.launcher3.ItemInfo; -import com.android.launcher3.ItemInfoWithIcon; import com.android.launcher3.Launcher; -import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherSettings; import com.android.launcher3.R; @@ -195,7 +191,6 @@ public class DragView extends View { new Handler(workerLooper).postAtFrontOfQueue(new Runnable() { @Override public void run() { - LauncherAppState appState = LauncherAppState.getInstance(mLauncher); Object[] outObj = new Object[1]; int w = mBitmap.getWidth(); int h = mBitmap.getHeight(); @@ -211,7 +206,7 @@ public class DragView extends View { // Badge is applied after icon normalization so the bounds for badge should not // be scaled down due to icon normalization. Rect badgeBounds = new Rect(bounds); - mBadge = getBadge(info, appState, outObj[0]); + mBadge = getBadge(mLauncher, info, outObj[0]); mBadge.setBounds(badgeBounds); // Do not draw the background in case of folder as its translucent @@ -307,40 +302,6 @@ public class DragView extends View { invalidate(); } - /** - * For apps icons and shortcut icons that have badges, this method creates a drawable that can - * later on be rendered on top of the layers for the badges. For app icons, work profile badges - * can only be applied. For deep shortcuts, when dragged from the pop up container, there's no - * badge. When dragged from workspace or folder, it may contain app AND/OR work profile badge - **/ - - @TargetApi(Build.VERSION_CODES.O) - private Drawable getBadge(ItemInfo info, LauncherAppState appState, Object obj) { - int iconSize = appState.getInvariantDeviceProfile().iconBitmapSize; - if (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT) { - boolean iconBadged = (info instanceof ItemInfoWithIcon) - && (((ItemInfoWithIcon) info).runtimeStatusFlags & FLAG_ICON_BADGED) > 0; - if ((info.id == ItemInfo.NO_ID && !iconBadged) - || !(obj instanceof ShortcutInfo)) { - // The item is not yet added on home screen. - return new FixedSizeEmptyDrawable(iconSize); - } - ShortcutInfo si = (ShortcutInfo) obj; - LauncherIcons li = LauncherIcons.obtain(appState.getContext()); - Bitmap badge = li.getShortcutInfoBadge(si, appState.getIconCache()).iconBitmap; - li.recycle(); - float badgeSize = mLauncher.getResources().getDimension(R.dimen.profile_badge_size); - float insetFraction = (iconSize - badgeSize) / iconSize; - return new InsetDrawable(new FastBitmapDrawable(badge), - insetFraction, insetFraction, 0, 0); - } else if (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_FOLDER) { - return ((FolderAdaptiveIcon) obj).getBadge(); - } else { - return mLauncher.getPackageManager() - .getUserBadgedIcon(new FixedSizeEmptyDrawable(iconSize), info.user); - } - } - @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(mBitmap.getWidth(), mBitmap.getHeight()); @@ -626,24 +587,4 @@ public class DragView extends View { mSpring.animateToFinalPosition(Utilities.boundToRange(value, -mDelta, mDelta)); } } - - private static class FixedSizeEmptyDrawable extends ColorDrawable { - - private final int mSize; - - public FixedSizeEmptyDrawable(int size) { - super(Color.TRANSPARENT); - mSize = size; - } - - @Override - public int getIntrinsicHeight() { - return mSize; - } - - @Override - public int getIntrinsicWidth() { - return mSize; - } - } } diff --git a/src/com/android/launcher3/views/FloatingIconView.java b/src/com/android/launcher3/views/FloatingIconView.java index 1a432a7ed..dba02fc36 100644 --- a/src/com/android/launcher3/views/FloatingIconView.java +++ b/src/com/android/launcher3/views/FloatingIconView.java @@ -15,6 +15,8 @@ */ package com.android.launcher3.views; +import static com.android.launcher3.LauncherAnimUtils.DRAWABLE_ALPHA; +import static com.android.launcher3.Utilities.getBadge; import static com.android.launcher3.Utilities.mapToRange; import static com.android.launcher3.anim.Interpolators.LINEAR; import static com.android.launcher3.config.FeatureFlags.ADAPTIVE_ICON_WINDOW_ANIM; @@ -121,6 +123,7 @@ public class FloatingIconView extends View implements private boolean mIsVerticalBarLayout = false; private boolean mIsAdaptiveIcon = false; + private @Nullable Drawable mBadge; private @Nullable Drawable mForeground; private @Nullable Drawable mBackground; private float mRotation; @@ -362,7 +365,9 @@ public class FloatingIconView extends View implements if (supportsAdaptiveIcons) { drawable = Utilities.getFullDrawable(mLauncher, info, lp.width, lp.height, false, sTmpObjArray); - if (!(drawable instanceof AdaptiveIconDrawable)) { + if ((drawable instanceof AdaptiveIconDrawable)) { + mBadge = getBadge(mLauncher, info, sTmpObjArray[0]); + } else { // The drawable we get back is not an adaptive icon, so we need to use the // BubbleTextView icon that is already legacy treated. drawable = btvIcon; @@ -421,6 +426,14 @@ public class FloatingIconView extends View implements mStartRevealRect.set(0, 0, originalWidth, originalHeight); + if (mBadge != null) { + mBadge.setBounds(mStartRevealRect); + if (!isOpening) { + DRAWABLE_ALPHA.set(mBadge, 0); + } + + } + if (!isFolderIcon) { mStartRevealRect.inset(mBlurSizeOutline, mBlurSizeOutline); } @@ -524,6 +537,9 @@ public class FloatingIconView extends View implements mForeground.draw(canvas); canvas.restoreToCount(count2); } + if (mBadge != null) { + mBadge.draw(canvas); + } canvas.restoreToCount(count); } @@ -642,6 +658,12 @@ public class FloatingIconView extends View implements } }); + if (mBadge != null) { + ObjectAnimator badgeFade = ObjectAnimator.ofInt(mBadge, DRAWABLE_ALPHA, 255); + badgeFade.addUpdateListener(valueAnimator -> invalidate()); + fade.play(badgeFade); + } + if (originalView instanceof BubbleTextView) { BubbleTextView btv = (BubbleTextView) originalView; btv.forceHideDot(true); @@ -716,5 +738,6 @@ public class FloatingIconView extends View implements mFgSpringX.cancel(); mFgTransX = 0; mFgSpringY.cancel(); + mBadge = null; } } |