From be4182939fc414adaa54cb1fd9b5185e83d64579 Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Mon, 26 Mar 2018 16:14:12 +0200 Subject: [PATCH] Fix issues with z-ordering during animations - Make sure to use DC pending transaction when updating z-layers, as it could lead to reordering of z-order assignment due to how we apply pending transactions in the hierarchy - Create a separate boosted animation layer in which AWT with zOrder=top animate, which happens above all stack. This brings back the boosting logic in O without boosting non-boosted stack above non-animating tokens Bug: 70730519 Bug: 72649981 Bug: 72686618 Bug: 37953606 Test: Share link from Chrome to Clipboard, make sure disappear animation happens properly Test: go/wm-smoke Change-Id: I3957daac76b991402bf3f520c4a3d3f519933f72 --- .../com/android/server/wm/AppWindowToken.java | 6 ++++- .../com/android/server/wm/DisplayContent.java | 23 +++++++++++++++---- .../android/server/wm/WindowContainer.java | 7 ++++-- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 85436da8dab71..56c9e51d5d3a8 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -1660,6 +1660,10 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree true /* topToBottom */); } + SurfaceControl getAppAnimationLayer() { + return getAppAnimationLayer(needsZBoost()); + } + @Override public SurfaceControl getAnimationLeashParent() { // All normal app transitions take place in an animation layer which is below the pinned @@ -1855,7 +1859,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree leash.setLayer(layer); final DisplayContent dc = getDisplayContent(); - dc.assignStackOrdering(t); + dc.assignStackOrdering(); if (mAnimatingAppWindowTokenRegistry != null) { mAnimatingAppWindowTokenRegistry.notifyStarting(this); } diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 3e47ea6411234..3c5fa146b593b 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -3172,6 +3172,7 @@ class DisplayContent extends WindowContainer extends ConfigurationContainer< } /** + * @param boosted If true, returns an animation layer that happens above all {@link TaskStack}s + * Otherwise, the layer will be positioned above all animating + * {@link TaskStack}s. * @return The layer on which all app animations are happening. */ - SurfaceControl getAppAnimationLayer() { + SurfaceControl getAppAnimationLayer(boolean boosted) { final WindowContainer parent = getParent(); if (parent != null) { - return parent.getAppAnimationLayer(); + return parent.getAppAnimationLayer(boosted); } return null; }