diff --git a/quickstep/src/com/android/quickstep/RecentsModel.java b/quickstep/src/com/android/quickstep/RecentsModel.java index d073580fb5..a01ceb2446 100644 --- a/quickstep/src/com/android/quickstep/RecentsModel.java +++ b/quickstep/src/com/android/quickstep/RecentsModel.java @@ -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 mThumbnailChangeListeners = - new ConcurrentLinkedQueue<>(); + private final List 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); } } diff --git a/quickstep/src/com/android/quickstep/recents/data/TaskVisualsChangedDelegate.kt b/quickstep/src/com/android/quickstep/recents/data/TaskVisualsChangedDelegate.kt index a45d194a1c..a141e89c23 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.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>() + mutableMapOf>() private val taskThumbnailChangedCallbacks = - ConcurrentHashMap>() + mutableMapOf>() + 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() } }