Add missing fallback for tasks which can't be split
- Fallback to launching in fullscreen if we can't split the tasks Bug: 277021180 Test: Manual - Split with calculator in AA & taskbar AA Test: atest TaplTestsSplitscreen Change-Id: I9d2f9188cd5bc3ece304442d42f4671005cf8d45
This commit is contained in:
@@ -541,6 +541,34 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
||||
instanceId);
|
||||
}
|
||||
|
||||
void startShortcutAndTask(ShortcutInfo shortcutInfo, @Nullable Bundle options1,
|
||||
int taskId, @Nullable Bundle options2, @SplitPosition int splitPosition,
|
||||
float splitRatio, @Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
|
||||
if (options1 == null) options1 = new Bundle();
|
||||
final ActivityOptions activityOptions = ActivityOptions.fromBundle(options1);
|
||||
final String packageName1 = shortcutInfo.getPackage();
|
||||
// NOTE: This doesn't correctly pull out packageName2 if taskId is referring to a task in
|
||||
// recents that hasn't launched and is not being organized
|
||||
final String packageName2 = SplitScreenUtils.getPackageName(taskId, mTaskOrganizer);
|
||||
if (samePackage(packageName1, packageName2)) {
|
||||
if (supportMultiInstancesSplit(packageName1)) {
|
||||
activityOptions.setApplyMultipleTaskFlagForShortcut(true);
|
||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, "Adding MULTIPLE_TASK");
|
||||
} else {
|
||||
if (mRecentTasksOptional.isPresent()) {
|
||||
mRecentTasksOptional.get().removeSplitPair(taskId);
|
||||
}
|
||||
taskId = INVALID_TASK_ID;
|
||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN,
|
||||
"Cancel entering split as not supporting multi-instances");
|
||||
Toast.makeText(mContext, R.string.dock_multi_instances_not_supported_text,
|
||||
Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
mStageCoordinator.startShortcutAndTask(shortcutInfo, options1, taskId, options2,
|
||||
splitPosition, splitRatio, remoteTransition, instanceId);
|
||||
}
|
||||
|
||||
/**
|
||||
* See {@link #startIntent(PendingIntent, Intent, int, Bundle)}
|
||||
* @param instanceId to be used by {@link SplitscreenEventLogger}
|
||||
@@ -580,6 +608,8 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
||||
float splitRatio, @Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
|
||||
Intent fillInIntent = null;
|
||||
final String packageName1 = SplitScreenUtils.getPackageName(pendingIntent);
|
||||
// NOTE: This doesn't correctly pull out packageName2 if taskId is referring to a task in
|
||||
// recents that hasn't launched and is not being organized
|
||||
final String packageName2 = SplitScreenUtils.getPackageName(taskId, mTaskOrganizer);
|
||||
if (samePackage(packageName1, packageName2)) {
|
||||
if (supportMultiInstancesSplit(packageName1)) {
|
||||
@@ -587,6 +617,10 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
||||
fillInIntent.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK);
|
||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, "Adding MULTIPLE_TASK");
|
||||
} else {
|
||||
if (mRecentTasksOptional.isPresent()) {
|
||||
mRecentTasksOptional.get().removeSplitPair(taskId);
|
||||
}
|
||||
taskId = INVALID_TASK_ID;
|
||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN,
|
||||
"Cancel entering split as not supporting multi-instances");
|
||||
Toast.makeText(mContext, R.string.dock_multi_instances_not_supported_text,
|
||||
@@ -1075,9 +1109,8 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
||||
float splitRatio, @Nullable RemoteTransition remoteTransition,
|
||||
InstanceId instanceId) {
|
||||
executeRemoteCallWithTaskPermission(mController, "startShortcutAndTask",
|
||||
(controller) -> controller.mStageCoordinator.startShortcutAndTask(shortcutInfo,
|
||||
options1, taskId, options2, splitPosition, splitRatio, remoteTransition,
|
||||
instanceId));
|
||||
(controller) -> controller.startShortcutAndTask(shortcutInfo, options1, taskId,
|
||||
options2, splitPosition, splitRatio, remoteTransition, instanceId));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -289,6 +289,12 @@ class SplitScreenTransitions {
|
||||
return null;
|
||||
}
|
||||
|
||||
void startFullscreenTransition(WindowContainerTransaction wct,
|
||||
@Nullable RemoteTransition handler) {
|
||||
mTransitions.startTransition(TRANSIT_OPEN, wct,
|
||||
new OneShotRemoteHandler(mTransitions.getMainExecutor(), handler));
|
||||
}
|
||||
|
||||
|
||||
/** Starts a transition to enter split with a remote transition animator. */
|
||||
IBinder startEnterTransition(
|
||||
|
||||
@@ -612,6 +612,19 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
@Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio,
|
||||
@Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
|
||||
final WindowContainerTransaction wct = new WindowContainerTransaction();
|
||||
if (taskId2 == INVALID_TASK_ID) {
|
||||
if (mMainStage.containsTask(taskId1) || mSideStage.containsTask(taskId1)) {
|
||||
prepareExitSplitScreen(STAGE_TYPE_UNDEFINED, wct);
|
||||
}
|
||||
if (mRecentTasks.isPresent()) {
|
||||
mRecentTasks.get().removeSplitPair(taskId1);
|
||||
}
|
||||
options1 = options1 != null ? options1 : new Bundle();
|
||||
wct.startTask(taskId1, options1);
|
||||
mSplitTransitions.startFullscreenTransition(wct, remoteTransition);
|
||||
return;
|
||||
}
|
||||
|
||||
prepareEvictChildTasksIfSplitActive(wct);
|
||||
setSideStagePosition(splitPosition, wct);
|
||||
options1 = options1 != null ? options1 : new Bundle();
|
||||
@@ -627,6 +640,13 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
@SplitPosition int splitPosition, float splitRatio,
|
||||
@Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
|
||||
final WindowContainerTransaction wct = new WindowContainerTransaction();
|
||||
if (taskId == INVALID_TASK_ID) {
|
||||
options1 = options1 != null ? options1 : new Bundle();
|
||||
wct.sendPendingIntent(pendingIntent, fillInIntent, options1);
|
||||
mSplitTransitions.startFullscreenTransition(wct, remoteTransition);
|
||||
return;
|
||||
}
|
||||
|
||||
prepareEvictChildTasksIfSplitActive(wct);
|
||||
setSideStagePosition(splitPosition, wct);
|
||||
options1 = options1 != null ? options1 : new Bundle();
|
||||
@@ -641,6 +661,13 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
int taskId, @Nullable Bundle options2, @SplitPosition int splitPosition,
|
||||
float splitRatio, @Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
|
||||
final WindowContainerTransaction wct = new WindowContainerTransaction();
|
||||
if (taskId == INVALID_TASK_ID) {
|
||||
options1 = options1 != null ? options1 : new Bundle();
|
||||
wct.startShortcut(mContext.getPackageName(), shortcutInfo, options1);
|
||||
mSplitTransitions.startFullscreenTransition(wct, remoteTransition);
|
||||
return;
|
||||
}
|
||||
|
||||
prepareEvictChildTasksIfSplitActive(wct);
|
||||
setSideStagePosition(splitPosition, wct);
|
||||
options1 = options1 != null ? options1 : new Bundle();
|
||||
@@ -689,6 +716,17 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
@SplitPosition int splitPosition, float splitRatio,
|
||||
@Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
|
||||
final WindowContainerTransaction wct = new WindowContainerTransaction();
|
||||
if (pendingIntent2 == null) {
|
||||
options1 = options1 != null ? options1 : new Bundle();
|
||||
if (shortcutInfo1 != null) {
|
||||
wct.startShortcut(mContext.getPackageName(), shortcutInfo1, options1);
|
||||
} else {
|
||||
wct.sendPendingIntent(pendingIntent1, fillInIntent1, options1);
|
||||
}
|
||||
mSplitTransitions.startFullscreenTransition(wct, remoteTransition);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!mMainStage.isActive()) {
|
||||
// Build a request WCT that will launch both apps such that task 0 is on the main stage
|
||||
// while task 1 is on the side stage.
|
||||
|
||||
Reference in New Issue
Block a user