diff options
| author | 2023-11-06 12:16:32 +0000 | |
|---|---|---|
| committer | 2023-11-06 12:16:32 +0000 | |
| commit | 3977eaa145b1a1bca942b73b0dde72a6e28ab06f (patch) | |
| tree | e260875226748b0a61d83458e613c8a223ddba6f | |
| parent | 901e7b6f2ec905e889e601a26cf78d42839eca5d (diff) | |
| parent | b64ae3f00dc2b038a56873ae2db2841703387991 (diff) | |
Merge "Pause updating surface position while seamless rotating" into main
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); |