diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/DisplayContent.java | 17 | ||||
| -rw-r--r-- | services/core/java/com/android/server/wm/WindowContainer.java | 13 |
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. * |