summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/TransitionController.java10
-rw-r--r--services/core/java/com/android/server/wm/WindowContainer.java2
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);