Loading quickstep/res/values/dimens.xml +3 −0 Original line number Diff line number Diff line Loading @@ -358,6 +358,9 @@ <dimen name="taskbar_running_app_indicator_height">4dp</dimen> <dimen name="taskbar_running_app_indicator_width">14dp</dimen> <dimen name="taskbar_running_app_indicator_top_margin">2dp</dimen> <dimen name="taskbar_minimized_app_indicator_height">2dp</dimen> <dimen name="taskbar_minimized_app_indicator_width">12dp</dimen> <dimen name="taskbar_minimized_app_indicator_top_margin">2dp</dimen> <!-- Transient taskbar --> <dimen name="transient_taskbar_padding">12dp</dimen> Loading quickstep/src/com/android/launcher3/taskbar/DesktopTaskbarRunningAppsController.kt +41 −13 Original line number Diff line number Diff line Loading @@ -47,6 +47,7 @@ class DesktopTaskbarRunningAppsController( private var apps: Array<AppInfo>? = null private var allRunningDesktopAppInfos: List<AppInfo>? = null private var allMinimizedDesktopAppInfos: List<AppInfo>? = null private val desktopVisibilityController: DesktopVisibilityController? get() = desktopVisibilityControllerProvider() Loading Loading @@ -95,6 +96,13 @@ class DesktopTaskbarRunningAppsController( return allRunningDesktopAppInfos?.mapNotNull { it.targetPackage }?.toSet() ?: emptySet() } override fun getMinimizedApps(): Set<String> { if (!isInDesktopMode) { return emptySet() } return allMinimizedDesktopAppInfos?.mapNotNull { it.targetPackage }?.toSet() ?: emptySet() } @VisibleForTesting public override fun updateRunningApps() { if (!isInDesktopMode) { Loading @@ -102,10 +110,34 @@ class DesktopTaskbarRunningAppsController( mControllers.taskbarViewController.commitRunningAppsToUI() return } allRunningDesktopAppInfos = getRunningDesktopAppInfos() val runningTasks = getDesktopRunningTasks() val runningAppInfo = getAppInfosFromRunningTasks(runningTasks) allRunningDesktopAppInfos = runningAppInfo updateMinimizedApps(runningTasks, runningAppInfo) mControllers.taskbarViewController.commitRunningAppsToUI() } private fun updateMinimizedApps( runningTasks: List<RunningTaskInfo>, runningAppInfo: List<AppInfo>, ) { val allRunningAppTasks = runningAppInfo .mapNotNull { appInfo -> appInfo.targetPackage?.let { appInfo to it } } .associate { (appInfo, targetPackage) -> appInfo to runningTasks .filter { it.realActivity?.packageName == targetPackage } .map { it.taskId } } val minimizedTaskIds = runningTasks.associate { it.taskId to !it.isVisible } allMinimizedDesktopAppInfos = allRunningAppTasks .filterValues { taskIds -> taskIds.all { minimizedTaskIds[it] ?: false } } .keys .toList() } private fun getRunningDesktopAppInfosExceptHotseatApps( allRunningDesktopAppInfos: List<AppInfo>, hotseatItems: List<ItemInfo> Loading @@ -116,15 +148,10 @@ class DesktopTaskbarRunningAppsController( .map { WorkspaceItemInfo(it) } } private fun getRunningDesktopAppInfos(): List<AppInfo> { return getAppInfosFromRunningTasks( recentsModel.runningTasks .filter { taskInfo: RunningTaskInfo -> private fun getDesktopRunningTasks(): List<RunningTaskInfo> = recentsModel.runningTasks.filter { taskInfo: RunningTaskInfo -> taskInfo.windowingMode == WindowConfiguration.WINDOWING_MODE_FREEFORM } .toList() ) } // TODO(b/335398876) fetch app icons from Tasks instead of AppInfos private fun getAppInfosFromRunningTasks(tasks: List<RunningTaskInfo>): List<AppInfo> { Loading @@ -138,9 +165,10 @@ class DesktopTaskbarRunningAppsController( .filterNotNull() } private fun <E> SparseArray<E>.toList(): List<E> { return valueIterator().asSequence().toList() } private fun getAppInfosFromRunningTask(task: RunningTaskInfo): AppInfo? = apps?.firstOrNull { it.targetPackage == task.realActivity?.packageName } private fun <E> SparseArray<E>.toList(): List<E> = valueIterator().asSequence().toList() companion object { private const val TAG = "TabletDesktopTaskbarRunningAppsController" Loading quickstep/src/com/android/launcher3/taskbar/TaskbarModelCallbacks.java +9 −6 Original line number Diff line number Diff line Loading @@ -68,7 +68,7 @@ public class TaskbarModelCallbacks implements // Used to defer any UI updates during the SUW unstash animation. private boolean mDeferUpdatesForSUW; private Runnable mDeferredUpdates; private DesktopVisibilityController.DesktopVisibilityListener mDesktopVisibilityListener = private final DesktopVisibilityController.DesktopVisibilityListener mDesktopVisibilityListener = visible -> updateRunningApps(); public TaskbarModelCallbacks( Loading Loading @@ -235,20 +235,23 @@ public class TaskbarModelCallbacks implements hotseatItemInfos = mControllers.taskbarRecentAppsController .updateHotseatItemInfos(hotseatItemInfos); Set<String> runningPackages = mControllers.taskbarRecentAppsController.getRunningApps(); Set<String> minimizedPackages = mControllers.taskbarRecentAppsController.getMinimizedApps(); if (mDeferUpdatesForSUW) { ItemInfo[] finalHotseatItemInfos = hotseatItemInfos; mDeferredUpdates = () -> commitHotseatItemUpdates(finalHotseatItemInfos, runningPackages); commitHotseatItemUpdates(finalHotseatItemInfos, runningPackages, minimizedPackages); } else { commitHotseatItemUpdates(hotseatItemInfos, runningPackages); commitHotseatItemUpdates(hotseatItemInfos, runningPackages, minimizedPackages); } } private void commitHotseatItemUpdates( ItemInfo[] hotseatItemInfos, Set<String> runningPackages) { private void commitHotseatItemUpdates(ItemInfo[] hotseatItemInfos, Set<String> runningPackages, Set<String> minimizedPackages) { mContainer.updateHotseatItems(hotseatItemInfos); mControllers.taskbarViewController.updateIconViewsRunningStates(runningPackages); mControllers.taskbarViewController.updateIconViewsRunningStates(runningPackages, minimizedPackages); } /** Loading quickstep/src/com/android/launcher3/taskbar/TaskbarRecentAppsController.java +5 −0 Original line number Diff line number Diff line Loading @@ -69,4 +69,9 @@ public class TaskbarRecentAppsController { public Set<String> getRunningApps() { return emptySet(); } /** Returns the set of apps whose tasks are all minimized. */ public Set<String> getMinimizedApps() { return emptySet(); } } quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java +18 −2 Original line number Diff line number Diff line Loading @@ -510,14 +510,30 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar } /** Updates which icons are marked as running given the Set of currently running packages. */ public void updateIconViewsRunningStates(Set<String> runningPackages) { public void updateIconViewsRunningStates(Set<String> runningPackages, Set<String> minimizedPackages) { for (View iconView : getIconViews()) { if (iconView instanceof BubbleTextView btv) { btv.updateRunningState(runningPackages.contains(btv.getTargetPackageName())); btv.updateRunningState( getRunningAppState(btv.getTargetPackageName(), runningPackages, minimizedPackages)); } } } private BubbleTextView.RunningAppState getRunningAppState( String packageName, Set<String> runningPackages, Set<String> minimizedPackages) { if (minimizedPackages.contains(packageName)) { return BubbleTextView.RunningAppState.MINIMIZED; } if (runningPackages.contains(packageName)) { return BubbleTextView.RunningAppState.RUNNING; } return BubbleTextView.RunningAppState.NOT_RUNNING; } /** * Defers any updates to the UI for the setup wizard animation. */ Loading Loading
quickstep/res/values/dimens.xml +3 −0 Original line number Diff line number Diff line Loading @@ -358,6 +358,9 @@ <dimen name="taskbar_running_app_indicator_height">4dp</dimen> <dimen name="taskbar_running_app_indicator_width">14dp</dimen> <dimen name="taskbar_running_app_indicator_top_margin">2dp</dimen> <dimen name="taskbar_minimized_app_indicator_height">2dp</dimen> <dimen name="taskbar_minimized_app_indicator_width">12dp</dimen> <dimen name="taskbar_minimized_app_indicator_top_margin">2dp</dimen> <!-- Transient taskbar --> <dimen name="transient_taskbar_padding">12dp</dimen> Loading
quickstep/src/com/android/launcher3/taskbar/DesktopTaskbarRunningAppsController.kt +41 −13 Original line number Diff line number Diff line Loading @@ -47,6 +47,7 @@ class DesktopTaskbarRunningAppsController( private var apps: Array<AppInfo>? = null private var allRunningDesktopAppInfos: List<AppInfo>? = null private var allMinimizedDesktopAppInfos: List<AppInfo>? = null private val desktopVisibilityController: DesktopVisibilityController? get() = desktopVisibilityControllerProvider() Loading Loading @@ -95,6 +96,13 @@ class DesktopTaskbarRunningAppsController( return allRunningDesktopAppInfos?.mapNotNull { it.targetPackage }?.toSet() ?: emptySet() } override fun getMinimizedApps(): Set<String> { if (!isInDesktopMode) { return emptySet() } return allMinimizedDesktopAppInfos?.mapNotNull { it.targetPackage }?.toSet() ?: emptySet() } @VisibleForTesting public override fun updateRunningApps() { if (!isInDesktopMode) { Loading @@ -102,10 +110,34 @@ class DesktopTaskbarRunningAppsController( mControllers.taskbarViewController.commitRunningAppsToUI() return } allRunningDesktopAppInfos = getRunningDesktopAppInfos() val runningTasks = getDesktopRunningTasks() val runningAppInfo = getAppInfosFromRunningTasks(runningTasks) allRunningDesktopAppInfos = runningAppInfo updateMinimizedApps(runningTasks, runningAppInfo) mControllers.taskbarViewController.commitRunningAppsToUI() } private fun updateMinimizedApps( runningTasks: List<RunningTaskInfo>, runningAppInfo: List<AppInfo>, ) { val allRunningAppTasks = runningAppInfo .mapNotNull { appInfo -> appInfo.targetPackage?.let { appInfo to it } } .associate { (appInfo, targetPackage) -> appInfo to runningTasks .filter { it.realActivity?.packageName == targetPackage } .map { it.taskId } } val minimizedTaskIds = runningTasks.associate { it.taskId to !it.isVisible } allMinimizedDesktopAppInfos = allRunningAppTasks .filterValues { taskIds -> taskIds.all { minimizedTaskIds[it] ?: false } } .keys .toList() } private fun getRunningDesktopAppInfosExceptHotseatApps( allRunningDesktopAppInfos: List<AppInfo>, hotseatItems: List<ItemInfo> Loading @@ -116,15 +148,10 @@ class DesktopTaskbarRunningAppsController( .map { WorkspaceItemInfo(it) } } private fun getRunningDesktopAppInfos(): List<AppInfo> { return getAppInfosFromRunningTasks( recentsModel.runningTasks .filter { taskInfo: RunningTaskInfo -> private fun getDesktopRunningTasks(): List<RunningTaskInfo> = recentsModel.runningTasks.filter { taskInfo: RunningTaskInfo -> taskInfo.windowingMode == WindowConfiguration.WINDOWING_MODE_FREEFORM } .toList() ) } // TODO(b/335398876) fetch app icons from Tasks instead of AppInfos private fun getAppInfosFromRunningTasks(tasks: List<RunningTaskInfo>): List<AppInfo> { Loading @@ -138,9 +165,10 @@ class DesktopTaskbarRunningAppsController( .filterNotNull() } private fun <E> SparseArray<E>.toList(): List<E> { return valueIterator().asSequence().toList() } private fun getAppInfosFromRunningTask(task: RunningTaskInfo): AppInfo? = apps?.firstOrNull { it.targetPackage == task.realActivity?.packageName } private fun <E> SparseArray<E>.toList(): List<E> = valueIterator().asSequence().toList() companion object { private const val TAG = "TabletDesktopTaskbarRunningAppsController" Loading
quickstep/src/com/android/launcher3/taskbar/TaskbarModelCallbacks.java +9 −6 Original line number Diff line number Diff line Loading @@ -68,7 +68,7 @@ public class TaskbarModelCallbacks implements // Used to defer any UI updates during the SUW unstash animation. private boolean mDeferUpdatesForSUW; private Runnable mDeferredUpdates; private DesktopVisibilityController.DesktopVisibilityListener mDesktopVisibilityListener = private final DesktopVisibilityController.DesktopVisibilityListener mDesktopVisibilityListener = visible -> updateRunningApps(); public TaskbarModelCallbacks( Loading Loading @@ -235,20 +235,23 @@ public class TaskbarModelCallbacks implements hotseatItemInfos = mControllers.taskbarRecentAppsController .updateHotseatItemInfos(hotseatItemInfos); Set<String> runningPackages = mControllers.taskbarRecentAppsController.getRunningApps(); Set<String> minimizedPackages = mControllers.taskbarRecentAppsController.getMinimizedApps(); if (mDeferUpdatesForSUW) { ItemInfo[] finalHotseatItemInfos = hotseatItemInfos; mDeferredUpdates = () -> commitHotseatItemUpdates(finalHotseatItemInfos, runningPackages); commitHotseatItemUpdates(finalHotseatItemInfos, runningPackages, minimizedPackages); } else { commitHotseatItemUpdates(hotseatItemInfos, runningPackages); commitHotseatItemUpdates(hotseatItemInfos, runningPackages, minimizedPackages); } } private void commitHotseatItemUpdates( ItemInfo[] hotseatItemInfos, Set<String> runningPackages) { private void commitHotseatItemUpdates(ItemInfo[] hotseatItemInfos, Set<String> runningPackages, Set<String> minimizedPackages) { mContainer.updateHotseatItems(hotseatItemInfos); mControllers.taskbarViewController.updateIconViewsRunningStates(runningPackages); mControllers.taskbarViewController.updateIconViewsRunningStates(runningPackages, minimizedPackages); } /** Loading
quickstep/src/com/android/launcher3/taskbar/TaskbarRecentAppsController.java +5 −0 Original line number Diff line number Diff line Loading @@ -69,4 +69,9 @@ public class TaskbarRecentAppsController { public Set<String> getRunningApps() { return emptySet(); } /** Returns the set of apps whose tasks are all minimized. */ public Set<String> getMinimizedApps() { return emptySet(); } }
quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java +18 −2 Original line number Diff line number Diff line Loading @@ -510,14 +510,30 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar } /** Updates which icons are marked as running given the Set of currently running packages. */ public void updateIconViewsRunningStates(Set<String> runningPackages) { public void updateIconViewsRunningStates(Set<String> runningPackages, Set<String> minimizedPackages) { for (View iconView : getIconViews()) { if (iconView instanceof BubbleTextView btv) { btv.updateRunningState(runningPackages.contains(btv.getTargetPackageName())); btv.updateRunningState( getRunningAppState(btv.getTargetPackageName(), runningPackages, minimizedPackages)); } } } private BubbleTextView.RunningAppState getRunningAppState( String packageName, Set<String> runningPackages, Set<String> minimizedPackages) { if (minimizedPackages.contains(packageName)) { return BubbleTextView.RunningAppState.MINIMIZED; } if (runningPackages.contains(packageName)) { return BubbleTextView.RunningAppState.RUNNING; } return BubbleTextView.RunningAppState.NOT_RUNNING; } /** * Defers any updates to the UI for the setup wizard animation. */ Loading