Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7c89480c authored by Adrian Roos's avatar Adrian Roos
Browse files

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
parent d3878b5e
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -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.
+11 −3
Original line number Diff line number Diff line
@@ -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} */
+1 −1
Original line number Diff line number Diff line
@@ -2403,7 +2403,7 @@ public class WindowManagerService extends IWindowManager.Stub
    }

    boolean okToAnimate() {
        return okToDisplay() && mPolicy.isInteractive();
        return okToDisplay() && mPolicy.okToAnimate();
    }

    @Override
+1 −1
Original line number Diff line number Diff line
@@ -382,7 +382,7 @@ class TestWindowManagerPolicy implements WindowManagerPolicy {
    }

    @Override
    public boolean isInteractive() {
    public boolean okToAnimate() {
        return true;
    }