From ca39594be9b451209891a738e8e786202e553dbb Mon Sep 17 00:00:00 2001 From: Uwais Ashraf Date: Thu, 31 Oct 2024 13:18:40 +0000 Subject: [PATCH] Recycle tasks that are split when split select anim complete for reuse Fix: 376428479 Flag: EXEMPT bugfix Test: Manual verification of heap dumps Change-Id: I8574c68da76227258985cb77955548352275049d --- .../android/quickstep/views/RecentsView.java | 34 ++++++++++++------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index b38d0d7d42..f95690963b 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -1245,21 +1245,24 @@ public abstract class RecentsView< // - It's the focused task to be moved to the front, we immediately re-add the task if (child instanceof TaskView && child != mSplitHiddenTaskView && child != mMovingTaskView) { - TaskView taskView = (TaskView) child; - for (int i : taskView.getTaskIds()) { - mHasVisibleTaskData.delete(i); - } - if (child instanceof GroupedTaskView) { - mGroupedTaskViewPool.recycle((GroupedTaskView) taskView); - } else if (child instanceof DesktopTaskView) { - mDesktopTaskViewPool.recycle((DesktopTaskView) taskView); - } else { - mTaskViewPool.recycle(taskView); - } - mActionsView.updateHiddenFlags(HIDDEN_NO_TASKS, getTaskViewCount() == 0); + clearAndRecycleTaskView((TaskView) child); } } + private void clearAndRecycleTaskView(TaskView taskView) { + for (int taskId : taskView.getTaskIds()) { + mHasVisibleTaskData.delete(taskId); + } + if (taskView instanceof GroupedTaskView) { + mGroupedTaskViewPool.recycle((GroupedTaskView) taskView); + } else if (taskView instanceof DesktopTaskView) { + mDesktopTaskViewPool.recycle((DesktopTaskView) taskView); + } else { + mTaskViewPool.recycle(taskView); + } + mActionsView.updateHiddenFlags(HIDDEN_NO_TASKS, getTaskViewCount() == 0); + } + @Override public void onViewAdded(View child) { super.onViewAdded(child); @@ -5302,6 +5305,13 @@ public abstract class RecentsView< mSplitHiddenTaskViewIndex = -1; if (mSplitHiddenTaskView != null) { mSplitHiddenTaskView.setThumbnailVisibility(VISIBLE, INVALID_TASK_ID); + // mSplitHiddenTaskView is set when split select animation starts. The TaskView is only + // removed when when the animation finishes. So in the case of overview being dismissed + // during the animation, we should not call clearAndRecycleTaskView() because it has + // not been removed yet. + if (mSplitHiddenTaskView.getParent() == null) { + clearAndRecycleTaskView(mSplitHiddenTaskView); + } mSplitHiddenTaskView = null; } }