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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user