From 87f88c5cacb0d6911ce1c54f8f6f0b5027491295 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Mon, 17 Jul 2023 18:20:15 +0000 Subject: [PATCH] Avoid waiting for drawn window without change For example, an app is launching with starting window when keyguard is showing. Then the transition will abort because there is no visibility change. And then after keyguard prepares to dismiss (keyguardGoingAway) right after the previous transition (i.e. unlocking), the drawn starting window will be collected again. Then the starting activity becomes no drawn window. It needs to wait until the app is drawn. Bug: 290684194 Test: atest WindowOrganizerTests#testBLASTCallbackWithWindows Change-Id: I0b0141f97f8680b785e57e167de8a103e34041ca --- services/core/java/com/android/server/wm/WindowState.java | 3 +-- .../wmtests/src/com/android/server/wm/SyncEngineTests.java | 5 +---- .../com/android/server/wm/WallpaperControllerTests.java | 5 +---- .../src/com/android/server/wm/WindowOrganizerTests.java | 1 + .../wmtests/src/com/android/server/wm/WindowTestsBase.java | 7 +++++++ 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 0d4c2d631b2ce..d4ebc89b0d876 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -5702,8 +5702,7 @@ class WindowState extends WindowContainer implements WindowManagerP // window becomes visible while the sync group is still active. return true; } - if (mSyncState == SYNC_STATE_WAITING_FOR_DRAW && mWinAnimator.mDrawState == HAS_DRAWN - && !mRedrawForSyncReported && !mWmService.mResizingWindows.contains(this)) { + if (mSyncState == SYNC_STATE_WAITING_FOR_DRAW && mLastConfigReportedToClient && isDrawn()) { // Complete the sync state immediately for a drawn window that doesn't need to redraw. onSyncFinishedDrawing(); } diff --git a/services/tests/wmtests/src/com/android/server/wm/SyncEngineTests.java b/services/tests/wmtests/src/com/android/server/wm/SyncEngineTests.java index fc5e9cab5447d..810cbe8f80801 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SyncEngineTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SyncEngineTests.java @@ -40,9 +40,7 @@ import static org.mockito.ArgumentMatchers.notNull; import static org.mockito.Mockito.spy; import android.platform.test.annotations.Presubmit; -import android.util.MergedConfiguration; import android.view.SurfaceControl; -import android.window.ClientWindowFrames; import androidx.test.filters.SmallTest; @@ -333,8 +331,7 @@ public class SyncEngineTests extends WindowTestsBase { w.reparent(botChildWC, POSITION_TOP); parentWC.prepareSync(); // Assume the window has drawn with the latest configuration. - w.fillClientWindowFramesAndConfiguration(new ClientWindowFrames(), - new MergedConfiguration(), true /* useLatestConfig */, true /* relayoutVisible */); + makeLastConfigReportedToClient(w, true /* visible */); assertTrue(w.onSyncFinishedDrawing()); assertEquals(SYNC_STATE_READY, w.mSyncState); w.reparent(topChildWC, POSITION_TOP); diff --git a/services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java index 4afcd0539b94a..e3d1b9c669f9c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java @@ -52,7 +52,6 @@ import android.graphics.Rect; import android.os.IBinder; import android.os.RemoteException; import android.platform.test.annotations.Presubmit; -import android.util.MergedConfiguration; import android.view.DisplayCutout; import android.view.DisplayInfo; import android.view.DisplayShape; @@ -63,7 +62,6 @@ import android.view.RoundedCorners; import android.view.Surface; import android.view.SurfaceControl; import android.view.WindowManager; -import android.window.ClientWindowFrames; import androidx.test.filters.SmallTest; @@ -380,8 +378,7 @@ public class WallpaperControllerTests extends WindowTestsBase { wallpaperWindow.mLayoutSeq = mDisplayContent.mLayoutSeq; // Assume the token was invisible and the latest config was reported. wallpaperToken.commitVisibility(false); - wallpaperWindow.fillClientWindowFramesAndConfiguration(new ClientWindowFrames(), - new MergedConfiguration(), true /* useLatestConfig */, false /* relayoutVisible */); + makeLastConfigReportedToClient(wallpaperWindow, false /* visible */); assertTrue(wallpaperWindow.isLastConfigReportedToClient()); final Rect bounds = wallpaperToken.getBounds(); diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java index 600681fb332c7..7168670f96522 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java @@ -1247,6 +1247,7 @@ public class WindowOrganizerTests extends WindowTestsBase { // A drawn window can complete the sync state automatically. w1.mWinAnimator.mDrawState = WindowStateAnimator.HAS_DRAWN; + makeLastConfigReportedToClient(w1, true /* visible */); mWm.mSyncEngine.onSurfacePlacement(); verify(mockCallback).onTransactionReady(anyInt(), any()); assertFalse(w1.useBLASTSync()); diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java index d5547ec692476..873c7f4e0e300 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java @@ -85,6 +85,7 @@ import android.os.RemoteException; import android.os.UserHandle; import android.provider.Settings; import android.service.voice.IVoiceInteractionSession; +import android.util.MergedConfiguration; import android.util.SparseArray; import android.view.Display; import android.view.DisplayInfo; @@ -102,6 +103,7 @@ import android.view.WindowInsets; import android.view.WindowManager; import android.view.WindowManager.DisplayImePolicy; import android.view.inputmethod.ImeTracker; +import android.window.ClientWindowFrames; import android.window.ITransitionPlayer; import android.window.ScreenCapture; import android.window.StartingWindowInfo; @@ -624,6 +626,11 @@ class WindowTestsBase extends SystemServiceTestsBase { } } + static void makeLastConfigReportedToClient(WindowState w, boolean visible) { + w.fillClientWindowFramesAndConfiguration(new ClientWindowFrames(), + new MergedConfiguration(), true /* useLatestConfig */, visible); + } + /** * Gets the order of the given {@link Task} as its z-order in the hierarchy below this TDA. * The Task can be a direct child of a child TaskDisplayArea. {@code -1} if not found.