Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f60dd547 authored by Pierre Barbier de Reuille's avatar Pierre Barbier de Reuille
Browse files

Update desktop mode to identify minimized tasks

When a task is minimised, it becomes invisible but is still running.
WMShell now signals to the launcher when a task's visibility changes.
The task bar takes the visibility into account to know if a running task
is, in fact, minimised.

Test: atest NexusLauncherTests:DesktopTaskbarRunningAppsControllerTest
Flag: com.android.window.flags.enable_desktop_windowing_taskbar_running_apps
Bug: 333872717
Change-Id: Iaff6b1240d354bb3c4de8e4884948acf9bf40112
parent 656f0e8d
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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>
+41 −13
Original line number Diff line number Diff line
@@ -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()
@@ -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) {
@@ -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>
@@ -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> {
@@ -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"
+9 −6
Original line number Diff line number Diff line
@@ -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(
@@ -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);
    }

    /**
+5 −0
Original line number Diff line number Diff line
@@ -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();
    }
}
+18 −2
Original line number Diff line number Diff line
@@ -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