diff --git a/quickstep/src/com/android/quickstep/RecentsModel.java b/quickstep/src/com/android/quickstep/RecentsModel.java
index d073580..a01ceb2 100644
--- a/quickstep/src/com/android/quickstep/RecentsModel.java
+++ b/quickstep/src/com/android/quickstep/RecentsModel.java
@@ -56,7 +56,6 @@
 import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
 import java.util.function.Consumer;
@@ -77,8 +76,7 @@
     private static final Executor RECENTS_MODEL_EXECUTOR = Executors.newSingleThreadExecutor(
             new SimpleThreadFactory("TaskThumbnailIconCache-", THREAD_PRIORITY_BACKGROUND));
 
-    private final ConcurrentLinkedQueue<TaskVisualsChangeListener> mThumbnailChangeListeners =
-            new ConcurrentLinkedQueue<>();
+    private final List<TaskVisualsChangeListener> mThumbnailChangeListeners = new ArrayList<>();
     private final Context mContext;
 
     private final RecentTasksList mTaskList;
@@ -241,8 +239,8 @@
     public boolean onTaskSnapshotChanged(int taskId, ThumbnailData snapshot) {
         mThumbnailCache.updateTaskSnapShot(taskId, snapshot);
 
-        for (TaskVisualsChangeListener listener : mThumbnailChangeListeners) {
-            Task task = listener.onTaskThumbnailChanged(taskId, snapshot);
+        for (int i = mThumbnailChangeListeners.size() - 1; i >= 0; i--) {
+            Task task = mThumbnailChangeListeners.get(i).onTaskThumbnailChanged(taskId, snapshot);
             if (task != null) {
                 task.thumbnail = snapshot;
             }
@@ -271,8 +269,8 @@
     @Override
     public void onAppIconChanged(String packageName, UserHandle user) {
         mIconCache.invalidateCacheEntries(packageName, user);
-        for (TaskVisualsChangeListener listener : mThumbnailChangeListeners) {
-            listener.onTaskIconChanged(packageName, user);
+        for (int i = mThumbnailChangeListeners.size() - 1; i >= 0; i--) {
+            mThumbnailChangeListeners.get(i).onTaskIconChanged(packageName, user);
         }
     }
 
diff --git a/quickstep/src/com/android/quickstep/recents/data/TaskVisualsChangedDelegate.kt b/quickstep/src/com/android/quickstep/recents/data/TaskVisualsChangedDelegate.kt
index a45d194..a141e89 100644
--- a/quickstep/src/com/android/quickstep/recents/data/TaskVisualsChangedDelegate.kt
+++ b/quickstep/src/com/android/quickstep/recents/data/TaskVisualsChangedDelegate.kt
@@ -23,7 +23,6 @@
 import com.android.quickstep.util.TaskVisualsChangeListener
 import com.android.systemui.shared.recents.model.Task
 import com.android.systemui.shared.recents.model.ThumbnailData
-import java.util.concurrent.ConcurrentHashMap
 
 /** Delegates the checking of task visuals (thumbnails, high res changes, icons) */
 interface TaskVisualsChangedDelegate :
@@ -31,7 +30,7 @@
     /** Registers a callback for visuals relating to icons */
     fun registerTaskIconChangedCallback(
         taskKey: Task.TaskKey,
-        taskIconChangedCallback: TaskIconChangedCallback,
+        taskIconChangedCallback: TaskIconChangedCallback
     )
 
     /** Unregisters a callback for visuals relating to icons */
@@ -40,7 +39,7 @@
     /** Registers a callback for visuals relating to thumbnails */
     fun registerTaskThumbnailChangedCallback(
         taskKey: Task.TaskKey,
-        taskThumbnailChangedCallback: TaskThumbnailChangedCallback,
+        taskThumbnailChangedCallback: TaskThumbnailChangedCallback
     )
 
     /** Unregisters a callback for visuals relating to thumbnails */
@@ -67,9 +66,31 @@
     private val highResLoadingStateNotifier: HighResLoadingStateNotifier,
 ) : TaskVisualsChangedDelegate {
     private val taskIconChangedCallbacks =
-        ConcurrentHashMap<Int, Pair<Task.TaskKey, TaskIconChangedCallback>>()
+        mutableMapOf<Int, Pair<Task.TaskKey, TaskIconChangedCallback>>()
     private val taskThumbnailChangedCallbacks =
-        ConcurrentHashMap<Int, Pair<Task.TaskKey, TaskThumbnailChangedCallback>>()
+        mutableMapOf<Int, Pair<Task.TaskKey, TaskThumbnailChangedCallback>>()
+    private var isListening = false
+
+    @Synchronized
+    private fun onCallbackRegistered() {
+        if (isListening) return
+
+        taskVisualsChangeNotifier.addThumbnailChangeListener(this)
+        highResLoadingStateNotifier.addCallback(this)
+        isListening = true
+    }
+
+    @Synchronized
+    private fun onCallbackUnregistered() {
+        if (!isListening) return
+
+        if (taskIconChangedCallbacks.size + taskThumbnailChangedCallbacks.size == 0) {
+            taskVisualsChangeNotifier.removeThumbnailChangeListener(this)
+            highResLoadingStateNotifier.removeCallback(this)
+        }
+
+        isListening = false
+    }
 
     override fun onTaskIconChanged(taskId: Int) {
         taskIconChangedCallbacks[taskId]?.let { (_, callback) -> callback.onTaskIconChanged() }
@@ -98,48 +119,27 @@
 
     override fun registerTaskIconChangedCallback(
         taskKey: Task.TaskKey,
-        taskIconChangedCallback: TaskIconChangedCallback,
+        taskIconChangedCallback: TaskIconChangedCallback
     ) {
-        updateCallbacks {
-            taskIconChangedCallbacks[taskKey.id] = taskKey to taskIconChangedCallback
-        }
+        taskIconChangedCallbacks[taskKey.id] = taskKey to taskIconChangedCallback
+        onCallbackRegistered()
     }
 
     override fun unregisterTaskIconChangedCallback(taskKey: Task.TaskKey) {
-        updateCallbacks { taskIconChangedCallbacks.remove(taskKey.id) }
+        taskIconChangedCallbacks.remove(taskKey.id)
+        onCallbackUnregistered()
     }
 
     override fun registerTaskThumbnailChangedCallback(
         taskKey: Task.TaskKey,
-        taskThumbnailChangedCallback: TaskThumbnailChangedCallback,
+        taskThumbnailChangedCallback: TaskThumbnailChangedCallback
     ) {
-        updateCallbacks {
-            taskThumbnailChangedCallbacks[taskKey.id] = taskKey to taskThumbnailChangedCallback
-        }
+        taskThumbnailChangedCallbacks[taskKey.id] = taskKey to taskThumbnailChangedCallback
+        onCallbackRegistered()
     }
 
     override fun unregisterTaskThumbnailChangedCallback(taskKey: Task.TaskKey) {
-        updateCallbacks { taskThumbnailChangedCallbacks.remove(taskKey.id) }
-    }
-
-    @Synchronized
-    private fun updateCallbacks(callbackModifier: () -> Unit) {
-        val prevHasCallbacks =
-            taskIconChangedCallbacks.size + taskThumbnailChangedCallbacks.size > 0
-        callbackModifier()
-
-        val currHasCallbacks =
-            taskIconChangedCallbacks.size + taskThumbnailChangedCallbacks.size > 0
-
-        when {
-            prevHasCallbacks && !currHasCallbacks -> {
-                taskVisualsChangeNotifier.removeThumbnailChangeListener(this)
-                highResLoadingStateNotifier.removeCallback(this)
-            }
-            !prevHasCallbacks && currHasCallbacks -> {
-                taskVisualsChangeNotifier.addThumbnailChangeListener(this)
-                highResLoadingStateNotifier.addCallback(this)
-            }
-        }
+        taskThumbnailChangedCallbacks.remove(taskKey.id)
+        onCallbackUnregistered()
     }
 }
