Merge "Add missing fallback for tasks which can't be split" into udc-dev
This commit is contained in:
@@ -541,6 +541,34 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
instanceId);
|
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)}
|
* See {@link #startIntent(PendingIntent, Intent, int, Bundle)}
|
||||||
* @param instanceId to be used by {@link SplitscreenEventLogger}
|
* @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) {
|
float splitRatio, @Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
|
||||||
Intent fillInIntent = null;
|
Intent fillInIntent = null;
|
||||||
final String packageName1 = SplitScreenUtils.getPackageName(pendingIntent);
|
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);
|
final String packageName2 = SplitScreenUtils.getPackageName(taskId, mTaskOrganizer);
|
||||||
if (samePackage(packageName1, packageName2)) {
|
if (samePackage(packageName1, packageName2)) {
|
||||||
if (supportMultiInstancesSplit(packageName1)) {
|
if (supportMultiInstancesSplit(packageName1)) {
|
||||||
@@ -587,6 +617,10 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
fillInIntent.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK);
|
fillInIntent.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK);
|
||||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, "Adding MULTIPLE_TASK");
|
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, "Adding MULTIPLE_TASK");
|
||||||
} else {
|
} else {
|
||||||
|
if (mRecentTasksOptional.isPresent()) {
|
||||||
|
mRecentTasksOptional.get().removeSplitPair(taskId);
|
||||||
|
}
|
||||||
|
taskId = INVALID_TASK_ID;
|
||||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN,
|
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN,
|
||||||
"Cancel entering split as not supporting multi-instances");
|
"Cancel entering split as not supporting multi-instances");
|
||||||
Toast.makeText(mContext, R.string.dock_multi_instances_not_supported_text,
|
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,
|
float splitRatio, @Nullable RemoteTransition remoteTransition,
|
||||||
InstanceId instanceId) {
|
InstanceId instanceId) {
|
||||||
executeRemoteCallWithTaskPermission(mController, "startShortcutAndTask",
|
executeRemoteCallWithTaskPermission(mController, "startShortcutAndTask",
|
||||||
(controller) -> controller.mStageCoordinator.startShortcutAndTask(shortcutInfo,
|
(controller) -> controller.startShortcutAndTask(shortcutInfo, options1, taskId,
|
||||||
options1, taskId, options2, splitPosition, splitRatio, remoteTransition,
|
options2, splitPosition, splitRatio, remoteTransition, instanceId));
|
||||||
instanceId));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -289,6 +289,12 @@ class SplitScreenTransitions {
|
|||||||
return null;
|
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. */
|
/** Starts a transition to enter split with a remote transition animator. */
|
||||||
IBinder startEnterTransition(
|
IBinder startEnterTransition(
|
||||||
|
|||||||
@@ -612,6 +612,19 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
|||||||
@Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio,
|
@Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio,
|
||||||
@Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
|
@Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
|
||||||
final WindowContainerTransaction wct = new WindowContainerTransaction();
|
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);
|
prepareEvictChildTasksIfSplitActive(wct);
|
||||||
setSideStagePosition(splitPosition, wct);
|
setSideStagePosition(splitPosition, wct);
|
||||||
options1 = options1 != null ? options1 : new Bundle();
|
options1 = options1 != null ? options1 : new Bundle();
|
||||||
@@ -627,6 +640,13 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
|||||||
@SplitPosition int splitPosition, float splitRatio,
|
@SplitPosition int splitPosition, float splitRatio,
|
||||||
@Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
|
@Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
|
||||||
final WindowContainerTransaction wct = new WindowContainerTransaction();
|
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);
|
prepareEvictChildTasksIfSplitActive(wct);
|
||||||
setSideStagePosition(splitPosition, wct);
|
setSideStagePosition(splitPosition, wct);
|
||||||
options1 = options1 != null ? options1 : new Bundle();
|
options1 = options1 != null ? options1 : new Bundle();
|
||||||
@@ -641,6 +661,13 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
|||||||
int taskId, @Nullable Bundle options2, @SplitPosition int splitPosition,
|
int taskId, @Nullable Bundle options2, @SplitPosition int splitPosition,
|
||||||
float splitRatio, @Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
|
float splitRatio, @Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
|
||||||
final WindowContainerTransaction wct = new WindowContainerTransaction();
|
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);
|
prepareEvictChildTasksIfSplitActive(wct);
|
||||||
setSideStagePosition(splitPosition, wct);
|
setSideStagePosition(splitPosition, wct);
|
||||||
options1 = options1 != null ? options1 : new Bundle();
|
options1 = options1 != null ? options1 : new Bundle();
|
||||||
@@ -689,6 +716,17 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
|||||||
@SplitPosition int splitPosition, float splitRatio,
|
@SplitPosition int splitPosition, float splitRatio,
|
||||||
@Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
|
@Nullable RemoteTransition remoteTransition, InstanceId instanceId) {
|
||||||
final WindowContainerTransaction wct = new WindowContainerTransaction();
|
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()) {
|
if (!mMainStage.isActive()) {
|
||||||
// Build a request WCT that will launch both apps such that task 0 is on the main stage
|
// 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.
|
// while task 1 is on the side stage.
|
||||||
|
|||||||
Reference in New Issue
Block a user