From 39179062c5a0b8cde180344f7370ebb40e7851d1 Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Wed, 18 Apr 2018 15:30:44 +0200 Subject: [PATCH] Animate home in separate layer Such that it always stays at the bottom. Test: Open app in split-screen Test: go/wm-smoke Change-Id: If713c6c04e6616ff04d8475ea2da0241ed863628 Fixes: 77144130 --- .../com/android/server/wm/AppWindowToken.java | 4 ++- .../com/android/server/wm/DisplayContent.java | 26 +++++++++++++++-- .../core/java/com/android/server/wm/Task.java | 2 +- .../android/server/wm/WindowContainer.java | 28 +++++++++++++++---- 4 files changed, 51 insertions(+), 9 deletions(-) diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 5676f588fa249..a701d42986e34 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -1662,7 +1662,9 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree } SurfaceControl getAppAnimationLayer() { - return getAppAnimationLayer(needsZBoost()); + return getAppAnimationLayer(isActivityTypeHome() ? ANIMATION_LAYER_HOME + : needsZBoost() ? ANIMATION_LAYER_BOOSTED + : ANIMATION_LAYER_STANDARD); } @Override diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 79eb2c9ebe170..4fd31ff26b016 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -3190,6 +3190,7 @@ class DisplayContent extends WindowContainer { public SurfaceControl getAnimationLeashParent() { // Reparent to the animation layer so that we aren't clipped by the non-minimized // stack bounds, currently we only animate the task for the recents animation - return getAppAnimationLayer(false /* boosted */); + return getAppAnimationLayer(ANIMATION_LAYER_STANDARD); } boolean isTaskAnimating() { diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 60e7c0dadaf2f..331a0bd3da11c 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -29,6 +29,8 @@ import static com.android.server.wm.WindowContainerProto.SURFACE_ANIMATOR; import static com.android.server.wm.WindowContainerProto.VISIBLE; import android.annotation.CallSuper; +import android.annotation.IntDef; +import android.app.WindowConfiguration; import android.content.res.Configuration; import android.graphics.Point; import android.graphics.Rect; @@ -60,6 +62,25 @@ class WindowContainer extends ConfigurationContainer< private static final String TAG = TAG_WITH_CLASS_NAME ? "WindowContainer" : TAG_WM; + /** Animation layer that happens above all animating {@link TaskStack}s. */ + static final int ANIMATION_LAYER_STANDARD = 0; + + /** Animation layer that happens above all {@link TaskStack}s. */ + static final int ANIMATION_LAYER_BOOSTED = 1; + + /** + * Animation layer that is reserved for {@link WindowConfiguration#ACTIVITY_TYPE_HOME} + * activities that happens below all {@link TaskStack}s. + */ + static final int ANIMATION_LAYER_HOME = 2; + + @IntDef(prefix = { "ANIMATION_LAYER_" }, value = { + ANIMATION_LAYER_STANDARD, + ANIMATION_LAYER_BOOSTED, + ANIMATION_LAYER_HOME, + }) + @interface AnimationLayer {} + static final int POSITION_TOP = Integer.MAX_VALUE; static final int POSITION_BOTTOM = Integer.MIN_VALUE; @@ -1125,15 +1146,12 @@ class 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(boolean boosted) { + SurfaceControl getAppAnimationLayer(@AnimationLayer int animationLayer) { final WindowContainer parent = getParent(); if (parent != null) { - return parent.getAppAnimationLayer(boosted); + return parent.getAppAnimationLayer(animationLayer); } return null; }