Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0cf68527 authored by chaviw's avatar chaviw
Browse files

Call finishDrawing for Windows with visiblity GONE

The viewVisiblity 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. Thereofre, call finishDrawing here to prevent system server from
blocking on a Window that will never draw.

Change-Id: I04f143c962dd94e6ba0e439d421eb3a53a6548cc
Bug: 153579514
Test: applySyncTransaction with hiding window in transaction
parent 0cdc03a7
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -2250,7 +2250,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());
+11 −0
Original line number Diff line number Diff line
@@ -5688,6 +5688,17 @@ class WindowState extends WindowContainer<WindowState> 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();
    }