diff options
3 files changed, 36 insertions, 21 deletions
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index ce3f512deccf..8155656cd5f4 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -1766,6 +1766,9 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree layer += Z_BOOST_BASE; } leash.setLayer(layer); + + final DisplayContent dc = getDisplayContent(); + dc.assignStackOrdering(t); } /** diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index bd3f302db462..6eeebbac2c52 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -3531,39 +3531,47 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo @Override void assignChildLayers(SurfaceControl.Transaction t) { + assignStackOrdering(t); + for (int i = 0; i < mChildren.size(); i++) { + final TaskStack s = mChildren.get(i); + s.assignChildLayers(t); + } + } + + void assignStackOrdering(SurfaceControl.Transaction t) { final int HOME_STACK_STATE = 0; final int NORMAL_STACK_STATE = 1; final int ALWAYS_ON_TOP_STATE = 2; int layer = 0; + int layerForAnimationLayer = 0; + for (int state = 0; state <= ALWAYS_ON_TOP_STATE; state++) { for (int i = 0; i < mChildren.size(); i++) { final TaskStack s = mChildren.get(i); - if (state == HOME_STACK_STATE && s.isActivityTypeHome()) { - s.assignLayer(t, layer++); - } else if (state == NORMAL_STACK_STATE && !s.isActivityTypeHome() - && !s.isAlwaysOnTop()) { - s.assignLayer(t, layer++); - if (s.inSplitScreenWindowingMode() && mSplitScreenDividerAnchor != null) { - t.setLayer(mSplitScreenDividerAnchor, layer++); - } - } else if (state == ALWAYS_ON_TOP_STATE && s.isAlwaysOnTop()) { - s.assignLayer(t, layer++); + if (state == HOME_STACK_STATE && !s.isActivityTypeHome()) { + continue; + } else if (state == NORMAL_STACK_STATE && (s.isActivityTypeHome() + || s.isAlwaysOnTop())) { + continue; + } else if (state == ALWAYS_ON_TOP_STATE && !s.isAlwaysOnTop()) { + continue; + } + s.assignLayer(t, layer++); + if (s.inSplitScreenWindowingMode() && mSplitScreenDividerAnchor != null) { + t.setLayer(mSplitScreenDividerAnchor, layer++); + } + if (s.isSelfOrChildAnimating()) { + // Ensure the animation layer ends up above the + // highest animating stack and no higher. + layerForAnimationLayer = layer++; } - } - // The appropriate place for App-Transitions to occur is right - // above all other animations but still below things in the Picture-and-Picture - // windowing mode. - if (state == NORMAL_STACK_STATE && mAppAnimationLayer != null) { - t.setLayer(mAppAnimationLayer, layer++); } } - for (int i = 0; i < mChildren.size(); i++) { - final TaskStack s = mChildren.get(i); - s.assignChildLayers(t); + if (mAppAnimationLayer != null) { + t.setLayer(mAppAnimationLayer, layerForAnimationLayer); } - } @Override @@ -3876,4 +3884,8 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } super.prepareSurfaces(); } + + void assignStackOrdering(SurfaceControl.Transaction t) { + mTaskStackContainers.assignStackOrdering(t); + } } diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 6bd7f22a4a4c..1f7caffd1916 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -1142,7 +1142,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< scheduleAnimation(); } - private void reassignLayer(Transaction t) { + void reassignLayer(Transaction t) { final WindowContainer parent = getParent(); if (parent != null) { parent.assignChildLayers(t); |