diff options
4 files changed, 101 insertions, 60 deletions
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 047e3b362b7a..ffea6a743a42 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -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,21 +4278,25 @@ 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..."); - updateScreenOffSleepToken(true); - mDefaultDisplayPolicy.screenTurnedOff(); - synchronized (mLock) { - if (mKeyguardDelegate != null) { - mKeyguardDelegate.onScreenTurnedOff(); + if (displayId == DEFAULT_DISPLAY) { + updateScreenOffSleepToken(true); + mRequestedOrSleepingDefaultDisplay = false; + mDefaultDisplayPolicy.screenTurnedOff(); + synchronized (mLock) { + if (mKeyguardDelegate != null) { + mKeyguardDelegate.onScreenTurnedOff(); + } + } + mDefaultDisplayRotation.updateOrientationListener(); + reportScreenStateToVrManager(false); + if (mCameraGestureTriggeredDuringGoingToSleep) { + wakeUp(SystemClock.uptimeMillis(), mAllowTheaterModeWakeFromPowerKey, + PowerManager.WAKE_REASON_CAMERA_LAUNCH, + "com.android.systemui:CAMERA_GESTURE_PREVENT_LOCK"); } } - mDefaultDisplayRotation.updateOrientationListener(); - reportScreenStateToVrManager(false); } private long getKeyguardDrawnTimeout() { @@ -4280,27 +4309,28 @@ 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, "Screen turning on..."); + if (DEBUG_WAKEUP) Slog.i(TAG, "Display " + displayId + " turning on..."); - Trace.asyncTraceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "screenTurningOn", 0 /* cookie */); - updateScreenOffSleepToken(false); - mDefaultDisplayPolicy.screenTurnedOn(screenOnListener); + if (displayId == DEFAULT_DISPLAY) { + Trace.asyncTraceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "screenTurningOn", + 0 /* cookie */); + updateScreenOffSleepToken(false); + mDefaultDisplayPolicy.screenTurnedOn(screenOnListener); - synchronized (mLock) { - if (mKeyguardDelegate != null && mKeyguardDelegate.hasKeyguard()) { - mHandler.removeMessages(MSG_KEYGUARD_DRAWN_TIMEOUT); - mHandler.sendEmptyMessageDelayed(MSG_KEYGUARD_DRAWN_TIMEOUT, - getKeyguardDrawnTimeout()); - mKeyguardDelegate.onScreenTurningOn(mKeyguardDrawnCallback); - } else { - if (DEBUG_WAKEUP) Slog.d(TAG, - "null mKeyguardDelegate: setting mKeyguardDrawComplete."); - mHandler.sendEmptyMessage(MSG_KEYGUARD_DRAWN_COMPLETE); + synchronized (mLock) { + if (mKeyguardDelegate != null && mKeyguardDelegate.hasKeyguard()) { + mHandler.removeMessages(MSG_KEYGUARD_DRAWN_TIMEOUT); + mHandler.sendEmptyMessageDelayed(MSG_KEYGUARD_DRAWN_TIMEOUT, + getKeyguardDrawnTimeout()); + mKeyguardDelegate.onScreenTurningOn(mKeyguardDrawnCallback); + } else { + if (DEBUG_WAKEUP) Slog.d(TAG, + "null mKeyguardDelegate: setting mKeyguardDrawComplete."); + mHandler.sendEmptyMessage(MSG_KEYGUARD_DRAWN_COMPLETE); + } } + } else { + mScreenOnListeners.put(displayId, screenOnListener); } } @@ -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; diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java index b5a9acacec83..3fc87c6a7fe2 100644 --- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java +++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java @@ -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. diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java index b810de99ee10..8915eba3d509 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotController.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java @@ -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); } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 6f853c795525..08181c5d6eea 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2999,8 +2999,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 |