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

Commit d4e37037 authored by Sean Stout's avatar Sean Stout Committed by Android (Google) Code Review
Browse files

Merge "Power button press behavior now accounts for default display state" into sc-dev

parents f4f6a9eb e4f07fed
Loading
Loading
Loading
Loading
+93 −54
Original line number Diff line number Diff line
@@ -345,6 +345,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
     */
    private final Object mLock = new Object();

    /** List of {@link ScreenOnListener}s which do not belong to the default display. */
    private final SparseArray<ScreenOnListener> mScreenOnListeners = new SparseArray<>();

    Context mContext;
    IWindowManager mWindowManager;
    WindowManagerFuncs mWindowManagerFuncs;
@@ -434,8 +437,25 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    volatile boolean mBeganFromNonInteractive;
    volatile boolean mEndCallKeyHandled;
    volatile boolean mCameraGestureTriggeredDuringGoingToSleep;
    volatile boolean mGoingToSleep;
    volatile boolean mRequestedOrGoingToSleep;

    /**
     * {@code true} if the device is entering a low-power state; {@code false otherwise}.
     *
     * <p>This differs from {@link #mRequestedOrSleepingDefaultDisplay} which tracks the power state
     * of the {@link #mDefaultDisplay default display} versus the power state of the entire device.
     */
    volatile boolean mDeviceGoingToSleep;

    /**
     * {@code true} if the {@link #mDefaultDisplay default display} is entering or was requested to
     * enter a low-power state; {@code false otherwise}.
     *
     * <p>This differs from {@link #mDeviceGoingToSleep} which tracks the power state of the entire
     * device versus the power state of the {@link #mDefaultDisplay default display}.
     */
    // TODO(b/178103325): Track sleep/requested sleep for every display.
    volatile boolean mRequestedOrSleepingDefaultDisplay;

    volatile boolean mRecentsVisible;
    volatile boolean mNavBarVirtualKeyHapticFeedbackEnabled = true;
    volatile boolean mPictureInPictureVisible;
@@ -917,13 +937,14 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                case SHORT_PRESS_POWER_NOTHING:
                    break;
                case SHORT_PRESS_POWER_GO_TO_SLEEP:
                    goToSleepFromPowerButton(eventTime, 0);
                    sleepDefaultDisplayFromPowerButton(eventTime, 0);
                    break;
                case SHORT_PRESS_POWER_REALLY_GO_TO_SLEEP:
                    goToSleepFromPowerButton(eventTime, PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);
                    sleepDefaultDisplayFromPowerButton(eventTime,
                            PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);
                    break;
                case SHORT_PRESS_POWER_REALLY_GO_TO_SLEEP_AND_GO_HOME:
                    if (goToSleepFromPowerButton(eventTime,
                    if (sleepDefaultDisplayFromPowerButton(eventTime,
                            PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE)) {
                        launchHomeFromHotKey(DEFAULT_DISPLAY);
                    }
@@ -951,11 +972,12 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    }

    /**
     * Sends the device to sleep as a result of a power button press.
     * Sends the default display to sleep as a result of a power button press.
     *
     * @return True if the was device was sent to sleep, false if sleep was suppressed.
     * @return {@code true} if the device was sent to sleep, {@code false} if the device did not
     * sleep.
     */
    private boolean goToSleepFromPowerButton(long eventTime, int flags) {
    private boolean sleepDefaultDisplayFromPowerButton(long eventTime, int flags) {
        // Before we actually go to sleep, we check the last wakeup reason.
        // If the device very recently woke up from a gesture (like user lifting their device)
        // then ignore the sleep instruction. This is because users have developed
@@ -975,12 +997,12 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            }
        }

        goToSleep(eventTime, PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON, flags);
        sleepDefaultDisplay(eventTime, PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON, flags);
        return true;
    }

    private void goToSleep(long eventTime, int reason, int flags) {
        mRequestedOrGoingToSleep = true;
    private void sleepDefaultDisplay(long eventTime, int reason, int flags) {
        mRequestedOrSleepingDefaultDisplay = true;
        mPowerManager.goToSleep(eventTime, reason, flags);
    }

@@ -1017,7 +1039,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                            Settings.Global.THEATER_MODE_ON, 1);

                    if (mGoToSleepOnButtonPressTheaterMode && interactive) {
                        goToSleep(eventTime, PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON, 0);
                        sleepDefaultDisplay(eventTime, PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON,
                                0);
                    }
                }
                break;
