diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/TransitionController.java | 10 | ||||
| -rw-r--r-- | services/core/java/com/android/server/wm/WindowContainer.java | 2 |
2 files changed, 9 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/wm/TransitionController.java b/services/core/java/com/android/server/wm/TransitionController.java index e228e7ef056a..1c6a412e5450 100644 --- a/services/core/java/com/android/server/wm/TransitionController.java +++ b/services/core/java/com/android/server/wm/TransitionController.java @@ -516,8 +516,14 @@ class TransitionController { * playing, but can be "opened-up" for certain transition operations like calculating layers * for finishTransaction. */ - boolean canAssignLayers() { - return mBuildingFinishLayers || !isPlaying(); + boolean canAssignLayers(@NonNull WindowContainer wc) { + // Don't build window state into finish transaction in case another window is added or + // removed during transition playing. + if (mBuildingFinishLayers) { + return wc.asWindowState() == null; + } + // Always allow WindowState to assign layers since it won't affect transition. + return wc.asWindowState() != null || !isPlaying(); } @WindowConfiguration.WindowingMode diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index be5f141b3762..0152666a830d 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -2596,7 +2596,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< void assignLayer(Transaction t, int layer) { // Don't assign layers while a transition animation is playing // TODO(b/173528115): establish robust best-practices around z-order fighting. - if (!mTransitionController.canAssignLayers()) return; + if (!mTransitionController.canAssignLayers(this)) return; final boolean changed = layer != mLastLayer || mLastRelativeToLayer != null; if (mSurfaceControl != null && changed) { setLayer(t, layer); |