Loading libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java +12 −3 Original line number Diff line number Diff line Loading @@ -425,7 +425,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, // Flag with MULTIPLE_TASK if this is launching the same activity into both sides of the // split. if (isLaunchingAdjacently(intent.getIntent(), position)) { if (shouldAddMultipleTaskFlag(intent.getIntent(), position)) { fillInIntent.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK); ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, "Adding MULTIPLE_TASK"); } Loading @@ -440,8 +440,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, /** Returns {@code true} if it's launching the same component on both sides of the split. */ @VisibleForTesting boolean isLaunchingAdjacently(@Nullable Intent startIntent, @SplitPosition int position) { boolean shouldAddMultipleTaskFlag(@Nullable Intent startIntent, @SplitPosition int position) { if (startIntent == null) { return false; } Loading @@ -452,6 +451,16 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, } if (isSplitScreenVisible()) { // To prevent users from constantly dropping the same app to the same side resulting in // a large number of instances in the background. final ActivityManager.RunningTaskInfo targetTaskInfo = getTaskInfo(position); final ComponentName targetActivity = targetTaskInfo != null ? targetTaskInfo.baseIntent.getComponent() : null; if (Objects.equals(launchingActivity, targetActivity)) { return false; } // Allow users to start a new instance the same to adjacent side. final ActivityManager.RunningTaskInfo pairedTaskInfo = getTaskInfo(SplitLayout.reversePosition(position)); final ComponentName pairedActivity = pairedTaskInfo != null Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitScreenControllerTests.java +28 −15 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; 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 org.junit.Assert.assertFalse; Loading Loading @@ -111,7 +112,7 @@ public class SplitScreenControllerTests extends ShellTestCase { } @Test public void testIsLaunchingAdjacently_notInSplitScreen() { public void testShouldAddMultipleTaskFlag_notInSplitScreen() { doReturn(false).when(mSplitScreenController).isSplitScreenVisible(); doReturn(true).when(mSplitScreenController).isValidToEnterSplitScreen(any()); Loading @@ -120,7 +121,7 @@ public class SplitScreenControllerTests extends ShellTestCase { ActivityManager.RunningTaskInfo focusTaskInfo = createTaskInfo(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, startIntent); doReturn(focusTaskInfo).when(mSplitScreenController).getFocusingTaskInfo(); assertTrue(mSplitScreenController.isLaunchingAdjacently( assertTrue(mSplitScreenController.shouldAddMultipleTaskFlag( startIntent, SPLIT_POSITION_TOP_OR_LEFT)); // Verify launching different activity returns false. Loading @@ -128,28 +129,40 @@ public class SplitScreenControllerTests extends ShellTestCase { focusTaskInfo = createTaskInfo(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, diffIntent); doReturn(focusTaskInfo).when(mSplitScreenController).getFocusingTaskInfo(); assertFalse(mSplitScreenController.isLaunchingAdjacently( assertFalse(mSplitScreenController.shouldAddMultipleTaskFlag( startIntent, SPLIT_POSITION_TOP_OR_LEFT)); } @Test public void testIsLaunchingAdjacently_inSplitScreen() { public void testShouldAddMultipleTaskFlag_inSplitScreen() { doReturn(true).when(mSplitScreenController).isSplitScreenVisible(); // Verify launching the same activity returns true. Intent startIntent = createStartIntent("startActivity"); ActivityManager.RunningTaskInfo pairingTaskInfo = ActivityManager.RunningTaskInfo sameTaskInfo = createTaskInfo(WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD, startIntent); doReturn(pairingTaskInfo).when(mSplitScreenController).getTaskInfo(anyInt()); assertTrue(mSplitScreenController.isLaunchingAdjacently( startIntent, SPLIT_POSITION_TOP_OR_LEFT)); // Verify launching different activity returns false. Intent diffIntent = createStartIntent("diffActivity"); pairingTaskInfo = ActivityManager.RunningTaskInfo differentTaskInfo = createTaskInfo(WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD, diffIntent); doReturn(pairingTaskInfo).when(mSplitScreenController).getTaskInfo(anyInt()); assertFalse(mSplitScreenController.isLaunchingAdjacently( // Verify launching the same activity return false. doReturn(sameTaskInfo).when(mSplitScreenController) .getTaskInfo(SPLIT_POSITION_TOP_OR_LEFT); assertFalse(mSplitScreenController.shouldAddMultipleTaskFlag( startIntent, SPLIT_POSITION_TOP_OR_LEFT)); // Verify launching the same activity as adjacent returns true. doReturn(differentTaskInfo).when(mSplitScreenController) .getTaskInfo(SPLIT_POSITION_TOP_OR_LEFT); doReturn(sameTaskInfo).when(mSplitScreenController) .getTaskInfo(SPLIT_POSITION_BOTTOM_OR_RIGHT); assertTrue(mSplitScreenController.shouldAddMultipleTaskFlag( startIntent, SPLIT_POSITION_TOP_OR_LEFT)); // Verify launching different activity from adjacent returns false. doReturn(differentTaskInfo).when(mSplitScreenController) .getTaskInfo(SPLIT_POSITION_TOP_OR_LEFT); doReturn(differentTaskInfo).when(mSplitScreenController) .getTaskInfo(SPLIT_POSITION_BOTTOM_OR_RIGHT); assertFalse(mSplitScreenController.shouldAddMultipleTaskFlag( startIntent, SPLIT_POSITION_TOP_OR_LEFT)); } Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java +12 −3 Original line number Diff line number Diff line Loading @@ -425,7 +425,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, // Flag with MULTIPLE_TASK if this is launching the same activity into both sides of the // split. if (isLaunchingAdjacently(intent.getIntent(), position)) { if (shouldAddMultipleTaskFlag(intent.getIntent(), position)) { fillInIntent.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK); ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, "Adding MULTIPLE_TASK"); } Loading @@ -440,8 +440,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, /** Returns {@code true} if it's launching the same component on both sides of the split. */ @VisibleForTesting boolean isLaunchingAdjacently(@Nullable Intent startIntent, @SplitPosition int position) { boolean shouldAddMultipleTaskFlag(@Nullable Intent startIntent, @SplitPosition int position) { if (startIntent == null) { return false; } Loading @@ -452,6 +451,16 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, } if (isSplitScreenVisible()) { // To prevent users from constantly dropping the same app to the same side resulting in // a large number of instances in the background. final ActivityManager.RunningTaskInfo targetTaskInfo = getTaskInfo(position); final ComponentName targetActivity = targetTaskInfo != null ? targetTaskInfo.baseIntent.getComponent() : null; if (Objects.equals(launchingActivity, targetActivity)) { return false; } // Allow users to start a new instance the same to adjacent side. final ActivityManager.RunningTaskInfo pairedTaskInfo = getTaskInfo(SplitLayout.reversePosition(position)); final ComponentName pairedActivity = pairedTaskInfo != null Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitScreenControllerTests.java +28 −15 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; 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 org.junit.Assert.assertFalse; Loading Loading @@ -111,7 +112,7 @@ public class SplitScreenControllerTests extends ShellTestCase { } @Test public void testIsLaunchingAdjacently_notInSplitScreen() { public void testShouldAddMultipleTaskFlag_notInSplitScreen() { doReturn(false).when(mSplitScreenController).isSplitScreenVisible(); doReturn(true).when(mSplitScreenController).isValidToEnterSplitScreen(any()); Loading @@ -120,7 +121,7 @@ public class SplitScreenControllerTests extends ShellTestCase { ActivityManager.RunningTaskInfo focusTaskInfo = createTaskInfo(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, startIntent); doReturn(focusTaskInfo).when(mSplitScreenController).getFocusingTaskInfo(); assertTrue(mSplitScreenController.isLaunchingAdjacently( assertTrue(mSplitScreenController.shouldAddMultipleTaskFlag( startIntent, SPLIT_POSITION_TOP_OR_LEFT)); // Verify launching different activity returns false. Loading @@ -128,28 +129,40 @@ public class SplitScreenControllerTests extends ShellTestCase { focusTaskInfo = createTaskInfo(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, diffIntent); doReturn(focusTaskInfo).when(mSplitScreenController).getFocusingTaskInfo(); assertFalse(mSplitScreenController.isLaunchingAdjacently( assertFalse(mSplitScreenController.shouldAddMultipleTaskFlag( startIntent, SPLIT_POSITION_TOP_OR_LEFT)); } @Test public void testIsLaunchingAdjacently_inSplitScreen() { public void testShouldAddMultipleTaskFlag_inSplitScreen() { doReturn(true).when(mSplitScreenController).isSplitScreenVisible(); // Verify launching the same activity returns true. Intent startIntent = createStartIntent("startActivity"); ActivityManager.RunningTaskInfo pairingTaskInfo = ActivityManager.RunningTaskInfo sameTaskInfo = createTaskInfo(WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD, startIntent); doReturn(pairingTaskInfo).when(mSplitScreenController).getTaskInfo(anyInt()); assertTrue(mSplitScreenController.isLaunchingAdjacently( startIntent, SPLIT_POSITION_TOP_OR_LEFT)); // Verify launching different activity returns false. Intent diffIntent = createStartIntent("diffActivity"); pairingTaskInfo = ActivityManager.RunningTaskInfo differentTaskInfo = createTaskInfo(WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD, diffIntent); doReturn(pairingTaskInfo).when(mSplitScreenController).getTaskInfo(anyInt()); assertFalse(mSplitScreenController.isLaunchingAdjacently( // Verify launching the same activity return false. doReturn(sameTaskInfo).when(mSplitScreenController) .getTaskInfo(SPLIT_POSITION_TOP_OR_LEFT); assertFalse(mSplitScreenController.shouldAddMultipleTaskFlag( startIntent, SPLIT_POSITION_TOP_OR_LEFT)); // Verify launching the same activity as adjacent returns true. doReturn(differentTaskInfo).when(mSplitScreenController) .getTaskInfo(SPLIT_POSITION_TOP_OR_LEFT); doReturn(sameTaskInfo).when(mSplitScreenController) .getTaskInfo(SPLIT_POSITION_BOTTOM_OR_RIGHT); assertTrue(mSplitScreenController.shouldAddMultipleTaskFlag( startIntent, SPLIT_POSITION_TOP_OR_LEFT)); // Verify launching different activity from adjacent returns false. doReturn(differentTaskInfo).when(mSplitScreenController) .getTaskInfo(SPLIT_POSITION_TOP_OR_LEFT); doReturn(differentTaskInfo).when(mSplitScreenController) .getTaskInfo(SPLIT_POSITION_BOTTOM_OR_RIGHT); assertFalse(mSplitScreenController.shouldAddMultipleTaskFlag( startIntent, SPLIT_POSITION_TOP_OR_LEFT)); } Loading