@@ -1126,7 +1149,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            case SHORT_PRESS_SLEEP_GO_TO_SLEEP:
            case SHORT_PRESS_SLEEP_GO_TO_SLEEP_AND_GO_HOME:
                Slog.i(TAG, "sleepRelease() calling goToSleep(GO_TO_SLEEP_REASON_SLEEP_BUTTON)");
                goToSleep(eventTime, PowerManager.GO_TO_SLEEP_REASON_SLEEP_BUTTON, 0);
                sleepDefaultDisplay(eventTime, PowerManager.GO_TO_SLEEP_REASON_SLEEP_BUTTON, 0);
                break;
        }
    }
@@ -3511,7 +3534,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                            }
                            if ((mEndcallBehavior
                                    & Settings.System.END_BUTTON_BEHAVIOR_SLEEP) != 0) {
                                goToSleep(event.getEventTime(),
                                sleepDefaultDisplay(event.getEventTime(),
                                        PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON, 0);
                                isWakeKey = false;
                            }
@@ -3538,10 +3561,12 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                // Any activity on the power button stops the accessibility shortcut
                result &= ~ACTION_PASS_TO_USER;
                isWakeKey = false; // wake-up will be handled separately
                final boolean isDefaultDisplayOn = Display.isOnState(mDefaultDisplay.getState());
                final boolean interactiveAndOn = interactive && isDefaultDisplayOn;
                if (down) {
                    interceptPowerKeyDown(event, interactive);
                    interceptPowerKeyDown(event, interactiveAndOn);
                } else {
                    interceptPowerKeyUp(event, interactive, canceled);
                    interceptPowerKeyUp(event, interactiveAndOn, canceled);
                }
                break;
            }
@@ -3746,7 +3771,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        final MutableBoolean outLaunched = new MutableBoolean(false);
        final boolean gesturedServiceIntercepted = gestureService.interceptPowerKeyDown(event,
                interactive, outLaunched);
        if (outLaunched.value && mRequestedOrGoingToSleep) {
        if (outLaunched.value && mRequestedOrSleepingDefaultDisplay) {
            mCameraGestureTriggeredDuringGoingToSleep = true;
        }
        return gesturedServiceIntercepted;
@@ -4088,8 +4113,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                                    pmSleepReason)) + ")");
        }

        mGoingToSleep = true;
        mRequestedOrGoingToSleep = true;
        mDeviceGoingToSleep = true;
        mRequestedOrSleepingDefaultDisplay = true;

        if (mKeyguardDelegate != null) {
            mKeyguardDelegate.onStartedGoingToSleep(pmSleepReason);
@@ -4108,8 +4133,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        }
        MetricsLogger.histogram(mContext, "screen_timeout", mLockScreenTimeout / 1000);

        mGoingToSleep = false;
        mRequestedOrGoingToSleep = false;
        mDeviceGoingToSleep = false;
        mRequestedOrSleepingDefaultDisplay = false;
        mDefaultDisplayPolicy.setAwake(false);

        // We must get this work done here because the power manager will drop
@@ -4253,13 +4278,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    // Called on the DisplayManager's DisplayPowerController thread.
    @Override
    public void screenTurnedOff(int displayId) {
        if (displayId != DEFAULT_DISPLAY) {
            return;
        }

        if (DEBUG_WAKEUP) Slog.i(TAG, "Screen turned off...");
        if (DEBUG_WAKEUP) Slog.i(TAG, "Display" + displayId + " turned off...");

        if (displayId == DEFAULT_DISPLAY) {
            updateScreenOffSleepToken(true);
            mRequestedOrSleepingDefaultDisplay = false;
            mDefaultDisplayPolicy.screenTurnedOff();
            synchronized (mLock) {
                if (mKeyguardDelegate != null) {
@@ -4268,6 +4291,12 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            }
            mDefaultDisplayRotation.updateOrientationListener();
            reportScreenStateToVrManager(false);
            if (mCameraGestureTriggeredDuringGoingToSleep) {
                wakeUp(SystemClock.uptimeMillis(), mAllowTheaterModeWakeFromPowerKey,
                        PowerManager.WAKE_REASON_CAMERA_LAUNCH,
                        "com.android.systemui:CAMERA_GESTURE_PREVENT_LOCK");
            }
        }
    }

    private long getKeyguardDrawnTimeout() {
@@ -4280,13 +4309,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    // Called on the DisplayManager's DisplayPowerController thread.
    @Override
    public void screenTurningOn(int displayId, final ScreenOnListener screenOnListener) {
        if (displayId != DEFAULT_DISPLAY) {
            return;
        }
        if (DEBUG_WAKEUP) Slog.i(TAG, "Display " + displayId + " turning on...");

        if (DEBUG_WAKEUP) Slog.i(TAG, "Screen turning on...");

        Trace.asyncTraceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "screenTurningOn", 0 /* cookie */);
        if (displayId == DEFAULT_DISPLAY) {
            Trace.asyncTraceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "screenTurningOn",
                    0 /* cookie */);
            updateScreenOffSleepToken(false);
            mDefaultDisplayPolicy.screenTurnedOn(screenOnListener);

@@ -4302,6 +4329,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                    mHandler.sendEmptyMessage(MSG_KEYGUARD_DRAWN_COMPLETE);
                }
            }
        } else {
            mScreenOnListeners.put(displayId, screenOnListener);
        }
    }

    // Called on the DisplayManager's DisplayPowerController thread.
