diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 3e0ed32eb3c98..614cebd69a8d3 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -2171,6 +2171,7 @@ class WindowState extends WindowContainer implements WindowManagerP return; } if (mActivityRecord != null) { + if (!mActivityRecord.mVisibleRequested) return; if (mActivityRecord.allDrawn) { // The allDrawn of activity is reset when the visibility is changed to visible, so // the content should be ready if allDrawn is set. diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java index b6998d84afa35..e6e7f8c334174 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java @@ -673,6 +673,14 @@ public class WindowStateTests extends WindowTestsBase { // Keyguard host window should be always contained. The drawn app or app with starting // window are unnecessary to draw. assertEquals(Arrays.asList(keyguardHostWindow, startingWindow), outWaitingForDrawn); + + // No need to wait for a window of invisible activity even if the window has surface. + final WindowState invisibleApp = mAppWindow; + invisibleApp.mActivityRecord.mVisibleRequested = false; + invisibleApp.mActivityRecord.allDrawn = false; + outWaitingForDrawn.clear(); + invisibleApp.requestDrawIfNeeded(outWaitingForDrawn); + assertTrue(outWaitingForDrawn.isEmpty()); } @UseTestDisplay(addWindows = W_ABOVE_ACTIVITY)