Complete sync draw only for visible window

Otherwise the sync may be finished too early if the client performs
relayout with View.INVISIBLE (e.g. the activity is stopping).

Besides, window manager service should only consider View.VISIBLE
as real visible.

Bug: 240564946
Test: adb shell setprop persist.wm.debug.shell_transit 1; reboot
      atest CloseImeAutoOpenWindowToHomeTest
Change-Id: I9a9868ba5a628b8fa7312380a5b1bb8148865f21
This commit is contained in:
Riddle Hsu
2022-08-31 18:15:53 +08:00
parent 39f9fc4375
commit d7f9a3afa4
2 changed files with 4 additions and 4 deletions

View File

@@ -2542,7 +2542,7 @@ public class WindowManagerService extends IWindowManager.Stub
if (outSyncIdBundle != null) {
final int maybeSyncSeqId;
if (USE_BLAST_SYNC && 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();

View File

@@ -5953,10 +5953,10 @@ class WindowState extends WindowContainer<WindowState> 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();