From b7a66372ff103a2b0af684cecc33ff89a382cd5d Mon Sep 17 00:00:00 2001 From: Uwais Ashraf Date: Thu, 23 Jan 2025 09:56:14 +0000 Subject: [PATCH] Only cancel CoroutineScope of TaskThumbnailView instead of removing from RV. Removing TVs from RV was causing failures of CUJs (only in tests) when enabling TTV flag. Bug: 390156722 Flag: com.android.launcher3.enable_refactor_task_thumbnail Test: TaplTestsQuickstep.testOverview Test: TaplTestsKeyboardQuickSwitch.testLaunchOverviewTask_fromHomeAllApps Change-Id: I0aae99891941c04b543d1e29db9d6d87bc89ed8e --- .../quickstep/task/thumbnail/TaskThumbnailView.kt | 4 ++-- .../src/com/android/quickstep/views/RecentsView.java | 9 +++++---- .../src/com/android/quickstep/views/TaskContainer.kt | 5 +++++ quickstep/src/com/android/quickstep/views/TaskView.kt | 5 +++++ 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt b/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt index 639d3a7768..02baa3901a 100644 --- a/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt +++ b/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt @@ -146,8 +146,8 @@ class TaskThumbnailView : FrameLayout, ViewPool.Reusable { } } - override fun onDetachedFromWindow() { - super.onDetachedFromWindow() + // TODO(b/391842220): Cancel scope in onDetach instead of having a specific method for this. + fun destroyScopes() { val scopeToCancel = viewAttachedScope recentsCoroutineScope.launch(dispatcherProvider.background) { scopeToCancel.cancel("TaskThumbnailView detaching from window") diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index b5d9936fba..d205e3cde7 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -2693,16 +2693,17 @@ public abstract class RecentsView< } private void onReset() { - if (enableRefactorTaskThumbnail()) { - mRecentsViewModel.onReset(); - removeAllViews(); - } unloadVisibleTaskData(TaskView.FLAG_UPDATE_ALL); setCurrentPage(0); LayoutUtils.setViewEnabled(mActionsView, true); if (mOrientationState.setGestureActive(false)) { updateOrientationHandler(/* forceRecreateDragLayerControllers = */ false); } + if (enableRefactorTaskThumbnail()) { + mRecentsViewModel.onReset(); + // TODO(b/391842220) Remove TaskViews rather than calling specific logic to cancel scope + getTaskViews().forEach(TaskView::destroyScopes); + } } public int getRunningTaskViewId() { diff --git a/quickstep/src/com/android/quickstep/views/TaskContainer.kt b/quickstep/src/com/android/quickstep/views/TaskContainer.kt index 5de8d1cde7..7ac0946e17 100644 --- a/quickstep/src/com/android/quickstep/views/TaskContainer.kt +++ b/quickstep/src/com/android/quickstep/views/TaskContainer.kt @@ -141,6 +141,11 @@ class TaskContainer( } } + // TODO(b/391842220): Cancel scope in onDetach instead of having a specific method for this. + fun destroyScopes() { + thumbnailView.destroyScopes() + } + fun bindThumbnailView() { taskThumbnailViewModel.bind(task.key.id) } diff --git a/quickstep/src/com/android/quickstep/views/TaskView.kt b/quickstep/src/com/android/quickstep/views/TaskView.kt index 99df84c72f..e7a395f278 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.kt +++ b/quickstep/src/com/android/quickstep/views/TaskView.kt @@ -617,6 +617,11 @@ constructor( taskContainers.forEach { it.destroy() } } + fun destroyScopes() { + // TODO(b/391842220): Cancel scope in onDetach instead of having a specific method for this. + taskContainers.forEach { it.destroyScopes() } + } + // TODO: Clip-out the icon region from the thumbnail, since they are overlapping. override fun hasOverlappingRendering() = false