diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 13a0b2c536e72..4c1d6f3b9892f 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2259,7 +2259,7 @@ public class WindowManagerService extends IWindowManager.Stub win.mRelayoutCalled = true; win.mInRelayout = true; - win.mViewVisibility = viewVisibility; + win.setViewVisibility(viewVisibility); ProtoLog.i(WM_DEBUG_SCREEN_ON, "Relayout %s: oldVis=%d newVis=%d. %s", win, oldVisibility, viewVisibility, new RuntimeException().fillInStackTrace()); diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 49d6889b95f93..e925ce5c2dac8 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -5689,6 +5689,17 @@ class WindowState extends WindowContainer implements WindowManagerP return mSession.mPid == pid && isNonToastOrStarting() && isVisibleNow(); } + void setViewVisibility(int viewVisibility) { + mViewVisibility = viewVisibility; + // The viewVisibility is set to GONE with a client request to relayout. If this occurs and + // there's a blast sync transaction waiting, finishDrawing will never be called since the + // client will not render when visibility is GONE. Therefore, call finishDrawing here to + // prevent system server from blocking on a window that will not draw. + if (viewVisibility == View.GONE && mUsingBLASTSyncTransaction) { + finishDrawing(null); + } + } + SurfaceControl getClientViewRootSurface() { return mWinAnimator.getClientViewRootSurface(); }