SCVH: Remove ViewRootImpl config callbacks on cleanup
Test: presubmit Fixes: 269243236 Change-Id: I7100651584d38edc75babd280b54241d8743be62
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user