diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index b0b44a07dadad..a35d2857748b3 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 724204f79eabe..378aff81ec3c4 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)