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>
This commit is contained in:
Chilun Huang
2022-08-09 12:24:28 +00:00
committed by Automerger Merge Worker
2 changed files with 40 additions and 18 deletions

View File

@@ -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

View File

@@ -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(
Intent diffIntent = createStartIntent("diffActivity");
ActivityManager.RunningTaskInfo differentTaskInfo =
createTaskInfo(WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD, diffIntent);
// 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 different activity returns false.
Intent diffIntent = createStartIntent("diffActivity");
pairingTaskInfo =
createTaskInfo(WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD, diffIntent);
doReturn(pairingTaskInfo).when(mSplitScreenController).getTaskInfo(anyInt());
assertFalse(mSplitScreenController.isLaunchingAdjacently(
// 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));
}