Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a6a3bc2d authored by Vinit Nayak's avatar Vinit Nayak Committed by Android (Google) Code Review
Browse files

Merge "Re-use existing app even for non-multi-instance apps" into main

parents 4f24ce90 bcdef076
Loading
Loading
Loading
Loading
+15 −13
Original line number Diff line number Diff line
@@ -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,13 +815,13 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
        final String packageName1 = SplitScreenUtils.getPackageName(intent);
        final String packageName2 = getPackageName(reverseSplitPosition(position));
        final int userId2 = getUserId(reverseSplitPosition(position));
        if (samePackage(packageName1, packageName2, userId1, userId2)) {
            if (supportMultiInstancesSplit(packageName1)) {
        final ComponentName component = intent.getIntent().getComponent();

        // To prevent accumulating large number of instances in the background, reuse task
                // in the background with priority.
        // 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(
                                intent.getIntent().getComponent(), userId1))
                .map(recentTasks -> recentTasks.findTaskInBackground(component, userId1))
                .orElse(null);
        if (taskInfo != null) {
            startTask(taskInfo.taskId, position, options);
@@ -828,7 +829,8 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
                    "Start task in background");
            return;
        }

        if (samePackage(packageName1, packageName2, userId1, userId2)) {
            if (supportMultiInstancesSplit(packageName1)) {
                // 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);
+4 −2
Original line number Diff line number Diff line
@@ -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