diff options
2 files changed, 45 insertions, 7 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitScreenConstants.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitScreenConstants.java index e73430056c89..49db8d9c54a6 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitScreenConstants.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitScreenConstants.java @@ -26,11 +26,12 @@ import android.annotation.IntDef; /** Helper utility class of methods and constants that are available to be imported in Launcher. */ public class SplitScreenConstants { - /** - * Duration used for every split fade-in or fade-out. - */ + /** Duration used for every split fade-in or fade-out. */ public static final int FADE_DURATION = 133; + /** Key for passing in widget intents when invoking split from launcher workspace. */ + public static final String KEY_EXTRA_WIDGET_INTENT = "key_extra_widget_intent"; + /////////////// // IMPORTANT for the following SPLIT_POSITION and SNAP_TO constants: // These int values must not be changed -- they are persisted to user-defined app pairs, and diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java index 37b24e505ade..56f1c784f3a7 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java @@ -25,6 +25,7 @@ import static android.view.Display.DEFAULT_DISPLAY; import static android.view.RemoteAnimationTarget.MODE_OPENING; import static com.android.wm.shell.common.ExecutorUtils.executeRemoteCallWithTaskPermission; +import static com.android.wm.shell.common.split.SplitScreenConstants.KEY_EXTRA_WIDGET_INTENT; import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT; import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_TOP_OR_LEFT; import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_UNDEFINED; @@ -719,10 +720,10 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, // recents that hasn't launched and is not being organized final String packageName2 = SplitScreenUtils.getPackageName(taskId, mTaskOrganizer); final int userId2 = SplitScreenUtils.getUserId(taskId, mTaskOrganizer); + boolean setSecondIntentMultipleTask = false; if (samePackage(packageName1, packageName2, userId1, userId2)) { if (supportMultiInstancesSplit(packageName1)) { - fillInIntent = new Intent(); - fillInIntent.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK); + setSecondIntentMultipleTask = true; ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, "Adding MULTIPLE_TASK"); } else { if (mRecentTasksOptional.isPresent()) { @@ -737,6 +738,10 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, Toast.LENGTH_SHORT).show(); } } + if (options2 != null) { + Intent widgetIntent = options2.getParcelable(KEY_EXTRA_WIDGET_INTENT, Intent.class); + fillInIntent = resolveWidgetFillinIntent(widgetIntent, setSecondIntentMultipleTask); + } mStageCoordinator.startIntentAndTask(pendingIntent, fillInIntent, options1, taskId, options2, splitPosition, snapPosition, remoteTransition, instanceId); } @@ -787,12 +792,12 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, ? ActivityOptions.fromBundle(options1) : ActivityOptions.makeBasic(); final ActivityOptions activityOptions2 = options2 != null ? ActivityOptions.fromBundle(options2) : ActivityOptions.makeBasic(); + boolean setSecondIntentMultipleTask = false; if (samePackage(packageName1, packageName2, userId1, userId2)) { if (supportMultiInstancesSplit(packageName1)) { fillInIntent1 = new Intent(); fillInIntent1.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK); - fillInIntent2 = new Intent(); - fillInIntent2.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK); + setSecondIntentMultipleTask = true; if (shortcutInfo1 != null) { activityOptions1.setApplyMultipleTaskFlagForShortcut(true); @@ -811,6 +816,10 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, Toast.LENGTH_SHORT).show(); } } + if (options2 != null) { + Intent widgetIntent = options2.getParcelable(KEY_EXTRA_WIDGET_INTENT, Intent.class); + fillInIntent2 = resolveWidgetFillinIntent(widgetIntent, setSecondIntentMultipleTask); + } mStageCoordinator.startIntents(pendingIntent1, fillInIntent1, shortcutInfo1, activityOptions1.toBundle(), pendingIntent2, fillInIntent2, shortcutInfo2, activityOptions2.toBundle(), splitPosition, snapPosition, remoteTransition, @@ -916,6 +925,34 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, return false; } + /** + * Determines whether the widgetIntent needs to be modified if multiple tasks of its + * corresponding package/app are supported. There are 4 possible paths: + * <li> We select a widget for second app which is the same as the first app </li> + * <li> We select a widget for second app which is different from the first app </li> + * <li> No widgets involved, we select a second app that is the same as first app </li> + * <li> No widgets involved, we select a second app that is different from the first app + * (returns null) </li> + * + * @return an {@link Intent} with the appropriate {@link Intent#FLAG_ACTIVITY_MULTIPLE_TASK} + * added on or not depending on {@param launchMultipleTasks}. + */ + @Nullable + private Intent resolveWidgetFillinIntent(@Nullable Intent widgetIntent, + boolean launchMultipleTasks) { + Intent fillInIntent2 = null; + if (launchMultipleTasks && widgetIntent != null) { + fillInIntent2 = widgetIntent; + fillInIntent2.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK); + } else if (widgetIntent != null) { + fillInIntent2 = widgetIntent; + } else if (launchMultipleTasks) { + fillInIntent2 = new Intent(); + fillInIntent2.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK); + } + return fillInIntent2; + } + RemoteAnimationTarget[] onGoingToRecentsLegacy(RemoteAnimationTarget[] apps) { if (ENABLE_SHELL_TRANSITIONS) return null; |