summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java17
-rw-r--r--services/core/java/com/android/server/wm/WindowContainer.java13
2 files changed, 28 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index d3acd716aed3..09be2b1ec947 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -1319,7 +1319,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
for (int i = 0; i < mChildren.size(); i++) {
SurfaceControl sc = mChildren.get(i).getSurfaceControl();
if (sc != null) {
- t.reparent(sc, mSurfaceControl);
+ t.reparent(sc, getParentingSurfaceControl());
}
}
@@ -5808,6 +5808,21 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
|| supportsSystemDecorations();
}
+ /**
+ * Returns the {@link SurfaceControl} where all the children should be parented on.
+ *
+ * <p> {@link DisplayContent} inserts a RootWrapper leash in the hierarchy above its original
+ * {@link #mSurfaceControl} and then overrides the {@link #mSurfaceControl} to point to the
+ * RootWrapper.
+ * <p> To prevent inconsistent state later where the DAs might get re-parented to the
+ * RootWrapper, this method should be used which returns the correct surface where the
+ * re-parenting should happen.
+ */
+ @Override
+ SurfaceControl getParentingSurfaceControl() {
+ return mWindowingLayer;
+ }
+
SurfaceControl getWindowingLayer() {
return mWindowingLayer;
}
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index fd0289edc84b..f2af852dfeed 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -716,7 +716,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
// If parent is null, the layer should be placed offscreen so reparent to null. Otherwise,
// set to the available parent.
- t.reparent(mSurfaceControl, mParent == null ? null : mParent.getSurfaceControl());
+ t.reparent(mSurfaceControl, mParent == null ? null : mParent.getParentingSurfaceControl());
if (mLastRelativeToLayer != null) {
t.setRelativeLayer(mSurfaceControl, mLastRelativeToLayer, mLastLayer);
@@ -2907,6 +2907,17 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
}
/**
+ * Returns the {@link SurfaceControl} where all the children should be parented on.
+ *
+ * A {@link WindowContainer} might insert intermediate leashes in the hierarchy and hence
+ * {@link #getSurfaceControl} won't return the correct surface where the children should be
+ * re-parented on.
+ */
+ SurfaceControl getParentingSurfaceControl() {
+ return getSurfaceControl();
+ }
+
+ /**
* Use this method instead of {@link #getPendingTransaction()} if the Transaction should be
* synchronized with the client.
*