Loading quickstep/src/com/android/quickstep/RecentsModel.java +5 −7 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; } Loading Loading @@ -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); } } Loading quickstep/src/com/android/quickstep/recents/data/TaskVisualsChangedDelegate.kt +36 −36 Original line number Diff line number Diff line Loading @@ -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 : Loading @@ -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 */ Loading @@ -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 */ Loading @@ -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() } Loading Loading @@ -98,48 +119,27 @@ class TaskVisualsChangedDelegateImpl( override fun registerTaskIconChangedCallback( taskKey: Task.TaskKey, taskIconChangedCallback: TaskIconChangedCallback, taskIconChangedCallback: TaskIconChangedCallback ) { updateCallbacks { 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 } 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() } } Loading
quickstep/src/com/android/quickstep/RecentsModel.java +5 −7 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; } Loading Loading @@ -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); } } Loading
quickstep/src/com/android/quickstep/recents/data/TaskVisualsChangedDelegate.kt +36 −36 Original line number Diff line number Diff line Loading @@ -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 : Loading @@ -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 */ Loading @@ -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 */ Loading @@ -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() } Loading Loading @@ -98,48 +119,27 @@ class TaskVisualsChangedDelegateImpl( override fun registerTaskIconChangedCallback( taskKey: Task.TaskKey, taskIconChangedCallback: TaskIconChangedCallback, taskIconChangedCallback: TaskIconChangedCallback ) { updateCallbacks { 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 } 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() } }