From 7114215648b5d27a23648458a6b5b476bdf8f7d9 Mon Sep 17 00:00:00 2001 From: Issei Suzuki Date: Thu, 15 Aug 2019 14:39:40 +0200 Subject: [PATCH] Stop reparenting surfaces during app transtion animation. This is a first step to restructure the app transition, and the change is behind the flag persist.wm.new_transit_animations. Bug: 131661052 Change-Id: I9a23440c6c5d28ea937121e95985b3bd6f3cc451 Test: No-op for production. Pass existing tests. --- .../com/android/server/wm/AppWindowToken.java | 14 +++++++++----- .../core/java/com/android/server/wm/Task.java | 3 +++ .../android/server/wm/WindowManagerService.java | 16 ++++++++++++++++ 3 files changed, 28 insertions(+), 5 deletions(-) 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 8d3a107c2f253..774c6e708c79a 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -376,6 +376,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})