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

Commit 37bb1108 authored by mattsziklay's avatar mattsziklay
Browse files

Minimize oldest task when clicking New Window at window limit.

Wires the multi instance "New Window" button logic into existing task
minimization logic, causing a new task launch from this button to
minimize if the desktop is at the window limit.

Also removes the check against minimizeChange in
DesktopMixedTransitionHandler as we now have a case where a null
launchChange could be paired with a minimizingTask (new window would
have resulted in a minimize but was aborted).

Bug: 378920066
Bug: 380198576
Test: Manual
Flag: EXEMPT bugfix
Change-Id: Icef8e92dbbbd82529e633211d1304f4334353566
parent 3633fa1c
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -239,7 +239,6 @@ class DesktopMixedTransitionHandler(
            pending.minimizingTask?.let { minimizingTask -> findTaskChange(info, minimizingTask) }
        val launchChange = findDesktopTaskLaunchChange(info, pending.launchingTask)
        if (launchChange == null) {
            check(minimizeChange == null)
            check(immersiveExitChange == null)
            logV("No launch Change, returning")
            return false
+22 −16
Original line number Diff line number Diff line
@@ -592,9 +592,14 @@ class DesktopTasksController(
        val isMinimizingToPip = taskInfo.pictureInPictureParams?.isAutoEnterEnabled() ?: false
        // If task is going to PiP, start a PiP transition instead of a minimize transition
        if (isMinimizingToPip) {
            val requestInfo = TransitionRequestInfo(
                TRANSIT_PIP, /* triggerTask= */ null, taskInfo, /* remoteTransition= */ null,
                /* displayChange= */ null, /* flags= */ 0
            val requestInfo =
                TransitionRequestInfo(
                    TRANSIT_PIP,
                    /* triggerTask= */ null,
                    taskInfo,
                    /* remoteTransition= */ null,
                    /* displayChange= */ null,
                    /* flags= */ 0,
                )
            val requestRes = transitions.dispatchRequest(Binder(), requestInfo, /* skip= */ null)
            wct.merge(requestRes.second, true)
@@ -759,15 +764,12 @@ class DesktopTasksController(
        displayId: Int = DEFAULT_DISPLAY,
    ): IBinder {
        val taskIdToMinimize =
            if (launchingTaskId != null) {
                addAndGetMinimizeChanges(displayId, wct, newTaskId = launchingTaskId)
            } else {
                logW("Starting desktop task launch without checking the task-limit")
                // TODO(b/378920066): This currently does not respect the desktop window limit.
                //  It's possible that |launchingTaskId| is null when launching using an intent, and
                //  the task-limit should be respected then too.
                null
            }
            addAndGetMinimizeChanges(
                displayId,
                wct,
                newTaskId = launchingTaskId,
                launchingNewIntent = launchingTaskId == null,
            )
        val exitImmersiveResult =
            desktopImmersiveController.exitImmersiveIfApplicable(
                wct = wct,
@@ -1409,7 +1411,7 @@ class DesktopTasksController(
    override fun onTransitionConsumed(
        transition: IBinder,
        aborted: Boolean,
        finishT: Transaction?
        finishT: Transaction?,
    ) {
        pendingPipTransitionAndTask?.let { (pipTransition, taskId) ->
            if (transition == pipTransition) {
@@ -1985,10 +1987,14 @@ class DesktopTasksController(
    private fun addAndGetMinimizeChanges(
        displayId: Int,
        wct: WindowContainerTransaction,
        newTaskId: Int,
        newTaskId: Int?,
        launchingNewIntent: Boolean = false,
    ): Int? {
        if (!desktopTasksLimiter.isPresent) return null
        return desktopTasksLimiter.get().addAndGetMinimizeTaskChanges(displayId, wct, newTaskId)
        require(newTaskId == null || !launchingNewIntent)
        return desktopTasksLimiter
            .get()
            .addAndGetMinimizeTaskChanges(displayId, wct, newTaskId, launchingNewIntent)
    }

    private fun addPendingMinimizeTransition(transition: IBinder, taskIdToMinimize: Int) {
+20 −6
Original line number Diff line number Diff line
@@ -214,12 +214,17 @@ class DesktopTasksLimiter(
    fun addAndGetMinimizeTaskChanges(
        displayId: Int,
        wct: WindowContainerTransaction,
        newFrontTaskId: Int,
        newFrontTaskId: Int?,
        launchingNewIntent: Boolean = false,
    ): Int? {
        logV("addAndGetMinimizeTaskChanges, newFrontTask=%d", newFrontTaskId)
        val taskRepository = desktopUserRepositories.current
        val taskIdToMinimize =
            getTaskIdToMinimize(taskRepository.getExpandedTasksOrdered(displayId), newFrontTaskId)
            getTaskIdToMinimize(
                taskRepository.getExpandedTasksOrdered(displayId),
                newFrontTaskId,
                launchingNewIntent,
            )
        // If it's a running task, reorder it to back.
        taskIdToMinimize
            ?.let { shellTaskOrganizer.getRunningTaskInfo(it) }
@@ -242,15 +247,24 @@ class DesktopTasksLimiter(
     * Returns the minimized task from the list of visible tasks ordered from front to back with the
     * new task placed in front of other tasks.
     */
    fun getTaskIdToMinimize(visibleOrderedTasks: List<Int>, newTaskIdInFront: Int? = null): Int? {
    fun getTaskIdToMinimize(
        visibleOrderedTasks: List<Int>,
        newTaskIdInFront: Int? = null,
        launchingNewIntent: Boolean = false,
    ): Int? {
        return getTaskIdToMinimize(
            createOrderedTaskListWithGivenTaskInFront(visibleOrderedTasks, newTaskIdInFront)
            createOrderedTaskListWithGivenTaskInFront(visibleOrderedTasks, newTaskIdInFront),
            launchingNewIntent,
        )
    }

    /** Returns the Task to minimize given a list of visible tasks ordered from front to back. */
    private fun getTaskIdToMinimize(visibleOrderedTasks: List<Int>): Int? {
        if (visibleOrderedTasks.size <= maxTasksLimit) {
    private fun getTaskIdToMinimize(
        visibleOrderedTasks: List<Int>,
        launchingNewIntent: Boolean,
    ): Int? {
        val newTasksOpening = if (launchingNewIntent) 1 else 0
        if (visibleOrderedTasks.size + newTasksOpening <= maxTasksLimit) {
            logV("No need to minimize; tasks below limit")
            // No need to minimize anything
            return null
+12 −0
Original line number Diff line number Diff line
@@ -441,6 +441,18 @@ class DesktopTasksLimiterTest : ShellTestCase() {
        assertThat(minimizedTask).isEqualTo(tasks.last().taskId)
    }

    @Test
    fun getTaskToMinimize_tasksAtLimit_newIntentReturnsBackTask() {
        val tasks = (1..MAX_TASK_LIMIT).map { setUpFreeformTask() }
        val minimizedTask = desktopTasksLimiter.getTaskIdToMinimize(
            visibleOrderedTasks = tasks.map { it.taskId },
            newTaskIdInFront = null,
            launchingNewIntent = true)

        // first == front, last == back
        assertThat(minimizedTask).isEqualTo(tasks.last().taskId)
    }

    @Test
    fun minimizeTransitionReadyAndFinished_logsJankInstrumentationBeginAndEnd() {
        (1..<MAX_TASK_LIMIT).forEach { _ -> setUpFreeformTask() }