From 902333722582e4767cb4f80187aeadd0f1789a3a Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Wed, 31 Aug 2022 18:15:53 +0800 Subject: [PATCH] Only complete sync draw for visible window Otherwise the sync may be finished too early if the client perform relayout with View.INVISIBLE (e.g. the activity is stopping). Besides, window manager service should only consider View.VISIBLE as real visible. Also change constant field from commit cf9955f to reduce conflict. Bug: 240564946 Test: CloseImeAutoOpenWindowToHomeTest Change-Id: I9a9868ba5a628b8fa7312380a5b1bb8148865f21 Merged-In: I9a9868ba5a628b8fa7312380a5b1bb8148865f21 --- .../java/com/android/server/wm/WindowManagerService.java | 6 +++--- services/core/java/com/android/server/wm/WindowState.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index cc17b5b50039d..66c962d855b7e 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -650,7 +650,7 @@ public class WindowManagerService extends IWindowManager.Stub // Whether the system should use BLAST for ViewRootImpl final boolean mUseBLAST; // Whether to enable BLASTSyncEngine Transaction passing. - final boolean mUseBLASTSync = true; + static final boolean USE_BLAST_SYNC = true; final BLASTSyncEngine mSyncEngine; @@ -2576,7 +2576,7 @@ public class WindowManagerService extends IWindowManager.Stub if (outSyncIdBundle != null) { final int maybeSyncSeqId; - if (mUseBLASTSync && win.useBLASTSync() && viewVisibility != View.GONE + if (USE_BLAST_SYNC && win.useBLASTSync() && viewVisibility == View.VISIBLE && win.mSyncSeqId > lastSyncSeqId) { maybeSyncSeqId = win.shouldSyncWithBuffers() ? win.mSyncSeqId : -1; win.markRedrawForSyncReported(); @@ -5659,7 +5659,7 @@ public class WindowManagerService extends IWindowManager.Stub } public boolean useBLASTSync() { - return mUseBLASTSync; + return USE_BLAST_SYNC; } @Override diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 65db359710265..fd18d3de180e4 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -5959,10 +5959,10 @@ class WindowState extends WindowContainer implements WindowManagerP @Override boolean isSyncFinished() { - if (mSyncState == SYNC_STATE_WAITING_FOR_DRAW && mViewVisibility == View.GONE + if (mSyncState == SYNC_STATE_WAITING_FOR_DRAW && mViewVisibility != View.VISIBLE && !isVisibleRequested()) { - // Don't wait for GONE windows. However, we don't alter the state in case the window - // becomes un-gone while the syncset is still active. + // Don't wait for invisible windows. However, we don't alter the state in case the + // window becomes visible while the sync group is still active. return true; } return super.isSyncFinished();