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
This commit is contained in:
Tony Wickham 2019-06-11 18:31:15 -07:00
parent 6129e4737c
commit e8836dc082
6 changed files with 43 additions and 2 deletions

View File

@ -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.
}
}

View File

@ -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);
}

View File

@ -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();
}
}

View File

@ -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);
}
}

View File

@ -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();

View File

@ -93,6 +93,8 @@ public interface ActivityControlHelper<T extends BaseDraggingActivity> {
boolean isInLiveTileMode();
void onLaunchTaskFailed(T activity);
interface ActivityInitListener {
void register();