From 7c89480c0e0521977e6bb5976e2f97daa0f248cf Mon Sep 17 00:00:00 2001 From: Adrian Roos Date: Wed, 19 Jul 2017 12:25:34 +0200 Subject: [PATCH] AOD: Prevent animations and rotations while going to sleep A recent change allowed animations while the screen is turning on, but not fully turned on; this allows rotations while the device is going to sleep though. To prevent that, we now disallow animations if the device is going to sleep too. In addition, we also prevent the rotation animation when the screen is not fully on or non-interactive. Change-Id: I9b84f68a02a07067e48b11c008bcaf4bcb7c41a0 Fixes: 63760853 Test: Turn phone to landscape on an app that can rotate. Press power button. Verify AOD shows without a rotation; go/wm-smoke --- core/java/android/view/WindowManagerPolicy.java | 9 ++++----- .../android/server/policy/PhoneWindowManager.java | 14 +++++++++++--- .../android/server/wm/WindowManagerService.java | 2 +- .../android/server/wm/TestWindowManagerPolicy.java | 2 +- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index ba9e05c2d8702..668d25e74276b 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -74,7 +74,6 @@ import android.graphics.Rect; import android.os.Bundle; import android.os.IBinder; import android.os.Looper; -import android.os.PowerManager; import android.os.RemoteException; import android.util.Slog; import android.view.animation.Animation; @@ -1317,12 +1316,12 @@ public interface WindowManagerPolicy { public boolean isScreenOn(); /** - * @return whether the device is currently {@link PowerManager#isInteractive() interactive}. + * @return whether the device is currently allowed to animate. * - * Note: the screen can be on while the device is not interactive, e.g. when the device is - * showing Ambient Display. + * Note: this can be true even if it is not appropriate to animate for reasons that are outside + * of the policy's authority. */ - boolean isInteractive(); + boolean okToAnimate(); /** * Tell the policy that the lid switch has changed state. diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 0b2d6fa0a1cfb..8e2097ae26096 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -3168,10 +3168,18 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override public void selectRotationAnimationLw(int anim[]) { + // If the screen is off or non-interactive, force a jumpcut. + final boolean forceJumpcut = !mScreenOnFully || !mAwake; if (PRINT_ANIM) Slog.i(TAG, "selectRotationAnimation mTopFullscreen=" + mTopFullscreenOpaqueWindowState + " rotationAnimation=" + (mTopFullscreenOpaqueWindowState == null ? - "0" : mTopFullscreenOpaqueWindowState.getAttrs().rotationAnimation)); + "0" : mTopFullscreenOpaqueWindowState.getAttrs().rotationAnimation) + + " forceJumpcut=" + forceJumpcut); + if (forceJumpcut) { + anim[0] = R.anim.rotation_animation_jump_exit; + anim[1] = R.anim.rotation_animation_enter; + return; + } if (mTopFullscreenOpaqueWindowState != null) { int animationHint = mTopFullscreenOpaqueWindowState.getRotationAnimationHint(); if (animationHint < 0 && mTopIsFullscreen) { @@ -6829,8 +6837,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { } @Override - public boolean isInteractive() { - return mAwake; + public boolean okToAnimate() { + return mAwake && !mGoingToSleep; } /** {@inheritDoc} */ diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 17e87a04e2c26..5bd5e21870182 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2403,7 +2403,7 @@ public class WindowManagerService extends IWindowManager.Stub } boolean okToAnimate() { - return okToDisplay() && mPolicy.isInteractive(); + return okToDisplay() && mPolicy.okToAnimate(); } @Override diff --git a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java index 0a7a5f26d35eb..828d405b5e3b2 100644 --- a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java +++ b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java @@ -382,7 +382,7 @@ class TestWindowManagerPolicy implements WindowManagerPolicy { } @Override - public boolean isInteractive() { + public boolean okToAnimate() { return true; }