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); }