diff options
6 files changed, 52 insertions, 21 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(); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java index 616f24a874bc..fb70cbe502b0 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/SystemWindows.java @@ -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) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java index 7f9c34f5df7a..728f60d93497 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java @@ -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); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java index e13a1dbe22d6..a18d106abea4 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/legacysplitscreen/DividerView.java @@ -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); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PhonePipMenuController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PhonePipMenuController.java index a57eee83ef59..ae5300502993 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PhonePipMenuController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PhonePipMenuController.java @@ -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); } /** |