From a8fe8b448e79677c10e5784b66168ba08b3a9fd2 Mon Sep 17 00:00:00 2001 From: wilsonshih Date: Thu, 10 Feb 2022 18:00:06 +0800 Subject: [PATCH] Cancel recents animation when touch home key(2/2) There should send an opening task transition to remote transition handler to finish the recents animation. For now there is no opening transition send to Shell because the exist home activity won't be collected while start home activity. To collect the home activity, do not set transient launch when start recents animation if the top activity is home, so the home activity would be paused. Then when user touch home key to cancel recents, the home activity will be resumed so it can be collect to the transition. When receive opening home activity while recents is running, enter home and dismiss recents. Bug: 207297486 Test: 1. Enable shell transition. 2. Setup 3rd-party launcher as default home. 3. Entering Recents from home. 4. "adb shell input keyevent KEYCODE_HOME", verify recents animation will be dismissed. Test: atest NexusLauncherTests:com.android.quickstep.FallbackRecentsTest Change-Id: I689032d1fa18aa9a923aaf89077dbd73c09721b7 --- .../quickstep/TaskAnimationManager.java | 36 +++++++++++++++---- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/quickstep/src/com/android/quickstep/TaskAnimationManager.java b/quickstep/src/com/android/quickstep/TaskAnimationManager.java index 5e298f4b8d..783c868a19 100644 --- a/quickstep/src/com/android/quickstep/TaskAnimationManager.java +++ b/quickstep/src/com/android/quickstep/TaskAnimationManager.java @@ -44,7 +44,7 @@ import com.android.systemui.shared.system.RemoteTransitionCompat; import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.shared.system.TaskStackChangeListeners; -import java.util.Arrays; +import java.util.ArrayList; import java.util.HashMap; public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAnimationListener { @@ -156,12 +156,26 @@ public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAn RemoteAnimationTargetCompat appearedTaskTarget = appearedTaskTargets[0]; BaseActivityInterface activityInterface = mLastGestureState.getActivityInterface(); // Convert appTargets to type RemoteAnimationTarget for all apps except Home app - RemoteAnimationTarget[] nonHomeApps = Arrays.stream(appearedTaskTargets) - .filter(remoteAnimationTarget -> - remoteAnimationTarget.activityType != ACTIVITY_TYPE_HOME) + final ArrayList tmpNonHomeApps = new ArrayList<>(); + final ArrayList tmpHomeApps = new ArrayList<>(); + for (RemoteAnimationTargetCompat compat : appearedTaskTargets) { + if (compat.activityType != ACTIVITY_TYPE_HOME) { + tmpNonHomeApps.add(compat); + } else { + tmpHomeApps.add(compat); + } + } + RemoteAnimationTarget[] nonHomeApps = tmpNonHomeApps.stream() .map(RemoteAnimationTargetCompat::unwrap) .toArray(RemoteAnimationTarget[]::new); - + RemoteAnimationTarget[] homeApps = tmpHomeApps.stream() + .map(RemoteAnimationTargetCompat::unwrap) + .toArray(RemoteAnimationTarget[]::new); + if (homeApps.length > 0 + && activityInterface.getCreatedActivity() instanceof RecentsActivity) { + ((RecentsActivity) activityInterface.getCreatedActivity()).startHome(); + return; + } RemoteAnimationTarget[] nonAppTargets = SystemUiProxy.INSTANCE.getNoCreate() .onGoingToRecentsLegacy(false, nonHomeApps); @@ -198,8 +212,16 @@ public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAn RemoteTransitionCompat transition = new RemoteTransitionCompat(mCallbacks, mController != null ? mController.getController() : null, mCtx.getIApplicationThread()); - final ActivityOptions options = ActivityOptionsCompat.makeRemoteTransition(transition) - .setTransientLaunch(); + final ActivityOptions options = ActivityOptionsCompat.makeRemoteTransition(transition); + // Allowing to pause Home if Home is top activity and Recents is not Home. So when user + // start home when recents animation is playing, the home activity can be resumed again + // to let the transition controller collect Home activity. + ActivityManager.RunningTaskInfo rti = gestureState.getRunningTask(); + boolean homeIsOnTop = rti != null && rti.topActivity != null + && rti.topActivity.equals(gestureState.getHomeIntent().getComponent()); + if (!homeIsOnTop) { + options.setTransientLaunch(); + } options.setSourceInfo(ActivityOptions.SourceInfo.TYPE_RECENTS_ANIMATION, eventTime); UI_HELPER_EXECUTOR.execute(() -> mCtx.startActivity(intent, options.toBundle())); } else {