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()
}
}