From 848544b4adbd8eca073b56020b37bf5502534a99 Mon Sep 17 00:00:00 2001 From: wilsonshih Date: Wed, 10 May 2023 15:08:03 +0800 Subject: [PATCH] Allow WindowState to assign layer during transition. But don't build the layer info into finish transaction. So when an Activity contains multiple WindowState, the layers can be update according to the hierarchy order. Keeps the layers as zero can confuse surface flinger. Also this shouldn't affect transition since window state won't participat transition directly. Bug: 270906945 Bug: 275459505 Test: manual, launch app and monitor the z order of windows can change during transition animation. Change-Id: I10daa1c4d9403dc29e5c740670d43a7590f647c0 --- .../com/android/server/wm/TransitionController.java | 10 ++++++++-- .../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 b697ab1580030..f95e937382c87 100644 --- a/services/core/java/com/android/server/wm/TransitionController.java +++ b/services/core/java/com/android/server/wm/TransitionController.java @@ -503,8 +503,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 be5f141b3762a..0152666a830dd 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 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);