Use desktop corner radius for initial task snapshot

When converting a task to bubble, we initially show a snapshot of the
task before starting the animation to bubble.
Use the desktop drag corner radius for the initial snapshot corner
radius so it matches the dragged task.

Bug: 396449031
Test: atest BubbleTransitionsTest
Test: manual, drag a task to bubble
Flag: com.android.wm.shell.enable_bubble_to_fullscreen
Change-Id: I766c3aac7101e1ddbfb743dc3ed86efb7d8b6c16
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleTransitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleTransitions.java
index e7e7be9..d5f2dbd 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleTransitions.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleTransitions.java
@@ -159,19 +159,22 @@
         private final WindowContainerTransaction mPendingWct;
         private final boolean mReleasedOnLeft;
         private final float mTaskScale;
+        private final float mCornerRadius;
         private final PointF mDragPosition;
 
         /**
          * @param releasedOnLeft true if the bubble was released in the left drop target
          * @param taskScale      the scale of the task when it was dragged to bubble
+         * @param cornerRadius   the corner radius of the task when it was dragged to bubble
          * @param dragPosition   the position of the task when it was dragged to bubble
          * @param wct            pending operations to be applied when finishing the drag
          */
-        public DragData(boolean releasedOnLeft, float taskScale, @Nullable PointF dragPosition,
-                @Nullable WindowContainerTransaction wct) {
+        public DragData(boolean releasedOnLeft, float taskScale, float cornerRadius,
+                @Nullable PointF dragPosition, @Nullable WindowContainerTransaction wct) {
             mPendingWct = wct;
             mReleasedOnLeft = releasedOnLeft;
             mTaskScale = taskScale;
+            mCornerRadius = cornerRadius;
             mDragPosition = dragPosition != null ? dragPosition : new PointF(0, 0);
         }
 
@@ -198,6 +201,13 @@
         }
 
         /**
+         * @return the corner radius of the task when it was dragged to bubble
+         */
+        public float getCornerRadius() {
+            return mCornerRadius;
+        }
+
+        /**
          * @return position of the task when it was dragged to bubble
          */
         public PointF getDragPosition() {
@@ -362,6 +372,7 @@
                         (int) mDragData.getDragPosition().y);
                 startTransaction.setScale(mSnapshot, mDragData.getTaskScale(),
                         mDragData.getTaskScale());
+                startTransaction.setCornerRadius(mSnapshot, mDragData.getCornerRadius());
             }
 
             // Now update state (and talk to launcher) in parallel with snapshot stuff
@@ -377,12 +388,6 @@
             startTransaction.setPosition(mSnapshot, left, top);
             startTransaction.setLayer(mSnapshot, Integer.MAX_VALUE);
 
-            BubbleBarExpandedView bbev = mBubble.getBubbleBarExpandedView();
-            if (bbev != null) {
-                // Corners get reset during the animation. Add them back
-                startTransaction.setCornerRadius(mSnapshot, bbev.getRestingCornerRadius());
-            }
-
             startTransaction.apply();
 
             mTaskViewTransitions.onExternalDone(transition);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt
index e943c42..4f511a9 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt
@@ -327,8 +327,9 @@
         val taskInfo = state.draggedTaskChange?.taskInfo ?: error("Expected non-null taskInfo")
         val dragPosition = PointF(state.dragAnimator.position)
         val scale = state.dragAnimator.scale
+        val cornerRadius = state.dragAnimator.cornerRadius
         state.dragAnimator.cancelAnimator()
-        requestBubble(wct, taskInfo, onLeft, scale, dragPosition)
+        requestBubble(wct, taskInfo, onLeft, scale, cornerRadius, dragPosition)
     }
 
     private fun requestBubble(
@@ -336,13 +337,14 @@
         taskInfo: RunningTaskInfo,
         onLeft: Boolean,
         taskScale: Float = 1f,
+        cornerRadius: Float = 0f,
         dragPosition: PointF = PointF(0f, 0f),
     ) {
         val controller =
             bubbleController.orElseThrow { IllegalStateException("BubbleController not set") }
         controller.expandStackAndSelectBubble(
             taskInfo,
-            BubbleTransitions.DragData(onLeft, taskScale, dragPosition, wct),
+            BubbleTransitions.DragData(onLeft, taskScale, cornerRadius, dragPosition, wct),
         )
     }
 
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MoveToDesktopAnimator.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MoveToDesktopAnimator.kt
index 22bc978..cf536eb 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MoveToDesktopAnimator.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MoveToDesktopAnimator.kt
@@ -42,8 +42,6 @@
             .setDuration(ANIMATION_DURATION.toLong())
             .apply {
                 val t = SurfaceControl.Transaction()
-                val cornerRadius = context.resources
-                    .getDimensionPixelSize(R.dimen.desktop_mode_dragged_task_radius).toFloat()
                 addUpdateListener {
                     setTaskPosition(mostRecentInput.x, mostRecentInput.y)
                     t.setScale(taskSurface, scale, scale)
@@ -57,6 +55,8 @@
 
     val taskId get() = taskInfo.taskId
     val position: PointF = PointF(0.0f, 0.0f)
+    val cornerRadius: Float = context.resources
+        .getDimensionPixelSize(R.dimen.desktop_mode_dragged_task_radius).toFloat()
 
     /**
      * Whether motion events from the drag gesture should affect the dragged surface or not. Used
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleTransitionsTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleTransitionsTest.java
index 3c79ea7..925ca0f 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleTransitionsTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleTransitionsTest.java
@@ -221,8 +221,8 @@
 
         PointF dragPosition = new PointF(10f, 20f);
         BubbleTransitions.DragData dragData = new BubbleTransitions.DragData(
-                /* releasedOnLeft= */ false, /* taskScale= */ 0.5f, dragPosition,
-                pendingWct);
+                /* releasedOnLeft= */ false, /* taskScale= */ 0.5f, /* cornerRadius= */ 10f,
+                dragPosition, pendingWct);
 
         final BubbleTransitions.BubbleTransition bt = mBubbleTransitions.startConvertToBubble(
                 mBubble, taskInfo, mExpandedViewManager, mTaskViewFactory, mBubblePositioner,
@@ -253,6 +253,8 @@
         verify(startT).setPosition(snapshot, dragPosition.x, dragPosition.y);
         // Snapshot has the scale of the dragged task
         verify(startT).setScale(snapshot, dragData.getTaskScale(), dragData.getTaskScale());
+        // Snapshot has dragged task corner radius
+        verify(startT).setCornerRadius(snapshot, dragData.getCornerRadius());
     }
 
     @Test