diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java index 076f28a6d9..88fcce1c30 100644 --- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java +++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java @@ -1254,12 +1254,23 @@ public abstract class AbsSwipeUpHandler, } } + private int calculateWindowRotation(RemoteAnimationTargetCompat runningTaskTarget, + RecentsOrientedState orientationState) { + if (runningTaskTarget.rotationChange != 0 + && TaskAnimationManager.ENABLE_SHELL_TRANSITIONS) { + return Math.abs(runningTaskTarget.rotationChange) == ROTATION_90 + ? ROTATION_270 : ROTATION_90; + } else { + return orientationState.getDisplayRotation(); + } + } + private SwipePipToHomeAnimator createWindowAnimationToPip(HomeAnimationFactory homeAnimFactory, RemoteAnimationTargetCompat runningTaskTarget, float startProgress) { // Directly animate the app to PiP (picture-in-picture) mode final ActivityManager.RunningTaskInfo taskInfo = mGestureState.getRunningTask(); final RecentsOrientedState orientationState = mTaskViewSimulator.getOrientationState(); - final int windowRotation = orientationState.getDisplayRotation(); + final int windowRotation = calculateWindowRotation(runningTaskTarget, orientationState); final int homeRotation = orientationState.getRecentsActivityRotation(); final Matrix homeToWindowPositionMap = new Matrix(); diff --git a/quickstep/src/com/android/quickstep/util/SwipePipToHomeAnimator.java b/quickstep/src/com/android/quickstep/util/SwipePipToHomeAnimator.java index c0f5c14e3c..d4191fe200 100644 --- a/quickstep/src/com/android/quickstep/util/SwipePipToHomeAnimator.java +++ b/quickstep/src/com/android/quickstep/util/SwipePipToHomeAnimator.java @@ -40,6 +40,7 @@ import com.android.launcher3.Utilities; import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.Interpolators; import com.android.launcher3.util.Themes; +import com.android.quickstep.TaskAnimationManager; import com.android.systemui.shared.pip.PipSurfaceTransactionHelper; import com.android.systemui.shared.system.InteractionJankMonitorWrapper; @@ -278,19 +279,36 @@ public class SwipePipToHomeAnimator extends RectFSpringAnim { private RotatedPosition getRotatedPosition(float progress) { final float degree, positionX, positionY; - if (mFromRotation == Surface.ROTATION_90) { - degree = -90 * progress; - positionX = progress * (mDestinationBoundsTransformed.left - mStartBounds.left) - + mStartBounds.left; - positionY = progress * (mDestinationBoundsTransformed.bottom - mStartBounds.top) - + mStartBounds.top; + if (TaskAnimationManager.ENABLE_SHELL_TRANSITIONS) { + if (mFromRotation == Surface.ROTATION_90) { + degree = -90 * (1 - progress); + positionX = progress * (mDestinationBoundsTransformed.left - mStartBounds.left) + + mStartBounds.left; + positionY = progress * (mDestinationBoundsTransformed.top - mStartBounds.top) + + mStartBounds.top + mStartBounds.bottom * (1 - progress); + } else { + degree = 90 * (1 - progress); + positionX = progress * (mDestinationBoundsTransformed.left - mStartBounds.left) + + mStartBounds.left + mStartBounds.right * (1 - progress); + positionY = progress * (mDestinationBoundsTransformed.top - mStartBounds.top) + + mStartBounds.top; + } } else { - degree = 90 * progress; - positionX = progress * (mDestinationBoundsTransformed.right - mStartBounds.left) - + mStartBounds.left; - positionY = progress * (mDestinationBoundsTransformed.top - mStartBounds.top) - + mStartBounds.top; + if (mFromRotation == Surface.ROTATION_90) { + degree = -90 * progress; + positionX = progress * (mDestinationBoundsTransformed.left - mStartBounds.left) + + mStartBounds.left; + positionY = progress * (mDestinationBoundsTransformed.bottom - mStartBounds.top) + + mStartBounds.top; + } else { + degree = 90 * progress; + positionX = progress * (mDestinationBoundsTransformed.right - mStartBounds.left) + + mStartBounds.left; + positionY = progress * (mDestinationBoundsTransformed.top - mStartBounds.top) + + mStartBounds.top; + } } + return new RotatedPosition(degree, positionX, positionY); }