From ae5517e9a4d49c5ff27fc9a96863d31d760fd85d Mon Sep 17 00:00:00 2001 From: Alexandre Elias Date: Mon, 15 Feb 2021 00:39:19 -0800 Subject: [PATCH] Fix transition animation when going back twice The logic in ag/5108931 was intended to suppress the next return animation if it would cross a task boundary, while preserving return animations in all other cases. However, it accidentally caused excessive suppressions in the case of repeated back button presses. The reason is that although the sending activity is indeed only topOfTask when moving forward cross-task, it's *always* topOfTask when pressing back, so the state of the sending activity doesn't contain sufficient information to feed this logic. This patch changes to suppress when the receiving activity is task root, which is a more direct and reliable signal. (By definition, the return transition from an activity will cross a task boundary if and only if it's the task root.) Fixes: 177780499 Test: New test in ag/13593522 Change-Id: Ia5751da6122dc1ddb557f45318712185fa0b3df9 --- core/java/android/app/EnterTransitionCoordinator.java | 6 +++++- core/java/android/app/ExitTransitionCoordinator.java | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/core/java/android/app/EnterTransitionCoordinator.java b/core/java/android/app/EnterTransitionCoordinator.java index 96751dba04f4d..033cffe38069a 100644 --- a/core/java/android/app/EnterTransitionCoordinator.java +++ b/core/java/android/app/EnterTransitionCoordinator.java @@ -52,6 +52,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { private boolean mSharedElementTransitionStarted; private Activity mActivity; + private boolean mIsTaskRoot; private boolean mHasStopped; private boolean mIsCanceled; private ObjectAnimator mBackgroundAnimator; @@ -252,7 +253,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { cancel(); break; case MSG_ALLOW_RETURN_TRANSITION: - if (!mIsCanceled) { + if (!mIsCanceled && !mIsTaskRoot) { mPendingExitNames = mAllSharedElementNames; } break; @@ -343,6 +344,9 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { if (mActivity == null || decorView == null) { return; } + + mIsTaskRoot = mActivity.isTaskRoot(); + if (!isCrossTask()) { mActivity.overridePendingTransition(0, 0); } diff --git a/core/java/android/app/ExitTransitionCoordinator.java b/core/java/android/app/ExitTransitionCoordinator.java index f7097fab6b9ec..cd84e56717533 100644 --- a/core/java/android/app/ExitTransitionCoordinator.java +++ b/core/java/android/app/ExitTransitionCoordinator.java @@ -551,7 +551,7 @@ public class ExitTransitionCoordinator extends ActivityTransitionCoordinator { @Override public boolean isReturnTransitionAllowed() { - return !mActivity.isTopOfTask(); + return true; } @Override