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

Commit e8836dc0 authored by Tony Wickham's avatar Tony Wickham
Browse files

Gracefully handle failed task launches during quick switch

When quick switching from home or overview, go to OverviewState if the
task launch failed. Otherwise we get stuck in BackgroundAppState.

Bug: 135038270
Change-Id: I42785c261cef0df95666bc106ec5ca6ef0553cc7
parent 6129e473
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -61,4 +61,9 @@ public abstract class GoActivityControlHelper<T extends BaseDraggingActivity> im
        // Go does not support live tiles.
        return false;
    }

    @Override
    public void onLaunchTaskFailed(T activity) {
        // Go does not support gestures from one task to another.
    }
}
+11 −1
Original line number Diff line number Diff line
@@ -15,6 +15,9 @@
 */
package com.android.launcher3.uioverrides.states;

import android.os.Handler;
import android.os.Looper;

import com.android.launcher3.Launcher;
import com.android.launcher3.userevent.nano.LauncherLogProto;
import com.android.quickstep.views.RecentsView;
@@ -27,6 +30,8 @@ import com.android.quickstep.views.TaskView;
 */
public class QuickSwitchState extends BackgroundAppState {

    private static final String TAG = "QuickSwitchState";

    public QuickSwitchState(int id) {
        super(id, LauncherLogProto.ContainerType.APP);
    }
@@ -48,7 +53,12 @@ public class QuickSwitchState extends BackgroundAppState {
    public void onStateTransitionEnd(Launcher launcher) {
        TaskView tasktolaunch = launcher.<RecentsView>getOverviewPanel().getTaskViewAt(0);
        if (tasktolaunch != null) {
            tasktolaunch.launchTask(false);
            tasktolaunch.launchTask(false, success -> {
                if (!success) {
                    launcher.getStateManager().goToState(OVERVIEW);
                    tasktolaunch.notifyTaskLaunchFailed(TAG);
                }
            }, new Handler(Looper.getMainLooper()));
        } else {
            launcher.getStateManager().goToState(NORMAL);
        }
+6 −0
Original line number Diff line number Diff line
@@ -224,4 +224,10 @@ public final class FallbackActivityControllerHelper implements
    public boolean isInLiveTileMode() {
        return false;
    }

    @Override
    public void onLaunchTaskFailed(RecentsActivity activity) {
        // TODO: probably go back to overview instead.
        activity.<RecentsView>getOverviewPanel().startHome();
    }
}
+5 −0
Original line number Diff line number Diff line
@@ -512,4 +512,9 @@ public final class LauncherActivityControllerHelper implements ActivityControlHe
        return launcher != null && launcher.getStateManager().getState() == OVERVIEW &&
                launcher.isStarted();
    }

    @Override
    public void onLaunchTaskFailed(Launcher launcher) {
        launcher.getStateManager().goToState(OVERVIEW);
    }
}
 No newline at end of file
+14 −1
Original line number Diff line number Diff line
@@ -746,6 +746,9 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity>
                        ? 0 : (progress - mShiftAtGestureStart) / (1 - mShiftAtGestureStart));
    }

    /**
     * @param windowProgress 0 == app, 1 == overview
     */
    private void updateSysUiFlags(float windowProgress) {
        if (mRecentsView != null) {
            TaskView centermostTask = mRecentsView.getTaskViewAt(mRecentsView
@@ -1249,7 +1252,17 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity>
                if (!mCanceled) {
                    TaskView nextTask = mRecentsView.getTaskView(taskId);
                    if (nextTask != null) {
                        nextTask.launchTask(false /* animate */, true /* freezeTaskList */);
                        nextTask.launchTask(false /* animate */, true /* freezeTaskList */,
                                success -> {
                            if (!success) {
                                // We couldn't launch the task, so take user to overview so they can
                                // decide what to do instead of staying in this broken state.
                                endLauncherTransitionController();
                                mActivityControlHelper.onLaunchTaskFailed(mActivity);
                                nextTask.notifyTaskLaunchFailed(TAG);
                                updateSysUiFlags(1 /* windowProgress == overview */);
                            }
                        }, mMainThreadHandler);
                        doLogGesture(NEW_TASK);
                    }
                    reset();
Loading