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

Commit fb59b688 authored by Robert Carr's avatar Robert Carr
Browse files

Port SurfaceControlViewHost to BLAST

This is mostly a matter of flipping the flag, except for the case of
SystemWindows. While external SurfaceControlViewHost clients use the
leash provided by the SurfaceControlViewHost rather than the internal
ViewRootImpl surface, SystemWindows clients will use the actual
ViewRootImpl surface. This can conflict with the BLAST adapter setting
crop/frame/etc on this Surface. We modify SystemWindows to put
each layer inside a leash, and hand this out to other parts of SysUI
instead of the ViewRootImpl surface.

Test: Existing tests pass
Bug: 168505645
Change-Id: Ie621f89166f00ce385d450f1f1cea4d4abd1b805
parent b610667b
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -162,7 +162,6 @@ public class SurfaceControlViewHost {
            @NonNull WindowlessWindowManager wwm, boolean useSfChoreographer) {
        mWm = wwm;
        mViewRoot = new ViewRootImpl(c, d, mWm, useSfChoreographer);
        mViewRoot.forceDisableBLAST();
        mAccessibilityEmbeddedConnection = mViewRoot.getAccessibilityEmbeddedConnection();
    }

@@ -188,7 +187,6 @@ public class SurfaceControlViewHost {
        mWm = new WindowlessWindowManager(context.getResources().getConfiguration(),
                mSurfaceControl, hostToken);
        mViewRoot = new ViewRootImpl(context, display, mWm);
        mViewRoot.forceDisableBLAST();
        mAccessibilityEmbeddedConnection = mViewRoot.getAccessibilityEmbeddedConnection();
    }

