From 59027cea3193524ec7ecdd5398d76b4eb24b432a Mon Sep 17 00:00:00 2001 From: Vishnu Nair Date: Wed, 12 Apr 2023 10:04:30 -0700 Subject: [PATCH] SCVH: Remove ViewRootImpl config callbacks on cleanup Test: presubmit Fixes: 269243236 Change-Id: I7100651584d38edc75babd280b54241d8743be62 --- .../android/view/SurfaceControlViewHost.java | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/core/java/android/view/SurfaceControlViewHost.java b/core/java/android/view/SurfaceControlViewHost.java index ac50d09cc091c..dbb3561f79270 100644 --- a/core/java/android/view/SurfaceControlViewHost.java +++ b/core/java/android/view/SurfaceControlViewHost.java @@ -113,6 +113,8 @@ public class SurfaceControlViewHost { private ISurfaceControlViewHost mRemoteInterface = new ISurfaceControlViewHostImpl(); + private ViewRootImpl.ConfigChangedCallback mConfigChangedCallback; + /** * Package encapsulating a Surface hierarchy which contains interactive view * elements. It's expected to get this object from @@ -299,7 +301,7 @@ public class SurfaceControlViewHost { mWm = wwm; mViewRoot = new ViewRootImpl(c, d, mWm, new WindowlessWindowLayout()); mCloseGuard.openWithCallSite("release", callsite); - addConfigCallback(c, d); + setConfigCallback(c, d); WindowManagerGlobal.getInstance().addWindowlessRoot(mViewRoot); @@ -349,21 +351,23 @@ public class SurfaceControlViewHost { mViewRoot = new ViewRootImpl(context, display, mWm, new WindowlessWindowLayout()); mCloseGuard.openWithCallSite("release", callsite); - addConfigCallback(context, display); + setConfigCallback(context, display); WindowManagerGlobal.getInstance().addWindowlessRoot(mViewRoot); mAccessibilityEmbeddedConnection = mViewRoot.getAccessibilityEmbeddedConnection(); } - private void addConfigCallback(Context c, Display d) { + private void setConfigCallback(Context c, Display d) { final IBinder token = c.getWindowContextToken(); - mViewRoot.addConfigCallback((conf) -> { + mConfigChangedCallback = conf -> { if (token instanceof WindowTokenClient) { final WindowTokenClient w = (WindowTokenClient) token; w.onConfigurationChanged(conf, d.getDisplayId(), true); } - }); + }; + + ViewRootImpl.addConfigCallback(mConfigChangedCallback); } /** @@ -378,8 +382,7 @@ public class SurfaceControlViewHost { mCloseGuard.warnIfOpen(); } // We aren't on the UI thread here so we need to pass false to doDie - mViewRoot.die(false /* immediate */); - WindowManagerGlobal.getInstance().removeWindowlessRoot(mViewRoot); + doRelease(false /* immediate */); } /** @@ -489,7 +492,16 @@ public class SurfaceControlViewHost { */ public void release() { // ViewRoot will release mSurfaceControl for us. - mViewRoot.die(true /* immediate */); + doRelease(true /* immediate */); + } + + private void doRelease(boolean immediate) { + if (mConfigChangedCallback != null) { + ViewRootImpl.removeConfigCallback(mConfigChangedCallback); + mConfigChangedCallback = null; + } + + mViewRoot.die(immediate); WindowManagerGlobal.getInstance().removeWindowlessRoot(mViewRoot); mReleased = true; mCloseGuard.close();