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
This commit is contained in:
Robert Carr
2021-02-02 13:19:06 -08:00
parent b610667bfd
commit fb59b6880f
6 changed files with 52 additions and 21 deletions

View File

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

View File

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

View File

@@ -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) {

View File

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

View File

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

View File

@@ -198,8 +198,7 @@ public class PhonePipMenuController implements PipMenuController {
* {@code null}), it will get the leash that the WindowlessWM has assigned to it.
*/
public SurfaceControl getSurfaceControl() {
SurfaceControl sf = mPipMenuView.getWindowSurfaceControl();
return sf != null ? sf : mSystemWindows.getViewSurface(mPipMenuView);
return mSystemWindows.getViewSurface(mPipMenuView);
}
/**