summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java147
-rw-r--r--services/core/java/com/android/server/policy/WindowManagerPolicy.java3
-rw-r--r--services/core/java/com/android/server/wm/TaskSnapshotController.java7
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java4
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