diff options
| author | 2023-05-22 23:37:26 +0800 | |
|---|---|---|
| committer | 2023-05-24 23:04:19 +0800 | |
| commit | bf312b0ee0bee3868d4a1ccff7b55ac17fa771c0 (patch) | |
| tree | 14ba7b7b085861bafb57498c6941acdf6c979710 | |
| parent | d62eae979ef8d989dc5914f1505764021d34b211 (diff) | |
Skip screen animation if it is off
This is similar to legacy WindowManagerService#startFreezingDisplay
that only runs animation when screen is on.
So if display is resized or rotated when screen off, it can go the
end state directly, which is more efficiency and also avoid seeing
partial animation when turning screen on.
This may slightly reduce some latency of display switch.
Bug: 282110960
Bug: 281067141
Test: On a device which support display switch.
Launch an activity that keeps screen on.
Turn on auto rotation for inner display, off for outer.
Rotate inner display to 90 degree.
Switch to outer display with a nosensor activity.
The outer display should show in rotation 0 directly
instead of additional rotation animation.
Change-Id: I5cff845810ef6da69adb88be2a24858388be2acf
4 files changed, 17 insertions, 3 deletions
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index e95ba797a985..e40f8e78dafc 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -555,6 +555,13 @@ public interface WindowManager extends ViewManager { int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_LAUNCHER_CLEAR_SNAPSHOT = (1 << 9); // 0x200 /** + * Transition flag: The transition is prepared when nothing is visible on screen, e.g. screen + * is off. The animation handlers can decide whether to skip animations. + * @hide + */ + int TRANSIT_FLAG_INVISIBLE = (1 << 10); // 0x400 + + /** * @hide */ @IntDef(flag = true, prefix = { "TRANSIT_FLAG_" }, value = { @@ -567,7 +574,8 @@ public interface WindowManager extends ViewManager { TRANSIT_FLAG_KEYGUARD_LOCKED, TRANSIT_FLAG_IS_RECENTS, TRANSIT_FLAG_KEYGUARD_GOING_AWAY, - TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_LAUNCHER_CLEAR_SNAPSHOT + TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_LAUNCHER_CLEAR_SNAPSHOT, + TRANSIT_FLAG_INVISIBLE, }) @Retention(RetentionPolicy.SOURCE) @interface TransitionFlags {} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java index 6a2468a7eaa2..dc8a25842969 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java @@ -299,7 +299,8 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { } // Early check if the transition doesn't warrant an animation. - if (Transitions.isAllNoAnimation(info) || Transitions.isAllOrderOnly(info)) { + if (Transitions.isAllNoAnimation(info) || Transitions.isAllOrderOnly(info) + || (info.getFlags() & WindowManager.TRANSIT_FLAG_INVISIBLE) != 0) { startTransaction.apply(); finishTransaction.apply(); finishCallback.onTransitionFinished(null /* wct */, null /* wctCB */); diff --git a/services/core/java/com/android/server/wm/DisplayRotation.java b/services/core/java/com/android/server/wm/DisplayRotation.java index 87de0f6e4aa0..bc1ddf8f66bc 100644 --- a/services/core/java/com/android/server/wm/DisplayRotation.java +++ b/services/core/java/com/android/server/wm/DisplayRotation.java @@ -513,6 +513,7 @@ public class DisplayRotation { } if (mDisplayContent.inTransition() + && mDisplayContent.getDisplayPolicy().isScreenOnFully() && !mDisplayContent.mTransitionController.useShellTransitionsRotation()) { // Rotation updates cannot be performed while the previous rotation change animation // is still in progress. Skip this update. We will try updating again after the diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index c763cfac4e88..bc9343420c75 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -680,7 +680,11 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { // All windows are synced already. return; } - if (!isInTransition(wc)) return; + if (wc.mDisplayContent == null || !isInTransition(wc)) return; + if (!wc.mDisplayContent.getDisplayPolicy().isScreenOnFully() + || wc.mDisplayContent.getDisplayInfo().state == Display.STATE_OFF) { + mFlags |= WindowManager.TRANSIT_FLAG_INVISIBLE; + } if (mContainerFreezer == null) { mContainerFreezer = new ScreenshotFreezer(); |