Revert "Use ConcurrentHashMap to make private maps thread safe"

This reverts commit d511538361fe9f20406e92b4f3dea66ac737663d.

Reason for revert: Droidmonitor created revert due to b/367736714. Will be verifying through ABTD before submission.

Change-Id: I01281bd48c4ba7d07dc0308c504f21aad751ea44
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()
     }
 }