summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java2
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayContentDeferredUpdateTests.java45
2 files changed, 46 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 979b3a5697cf..e3ceb3348de7 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -7920,7 +7920,7 @@ public class WindowManagerService extends IWindowManager.Stub
}
boolean allWindowsDrawn = false;
synchronized (mGlobalLock) {
- if (displayId == DEFAULT_DISPLAY
+ if ((displayId == DEFAULT_DISPLAY || displayId == INVALID_DISPLAY)
&& mRoot.getDefaultDisplay().mDisplayUpdater.waitForTransition(message)) {
// Use the ready-to-play of transition as the signal.
return;
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentDeferredUpdateTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentDeferredUpdateTests.java
index affaad6d9210..193390833789 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentDeferredUpdateTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentDeferredUpdateTests.java
@@ -17,6 +17,7 @@
package com.android.server.wm;
import static android.view.Display.DEFAULT_DISPLAY;
+import static android.view.Display.INVALID_DISPLAY;
import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.any;
@@ -316,6 +317,50 @@ public class DisplayContentDeferredUpdateTests extends WindowTestsBase {
verify(mScreenUnblocker).sendToTarget();
}
+ @Test
+ public void testWaitForAllWindowsDrawnForInvalidDisplay_usesTransitionToUnblock() {
+ mSetFlagsRule.enableFlags(Flags.FLAG_WAIT_FOR_TRANSITION_ON_DISPLAY_SWITCH);
+
+ final WindowState defaultDisplayWindow = createWindow(/* parent= */ null,
+ TYPE_BASE_APPLICATION, mDisplayContent, "DefaultDisplayWindow");
+ makeWindowVisibleAndNotDrawn(defaultDisplayWindow);
+
+ mDisplayContent.mDisplayUpdater.onDisplaySwitching(/* switching= */ true);
+
+ mWmInternal.waitForAllWindowsDrawn(mScreenUnblocker,
+ /* timeout= */ Integer.MAX_VALUE, INVALID_DISPLAY);
+
+ // Perform display update
+ mUniqueId = "new_default_display_unique_id";
+ mDisplayContent.requestDisplayUpdate(mock(Runnable.class));
+
+ when(mDisplayContent.mTransitionController.inTransition()).thenReturn(true);
+
+ // Notify that transition started collecting
+ captureStartTransitionCollection().getAllValues().forEach((callback) ->
+ callback.onCollectStarted(/* deferred= */ true));
+
+ // Verify that screen is not unblocked yet
+ verify(mScreenUnblocker, never()).sendToTarget();
+
+ // Make all display windows drawn
+ defaultDisplayWindow.mWinAnimator.mDrawState = HAS_DRAWN;
+ mWm.mRoot.performSurfacePlacement();
+
+ // Verify that default display is still not unblocked yet
+ // (so it doesn't use old windows drawn path)
+ verify(mScreenUnblocker, never()).sendToTarget();
+
+ // Mark start transaction as presented
+ when(mDisplayContent.mTransitionController.inTransition()).thenReturn(false);
+ captureRequestedTransition().getAllValues().forEach(
+ this::makeTransitionTransactionCompleted);
+
+ // Verify that the default screen unblocker is sent only after start transaction
+ // of the Shell transition is presented
+ verify(mScreenUnblocker).sendToTarget();
+ }
+
private void prepareSecondaryDisplay() {
mSecondaryDisplayContent = createNewDisplay();
when(mSecondaryScreenUnblocker.getTarget()).thenReturn(mWm.mH);