diff options
| author | 2022-08-09 12:24:28 +0000 | |
|---|---|---|
| committer | 2022-08-09 12:24:28 +0000 | |
| commit | 903c1e08cb839f80b7544a120449269319e03219 (patch) | |
| tree | 73318a9ad71e05f13e98e11b70df5b307e49eec7 | |
| parent | 989c35d9560c54a09fe597188977790849d0579e (diff) | |
| parent | 3d3bf180c4d4180bb1cc7c65764a4e1779245ae8 (diff) | |
Merge "Prevent new instance if drop on split-screen with the same app" into tm-qpr-dev am: 3d3bf180c4
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/19533592
Change-Id: Ic81dc75bb5cecb44fb4964e77ccec3230fb7232d
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
2 files changed, 40 insertions, 18 deletions
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 8de649ef69eb..a372acbd6bdd 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 @@ -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"); } @@ -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; } @@ -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 diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitScreenControllerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitScreenControllerTests.java index 10788f9df32f..c7c78d38d69b 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitScreenControllerTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitScreenControllerTests.java @@ -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; @@ -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()); @@ -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. @@ -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)); } |