Merge "Trims Recent Task when Task windowing mode changed after dismiss split-screen" into udc-qpr-dev am: 970f6c42f5

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/24033385

Change-Id: I85adb61b666278732d6830da3d3a1713fddb3a3a
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Louis Chang
2023-07-19 04:20:54 +00:00
committed by Automerger Merge Worker
3 changed files with 53 additions and 0 deletions

View File

@@ -682,6 +682,26 @@ class RecentTasks {
} }
} }
/**
* Removes the oldest recent task that is compatible with the given one. This is possible if
* the task windowing mode changed after being added to the Recents.
*/
void removeCompatibleRecentTask(Task task) {
final int taskIndex = mTasks.indexOf(task);
if (taskIndex < 0) {
return;
}
final int candidateIndex = findRemoveIndexForTask(task, false /* includingSelf */);
if (candidateIndex == -1) {
// Nothing to trim
return;
}
final Task taskToRemove = taskIndex > candidateIndex ? task : mTasks.get(candidateIndex);
remove(taskToRemove);
}
void removeTasksByPackageName(String packageName, int userId) { void removeTasksByPackageName(String packageName, int userId) {
for (int i = mTasks.size() - 1; i >= 0; --i) { for (int i = mTasks.size() - 1; i >= 0; --i) {
final Task task = mTasks.get(i); final Task task = mTasks.get(i);
@@ -1540,6 +1560,10 @@ class RecentTasks {
* list (if any). * list (if any).
*/ */
private int findRemoveIndexForAddTask(Task task) { private int findRemoveIndexForAddTask(Task task) {
return findRemoveIndexForTask(task, true /* includingSelf */);
}
private int findRemoveIndexForTask(Task task, boolean includingSelf) {
final int recentsCount = mTasks.size(); final int recentsCount = mTasks.size();
final Intent intent = task.intent; final Intent intent = task.intent;
final boolean document = intent != null && intent.isDocument(); final boolean document = intent != null && intent.isDocument();
@@ -1595,6 +1619,8 @@ class RecentTasks {
// existing task // existing task
continue; continue;
} }
} else if (!includingSelf) {
continue;
} }
return i; return i;
} }

View File

@@ -1615,6 +1615,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
final int count = tasksToReparent.size(); final int count = tasksToReparent.size();
for (int i = 0; i < count; ++i) { for (int i = 0; i < count; ++i) {
final Task task = tasksToReparent.get(i); final Task task = tasksToReparent.get(i);
final int prevWindowingMode = task.getWindowingMode();
if (syncId >= 0) { if (syncId >= 0) {
addToSyncSet(syncId, task); addToSyncSet(syncId, task);
} }
@@ -1628,6 +1629,12 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
hop.getToTop() ? POSITION_TOP : POSITION_BOTTOM, hop.getToTop() ? POSITION_TOP : POSITION_BOTTOM,
false /*moveParents*/, "processChildrenTaskReparentHierarchyOp"); false /*moveParents*/, "processChildrenTaskReparentHierarchyOp");
} }
// Trim the compatible Recent task (if any) after the Task is reparented and now has
// a different windowing mode, in order to prevent redundant Recent tasks after
// reparenting.
if (prevWindowingMode != task.getWindowingMode()) {
mService.mTaskSupervisor.mRecentTasks.removeCompatibleRecentTask(task);
}
} }
if (transition != null) transition.collect(newParent); if (transition != null) transition.collect(newParent);

View File

@@ -1315,6 +1315,26 @@ public class RecentTasksTest extends WindowTestsBase {
assertTrue(info.supportsMultiWindow); assertTrue(info.supportsMultiWindow);
} }
@Test
public void testRemoveCompatibleRecentTask() {
final Task task1 = createTaskBuilder(".Task").setWindowingMode(
WINDOWING_MODE_FULLSCREEN).build();
mRecentTasks.add(task1);
final Task task2 = createTaskBuilder(".Task").setWindowingMode(
WINDOWING_MODE_MULTI_WINDOW).build();
mRecentTasks.add(task2);
assertEquals(2, mRecentTasks.getRecentTasks(MAX_VALUE, 0 /* flags */,
true /* getTasksAllowed */, TEST_USER_0_ID, 0).getList().size());
// Set windowing mode and ensure the same fullscreen task that created earlier is removed.
task2.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
mRecentTasks.removeCompatibleRecentTask(task2);
assertEquals(1, mRecentTasks.getRecentTasks(MAX_VALUE, 0 /* flags */,
true /* getTasksAllowed */, TEST_USER_0_ID, 0).getList().size());
assertEquals(task2.mTaskId, mRecentTasks.getRecentTasks(MAX_VALUE, 0 /* flags */,
true /* getTasksAllowed */, TEST_USER_0_ID, 0).getList().get(0).taskId);
}
private TaskSnapshot createSnapshot(Point taskSize, Point bufferSize) { private TaskSnapshot createSnapshot(Point taskSize, Point bufferSize) {
HardwareBuffer buffer = null; HardwareBuffer buffer = null;
if (bufferSize != null) { if (bufferSize != null) {