summaryrefslogtreecommitdiff
path: root/core/java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java')
-rw-r--r--core/java/android/view/SurfaceControlViewHost.java20
-rw-r--r--core/java/android/view/ViewRootImpl.java4
-rw-r--r--core/java/android/view/WindowManagerGlobal.java36
3 files changed, 56 insertions, 4 deletions
diff --git a/core/java/android/view/SurfaceControlViewHost.java b/core/java/android/view/SurfaceControlViewHost.java
index 7e0d887a8f79..3fb0fe7ff047 100644
--- a/core/java/android/view/SurfaceControlViewHost.java
+++ b/core/java/android/view/SurfaceControlViewHost.java
@@ -27,8 +27,10 @@ import android.os.IBinder;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.RemoteException;
+import android.util.Log;
import android.view.accessibility.IAccessibilityEmbeddedConnection;
import android.view.InsetsState;
+import android.view.WindowManagerGlobal;
import java.util.Objects;
@@ -43,11 +45,13 @@ import java.util.Objects;
* {@link SurfaceView#setChildSurfacePackage}.
*/
public class SurfaceControlViewHost {
+ private final static String TAG = "SurfaceControlViewHost";
private final ViewRootImpl mViewRoot;
private WindowlessWindowManager mWm;
private SurfaceControl mSurfaceControl;
private IAccessibilityEmbeddedConnection mAccessibilityEmbeddedConnection;
+ private boolean mReleased = false;
private final class ISurfaceControlViewHostImpl extends ISurfaceControlViewHost.Stub {
@Override
@@ -268,6 +272,8 @@ public class SurfaceControlViewHost {
@NonNull WindowlessWindowManager wwm, boolean useSfChoreographer) {
mWm = wwm;
mViewRoot = new ViewRootImpl(c, d, mWm, useSfChoreographer);
+ WindowManagerGlobal.getInstance().addWindowlessRoot(mViewRoot);
+
mAccessibilityEmbeddedConnection = mViewRoot.getAccessibilityEmbeddedConnection();
}
@@ -292,7 +298,10 @@ public class SurfaceControlViewHost {
.build();
mWm = new WindowlessWindowManager(context.getResources().getConfiguration(),
mSurfaceControl, hostToken);
+
mViewRoot = new ViewRootImpl(context, display, mWm);
+ WindowManagerGlobal.getInstance().addWindowlessRoot(mViewRoot);
+
mAccessibilityEmbeddedConnection = mViewRoot.getAccessibilityEmbeddedConnection();
}
@@ -301,12 +310,15 @@ public class SurfaceControlViewHost {
*/
@Override
protected void finalize() throws Throwable {
- // We aren't on the UI thread here so we need to pass false to
- // doDie
+ if (mReleased) {
+ return;
+ }
+ Log.e(TAG, "SurfaceControlViewHost finalized without being released: " + this);
+ // We aren't on the UI thread here so we need to pass false to doDie
mViewRoot.die(false /* immediate */);
+ WindowManagerGlobal.getInstance().removeWindowlessRoot(mViewRoot);
}
-
/**
* Return a SurfacePackage for the root SurfaceControl of the embedded hierarchy.
* Rather than be directly reparented using {@link SurfaceControl.Transaction} this
@@ -413,5 +425,7 @@ public class SurfaceControlViewHost {
public void release() {
// ViewRoot will release mSurfaceControl for us.
mViewRoot.die(true /* immediate */);
+ WindowManagerGlobal.getInstance().removeWindowlessRoot(mViewRoot);
+ mReleased = true;
}
}
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index d4dafbd7b137..b457ff3d7bc3 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -10855,4 +10855,8 @@ public final class ViewRootImpl implements ViewParent,
mLastGivenInsets.reset();
requestLayout();
}
+
+ IWindowSession getWindowSession() {
+ return mWindowSession;
+ }
}
diff --git a/core/java/android/view/WindowManagerGlobal.java b/core/java/android/view/WindowManagerGlobal.java
index c92a3a086a8b..93cb0dd7a234 100644
--- a/core/java/android/view/WindowManagerGlobal.java
+++ b/core/java/android/view/WindowManagerGlobal.java
@@ -159,6 +159,8 @@ public final class WindowManagerGlobal {
new ArrayList<WindowManager.LayoutParams>();
private final ArraySet<View> mDyingViews = new ArraySet<View>();
+ private final ArrayList<ViewRootImpl> mWindowlessRoots = new ArrayList<ViewRootImpl>();
+
private Runnable mSystemPropertyUpdater;
private WindowManagerGlobal() {
@@ -387,7 +389,25 @@ public final class WindowManagerGlobal {
}
}
- root = new ViewRootImpl(view.getContext(), display);
+ IWindowSession windowlessSession = null;
+ // If there is a parent set, but we can't find it, it may be coming
+ // from a SurfaceControlViewHost hierarchy.
+ if (wparams.token != null && panelParentView == null) {
+ for (int i = 0; i < mWindowlessRoots.size(); i++) {
+ ViewRootImpl maybeParent = mWindowlessRoots.get(i);
+ if (maybeParent.getWindowToken() == wparams.token) {
+ windowlessSession = maybeParent.getWindowSession();
+ break;
+ }
+ }
+ }
+
+ if (windowlessSession == null) {
+ root = new ViewRootImpl(view.getContext(), display);
+ } else {
+ root = new ViewRootImpl(view.getContext(), display,
+ windowlessSession);
+ }
view.setLayoutParams(wparams);
@@ -720,6 +740,20 @@ public final class WindowManagerGlobal {
throw e.rethrowFromSystemServer();
}
}
+
+ /** @hide */
+ public void addWindowlessRoot(ViewRootImpl impl) {
+ synchronized (mLock) {
+ mWindowlessRoots.add(impl);
+ }
+ }
+
+ /** @hide */
+ public void removeWindowlessRoot(ViewRootImpl impl) {
+ synchronized (mLock) {
+ mWindowlessRoots.remove(impl);
+ }
+ }
}
final class WindowLeaked extends AndroidRuntimeException {