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 Original line Diff line number Diff line
@@ -61,4 +61,9 @@ public abstract class GoActivityControlHelper<T extends BaseDraggingActivity> im
        // Go does not support live tiles.
        // Go does not support live tiles.
        return false;
        return false;
    }
    }

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


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

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


    private static final String TAG = "QuickSwitchState";

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

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

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


    /**
     * @param windowProgress 0 == app, 1 == overview
     */
    private void updateSysUiFlags(float windowProgress) {
    private void updateSysUiFlags(float windowProgress) {
        if (mRecentsView != null) {
        if (mRecentsView != null) {
            TaskView centermostTask = mRecentsView.getTaskViewAt(mRecentsView
            TaskView centermostTask = mRecentsView.getTaskViewAt(mRecentsView
@@ -1249,7 +1252,17 @@ public class WindowTransformSwipeHandler<T extends BaseDraggingActivity>
                if (!mCanceled) {
                if (!mCanceled) {
                    TaskView nextTask = mRecentsView.getTaskView(taskId);
                    TaskView nextTask = mRecentsView.getTaskView(taskId);
                    if (nextTask != null) {
                    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);
                        doLogGesture(NEW_TASK);
                    }
                    }
                    reset();
                    reset();
Loading