Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 59027cea authored by Vishnu Nair's avatar Vishnu Nair
Browse files

SCVH: Remove ViewRootImpl config callbacks on cleanup

Test: presubmit
Fixes: 269243236
Change-Id: I7100651584d38edc75babd280b54241d8743be62
parent d8e67a7d
Loading
Loading
Loading
Loading
+20 −8
Original line number Diff line number Diff line
@@ -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();