From 9b7d91390178e43c555b7d3e15a80339f4d1218e Mon Sep 17 00:00:00 2001 From: Samuel Fufa Date: Mon, 20 Apr 2020 16:10:18 -0700 Subject: [PATCH] Predicted icon ring embellishments Screenshot: https://screenshot.googleplex.com/yFfiDbHiyq6 - Wrap ring around badge - Add shadow to ring Bug: 153201272 Bug: 152560070 Test: Manual Change-Id: Ic1f726d080a8e6768417e5174a855a57f3241166 --- .../uioverrides/PredictedAppIcon.java | 42 ++++++++++++++++--- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/PredictedAppIcon.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/PredictedAppIcon.java index 8af26c6e8b..c58123fccc 100644 --- a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/PredictedAppIcon.java +++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/PredictedAppIcon.java @@ -19,11 +19,14 @@ import static com.android.launcher3.accessibility.LauncherAccessibilityDelegate. import static com.android.launcher3.graphics.IconShape.getShape; import android.content.Context; +import android.graphics.BlurMaskFilter; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.DashPathEffect; import android.graphics.Paint; +import android.graphics.Path; import android.graphics.Rect; +import android.os.Process; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.ViewGroup; @@ -39,6 +42,7 @@ import com.android.launcher3.accessibility.LauncherAccessibilityDelegate; import com.android.launcher3.graphics.IconPalette; import com.android.launcher3.hybridhotseat.HotseatPredictionController; import com.android.launcher3.icons.IconNormalizer; +import com.android.launcher3.icons.LauncherIcons; import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.model.data.WorkspaceItemInfo; import com.android.launcher3.touch.ItemClickHandler; @@ -51,13 +55,18 @@ import com.android.launcher3.views.DoubleShadowBubbleTextView; public class PredictedAppIcon extends DoubleShadowBubbleTextView implements LauncherAccessibilityDelegate.AccessibilityActionHandler { + private static final int RING_SHADOW_COLOR = 0x99000000; private static final float RING_EFFECT_RATIO = 0.11f; boolean mIsDrawingDot = false; private final DeviceProfile mDeviceProfile; private final Paint mIconRingPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final Path mRingPath = new Path(); private boolean mIsPinned = false; - private int mNormalizedIconRadius; + private final int mNormalizedIconRadius; + private final BlurMaskFilter mShadowFilter; + private int mPlateColor; + public PredictedAppIcon(Context context) { this(context, null, 0); @@ -73,13 +82,18 @@ public class PredictedAppIcon extends DoubleShadowBubbleTextView implements mNormalizedIconRadius = IconNormalizer.getNormalizedCircleSize(getIconSize()) / 2; setOnClickListener(ItemClickHandler.INSTANCE); setOnFocusChangeListener(Launcher.getLauncher(context).getFocusHandler()); + int shadowSize = context.getResources().getDimensionPixelSize( + R.dimen.blur_size_thin_outline); + mShadowFilter = new BlurMaskFilter(shadowSize, BlurMaskFilter.Blur.OUTER); } @Override public void onDraw(Canvas canvas) { int count = canvas.save(); if (!mIsPinned) { - drawEffect(canvas); + boolean isBadged = getTag() instanceof WorkspaceItemInfo + && !Process.myUserHandle().equals(((ItemInfo) getTag()).user); + drawEffect(canvas, isBadged); canvas.translate(getWidth() * RING_EFFECT_RATIO, getHeight() * RING_EFFECT_RATIO); canvas.scale(1 - 2 * RING_EFFECT_RATIO, 1 - 2 * RING_EFFECT_RATIO); } @@ -102,7 +116,7 @@ public class PredictedAppIcon extends DoubleShadowBubbleTextView implements public void applyFromWorkspaceItem(WorkspaceItemInfo info) { super.applyFromWorkspaceItem(info); int color = IconPalette.getMutedColor(info.bitmap.color, 0.54f); - mIconRingPaint.setColor(ColorUtils.setAlphaComponent(color, 200)); + mPlateColor = ColorUtils.setAlphaComponent(color, 200); if (mIsPinned) { setContentDescription(info.contentDescription); } else { @@ -174,9 +188,25 @@ public class PredictedAppIcon extends DoubleShadowBubbleTextView implements return getPaddingTop() + mDeviceProfile.folderIconOffsetYPx; } - private void drawEffect(Canvas canvas) { - getShape().drawShape(canvas, getOutlineOffsetX(), getOutlineOffsetY(), - mNormalizedIconRadius, mIconRingPaint); + private void drawEffect(Canvas canvas, boolean isBadged) { + mRingPath.reset(); + getShape().addToPath(mRingPath, getOutlineOffsetX(), getOutlineOffsetY(), + mNormalizedIconRadius); + if (isBadged) { + float outlineSize = mNormalizedIconRadius * RING_EFFECT_RATIO * 2; + float iconSize = getIconSize() * (1 - 2 * RING_EFFECT_RATIO); + float badgeSize = LauncherIcons.getBadgeSizeForIconSize((int) iconSize) + outlineSize; + float badgeInset = mNormalizedIconRadius * 2 - badgeSize; + getShape().addToPath(mRingPath, getOutlineOffsetX() + badgeInset, + getOutlineOffsetY() + badgeInset, badgeSize / 2); + + } + mIconRingPaint.setColor(RING_SHADOW_COLOR); + mIconRingPaint.setMaskFilter(mShadowFilter); + canvas.drawPath(mRingPath, mIconRingPaint); + mIconRingPaint.setColor(mPlateColor); + mIconRingPaint.setMaskFilter(null); + canvas.drawPath(path, mIconRingPaint); } /**