summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Riddle Hsu <riddlehsu@google.com> 2023-05-22 23:37:26 +0800
committer Riddle Hsu <riddlehsu@google.com> 2023-05-24 23:04:19 +0800
commitbf312b0ee0bee3868d4a1ccff7b55ac17fa771c0 (patch)
tree14ba7b7b085861bafb57498c6941acdf6c979710
parentd62eae979ef8d989dc5914f1505764021d34b211 (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
-rw-r--r--core/java/android/view/WindowManager.java10
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java3
-rw-r--r--services/core/java/com/android/server/wm/DisplayRotation.java1
-rw-r--r--services/core/java/com/android/server/wm/Transition.java6
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();