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

Commit 2de842b5 authored by Pierre Barbier de Reuille's avatar Pierre Barbier de Reuille Committed by Android (Google) Code Review
Browse files

Merge "Update desktop mode to identify minimized tasks" into main

parents 0131a275 f60dd547
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