Merge "Trims Recent Task when Task windowing mode changed after dismiss split-screen" into udc-qpr-dev am: 970f6c42f5 am: f6f37a93b5
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/24033385 Change-Id: I4b10e8988053f0e68eb9f619d721a255135e2e8d Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -684,6 +684,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) {
|
||||
for (int i = mTasks.size() - 1; i >= 0; --i) {
|
||||
final Task task = mTasks.get(i);
|
||||
@@ -1546,6 +1566,10 @@ class RecentTasks {
|
||||
* list (if any).
|
||||
*/
|
||||
private int findRemoveIndexForAddTask(Task task) {
|
||||
return findRemoveIndexForTask(task, true /* includingSelf */);
|
||||
}
|
||||
|
||||
private int findRemoveIndexForTask(Task task, boolean includingSelf) {
|
||||
final int recentsCount = mTasks.size();
|
||||
final Intent intent = task.intent;
|
||||
final boolean document = intent != null && intent.isDocument();
|
||||
@@ -1601,6 +1625,8 @@ class RecentTasks {
|
||||
// existing task
|
||||
continue;
|
||||
}
|
||||
} else if (!includingSelf) {
|
||||
continue;
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
@@ -1615,6 +1615,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
|
||||
final int count = tasksToReparent.size();
|
||||
for (int i = 0; i < count; ++i) {
|
||||
final Task task = tasksToReparent.get(i);
|
||||
final int prevWindowingMode = task.getWindowingMode();
|
||||
if (syncId >= 0) {
|
||||
addToSyncSet(syncId, task);
|
||||
}
|
||||
@@ -1628,6 +1629,12 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
|
||||
hop.getToTop() ? POSITION_TOP : POSITION_BOTTOM,
|
||||
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);
|
||||
|
||||
@@ -1303,6 +1303,26 @@ public class RecentTasksTest extends WindowTestsBase {
|
||||
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) {
|
||||
HardwareBuffer buffer = null;
|
||||
if (bufferSize != null) {
|
||||
|
||||
Reference in New Issue
Block a user