Merge "Only allow one turnScreenOn per app resume." into oc-dr1-dev
am: c36b2f0490
Change-Id: Ica77a650a769c282f97056b0779def22ee0d00e1
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index be4b43d..2e4de8c 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -193,6 +193,11 @@
Task mLastParent;
+ /**
+ * See {@link #canTurnScreenOn()}
+ */
+ private boolean mCanTurnScreenOn = true;
+
AppWindowToken(WindowManagerService service, IApplicationToken token, boolean voiceInteraction,
DisplayContent dc, long inputDispatchingTimeoutNanos, boolean fullscreen,
boolean showForAllUsers, int targetSdk, int orientation, int rotationAnimationHint,
@@ -644,6 +649,8 @@
if (DEBUG_ADD_REMOVE) Slog.v(TAG, "notifyAppResumed: wasStopped=" + wasStopped
+ " " + this);
mAppStopped = false;
+ // Allow the window to turn the screen on once the app is resumed again.
+ setCanTurnScreenOn(true);
if (!wasStopped) {
destroySurfaces(true /*cleanupOnResume*/);
}
@@ -1641,6 +1648,24 @@
}
/**
+ * Sets whether the current launch can turn the screen on. See {@link #canTurnScreenOn()}
+ */
+ void setCanTurnScreenOn(boolean canTurnScreenOn) {
+ mCanTurnScreenOn = canTurnScreenOn;
+ }
+
+ /**
+ * Indicates whether the current launch can turn the screen on. This is to prevent multiple
+ * relayouts from turning the screen back on. The screen should only turn on at most
+ * once per activity resume.
+ *
+ * @return true if the screen can be turned on.
+ */
+ boolean canTurnScreenOn() {
+ return mCanTurnScreenOn;
+ }
+
+ /**
* Retrieves whether we'd like to generate a snapshot that's based solely on the theme. This is
* the case when preview screenshots are disabled {@link #setDisablePreviewScreenshots} or when
* we can't take a snapshot for other reasons, for example, if we have a secure window.
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index c610ca3..0cc505e 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -1632,9 +1632,14 @@
// hidden while the screen is turning off.
// TODO(b/63773439): These cases should be eliminated, though we probably still
// want to process mTurnOnScreen in this way for clarity.
- if (mWin.mTurnOnScreen) {
+ if (mWin.mTurnOnScreen && mWin.mAppToken.canTurnScreenOn()) {
if (DEBUG_VISIBILITY) Slog.v(TAG, "Show surface turning screen on: " + mWin);
mWin.mTurnOnScreen = false;
+
+ // The window should only turn the screen on once per resume, but
+ // prepareSurfaceLocked can be called multiple times. Set canTurnScreenOn to
+ // false so the window doesn't turn the screen on again during this resume.
+ mWin.mAppToken.setCanTurnScreenOn(false);
mAnimator.mBulkUpdateParams |= SET_TURN_ON_SCREEN;
}
}