+19 −7
Original line number Diff line number Diff line
@@ -71,7 +71,7 @@ public class WindowlessWindowManager implements IWindowSession {
        new HashMap<IBinder, ResizeCompleteCallback>();

    private final SurfaceSession mSurfaceSession = new SurfaceSession();
    private final SurfaceControl mRootSurface;
    protected final SurfaceControl mRootSurface;
    private final Configuration mConfiguration;
    private final IWindowSession mRealWm;
    private final IBinder mHostInputToken;
@@ -126,7 +126,7 @@ public class WindowlessWindowManager implements IWindowSession {
        }
    }

    protected void attachToParentSurface(SurfaceControl.Builder b) {
    protected void attachToParentSurface(IWindow window, SurfaceControl.Builder b) {
        b.setParent(mRootSurface);
    }

@@ -140,10 +140,10 @@ public class WindowlessWindowManager implements IWindowSession {
            InsetsSourceControl[] outActiveControls) {
        final SurfaceControl.Builder b = new SurfaceControl.Builder(mSurfaceSession)
                .setFormat(attrs.format)
                .setBufferSize(getSurfaceWidth(attrs), getSurfaceHeight(attrs))
                .setBLASTLayer()
                .setName(attrs.getTitle().toString())
                .setCallsite("WindowlessWindowManager.addToDisplay");
        attachToParentSurface(b);
        attachToParentSurface(window, b);
        final SurfaceControl sc = b.build();

        if (((attrs.inputFeatures &
@@ -162,7 +162,8 @@ public class WindowlessWindowManager implements IWindowSession {
            mStateForWindow.put(window.asBinder(), state);
        }

        final int res = WindowManagerGlobal.ADD_OKAY | WindowManagerGlobal.ADD_FLAG_APP_VISIBLE;
        final int res = WindowManagerGlobal.ADD_OKAY | WindowManagerGlobal.ADD_FLAG_APP_VISIBLE |
                        WindowManagerGlobal.ADD_FLAG_USE_BLAST;

        // Include whether the window is in touch mode.
        return isInTouchMode() ? res | WindowManagerGlobal.ADD_FLAG_IN_TOUCH_MODE : res;
@@ -222,6 +223,17 @@ public class WindowlessWindowManager implements IWindowSession {
        return false;
    }

    /** Access to package members for SystemWindow leashing
     * @hide
     */
    protected IBinder getWindowBinder(View rootView) {
        final ViewRootImpl root = rootView.getViewRootImpl();
        if (root == null) {
            return null;
        }
        return root.mWindow.asBinder();
    }

    /** @hide */
    @Nullable
    protected SurfaceControl getSurfaceControl(View rootView) {
@@ -266,8 +278,8 @@ public class WindowlessWindowManager implements IWindowSession {
        WindowManager.LayoutParams attrs = state.mParams;

        if (viewFlags == View.VISIBLE) {
            t.setBufferSize(sc, getSurfaceWidth(attrs), getSurfaceHeight(attrs))
                    .setOpaque(sc, isOpaque(attrs)).show(sc).apply();
            outSurfaceSize.set(getSurfaceWidth(attrs), getSurfaceHeight(attrs));
            t.setOpaque(sc, isOpaque(attrs)).show(sc).apply();
            outSurfaceControl.copyFrom(sc, "WindowlessWindowManager.relayout");
        } else {
            t.hide(sc).apply();
+31 −1
Original line number Diff line number Diff line
@@ -40,9 +40,11 @@ import android.view.IWindowSessionCallback;
import android.view.InsetsSourceControl;
import android.view.InsetsState;
import android.view.SurfaceControl;
import android.view.SurfaceSession;
import android.view.SurfaceControlViewHost;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewRootImpl;
import android.view.WindowManager;
import android.view.WindowlessWindowManager;
import android.window.ClientWindowFrames;
@@ -251,6 +253,8 @@ public class SystemWindows {
    public class SysUiWindowManager extends WindowlessWindowManager {
        final int mDisplayId;
        ContainerWindow mContainerWindow;
        final HashMap<IBinder, SurfaceControl> mLeashForWindow =
                new HashMap<IBinder, SurfaceControl>();
        public SysUiWindowManager(int displayId, Context ctx, SurfaceControl rootSurface,
                ContainerWindow container) {
            super(ctx.getResources().getConfiguration(), rootSurface, null /* hostInputToken */);
@@ -263,7 +267,33 @@ public class SystemWindows {
        }

        SurfaceControl getSurfaceControlForWindow(View rootView) {
            return getSurfaceControl(rootView);
            synchronized (this) {
                return mLeashForWindow.get(getWindowBinder(rootView));
            }
        }

        protected void attachToParentSurface(IWindow window, SurfaceControl.Builder b) {
            SurfaceControl leash = new SurfaceControl.Builder(new SurfaceSession())
                  .setContainerLayer()
                  .setName("SystemWindowLeash")
                  .setHidden(false)
                  .setParent(mRootSurface)
                  .setCallsite("SysUiWIndowManager#attachToParentSurface").build();
            synchronized (this) {
                mLeashForWindow.put(window.asBinder(), leash);
            }
            b.setParent(leash);
        }

        @Override
        public void remove(android.view.IWindow window) throws RemoteException {
            super.remove(window);
            synchronized(this) {
                IBinder token = window.asBinder();
                new SurfaceControl.Transaction().remove(mLeashForWindow.get(token))
                    .apply();
                mLeashForWindow.remove(token);
            }
        }

        void setTouchableRegionForWindow(View rootView, Region region) {
+1 −1
Original line number Diff line number Diff line
@@ -87,7 +87,7 @@ public final class SplitWindowManager extends WindowlessWindowManager {
    }

    @Override
    protected void attachToParentSurface(SurfaceControl.Builder b) {
    protected void attachToParentSurface(IWindow window, SurfaceControl.Builder b) {
        mParentContainerCallbacks.attachToParentSurface(b);
    }

+0 −8
Original line number Diff line number Diff line
@@ -862,14 +862,6 @@ public class DividerView extends FrameLayout implements OnTouchListener,
     * assigned to it.
     */
    private SurfaceControl getWindowSurfaceControl() {
        final ViewRootImpl root = getViewRootImpl();
        if (root == null) {
            return null;
        }
        SurfaceControl out = root.getSurfaceControl();
        if (out != null && out.isValid()) {
            return out;
        }
        return mWindowManager.mSystemWindows.getViewSurface(this);
    }

Loading