From 363ab98fced07bf7647355367be9e6ef76751450 Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Tue, 26 Apr 2016 19:51:20 -0700 Subject: [PATCH] Fix regression with docking from recents transition Because we move the task to the front in startRecentsActivity, we always overrode the app transition type. Instead, we should remove this logic and keep a flag whether the animation was prolonging was finished already. If it was finished already, don't start the prolonging when starting the transition. Bug: 27154882 Change-Id: I1cd9e323867726ebd4b131ed5c13c3834d0f1107 --- .../com/android/server/wm/AppTransition.java | 27 +++++++++++++------ .../server/wm/WindowManagerService.java | 1 + .../server/wm/WindowSurfacePlacer.java | 4 --- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java index 9199d10aa5754..094b217aafa03 100644 --- a/services/core/java/com/android/server/wm/AppTransition.java +++ b/services/core/java/com/android/server/wm/AppTransition.java @@ -39,6 +39,7 @@ import static com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpe import static com.android.internal.R.styleable.WindowAnimation_wallpaperIntraOpenExitAnimation; import static com.android.internal.R.styleable.WindowAnimation_wallpaperOpenEnterAnimation; import static com.android.internal.R.styleable.WindowAnimation_wallpaperOpenExitAnimation; +import static com.android.server.wm.AppWindowAnimator.PROLONG_ANIMATION_AT_START; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; @@ -228,6 +229,7 @@ public class AppTransition implements Dump { private int mLastClipRevealMaxTranslation; private boolean mLastHadClipReveal; + private boolean mProlongedAnimationsEnded; AppTransition(Context context, WindowManagerService service) { mContext = context; @@ -371,6 +373,22 @@ public class AppTransition implements Dump { topClosingAppAnimator != null ? topClosingAppAnimator.animation : null); mService.getDefaultDisplayContentLocked().getDockedDividerController() .notifyAppTransitionStarting(openingApps, closingApps); + + // Prolong the start for the transition when docking a task from recents, unless recents + // ended it already then we don't need to wait. + if (mNextAppTransition == TRANSIT_DOCK_TASK_FROM_RECENTS && !mProlongedAnimationsEnded) { + for (int i = openingApps.size() - 1; i >= 0; i--) { + final AppWindowAnimator appAnimator = openingApps.valueAt(i).mAppAnimator; + appAnimator.startProlongAnimation(PROLONG_ANIMATION_AT_START); + } + } + } + + /** + * Let the transitions manager know that the somebody wanted to end the prolonged animations. + */ + void notifyProlongedAnimationsEnded() { + mProlongedAnimationsEnded = true; } void clear() { @@ -380,6 +398,7 @@ public class AppTransition implements Dump { mNextAppTransitionAnimationsSpecsFuture = null; mDefaultNextAppTransitionAnimationSpec = null; mAnimationFinishedCallback = null; + mProlongedAnimationsEnded = false; } void freeze() { @@ -1914,14 +1933,6 @@ public class AppTransition implements Dump { setAppTransition(transit); } } - if (transit != TRANSIT_DOCK_TASK_FROM_RECENTS - && mNextAppTransition == TRANSIT_DOCK_TASK_FROM_RECENTS) { - - // Somebody is trying to start another transition while we are waiting for the docking - // window to be drawn. Because TRANSIT_DOCK_TASK_FROM_RECENTS starts prolonged - // animations, we need to override it or our prolonged animations will never be ended. - setAppTransition(transit); - } boolean prepared = prepare(); if (isTransitionSet()) { mService.mH.removeMessages(H.APP_TRANSITION_TIMEOUT); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 534c661d0618e..1bd8c3253d681 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -3944,6 +3944,7 @@ public class WindowManagerService extends IWindowManager.Stub appToken.mAppAnimator.endProlongedAnimation(); } } + mAppTransition.notifyProlongedAnimationsEnded(); } } diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java index 8937f09d37ac2..a45ae60026920 100644 --- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java +++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java @@ -1251,10 +1251,6 @@ class WindowSurfacePlacer { if (mService.mAppTransition.isNextAppTransitionThumbnailUp()) { createThumbnailAppAnimator(transit, wtoken, topOpeningLayer, topClosingLayer); } - if (mService.mAppTransition.getAppTransition() - == AppTransition.TRANSIT_DOCK_TASK_FROM_RECENTS) { - appAnimator.startProlongAnimation(PROLONG_ANIMATION_AT_START); - } } return topOpeningApp; }