Loading libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitScreenConstants.java +4 −3 Original line number Diff line number Diff line Loading @@ -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 Loading libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java +41 −4 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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()) { Loading @@ -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); } Loading Loading @@ -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); Loading @@ -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, Loading Loading @@ -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; Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitScreenConstants.java +4 −3 Original line number Diff line number Diff line Loading @@ -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 Loading
libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java +41 −4 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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()) { Loading @@ -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); } Loading Loading @@ -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); Loading @@ -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, Loading Loading @@ -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; Loading