Merge "Port SurfaceControlViewHost to BLAST" into sc-dev

This commit is contained in:
Rob Carr
2021-02-09 01:10:51 +00:00
committed by Android (Google) Code Review
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);
}
/**