diff --git a/core/java/android/view/SurfaceControlViewHost.java b/core/java/android/view/SurfaceControlViewHost.java index 16c133523303c..bd6224b07b165 100644 --- a/core/java/android/view/SurfaceControlViewHost.java +++ b/core/java/android/view/SurfaceControlViewHost.java @@ -120,6 +120,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 @@ -307,7 +309,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); @@ -357,21 +359,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); } /** @@ -386,8 +390,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 */); } /** @@ -496,7 +499,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();