Merge "Revert "Use ConcurrentHashMap to make private maps thread safe"" into main

This commit is contained in:
Priyanka Advani (xWF)
2024-09-17 20:00:08 +00:00
committed by Android (Google) Code Review
2 changed files with 41 additions and 43 deletions
@@ -56,7 +56,6 @@ import com.android.systemui.shared.system.TaskStackChangeListeners;
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 @@ public class RecentsModel implements RecentTasksDataSource, IconChangeListener,
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 class RecentsModel implements RecentTasksDataSource, IconChangeListener,
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 @@ public class RecentsModel implements RecentTasksDataSource, IconChangeListener,
@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);
}
}
@@ -23,7 +23,6 @@ import com.android.quickstep.recents.data.TaskVisualsChangedDelegate.TaskThumbna
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 @@ interface TaskVisualsChangedDelegate :
/** 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 @@ interface TaskVisualsChangedDelegate :
/** 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 @@ class TaskVisualsChangedDelegateImpl(
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 @@ class TaskVisualsChangedDelegateImpl(
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()
}
}