@@ -4321,11 +4351,12 @@ public class PhoneWindowManager implements WindowManagerPolicy {

    @Override
    public void screenTurningOff(int displayId, ScreenOffListener screenOffListener) {
        mWindowManagerFuncs.screenTurningOff(displayId, screenOffListener);
        if (displayId != DEFAULT_DISPLAY) {
            return;
        }

        mWindowManagerFuncs.screenTurningOff(screenOffListener);
        mRequestedOrSleepingDefaultDisplay = true;
        synchronized (mLock) {
            if (mKeyguardDelegate != null) {
                mKeyguardDelegate.onScreenTurningOff();
@@ -4380,6 +4411,14 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            listener.onScreenOn();
        }

        for (int i = mScreenOnListeners.size() - 1; i >= 0; i--) {
            final ScreenOnListener screenOnListener = mScreenOnListeners.valueAt(i);
            if (screenOnListener != null) {
                screenOnListener.onScreenOn();
            }
        }
        mScreenOnListeners.clear();

        if (enableScreen) {
            try {
                mWindowManager.enableScreenIfNeeded();
@@ -4410,7 +4449,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {

    @Override
    public boolean okToAnimate() {
        return mDefaultDisplayPolicy.isAwake() && !mGoingToSleep;
        return mDefaultDisplayPolicy.isAwake() && !mDeviceGoingToSleep;
    }

    /** {@inheritDoc} */
@@ -4777,7 +4816,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                    mWindowManagerFuncs.lockDeviceNow();
                    break;
                case LID_BEHAVIOR_SLEEP:
                    goToSleep(SystemClock.uptimeMillis(),
                    sleepDefaultDisplay(SystemClock.uptimeMillis(),
                            PowerManager.GO_TO_SLEEP_REASON_LID_SWITCH,
                            PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);
                    break;
+2 −1
Original line number Diff line number Diff line
@@ -303,9 +303,10 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants {
        /**
         * Notifies the window manager that screen is being turned off.
         *
         * @param displayId the ID of the display which is turning off
         * @param listener callback to call when display can be turned off
         */
        void screenTurningOff(ScreenOffListener listener);
        void screenTurningOff(int displayId, ScreenOffListener listener);

        /**
         * Convert the lid state to a human readable format.
+4 −3
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import android.os.Handler;
import android.util.ArraySet;
import android.util.Pair;
import android.util.Slog;
import android.view.Display;
import android.view.InsetsState;
import android.view.SurfaceControl;
import android.view.ThreadedRenderer;
@@ -624,7 +625,7 @@ class TaskSnapshotController {
    /**
     * Called when screen is being turned off.
     */
    void screenTurningOff(ScreenOffListener listener) {
    void screenTurningOff(int displayId, ScreenOffListener listener) {
        if (shouldDisableSnapshots()) {
            listener.onScreenOff();
            return;
@@ -635,7 +636,7 @@ class TaskSnapshotController {
            try {
                synchronized (mService.mGlobalLock) {
                    mTmpTasks.clear();
                    mService.mRoot.forAllTasks(task -> {
                    mService.mRoot.getDisplayContent(displayId).forAllTasks(task -> {
                        // Since RecentsAnimation will handle task snapshot while switching apps
                        // with the best capture timing (e.g. IME window capture), No need
                        // additional task capture while task is controlled by RecentsAnimation.
@@ -645,7 +646,7 @@ class TaskSnapshotController {
                    });
                    // Allow taking snapshot of home when turning screen off to reduce the delay of
                    // waking from secure lock to home.
                    final boolean allowSnapshotHome =
                    final boolean allowSnapshotHome = displayId == Display.DEFAULT_DISPLAY &&
                            mService.mPolicy.isKeyguardSecure(mService.mCurrentUserId);
                    snapshotTasks(mTmpTasks, allowSnapshotHome);
                }
+2 −2
Original line number Diff line number Diff line
@@ -2985,8 +2985,8 @@ public class WindowManagerService extends IWindowManager.Stub
    }

    @Override
    public void screenTurningOff(ScreenOffListener listener) {
        mTaskSnapshotController.screenTurningOff(listener);
    public void screenTurningOff(int displayId, ScreenOffListener listener) {
        mTaskSnapshotController.screenTurningOff(displayId, listener);
    }

    @Override