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; }