Merge "Reuse tasks in background in priority for split screen" into tm-qpr-dev

This commit is contained in:
Chilun Huang
2022-09-26 04:35:45 +00:00
committed by Android (Google) Code Review
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

@@ -385,6 +385,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,
@@ -472,8 +475,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");
}