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
This commit is contained in:
Chilun Huang
2022-09-14 14:16:20 +08:00
parent d5d35fb282
commit 8e89deb761
2 changed files with 35 additions and 1 deletions

View File

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

View File

@@ -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");
}