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

Commit 546fd255 authored by Chong Zhang's avatar Chong Zhang
Browse files

Don't release surface if relayout is visible

There is a delay from the point we notify the client to go invisible,
to the point that request is handled. If a relayout VISIBLE happens
during this period, we need to give the client a surface so that any
pending draws will go through.

bug: 30066966

Change-Id: I0cd4e4be49f3d2d8f726963ed9e23bf0327e1d0f
parent e5b46f3b
Loading
Loading
Loading
Loading
+17 −2
Original line number Diff line number Diff line
@@ -2907,9 +2907,23 @@ public class WindowManagerService extends IWindowManager.Stub
                    }
                    result |= RELAYOUT_RES_SURFACE_CHANGED;
                }
                final WindowSurfaceController surfaceController = winAnimator.mSurfaceController;
                if (viewVisibility == View.VISIBLE && surfaceController != null) {
                    // We already told the client to go invisible, but the message may not be
                    // handled yet, or it might want to draw a last frame. If we already have a
                    // surface, let the client use that, but don't create new surface at this point.
                    surfaceController.getSurface(outSurface);
                } else {
                    if (DEBUG_VISIBILITY) Slog.i(TAG_WM, "Releasing surface in: " + win);

                    try {
                        Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "wmReleaseOutSurface_"
                                + win.mAttrs.getTitle());
                        outSurface.release();
                if (DEBUG_VISIBILITY) Slog.i(TAG_WM, "Releasing surface in: " + win);
                    } finally {
                        Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
                    }
                }
            }

            if (focusMayChange) {
@@ -3044,6 +3058,7 @@ public class WindowManagerService extends IWindowManager.Stub
        } else {
            // For some reason there isn't a surface.  Clear the
            // caller's object so they see the same state.
            Slog.w(TAG_WM, "Failed to create surface control for " + win);
            outSurface.release();
        }
        return result;