summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/WindowlessViewRoot.java16
-rw-r--r--core/java/android/view/WindowlessWindowManager.java33
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);