From 03206afc7f83060ab76ddc61754c9cf973e39407 Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Mon, 10 Jul 2017 18:24:21 -0700 Subject: [PATCH] Ignore "mLastHidden" state when deciding whether to turnScreenOn. In the case of showWhileLocked, turnScreenOn, windows, we may not hide them or destroy their surface when turning the screen off. In this case mLastHidden will never be set to true, and we will never enter the showSurfaceRobustlyLocked path. However this is the path where we consume turnScreenOn, and so this was preventing such a window from being able to turn the screen on a second time. Bug: 62913759 Test: Manual from bug. go/wm-smoke. "At some form at a later date" Change-Id: Ia72d702e175b82c5f0e628010177f02bf87abf84 --- .../server/wm/WindowStateAnimator.java | 45 +++++++++++-------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 8f1065f756424..23b515e3c5c98 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -1604,21 +1604,33 @@ class WindowStateAnimator { recoveringMemory); mSurfaceController.setLayer(mAnimLayer); - if (prepared && mLastHidden && mDrawState == HAS_DRAWN) { - if (showSurfaceRobustlyLocked()) { - markPreservedSurfaceForDestroy(); - mAnimator.requestRemovalOfReplacedWindows(w); - mLastHidden = false; - if (mIsWallpaper) { - w.dispatchWallpaperVisibility(true); + if (prepared && mDrawState == HAS_DRAWN) { + if (mLastHidden) { + if (showSurfaceRobustlyLocked()) { + markPreservedSurfaceForDestroy(); + mAnimator.requestRemovalOfReplacedWindows(w); + mLastHidden = false; + if (mIsWallpaper) { + w.dispatchWallpaperVisibility(true); + } + // This draw means the difference between unique content and mirroring. + // Run another pass through performLayout to set mHasContent in the + // LogicalDisplay. + mAnimator.setPendingLayoutChanges(w.getDisplayId(), + WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM); + } else { + w.setOrientationChanging(false); } - // This draw means the difference between unique content and mirroring. - // Run another pass through performLayout to set mHasContent in the - // LogicalDisplay. - mAnimator.setPendingLayoutChanges(w.getDisplayId(), - WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM); - } else { - w.setOrientationChanging(false); + } + // We process mTurnOnScreen even for windows which have already + // been shown, to handle cases where windows are not necessarily + // 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 (DEBUG_VISIBILITY) Slog.v(TAG, "Show surface turning screen on: " + mWin); + mWin.mTurnOnScreen = false; + mAnimator.mBulkUpdateParams |= SET_TURN_ON_SCREEN; } } if (hasSurface()) { @@ -1730,11 +1742,6 @@ class WindowStateAnimator { if (!shown) return false; - if (mWin.mTurnOnScreen) { - if (DEBUG_VISIBILITY) Slog.v(TAG, "Show surface turning screen on: " + mWin); - mWin.mTurnOnScreen = false; - mAnimator.mBulkUpdateParams |= SET_TURN_ON_SCREEN; - } return true; }