diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index ffd9021989b46..93b8f0022f79e 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -2503,14 +2503,18 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree @Override public SurfaceControl getAnimationLeashParent() { - // All normal app transitions take place in an animation layer which is below the pinned - // stack but may be above the parent stacks of the given animating apps. // For transitions in the pinned stack (menu activity) we just let them occur as a child // of the pinned stack. - if (!inPinnedWindowingMode()) { - return getAppAnimationLayer(); - } else { + // All normal app transitions take place in an animation layer which is below the pinned + // stack but may be above the parent stacks of the given animating apps by default. When + // a new hierarchical animation is enabled, we just let them occur as a child of the parent + // stack, i.e. the hierarchy of the surfaces is unchanged. + if (inPinnedWindowingMode()) { return getStack().getSurfaceControl(); + } else if (WindowManagerService.sHierarchicalAnimations) { + return super.getAnimationLeashParent(); + } else { + return getAppAnimationLayer(); } } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 3a2eb57f1d80b..762066c1f80ab 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -613,6 +613,9 @@ class Task extends WindowContainer implements ConfigurationConta @Override public SurfaceControl getAnimationLeashParent() { + if (!WindowManagerService.sHierarchicalAnimations) { + return super.getAnimationLeashParent(); + } // Currently, only the recents animation will create animation leashes for tasks. In this // case, reparent the task to the home animation layer while it is being animated to allow // the home activity to reorder the app windows relative to its own. diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 607a013abc510..1ebaa5da5befc 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -375,6 +375,22 @@ public class WindowManagerService extends IWindowManager.Stub // trying to apply a new one. private static final boolean ALWAYS_KEEP_CURRENT = true; + /** + * If set, new app transition framework which supports setting animation on any element + * in a surface is used. + *

+ * Only set this to non-zero once the new app transition framework is productionalized. + *

+ */ + private static final String HIERARCHICAL_ANIMATIONS_PROPERTY = + "persist.wm.hierarchical_animations"; + + /** + * @see #HIERARCHICAL_ANIMATIONS_PROPERTY + */ + static boolean sHierarchicalAnimations = + SystemProperties.getBoolean(HIERARCHICAL_ANIMATIONS_PROPERTY, false); + // Enums for animation scale update types. @Retention(RetentionPolicy.SOURCE) @IntDef({WINDOW_ANIMATION_SCALE, TRANSITION_ANIMATION_SCALE, ANIMATION_DURATION_SCALE})