From 167210a323c419f03423226486d28393506800b4 Mon Sep 17 00:00:00 2001 From: Samuel Fufa Date: Tue, 12 May 2020 18:40:11 -0700 Subject: [PATCH] Keep Predicted icon same size when dragging -> In addition, this also prevents the drawing of ring effect for predicted icon when view is about to be copied to drag bitmap. Icon will scale to full size (without ring) when dropped. Video attached to bug report Bug: 152325754 Test: Manual Change-Id: Ibd1a5dbf76c41bdc30ae851ad914a4d0e32703c8 --- .../uioverrides/PredictedAppIcon.java | 26 +++++++++++++++++++ src/com/android/launcher3/BubbleTextView.java | 4 ++- .../launcher3/dragndrop/DraggableView.java | 11 ++++++-- .../graphics/DragPreviewProvider.java | 12 +++++---- 4 files changed, 45 insertions(+), 8 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 752068843c..676114860c 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 @@ -46,6 +46,7 @@ import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.model.data.WorkspaceItemInfo; import com.android.launcher3.touch.ItemClickHandler; import com.android.launcher3.touch.ItemLongClickListener; +import com.android.launcher3.util.SafeCloseable; import com.android.launcher3.views.DoubleShadowBubbleTextView; /** @@ -65,6 +66,7 @@ public class PredictedAppIcon extends DoubleShadowBubbleTextView implements private final int mNormalizedIconRadius; private final BlurMaskFilter mShadowFilter; private int mPlateColor; + boolean mDrawForDrag = false; public PredictedAppIcon(Context context) { @@ -188,6 +190,10 @@ public class PredictedAppIcon extends DoubleShadowBubbleTextView implements } private void drawEffect(Canvas canvas, boolean isBadged) { + // Don't draw ring effect if item is about to be dragged. + if (mDrawForDrag) { + return; + } mRingPath.reset(); getShape().addToPath(mRingPath, getOutlineOffsetX(), getOutlineOffsetY(), mNormalizedIconRadius); @@ -208,6 +214,26 @@ public class PredictedAppIcon extends DoubleShadowBubbleTextView implements canvas.drawPath(mRingPath, mIconRingPaint); } + @Override + public void getSourceVisualDragBounds(Rect bounds) { + super.getSourceVisualDragBounds(bounds); + if (!mIsPinned) { + int internalSize = (int) (bounds.width() * RING_EFFECT_RATIO); + bounds.inset(internalSize, internalSize); + } + } + + @Override + public SafeCloseable prepareDrawDragView() { + mDrawForDrag = true; + invalidate(); + SafeCloseable r = super.prepareDrawDragView(); + return () -> { + r.close(); + mDrawForDrag = false; + }; + } + /** * Creates and returns a new instance of PredictedAppIcon from WorkspaceItemInfo */ diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index 79ed2b8c45..60b6da67f9 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -60,6 +60,7 @@ import com.android.launcher3.model.data.ItemInfoWithIcon; import com.android.launcher3.model.data.PackageItemInfo; import com.android.launcher3.model.data.PromiseAppInfo; import com.android.launcher3.model.data.WorkspaceItemInfo; +import com.android.launcher3.util.SafeCloseable; import com.android.launcher3.views.ActivityContext; import com.android.launcher3.views.IconLabelDotView; @@ -744,11 +745,12 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, } @Override - public void prepareDrawDragView() { + public SafeCloseable prepareDrawDragView() { if (getIcon() instanceof FastBitmapDrawable) { FastBitmapDrawable icon = (FastBitmapDrawable) getIcon(); icon.setScale(1f); } setForceHideDot(true); + return () -> { }; } } diff --git a/src/com/android/launcher3/dragndrop/DraggableView.java b/src/com/android/launcher3/dragndrop/DraggableView.java index 287c781131..f7dcf6b7ba 100644 --- a/src/com/android/launcher3/dragndrop/DraggableView.java +++ b/src/com/android/launcher3/dragndrop/DraggableView.java @@ -18,6 +18,10 @@ package com.android.launcher3.dragndrop; import android.graphics.Rect; +import androidx.annotation.NonNull; + +import com.android.launcher3.util.SafeCloseable; + /** * Interface defining methods required for drawing and previewing DragViews, drag previews, and * related animations @@ -42,9 +46,12 @@ public interface DraggableView { int getViewType(); /** - * Before rendering as a DragView bitmap, some views need a preparation step. + * Before rendering as a DragView bitmap, some views need a preparation step. Returns a + * callback to clear any preparation work */ - default void prepareDrawDragView() { } + @NonNull default SafeCloseable prepareDrawDragView() { + return () -> { }; + } /** * If an actual View subclass, this method returns the rectangle (within the View's coordinates) diff --git a/src/com/android/launcher3/graphics/DragPreviewProvider.java b/src/com/android/launcher3/graphics/DragPreviewProvider.java index 634d07e3e9..21822a3542 100644 --- a/src/com/android/launcher3/graphics/DragPreviewProvider.java +++ b/src/com/android/launcher3/graphics/DragPreviewProvider.java @@ -35,6 +35,7 @@ import com.android.launcher3.R; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.dragndrop.DraggableView; import com.android.launcher3.icons.BitmapRenderer; +import com.android.launcher3.util.SafeCloseable; import com.android.launcher3.widget.LauncherAppWidgetHostView; import java.nio.ByteBuffer; @@ -76,11 +77,12 @@ public class DragPreviewProvider { if (mView instanceof DraggableView) { DraggableView dv = (DraggableView) mView; - dv.prepareDrawDragView(); - dv.getSourceVisualDragBounds(mTempRect); - destCanvas.translate(blurSizeOutline / 2 - mTempRect.left, - blurSizeOutline / 2 - mTempRect.top); - mView.draw(destCanvas); + try (SafeCloseable t = dv.prepareDrawDragView()) { + dv.getSourceVisualDragBounds(mTempRect); + destCanvas.translate(blurSizeOutline / 2 - mTempRect.left, + blurSizeOutline / 2 - mTempRect.top); + mView.draw(destCanvas); + } } destCanvas.restoreToCount(saveCount); }