diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/WindowManagerService.java | 2 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/DisplayContentDeferredUpdateTests.java | 45 |
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); |