diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/EnterDesktopTaskTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/EnterDesktopTaskTransitionHandler.java index 27eda16f4171b..94675788c5141 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/EnterDesktopTaskTransitionHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/EnterDesktopTaskTransitionHandler.java @@ -193,8 +193,11 @@ public class EnterDesktopTaskTransitionHandler implements Transitions.Transition // This Transition animates a task to fullscreen after being dragged from the status // bar and then released back into the status bar area final SurfaceControl sc = change.getLeash(); - startT.setWindowCrop(sc, null); - startT.apply(); + // Hide the first (fullscreen) frame because the animation will start from the smaller + // scale size. + startT.hide(sc) + .setWindowCrop(sc, endBounds.width(), endBounds.height()) + .apply(); final ValueAnimator animator = new ValueAnimator(); animator.setFloatValues(DRAG_FREEFORM_SCALE, 1f); @@ -202,10 +205,10 @@ public class EnterDesktopTaskTransitionHandler implements Transitions.Transition final SurfaceControl.Transaction t = mTransactionSupplier.get(); animator.addUpdateListener(animation -> { final float scale = animation.getAnimatedFraction(); - t.setPosition(sc, mStartPosition.x * (1 - scale), - mStartPosition.y * (1 - scale)); - t.setScale(sc, scale, scale); - t.apply(); + t.setPosition(sc, mStartPosition.x * (1 - scale), mStartPosition.y * (1 - scale)) + .setScale(sc, scale, scale) + .show(sc) + .apply(); }); animator.addListener(new AnimatorListenerAdapter() { @Override diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandler.java index 248a5fce68849..fa3eee257a520 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandler.java @@ -129,8 +129,12 @@ public class ExitDesktopTaskTransitionHandler implements Transitions.TransitionH final int screenWidth = metrics.widthPixels; final int screenHeight = metrics.heightPixels; final SurfaceControl sc = change.getLeash(); - startT.setCrop(sc, null); - startT.apply(); + final Rect endBounds = change.getEndAbsBounds(); + // Hide the first (fullscreen) frame because the animation will start from the freeform + // size. + startT.hide(sc) + .setWindowCrop(sc, endBounds.width(), endBounds.height()) + .apply(); final ValueAnimator animator = new ValueAnimator(); animator.setFloatValues(0f, 1f); animator.setDuration(FULLSCREEN_ANIMATION_DURATION); @@ -144,9 +148,10 @@ public class ExitDesktopTaskTransitionHandler implements Transitions.TransitionH float fraction = animation.getAnimatedFraction(); float currentScaleX = scaleX + ((1 - scaleX) * fraction); float currentScaleY = scaleY + ((1 - scaleY) * fraction); - t.setPosition(sc, startPos.x * (1 - fraction), startPos.y * (1 - fraction)); - t.setScale(sc, currentScaleX, currentScaleY); - t.apply(); + t.setPosition(sc, startPos.x * (1 - fraction), startPos.y * (1 - fraction)) + .setScale(sc, currentScaleX, currentScaleY) + .show(sc) + .apply(); }); animator.addListener(new AnimatorListenerAdapter() { @Override diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandlerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandlerTest.java index 2c5a5cd72c539..4fad05433d1c9 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandlerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandlerTest.java @@ -71,12 +71,6 @@ public class ExitDesktopTaskTransitionHandlerTest extends ShellTestCase { @Mock Resources mResources; @Mock - SurfaceControl.Transaction mStartT; - @Mock - SurfaceControl.Transaction mFinishT; - @Mock - SurfaceControl.Transaction mAnimationT; - @Mock Transitions.TransitionFinishCallback mTransitionFinishCallback; @Mock ShellExecutor mExecutor; @@ -88,7 +82,7 @@ public class ExitDesktopTaskTransitionHandlerTest extends ShellTestCase { MockitoAnnotations.initMocks(this); doReturn(mExecutor).when(mTransitions).getMainExecutor(); - doReturn(mAnimationT).when(mTransactionFactory).get(); + doReturn(new SurfaceControl.Transaction()).when(mTransactionFactory).get(); doReturn(mResources).when(mContext).getResources(); doReturn(mDisplayMetrics).when(mResources).getDisplayMetrics(); when(mResources.getDisplayMetrics()) @@ -115,7 +109,9 @@ public class ExitDesktopTaskTransitionHandlerTest extends ShellTestCase { runOnUiThread(() -> { try { assertTrue(mExitDesktopTaskTransitionHandler - .startAnimation(mToken, info, mStartT, mFinishT, + .startAnimation(mToken, info, + new SurfaceControl.Transaction(), + new SurfaceControl.Transaction(), mTransitionFinishCallback)); } catch (Exception e) { exceptions.add(e);