From 8ecfc6b2df23c067fb6996e87aeedad2b48e3cbf Mon Sep 17 00:00:00 2001 From: Daichi Hirono Date: Tue, 18 Feb 2020 16:28:03 +0900 Subject: [PATCH] Fix getAnimationTargets so that it returns valid animation target AppTransitionController#getAnimationTargets traverse ancestors of activity to find animation targets. Previously it can reach DisplayContent#mWindowContainers which does not inherit WindowContainer#createRemoteAnimationTarget thus cannot be a remote animation target. After this CL, getAnimationTargets stops traversing if it reaches WindowContainer which cannot be a remote animation target. Bug: 149716548 Test: None Change-Id: Ie94ab8ecd35e9dcc28d0b8f7aaeb058e15b0f80b --- services/core/java/com/android/server/wm/ActivityRecord.java | 5 +++++ .../java/com/android/server/wm/AppTransitionController.java | 2 +- services/core/java/com/android/server/wm/Task.java | 5 +++++ .../core/java/com/android/server/wm/WindowContainer.java | 4 ++++ 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 76bc36620c850..94a43a426fc69 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -7568,6 +7568,11 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A record.mStartBounds); } + @Override + boolean canCreateRemoteAnimationTarget() { + return true; + } + @Override void getAnimationFrames(Rect outFrame, Rect outInsets, Rect outStableInsets, Rect outSurfaceInsets) { diff --git a/services/core/java/com/android/server/wm/AppTransitionController.java b/services/core/java/com/android/server/wm/AppTransitionController.java index 0912b2e8b52f0..6a47c9e217f84 100644 --- a/services/core/java/com/android/server/wm/AppTransitionController.java +++ b/services/core/java/com/android/server/wm/AppTransitionController.java @@ -446,7 +446,7 @@ public class AppTransitionController { siblings.add(current); boolean canPromote = true; - if (parent == null) { + if (parent == null || !parent.canCreateRemoteAnimationTarget()) { canPromote = false; } else { // In case a descendant of the parent belongs to the other group, we cannot promote diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 27acb2356585b..ba3db3a3cfe1a 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -3087,6 +3087,11 @@ class Task extends WindowContainer { return activity != null ? activity.createRemoteAnimationTarget(record) : null; } + @Override + boolean canCreateRemoteAnimationTarget() { + return true; + } + WindowState getTopVisibleAppMainWindow() { final ActivityRecord activity = getTopVisibleActivity(); return activity != null ? activity.findMainWindow() : null; diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index a0a70dc6a1d76..36c5262b833f8 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -2186,6 +2186,10 @@ class WindowContainer extends ConfigurationContainer< return null; } + boolean canCreateRemoteAnimationTarget() { + return false; + } + boolean okToDisplay() { final DisplayContent dc = getDisplayContent(); return dc != null && dc.okToDisplay();