diff options
| author | 2023-09-08 18:49:45 +0000 | |
|---|---|---|
| committer | 2023-09-08 18:49:45 +0000 | |
| commit | a6a3bc2d2de16c6f8460d42c19a4b0346038b9a4 (patch) | |
| tree | 4aa4e5030f7014f5b14242f206b05cfd0185b6a3 | |
| parent | 4f24ce90ed7a69bcb9ce6dec3804fc12cf24603f (diff) | |
| parent | bcdef0765c9e53d1299487fd7e35ffc5f8857b25 (diff) | |
Merge "Re-use existing app even for non-multi-instance apps" into main
2 files changed, 19 insertions, 15 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 f90ee586e696..991b699161ea 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 @@ -43,6 +43,7 @@ import android.app.ActivityOptions; import android.app.ActivityTaskManager; import android.app.PendingIntent; import android.app.TaskInfo; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.ShortcutInfo; @@ -814,21 +815,22 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, final String packageName1 = SplitScreenUtils.getPackageName(intent); final String packageName2 = getPackageName(reverseSplitPosition(position)); final int userId2 = getUserId(reverseSplitPosition(position)); + final ComponentName component = intent.getIntent().getComponent(); + + // To prevent accumulating large number of instances in the background, reuse task + // in the background. If we don't explicitly reuse, new may be created even if the app + // isn't multi-instance because WM won't automatically remove/reuse the previous instance + final ActivityManager.RecentTaskInfo taskInfo = mRecentTasksOptional + .map(recentTasks -> recentTasks.findTaskInBackground(component, userId1)) + .orElse(null); + if (taskInfo != null) { + startTask(taskInfo.taskId, position, options); + ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, + "Start task in background"); + return; + } if (samePackage(packageName1, packageName2, userId1, userId2)) { if (supportMultiInstancesSplit(packageName1)) { - // To prevent accumulating large number of instances in the background, reuse task - // in the background with priority. - final ActivityManager.RecentTaskInfo taskInfo = mRecentTasksOptional - .map(recentTasks -> recentTasks.findTaskInBackground( - intent.getIntent().getComponent(), userId1)) - .orElse(null); - if (taskInfo != null) { - startTask(taskInfo.taskId, position, options); - ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, - "Start task in background"); - return; - } - // Flag with MULTIPLE_TASK if this is launching the same activity into both sides of // the split and there is no reusable background task. fillInIntent.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK); 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 568db919818c..99cd4f391153 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 @@ -36,6 +36,7 @@ import static org.mockito.ArgumentMatchers.isA; import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -218,8 +219,7 @@ public class SplitScreenControllerTests extends ShellTestCase { } @Test - public void startIntent_multiInstancesSupported_startTaskInBackgroundBeforeSplitActivated() { - doReturn(true).when(mSplitScreenController).supportMultiInstancesSplit(any()); + public void startIntent_multiInstancesNotSupported_startTaskInBackgroundBeforeSplitActivated() { doNothing().when(mSplitScreenController).startTask(anyInt(), anyInt(), any()); Intent startIntent = createStartIntent("startActivity"); PendingIntent pendingIntent = @@ -237,6 +237,8 @@ public class SplitScreenControllerTests extends ShellTestCase { verify(mSplitScreenController).startTask(anyInt(), eq(SPLIT_POSITION_TOP_OR_LEFT), isNull()); + verify(mSplitScreenController, never()).supportMultiInstancesSplit(any()); + verify(mStageCoordinator, never()).switchSplitPosition(any()); } @Test |