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

Commit 8e89deb7 authored by Chilun Huang's avatar Chilun Huang
Browse files

Reuse tasks in background in priority for split screen

When dragging the same app to the other side, we will try to reuse the
task in background instead of directly launching a new instance.

Bug: 241181313
Test: atest WMShellUnitTests
Change-Id: Ifd1329ae0b634d8b27a6960e4500458a09cf69f4
parent d5d35fb2
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import static com.android.wm.shell.common.ExecutorUtils.executeRemoteCallWithTas
import android.app.ActivityManager;
import android.app.ActivityTaskManager;
import android.app.TaskInfo;
import android.content.ComponentName;
import android.content.Context;
import android.os.RemoteException;
import android.util.Slog;
@@ -327,6 +328,28 @@ public class RecentTasksController implements TaskStackListenerCallback,
        return recentTasks;
    }

    /**
     * Find the background task that match the given component.
     */
    @Nullable
    public ActivityManager.RecentTaskInfo findTaskInBackground(ComponentName componentName) {
        if (componentName == null) {
            return null;
        }
        List<ActivityManager.RecentTaskInfo> tasks = getRawRecentTasks(Integer.MAX_VALUE,
                ActivityManager.RECENT_IGNORE_UNAVAILABLE, ActivityManager.getCurrentUser());
        for (int i = 0; i < tasks.size(); i++) {
            final ActivityManager.RecentTaskInfo task = tasks.get(i);
            if (task.isVisible) {
                continue;
            }
            if (componentName.equals(task.baseIntent.getComponent())) {
                return task;
            }
        }
        return null;
    }

    public void dump(@NonNull PrintWriter pw, String prefix) {
        final String innerPrefix = prefix + "  ";
        pw.println(prefix + TAG);
+12 −1
Original line number Diff line number Diff line
@@ -371,6 +371,9 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
            }
            @Override
            public void onAnimationCancelled(boolean isKeyguardOccluded) {
                final WindowContainerTransaction evictWct = new WindowContainerTransaction();
                mStageCoordinator.prepareEvictInvisibleChildTasks(evictWct);
                mSyncQueue.queue(evictWct);
            }
        };
        options = mStageCoordinator.resolveStartStage(STAGE_TYPE_UNDEFINED, position, options,
@@ -458,8 +461,16 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
        fillInIntent.addFlags(FLAG_ACTIVITY_NO_USER_ACTION);

        // Flag with MULTIPLE_TASK if this is launching the same activity into both sides of the
        // split.
        // split and there is no reusable background task.
        if (shouldAddMultipleTaskFlag(intent.getIntent(), position)) {
            final ActivityManager.RecentTaskInfo taskInfo = mRecentTasksOptional.isPresent()
                    ? mRecentTasksOptional.get().findTaskInBackground(
                            intent.getIntent().getComponent())
                    : null;
            if (taskInfo != null) {
                startTask(taskInfo.taskId, position, options);
                return;
            }
            fillInIntent.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK);
            ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, "Adding MULTIPLE_TASK");
        }