diff options
author | 2021-04-30 01:27:35 +0800 | |
---|---|---|
committer | 2021-04-30 01:30:27 +0800 | |
commit | cf951a027696295a23ba4a643de921cb4bd9f9e1 (patch) | |
tree | 56267ee2082c981c4429ef4116bfb0238bfdbb27 | |
parent | 285e3754084cfa88abb9629a6f4f07c8cc3bb809 (diff) |
Apply rotation animation when canceling fixed rotation
... if the activity requested the same orientation as display.
The launching activity may not declare fixed orientation, so when
launching it in a different orientation, the fixed rotation will
be applied. But if the activity requested to use previous
orientation before the transition is done, it suddenly redraws
that causes flickering.
Fix: 186759371
Test: ActivityRecordTests#testActivityOnCancelFixedRotationTransform
Change-Id: I839dc1b563e9e3c150fbad8c33596dbc2bf0677b
-rw-r--r-- | services/core/java/com/android/server/wm/ActivityRecord.java | 12 | ||||
-rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java | 9 |
2 files changed, 18 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 3e8bc5d31af0..5014bf645492 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -6598,9 +6598,15 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A @Override void onCancelFixedRotationTransform(int originalDisplayRotation) { - if (this != mDisplayContent.getLastOrientationSource() - || getRequestedConfigurationOrientation() != ORIENTATION_UNDEFINED) { - // Only need to handle the activity that should be rotated with display. + if (this != mDisplayContent.getLastOrientationSource()) { + // This activity doesn't affect display rotation. + return; + } + final int requestedOrientation = getRequestedConfigurationOrientation(); + if (requestedOrientation != ORIENTATION_UNDEFINED + && requestedOrientation != mDisplayContent.getConfiguration().orientation) { + // Only need to handle the activity that can be rotated with display or the activity + // has requested the same orientation. return; } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index bd143f8a5c35..06542bd01ba4 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -1723,6 +1723,15 @@ public class ActivityRecordTests extends WindowTestsBase { assertFalse(display.hasTopFixedRotationLaunchingApp()); assertFalse(activity.hasFixedRotationTransform()); + + // Simulate that the activity requests the same orientation as display. + activity.setOrientation(display.getConfiguration().orientation); + // Skip the real freezing. + activity.mVisibleRequested = false; + clearInvocations(activity); + activity.onCancelFixedRotationTransform(originalRotation); + // The implementation of cancellation must be executed. + verify(activity).startFreezingScreen(originalRotation); } @Test |