diff options
| -rw-r--r-- | core/java/android/view/WindowlessViewRoot.java | 16 | ||||
| -rw-r--r-- | core/java/android/view/WindowlessWindowManager.java | 33 |
2 files changed, 43 insertions, 6 deletions
diff --git a/core/java/android/view/WindowlessViewRoot.java b/core/java/android/view/WindowlessViewRoot.java index addf8e242e3d..68f2bde9c265 100644 --- a/core/java/android/view/WindowlessViewRoot.java +++ b/core/java/android/view/WindowlessViewRoot.java @@ -32,6 +32,14 @@ import android.os.IBinder; public class WindowlessViewRoot { private ViewRootImpl mViewRoot; private WindowlessWindowManager mWm; + + /** @hide */ + public WindowlessViewRoot(@NonNull Context c, @NonNull Display d, + @NonNull WindowlessWindowManager wwm) { + mWm = wwm; + mViewRoot = new ViewRootImpl(c, d, mWm); + } + public WindowlessViewRoot(@NonNull Context c, @NonNull Display d, @NonNull SurfaceControl rootSurface, @Nullable IBinder hostInputToken) { @@ -55,4 +63,12 @@ public class WindowlessViewRoot { public void dispose() { mViewRoot.dispatchDetachedFromWindow(); } + + /** + * Tell this viewroot to clean itself up. + * @hide + */ + public void die() { + mViewRoot.die(false /* immediate */); + } } diff --git a/core/java/android/view/WindowlessWindowManager.java b/core/java/android/view/WindowlessWindowManager.java index cf39979ff7f9..2ba09750b001 100644 --- a/core/java/android/view/WindowlessWindowManager.java +++ b/core/java/android/view/WindowlessWindowManager.java @@ -34,7 +34,7 @@ import java.util.HashMap; * By parcelling the root surface, the app can offer another app content for embedding. * @hide */ -class WindowlessWindowManager implements IWindowSession { +public class WindowlessWindowManager implements IWindowSession { private final static String TAG = "WindowlessWindowManager"; private class State { @@ -45,6 +45,7 @@ class WindowlessWindowManager implements IWindowSession { mParams.copyFrom(p); } }; + /** * Used to store SurfaceControl we've built for clients to * reconfigure them if relayout is called. @@ -67,13 +68,18 @@ class WindowlessWindowManager implements IWindowSession { private int mForceHeight = -1; private int mForceWidth = -1; - WindowlessWindowManager(Configuration c, SurfaceControl rootSurface, IBinder hostInputToken) { + public WindowlessWindowManager(Configuration c, SurfaceControl rootSurface, + IBinder hostInputToken) { mRootSurface = rootSurface; mConfiguration = new Configuration(c); mRealWm = WindowManagerGlobal.getWindowSession(); mHostInputToken = hostInputToken; } + protected void setConfiguration(Configuration configuration) { + mConfiguration.setTo(configuration); + } + /** * Utility API. */ @@ -125,6 +131,17 @@ class WindowlessWindowManager implements IWindowSession { @Override public void remove(android.view.IWindow window) throws RemoteException { mRealWm.remove(window); + State state; + synchronized (this) { + state = mStateForWindow.remove(window.asBinder()); + } + if (state == null) { + throw new IllegalArgumentException( + "Invalid window token (never added or removed already)"); + } + try (SurfaceControl.Transaction t = new SurfaceControl.Transaction()) { + t.remove(state.mSurfaceControl).apply(); + } } private boolean isOpaque(WindowManager.LayoutParams attrs) { @@ -165,10 +182,14 @@ class WindowlessWindowManager implements IWindowSession { int height = surfaceInsets != null ? attrs.height + surfaceInsets.top + surfaceInsets.bottom : attrs.height; - t.show(sc) - .setBufferSize(sc, width, height) - .setOpaque(sc, isOpaque(attrs)) - .apply(); + t.setBufferSize(sc, width, height) + .setOpaque(sc, isOpaque(attrs)); + if (viewFlags == View.VISIBLE) { + t.show(sc); + } else { + t.hide(sc); + } + t.apply(); outSurfaceControl.copyFrom(sc); outFrame.set(0, 0, attrs.width, attrs.height); |