From b80f90bc0d037e4752dfec93fdd2109ea9d9fff5 Mon Sep 17 00:00:00 2001 From: Uwais Ashraf Date: Fri, 25 Oct 2024 15:18:23 +0000 Subject: [PATCH] Remove listener in destroy() that caused a memory leak. Fix: 370916189 Flag: com.android.launcher3.enable_refactor_task_thumbnail Test: Manually looking at heap dumps. Verify leaked obj no longer there Change-Id: I65e6ad57d1ac6873946d836d8221b67deef548b1 --- .../android/quickstep/task/util/TaskOverlayHelper.kt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/quickstep/src/com/android/quickstep/task/util/TaskOverlayHelper.kt b/quickstep/src/com/android/quickstep/task/util/TaskOverlayHelper.kt index 92ac4adae8..c82ed9aa4c 100644 --- a/quickstep/src/com/android/quickstep/task/util/TaskOverlayHelper.kt +++ b/quickstep/src/com/android/quickstep/task/util/TaskOverlayHelper.kt @@ -17,6 +17,7 @@ package com.android.quickstep.task.util import android.util.Log +import android.view.View.OnLayoutChangeListener import com.android.quickstep.TaskOverlayFactory import com.android.quickstep.recents.di.RecentsDependencies import com.android.quickstep.recents.di.get @@ -47,6 +48,10 @@ class TaskOverlayHelper(val task: Task, val overlay: TaskOverlayFactory.TaskOver val enabledState: Enabled get() = uiState as Enabled + private val snapshotLayoutChangeListener = OnLayoutChangeListener { _, _, _, _, _, _, _, _, _ -> + (uiState as? Enabled)?.let { initOverlay(it) } + } + fun getThumbnailMatrix() = getThumbnailPositionState().matrix private fun getThumbnailPositionState() = @@ -76,9 +81,7 @@ class TaskOverlayHelper(val task: Task, val overlay: TaskOverlayFactory.TaskOver } } .launchIn(overlayInitializedScope) - overlay.snapshotView.addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ -> - (uiState as? Enabled)?.let { initOverlay(it) } - } + overlay.snapshotView.addOnLayoutChangeListener(snapshotLayoutChangeListener) } private fun initOverlay(enabledState: Enabled) { @@ -96,6 +99,7 @@ class TaskOverlayHelper(val task: Task, val overlay: TaskOverlayFactory.TaskOver fun destroy() { overlayInitializedScope.cancel() uiState = Disabled + overlay.snapshotView.removeOnLayoutChangeListener(snapshotLayoutChangeListener) reset() }