Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5e957551 authored by Tony Wickham's avatar Tony Wickham
Browse files

Fix quick switching to any task that already appeared

Previously we did this for the last task that appeared, but didn't
take into account cases where multiple tasks had appeared during
the same gesture state. We handle that now.

Test:
- Quick switch to delayed task A, start new gesture, return to the
  first app after onTaskAppeared(A)
- Quick switch to delayed task A, start new gesture, wait for
  onTaskAppeared(A), then switch to delayed task B, start new
  gesture, wait for onTaskAppeared(B), and switch back to A
- Quick switch to delayed task A, start new gesture, wait for
  onTaskAppeared(A), then switch to delayed task B, start new
  gesture, wait for onTaskAppeared(B), and switch back to A and
  quickly back to original app (before settling on A)
Ensure task starts/resumes and is interactable in all cases.

Bug: 158588954
Change-Id: I647a6d015baa1d9b6d613e6c0e584589f35da54a
parent db087d3c
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -144,13 +144,14 @@ public abstract class BaseSwipeUpHandler<T extends StatefulActivity<?>, Q extend
                TaskView nextTask = mRecentsView.getTaskView(taskId);
                if (nextTask != null) {
                    mGestureState.updateLastStartedTaskId(taskId);
                    boolean hasTaskPreviouslyAppeared = mGestureState.getPreviouslyAppearedTaskIds()
                            .contains(taskId);
                    nextTask.launchTask(false /* animate */, true /* freezeTaskList */,
                            success -> {
                                resultCallback.accept(success);
                                if (success) {
                                    if (mRecentsView.indexOfChild(nextTask)
                                            == getLastAppearedTaskIndex()) {
                                        onRestartLastAppearedTask();
                                    if (hasTaskPreviouslyAppeared) {
                                        onRestartPreviouslyAppearedTask();
                                    }
                                } else {
                                    mActivityInterface.onLaunchTaskFailed();
@@ -171,7 +172,7 @@ public abstract class BaseSwipeUpHandler<T extends StatefulActivity<?>, Q extend
     * start A again to ensure it stays on top.
     */
    @CallSuper
    protected void onRestartLastAppearedTask() {
    protected void onRestartPreviouslyAppearedTask() {
        // Finish the controller here, since we won't get onTaskAppeared() for a task that already
        // appeared.
        if (mRecentsAnimationController != null) {
+2 −2
Original line number Diff line number Diff line
@@ -1097,8 +1097,8 @@ public abstract class BaseSwipeUpHandlerV2<T extends StatefulActivity<?>, Q exte
    }

    @Override
    protected void onRestartLastAppearedTask() {
        super.onRestartLastAppearedTask();
    protected void onRestartPreviouslyAppearedTask() {
        super.onRestartPreviouslyAppearedTask();
        reset();
    }

+2 −0
Original line number Diff line number Diff line
@@ -540,6 +540,8 @@ public class TouchInteractionService extends Service implements PluginListener<O
        if (mTaskAnimationManager.isRecentsAnimationRunning()) {
            gestureState.updateRunningTask(mGestureState.getRunningTask());
            gestureState.updateLastStartedTaskId(mGestureState.getLastStartedTaskId());
            gestureState.updatePreviouslyAppearedTaskIds(
                    mGestureState.getPreviouslyAppearedTaskIds());
        } else {
            gestureState.updateRunningTask(TraceHelper.whitelistIpcs("getRunningTask.0",
                    () -> mAM.getRunningTask(false /* filterOnlyVisibleRecents */)));
+15 −0
Original line number Diff line number Diff line
@@ -30,6 +30,8 @@ import com.android.systemui.shared.system.RemoteAnimationTargetCompat;

import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

/**
 * Manages the state for an active system gesture, listens for events from the system and Launcher,
@@ -128,6 +130,7 @@ public class GestureState implements RecentsAnimationCallbacks.RecentsAnimationL
    private ActivityManager.RunningTaskInfo mRunningTask;
    private GestureEndTarget mEndTarget;
    private RemoteAnimationTargetCompat mLastAppearedTaskTarget;
    private Set<Integer> mPreviouslyAppearedTaskIds = new HashSet<>();
    private int mLastStartedTaskId = -1;

    public GestureState(OverviewComponentObserver componentObserver, int gestureId) {
@@ -147,6 +150,7 @@ public class GestureState implements RecentsAnimationCallbacks.RecentsAnimationL
        mRunningTask = other.mRunningTask;
        mEndTarget = other.mEndTarget;
        mLastAppearedTaskTarget = other.mLastAppearedTaskTarget;
        mPreviouslyAppearedTaskIds = other.mPreviouslyAppearedTaskIds;
        mLastStartedTaskId = other.mLastStartedTaskId;
    }

@@ -234,6 +238,9 @@ public class GestureState implements RecentsAnimationCallbacks.RecentsAnimationL
     */
    public void updateLastAppearedTaskTarget(RemoteAnimationTargetCompat lastAppearedTaskTarget) {
        mLastAppearedTaskTarget = lastAppearedTaskTarget;
        if (lastAppearedTaskTarget != null) {
            mPreviouslyAppearedTaskIds.add(lastAppearedTaskTarget.taskId);
        }
    }

    /**
@@ -243,6 +250,14 @@ public class GestureState implements RecentsAnimationCallbacks.RecentsAnimationL
        return mLastAppearedTaskTarget != null ? mLastAppearedTaskTarget.taskId : -1;
    }

    public void updatePreviouslyAppearedTaskIds(Set<Integer> previouslyAppearedTaskIds) {
        mPreviouslyAppearedTaskIds = previouslyAppearedTaskIds;
    }

    public Set<Integer> getPreviouslyAppearedTaskIds() {
        return mPreviouslyAppearedTaskIds;
    }

    /**
     * Updates the last task that we started via startActivityFromRecents() during this gesture.
     */