diff options
author | Tony Wickham <twickham@google.com> | 2017-02-24 08:59:36 -0800 |
---|---|---|
committer | Tony Wickham <twickham@google.com> | 2017-04-25 12:55:02 -0700 |
commit | 1237df0a7cb89570b90b30fa30a3c76417ce3b64 (patch) | |
tree | a2c446ec276082b074122831a09c15397c2978bc /src/com/android/launcher3/BubbleTextView.java | |
parent | 343a77e609382bcb9b1d69ea235a9e6d779b719e (diff) | |
download | android_packages_apps_Trebuchet-1237df0a7cb89570b90b30fa30a3c76417ce3b64.tar.gz android_packages_apps_Trebuchet-1237df0a7cb89570b90b30fa30a3c76417ce3b64.tar.bz2 android_packages_apps_Trebuchet-1237df0a7cb89570b90b30fa30a3c76417ce3b64.zip |
Update icon badges to match spec
- Size defined as percentage of app icon size
- Width changes when there are 2 or 3 digits (round rect)
- Offset slightly away from the app icon
- Had to move drawing to BubbleTextView instead of
FastBitmapDrawable
- Hide badge when dragging and while popup is open
- Tweaks for some color/text parameters
Bug: 35744066
Change-Id: Ibb15ca634abaa0729aea637c904c4c6889a58c7c
Diffstat (limited to 'src/com/android/launcher3/BubbleTextView.java')
-rw-r--r-- | src/com/android/launcher3/BubbleTextView.java | 90 |
1 files changed, 89 insertions, 1 deletions
diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index bad70183a..97e93a008 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -16,6 +16,7 @@ package com.android.launcher3; +import android.animation.ObjectAnimator; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.Resources; @@ -23,9 +24,12 @@ import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; +import android.graphics.Point; +import android.graphics.Rect; import android.graphics.Region; import android.graphics.drawable.Drawable; import android.util.AttributeSet; +import android.util.Property; import android.util.TypedValue; import android.view.KeyEvent; import android.view.MotionEvent; @@ -42,6 +46,7 @@ import com.android.launcher3.badge.BadgeRenderer; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.graphics.DrawableFactory; import com.android.launcher3.graphics.HolographicOutlineHelper; +import com.android.launcher3.graphics.IconPalette; import com.android.launcher3.graphics.PreloadIconDrawable; import com.android.launcher3.model.PackageItemInfo; import com.android.launcher3.popup.PopupContainerWithArrow; @@ -90,6 +95,28 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver { @ViewDebug.ExportedProperty(category = "launcher") private int mTextColor; + private BadgeInfo mBadgeInfo; + private BadgeRenderer mBadgeRenderer; + private IconPalette mIconPalette; + private float mBadgeScale; + private boolean mForceHideBadge; + private Point mTempSpaceForBadgeOffset = new Point(); + private Rect mTempIconBounds = new Rect(); + + private static final Property<BubbleTextView, Float> BADGE_SCALE_PROPERTY + = new Property<BubbleTextView, Float>(Float.TYPE, "badgeScale") { + @Override + public Float get(BubbleTextView bubbleTextView) { + return bubbleTextView.mBadgeScale; + } + + @Override + public void set(BubbleTextView bubbleTextView, Float value) { + bubbleTextView.mBadgeScale = value; + bubbleTextView.invalidate(); + } + }; + @ViewDebug.ExportedProperty(category = "launcher") private boolean mStayPressed; @ViewDebug.ExportedProperty(category = "launcher") @@ -369,6 +396,7 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver { public void draw(Canvas canvas) { if (!mCustomShadowsEnabled) { super.draw(canvas); + drawBadgeIfNecessary(canvas); return; } @@ -395,6 +423,7 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver { if ((getCurrentTextColor() >> 24) == 0) { getPaint().clearShadowLayer(); super.draw(canvas); + drawBadgeIfNecessary(canvas); return; } @@ -410,6 +439,50 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver { density * KEY_SHADOW_RADIUS, 0.0f, density * KEY_SHADOW_OFFSET, KEY_SHADOW_COLOR); super.draw(canvas); canvas.restore(); + + drawBadgeIfNecessary(canvas); + } + + /** + * Draws the icon badge in the top right corner of the icon bounds. + * @param canvas The canvas to draw to. + */ + private void drawBadgeIfNecessary(Canvas canvas) { + if (!mForceHideBadge && (hasBadge() || mBadgeScale > 0)) { + getIconBounds(mTempIconBounds); + mTempSpaceForBadgeOffset.set((getWidth() - mIconSize) / 2, getPaddingTop()); + final int scrollX = getScrollX(); + final int scrollY = getScrollY(); + canvas.translate(scrollX, scrollY); + mBadgeRenderer.draw(canvas, mIconPalette, mBadgeInfo, mTempIconBounds, mBadgeScale, + mTempSpaceForBadgeOffset); + canvas.translate(-scrollX, -scrollY); + } + } + + public void forceHideBadge(boolean forceHideBadge) { + if (mForceHideBadge == forceHideBadge) { + return; + } + mForceHideBadge = forceHideBadge; + + if (forceHideBadge) { + invalidate(); + } else if (hasBadge()) { + ObjectAnimator.ofFloat(this, BADGE_SCALE_PROPERTY, 0, 1).start(); + } + } + + private boolean hasBadge() { + return (mBadgeInfo != null && mBadgeInfo.getNotificationCount() > 0); + } + + public void getIconBounds(Rect outBounds) { + int top = getPaddingTop(); + int left = (getWidth() - mIconSize) / 2; + int right = left + mIconSize; + int bottom = top + mIconSize; + outBounds.set(left, top, right, bottom); } @Override @@ -506,7 +579,22 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver { if (popup != null) { popup.updateNotificationHeader(badgeInfo, itemInfo); } - ((FastBitmapDrawable) mIcon).applyIconBadge(badgeInfo, badgeRenderer, animate); + + boolean wasBadged = mBadgeInfo != null; + boolean isBadged = badgeInfo != null; + float newBadgeScale = isBadged ? 1f : 0; + mBadgeInfo = badgeInfo; + mBadgeRenderer = badgeRenderer; + if (wasBadged || isBadged) { + mIconPalette = ((FastBitmapDrawable) mIcon).getIconPalette(); + // Animate when a badge is first added or when it is removed. + if (animate && (wasBadged ^ isBadged) && isShown()) { + ObjectAnimator.ofFloat(this, BADGE_SCALE_PROPERTY, newBadgeScale).start(); + } else { + mBadgeScale = newBadgeScale; + invalidate(); + } + } } } |