From f46fa7ac4914d84777e785ab3fac4dfef163df0e Mon Sep 17 00:00:00 2001 From: Vinit Nayak Date: Wed, 3 May 2023 20:51:34 -0700 Subject: [PATCH] Restore Recents TaskView based on all taskIDs, not first * Return a copy of taskIds in TaskView#getTaskIds() to prevent accessors from getting clobbered values * In RecentsView#applyLoadPlan we overwrite values in that array, so callers using it to cache old values would read incorrect values when reading it after a TaskView has been bound to new tasks. * Load/Unload visible task data for all tasks in a given TaskView, not just single task <-- probably not necessary for bug fix, but seems sensible Flag: none Fixes: 266905177 Test: Quickswitch works as expected. Currently unable to test thumbnails (created b/281582106) Change-Id: Ifd4d8a856976ab9cc200b0f61eca1c68897f343c --- .../android/quickstep/views/RecentsView.java | 93 +++++++++++++------ .../com/android/quickstep/views/TaskView.java | 2 +- 2 files changed, 64 insertions(+), 31 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index f0afa69983..cb8ab1c079 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -213,6 +213,7 @@ import java.util.HashMap; import java.util.List; import java.util.Objects; import java.util.function.Consumer; +import java.util.stream.Collectors; /** * A list of recent tasks. @@ -1320,6 +1321,29 @@ public abstract class RecentsView 0) { newFocusedTaskView = getTaskViewAt(0); @@ -1716,10 +1740,10 @@ public abstract class RecentsView 0) { TaskView taskView = requireTaskViewAt(0); @@ -2210,8 +2234,8 @@ public abstract class RecentsView tasksToUpdate = Arrays.stream(containers).filter(Objects::nonNull) + .map(TaskIdAttributeContainer::getTask) + .collect(Collectors.toCollection(ArrayList::new)); if (mTmpRunningTasks != null) { for (Task t : mTmpRunningTasks) { - if (task == t) { - // Skip loading if this is the task that we are animating into - skipLoadingTask = true; - break; - } + // Skip loading if this is the task that we are animating into + // TODO(b/280812109) change this equality check to use A.equals(B) + tasksToUpdate.removeIf(task -> task == t); } } - if (skipLoadingTask) { + if (tasksToUpdate.isEmpty()) { continue; } - if (!mHasVisibleTaskData.get(task.key.id)) { - // Ignore thumbnail update if it's current running task during the gesture - // We snapshot at end of gesture, it will update then - int changes = dataChanges; - if (taskView == getRunningTaskView() && mGestureActive) { - changes &= ~TaskView.FLAG_UPDATE_THUMBNAIL; + for (Task task : tasksToUpdate) { + if (!mHasVisibleTaskData.get(task.key.id)) { + // Ignore thumbnail update if it's current running task during the gesture + // We snapshot at end of gesture, it will update then + int changes = dataChanges; + if (taskView == getRunningTaskView() && mGestureActive) { + changes &= ~TaskView.FLAG_UPDATE_THUMBNAIL; + } + taskView.onTaskListVisibilityChanged(true /* visible */, changes); } - taskView.onTaskListVisibilityChanged(true /* visible */, changes); + mHasVisibleTaskData.put(task.key.id, visible); } - mHasVisibleTaskData.put(task.key.id, visible); } else { - if (mHasVisibleTaskData.get(task.key.id)) { - taskView.onTaskListVisibilityChanged(false /* visible */, dataChanges); + for (TaskIdAttributeContainer container : containers) { + if (container == null) { + continue; + } + + if (mHasVisibleTaskData.get(container.getTask().key.id)) { + taskView.onTaskListVisibilityChanged(false /* visible */, dataChanges); + } + mHasVisibleTaskData.delete(container.getTask().key.id); } - mHasVisibleTaskData.delete(task.key.id); } } } diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index 53660b5040..cb0e1b33fa 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -651,7 +651,7 @@ public class TaskView extends FrameLayout implements Reusable { * index 0 will contain the taskId, index 1 will be -1 indicating a null taskID value */ public int[] getTaskIds() { - return mTaskIdContainer; + return Arrays.copyOf(mTaskIdContainer, mTaskIdContainer.length); } public boolean containsMultipleTasks() {