SCVH: Remove ViewRootImpl config callbacks on cleanup

Test: presubmit
Fixes: 269243236
Change-Id: I7100651584d38edc75babd280b54241d8743be62
This commit is contained in:
Vishnu Nair
2023-04-12 10:04:30 -07:00
parent d8e67a7d0d
commit 59027cea31

View File

@@ -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();