From 0078150dd5e00b09298967c2b95adf9836a2e1ab Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Wed, 23 Nov 2022 01:03:48 +0800 Subject: [PATCH] Finish sync for relayout a drawn window An activity may change visibility in a short time as visible -> invisible -> visible without reset drawn state. E.g. scene transition convert to translucent. Then if its window relayout to clear mRedrawForSyncReported, the window will stuck by SYNC_STATE_WAITING_FOR_DRAW until it becomes invisible or timeout. This also relates to non-sync blast so maybeSyncSeqId is -1 then the window won't report drawn. Bug: 260093427 Test: Enable shell transition. Launch Messages and click its search bar. There should be fade out/in animation for activity switch. Change-Id: I49746b56e7dda76c530366663000b0d11ae779f3 --- .../java/com/android/server/wm/WindowManagerService.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 9db5170897a8d..63344a0e8678f 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2587,6 +2587,12 @@ public class WindowManagerService extends IWindowManager.Stub && win.mSyncSeqId > lastSyncSeqId) { maybeSyncSeqId = win.shouldSyncWithBuffers() ? win.mSyncSeqId : -1; win.markRedrawForSyncReported(); + if (win.mSyncState == WindowContainer.SYNC_STATE_WAITING_FOR_DRAW + && winAnimator.mDrawState == WindowStateAnimator.HAS_DRAWN + && maybeSyncSeqId < 0) { + // Do not wait for a drawn window which won't report draw. + win.onSyncFinishedDrawing(); + } } else { maybeSyncSeqId = -1; }