summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Riddle Hsu <riddlehsu@google.com> 2023-11-06 12:16:32 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-11-06 12:16:32 +0000
commit3977eaa145b1a1bca942b73b0dde72a6e28ab06f (patch)
treee260875226748b0a61d83458e613c8a223ddba6f
parent901e7b6f2ec905e889e601a26cf78d42839eca5d (diff)
parentb64ae3f00dc2b038a56873ae2db2841703387991 (diff)
Merge "Pause updating surface position while seamless rotating" into main
-rw-r--r--services/core/java/com/android/server/wm/AsyncRotationController.java6
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java15
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TransitionTests.java6
3 files changed, 23 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/wm/AsyncRotationController.java b/services/core/java/com/android/server/wm/AsyncRotationController.java
index b87e761e5795..68d13cd6789e 100644
--- a/services/core/java/com/android/server/wm/AsyncRotationController.java
+++ b/services/core/java/com/android/server/wm/AsyncRotationController.java
@@ -465,6 +465,12 @@ class AsyncRotationController extends FadeAnimationController implements Consume
return op != null && op.mAction == Operation.ACTION_FADE;
}
+ /** Returns {@code true} if the window is un-rotated to original rotation. */
+ boolean hasSeamlessOperation(WindowToken token) {
+ final Operation op = mTargetWindowTokens.get(token);
+ return op != null && op.mAction == Operation.ACTION_SEAMLESS;
+ }
+
/**
* Whether the insets animation leash should use previous position when running fade animation
* or seamless transformation in a rotated display.
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 34cf436fd8ad..ae2df00007f4 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -5258,10 +5258,17 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
mSurfacePosition.offset(mXOffset, mYOffset);
}
- // Freeze position while we're unrotated, so the surface remains at the position it was
- // prior to the rotation.
- if (!mSurfaceAnimator.hasLeash() && mPendingSeamlessRotate == null
- && !mLastSurfacePosition.equals(mSurfacePosition)) {
+ final AsyncRotationController asyncRotationController =
+ mDisplayContent.getAsyncRotationController();
+ if ((asyncRotationController != null
+ && asyncRotationController.hasSeamlessOperation(mToken))
+ || mPendingSeamlessRotate != null) {
+ // Freeze position while un-rotating the window, so its surface remains at the position
+ // corresponding to the original rotation.
+ return;
+ }
+
+ if (!mSurfaceAnimator.hasLeash() && !mLastSurfacePosition.equals(mSurfacePosition)) {
final boolean frameSizeChanged = mWindowFrames.isFrameSizeChangeReported();
final boolean surfaceInsetsChanged = surfaceInsetsChanging();
final boolean surfaceSizeChanged = frameSizeChanged || surfaceInsetsChanged;
diff --git a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
index 1aa34eebbbb3..2689e9d14c00 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
@@ -1115,6 +1115,12 @@ public class TransitionTests extends WindowTestsBase {
assertFalse(asyncRotationController.handleFinishDrawing(statusBar, mMockT));
assertTrue(asyncRotationController.isTargetToken(statusBar.mToken));
+ // Window surface position is frozen while seamless rotation state is active.
+ final Point prevPos = new Point(screenDecor.mLastSurfacePosition);
+ screenDecor.getFrame().left += 1;
+ screenDecor.updateSurfacePosition(mMockT);
+ assertEquals(prevPos, screenDecor.mLastSurfacePosition);
+
final SurfaceControl.Transaction startTransaction = mock(SurfaceControl.Transaction.class);
final SurfaceControl.TransactionCommittedListener transactionCommittedListener =
onRotationTransactionReady(player, startTransaction);