diff options
| author | Robert Carr <racarr@google.com> | 2021-02-02 13:19:06 -0800 |
|---|---|---|
| committer | Robert Carr <racarr@google.com> | 2021-02-08 13:33:00 -0800 |
| commit | fb59b6880f4765efd3f13d5429a80be0748f3505 (patch) | |
| tree | 891f606b42414e4c2db8844e7a43f1486f19df0b /core/java | |
| parent | b610667bfd88681a2c089150315f8e4eedd3691e (diff) | |
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
Diffstat (limited to 'core/java')
| -rw-r--r-- | core/java/android/view/SurfaceControlViewHost.java | 2 | ||||
| -rw-r--r-- | core/java/android/view/WindowlessWindowManager.java | 26 |
2 files changed, 19 insertions, 9 deletions
diff --git a/core/java/android/view/SurfaceControlViewHost.java b/core/java/android/view/SurfaceControlViewHost.java index f01964822897..18029af6a85e 100644 --- a/core/java/android/view/SurfaceControlViewHost.java +++ b/core/java/android/view/SurfaceControlViewHost.java @@ -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(); } diff --git a/core/java/android/view/WindowlessWindowManager.java b/core/java/android/view/WindowlessWindowManager.java index bededa09cfce..3aedda1a6bd3 100644 --- a/core/java/android/view/WindowlessWindowManager.java +++ b/core/java/android/view/WindowlessWindowManager.java @@ -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(); |
