diff options
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 5676f588fa24..a701d42986e3 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 79eb2c9ebe17..4fd31ff26b01 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<DisplayContent.DisplayChildWindowCo */ SurfaceControl mAppAnimationLayer = null; SurfaceControl mBoostedAppAnimationLayer = null; + SurfaceControl mHomeAppAnimationLayer = null; /** * Given that the split-screen divider does not have an AppWindowToken, it @@ -3552,6 +3553,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo int layer = 0; int layerForAnimationLayer = 0; int layerForBoostedAnimationLayer = 0; + int layerForHomeAnimationLayer = 0; for (int state = 0; state <= ALWAYS_ON_TOP_STATE; state++) { for (int i = 0; i < mChildren.size(); i++) { @@ -3578,6 +3580,9 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo layerForBoostedAnimationLayer = layer++; } } + if (state == HOME_STACK_STATE) { + layerForHomeAnimationLayer = layer++; + } } if (mAppAnimationLayer != null) { t.setLayer(mAppAnimationLayer, layerForAnimationLayer); @@ -3585,11 +3590,22 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo if (mBoostedAppAnimationLayer != null) { t.setLayer(mBoostedAppAnimationLayer, layerForBoostedAnimationLayer); } + if (mHomeAppAnimationLayer != null) { + t.setLayer(mHomeAppAnimationLayer, layerForHomeAnimationLayer); + } } @Override - SurfaceControl getAppAnimationLayer(boolean boosted) { - return boosted ? mBoostedAppAnimationLayer : mAppAnimationLayer; + SurfaceControl getAppAnimationLayer(@AnimationLayer int animationLayer) { + switch (animationLayer) { + case ANIMATION_LAYER_BOOSTED: + return mBoostedAppAnimationLayer; + case ANIMATION_LAYER_HOME: + return mHomeAppAnimationLayer; + case ANIMATION_LAYER_STANDARD: + default: + return mAppAnimationLayer; + } } SurfaceControl getSplitScreenDividerAnchor() { @@ -3606,12 +3622,16 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo mBoostedAppAnimationLayer = makeChildSurface(null) .setName("boostedAnimationLayer") .build(); + mHomeAppAnimationLayer = makeChildSurface(null) + .setName("homeAnimationLayer") + .build(); mSplitScreenDividerAnchor = makeChildSurface(null) .setName("splitScreenDividerAnchor") .build(); getPendingTransaction() .show(mAppAnimationLayer) .show(mBoostedAppAnimationLayer) + .show(mHomeAppAnimationLayer) .show(mSplitScreenDividerAnchor); scheduleAnimation(); } else { @@ -3619,6 +3639,8 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo mAppAnimationLayer = null; mBoostedAppAnimationLayer.destroy(); mBoostedAppAnimationLayer = null; + mHomeAppAnimationLayer.destroy(); + mHomeAppAnimationLayer = null; mSplitScreenDividerAnchor.destroy(); mSplitScreenDividerAnchor = null; } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 95223d84635a..f87538a2a890 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -564,7 +564,7 @@ class Task extends WindowContainer<AppWindowToken> { 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 60e7c0dadaf2..331a0bd3da11 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<E extends 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<E 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(boolean boosted) { + SurfaceControl getAppAnimationLayer(@AnimationLayer int animationLayer) { final WindowContainer parent = getParent(); if (parent != null) { - return parent.getAppAnimationLayer(boosted); + return parent.getAppAnimationLayer(animationLayer); } return null; } |