From 6858bb9ab1e867245370a8edf9e348ddc5ceec31 Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Mon, 16 Apr 2018 11:09:49 -0700 Subject: [PATCH] ViewRoot: Ensure we release surface from setWindowStopped. Otherwise, we may attempt to reinitialize the ThreadedRenderer with a Surface which is not actually valid, e.g. from handleWindowFocusChanged. Entering a code path where the threaded renderer does not heed the stopped signal. This change ensures isValid returns false when the Surface is not valid preventing us from calling initialize/initializeIfNeeded, or udpateSurface. Unlike a previous iteration of this CL, we take care to do so after invoking the WindowStopped callbacks so that SurfaceView has a chance to tear down. Test: go/wm-smoke. More extensive manual testing. Bug: 62536731 Change-Id: If5e51f8aef7957ad87a23015fe100095f9502bc9 --- core/java/android/view/ViewRootImpl.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index f6d9a16e42467..31cb596574945 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1339,6 +1339,10 @@ public final class ViewRootImpl implements ViewParent, for (int i = 0; i < mWindowStoppedCallbacks.size(); i++) { mWindowStoppedCallbacks.get(i).windowStopped(stopped); } + + if (mStopped) { + mSurface.release(); + } } }