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

Commit 0bf3a2a6 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add mixed transition handling for desktop changes" into main

parents 9f054ccb 8315ff03
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -67,7 +67,7 @@ import com.android.wm.shell.dagger.pip.PipModule;
import com.android.wm.shell.desktopmode.CloseDesktopTaskTransitionHandler;
import com.android.wm.shell.desktopmode.DefaultDragToDesktopTransitionHandler;
import com.android.wm.shell.desktopmode.DesktopActivityOrientationChangeHandler;
import com.android.wm.shell.desktopmode.DesktopFullImmersiveTransitionHandler;
import com.android.wm.shell.desktopmode.DesktopImmersiveController;
import com.android.wm.shell.desktopmode.DesktopMixedTransitionHandler;
import com.android.wm.shell.desktopmode.DesktopModeDragAndDropTransitionHandler;
import com.android.wm.shell.desktopmode.DesktopModeEventLogger;
@@ -397,12 +397,12 @@ public abstract class WMShellModule {
            Context context,
            ShellInit shellInit,
            Transitions transitions,
            Optional<DesktopFullImmersiveTransitionHandler> desktopImmersiveTransitionHandler,
            Optional<DesktopImmersiveController> desktopImmersiveController,
            WindowDecorViewModel windowDecorViewModel,
            Optional<TaskChangeListener> taskChangeListener,
            FocusTransitionObserver focusTransitionObserver) {
        return new FreeformTaskTransitionObserver(
                context, shellInit, transitions, desktopImmersiveTransitionHandler,
                context, shellInit, transitions, desktopImmersiveController,
                windowDecorViewModel, taskChangeListener, focusTransitionObserver);
    }

@@ -638,7 +638,7 @@ public abstract class WMShellModule {
            ToggleResizeDesktopTaskTransitionHandler toggleResizeDesktopTaskTransitionHandler,
            DragToDesktopTransitionHandler dragToDesktopTransitionHandler,
            @DynamicOverride DesktopRepository desktopRepository,
            Optional<DesktopFullImmersiveTransitionHandler> desktopFullImmersiveTransitionHandler,
            Optional<DesktopImmersiveController> desktopImmersiveController,
            DesktopModeLoggerTransitionObserver desktopModeLoggerTransitionObserver,
            LaunchAdjacentController launchAdjacentController,
            RecentsTransitionHandler recentsTransitionHandler,
@@ -657,7 +657,7 @@ public abstract class WMShellModule {
                returnToDragStartAnimator, enterDesktopTransitionHandler,
                exitDesktopTransitionHandler, desktopModeDragAndDropTransitionHandler,
                toggleResizeDesktopTaskTransitionHandler,
                dragToDesktopTransitionHandler, desktopFullImmersiveTransitionHandler.get(),
                dragToDesktopTransitionHandler, desktopImmersiveController.get(),
                desktopRepository,
                desktopModeLoggerTransitionObserver, launchAdjacentController,
                recentsTransitionHandler, multiInstanceHelper, mainExecutor, desktopTasksLimiter,
@@ -705,7 +705,7 @@ public abstract class WMShellModule {

    @WMSingleton
    @Provides
    static Optional<DesktopFullImmersiveTransitionHandler> provideDesktopImmersiveHandler(
    static Optional<DesktopImmersiveController> provideDesktopImmersiveController(
            Context context,
            Transitions transitions,
            @DynamicOverride DesktopRepository desktopRepository,
@@ -713,7 +713,7 @@ public abstract class WMShellModule {
            ShellTaskOrganizer shellTaskOrganizer) {
        if (DesktopModeStatus.canEnterDesktopMode(context)) {
            return Optional.of(
                    new DesktopFullImmersiveTransitionHandler(
                    new DesktopImmersiveController(
                            transitions,
                            desktopRepository,
                            displayController,
+88 −25
Original line number Diff line number Diff line
@@ -36,20 +36,21 @@ import com.android.wm.shell.common.DisplayController
import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE
import com.android.wm.shell.transition.Transitions
import com.android.wm.shell.transition.Transitions.TransitionHandler
import com.android.wm.shell.transition.Transitions.TransitionObserver
import com.android.wm.shell.windowdecor.OnTaskResizeAnimationListener

/**
 * A [TransitionHandler] to move a task in/out of desktop's full immersive state where the task
 * A controller to move tasks in/out of desktop's full immersive state where the task
 * remains freeform while being able to take fullscreen bounds and have its App Header visibility
 * be transient below the status bar like in fullscreen immersive mode.
 */
class DesktopFullImmersiveTransitionHandler(
class DesktopImmersiveController(
    private val transitions: Transitions,
    private val desktopRepository: DesktopRepository,
    private val displayController: DisplayController,
    private val shellTaskOrganizer: ShellTaskOrganizer,
    private val transactionSupplier: () -> SurfaceControl.Transaction,
) : TransitionHandler {
) : TransitionHandler, TransitionObserver {

    constructor(
        transitions: Transitions,
@@ -67,7 +68,7 @@ class DesktopFullImmersiveTransitionHandler(
    private var state: TransitionState? = null

    @VisibleForTesting
    val pendingExternalExitTransitions = mutableSetOf<ExternalPendingExit>()
    val pendingExternalExitTransitions = mutableListOf<ExternalPendingExit>()

    /** Whether there is an immersive transition that hasn't completed yet. */
    private val inProgress: Boolean
@@ -184,6 +185,17 @@ class DesktopFullImmersiveTransitionHandler(
        return null
    }


    /** Whether the [change] in the [transition] is a known immersive change. */
    fun isImmersiveChange(
        transition: IBinder,
        change: TransitionInfo.Change,
    ): Boolean {
        return pendingExternalExitTransitions.any {
            it.transition == transition && it.taskId == change.taskInfo?.taskId
        }
    }

    private fun addPendingImmersiveExit(taskId: Int, displayId: Int, transition: IBinder) {
        pendingExternalExitTransitions.add(
            ExternalPendingExit(
@@ -201,10 +213,11 @@ class DesktopFullImmersiveTransitionHandler(
        finishTransaction: SurfaceControl.Transaction,
        finishCallback: Transitions.TransitionFinishCallback
    ): Boolean {
        logD("startAnimation transition=%s", transition)
        val state = requireState()
        if (transition != state.transition) return false
        animateResize(
            transitionState = state,
            targetTaskId = state.taskId,
            info = info,
            startTransaction = startTransaction,
            finishTransaction = finishTransaction,
@@ -214,40 +227,55 @@ class DesktopFullImmersiveTransitionHandler(
    }

    private fun animateResize(
        transitionState: TransitionState,
        targetTaskId: Int,
        info: TransitionInfo,
        startTransaction: SurfaceControl.Transaction,
        finishTransaction: SurfaceControl.Transaction,
        finishCallback: Transitions.TransitionFinishCallback
    ) {
        logD("animateResize for task#%d", targetTaskId)
        val change = info.changes.first { c ->
            val taskInfo = c.taskInfo
            return@first taskInfo != null && taskInfo.taskId == transitionState.taskId
            return@first taskInfo != null && taskInfo.taskId == targetTaskId
        }
        animateResizeChange(change, startTransaction, finishTransaction, finishCallback)
    }

    /**
     *  Animate an immersive change.
     *
     *  As of now, both enter and exit transitions have the same animation, a veiled resize.
     */
    fun animateResizeChange(
        change: TransitionInfo.Change,
        startTransaction: SurfaceControl.Transaction,
        finishTransaction: SurfaceControl.Transaction,
        finishCallback: Transitions.TransitionFinishCallback,
    ) {
        val taskId = change.taskInfo!!.taskId
        val leash = change.leash
        val startBounds = change.startAbsBounds
        val endBounds = change.endAbsBounds
        logD("Animating resize change for task#%d from %s to %s", taskId, startBounds, endBounds)

        val updateTransaction = transactionSupplier()
        ValueAnimator.ofObject(rectEvaluator, startBounds, endBounds).apply {
            duration = FULL_IMMERSIVE_ANIM_DURATION_MS
            interpolator = DecelerateInterpolator()
            addListener(
                onStart = {
        startTransaction
            .setPosition(leash, startBounds.left.toFloat(), startBounds.top.toFloat())
            .setWindowCrop(leash, startBounds.width(), startBounds.height())
            .show(leash)
        onTaskResizeAnimationListener
                        ?.onAnimationStart(transitionState.taskId, startTransaction, startBounds)
            ?.onAnimationStart(taskId, startTransaction, startBounds)
            ?: startTransaction.apply()
                },
        val updateTransaction = transactionSupplier()
        ValueAnimator.ofObject(rectEvaluator, startBounds, endBounds).apply {
            duration = FULL_IMMERSIVE_ANIM_DURATION_MS
            interpolator = DecelerateInterpolator()
            addListener(
                onEnd = {
                    finishTransaction
                        .setPosition(leash, endBounds.left.toFloat(), endBounds.top.toFloat())
                        .setWindowCrop(leash, endBounds.width(), endBounds.height())
                        .apply()
                    onTaskResizeAnimationListener?.onAnimationEnd(transitionState.taskId)
                    onTaskResizeAnimationListener?.onAnimationEnd(taskId)
                    finishCallback.onTransitionFinished(null /* wct */)
                    clearState()
                }
@@ -259,7 +287,7 @@ class DesktopFullImmersiveTransitionHandler(
                    .setWindowCrop(leash, rect.width(), rect.height())
                    .apply()
                onTaskResizeAnimationListener
                    ?.onBoundsChange(transitionState.taskId, updateTransaction, rect)
                    ?.onBoundsChange(taskId, updateTransaction, rect)
                    ?: updateTransaction.apply()
            }
            start()
@@ -289,15 +317,20 @@ class DesktopFullImmersiveTransitionHandler(
     * |onTransitionReady|, before this transition actually animates) because drawing decorations
     * depends on whether the task is in full immersive state or not.
     */
    fun onTransitionReady(transition: IBinder, info: TransitionInfo) {
    override fun onTransitionReady(
        transition: IBinder,
        info: TransitionInfo,
        startTransaction: SurfaceControl.Transaction,
        finishTransaction: SurfaceControl.Transaction,
    ) {
        logD("onTransitionReady transition=%s", transition)
        // Check if this is a pending external exit transition.
        val pendingExit = pendingExternalExitTransitions
            .firstOrNull { pendingExit -> pendingExit.transition == transition }
        if (pendingExit != null) {
            pendingExternalExitTransitions.remove(pendingExit)
            if (info.hasTaskChange(taskId = pendingExit.taskId)) {
                if (desktopRepository.isTaskInFullImmersiveState(pendingExit.taskId)) {
                    logV("Pending external exit for task ${pendingExit.taskId} verified")
                    logV("Pending external exit for task#%d verified", pendingExit.taskId)
                    desktopRepository.setTaskInFullImmersiveState(
                        displayId = pendingExit.displayId,
                        taskId = pendingExit.taskId,
@@ -316,7 +349,7 @@ class DesktopFullImmersiveTransitionHandler(
            val state = requireState()
            val startBounds = info.changes.first { c -> c.taskInfo?.taskId == state.taskId }
                .startAbsBounds
            logV("Direct move for task ${state.taskId} in ${state.direction} direction verified")
            logV("Direct move for task#%d in %s direction verified", state.taskId, state.direction)
            when (state.direction) {
                Direction.ENTER -> {
                    desktopRepository.setTaskInFullImmersiveState(
@@ -348,7 +381,7 @@ class DesktopFullImmersiveTransitionHandler(
            .filter { c -> desktopRepository.isTaskInFullImmersiveState(c.taskInfo!!.taskId) }
            .filter { c -> c.startRotation != c.endRotation }
            .forEach { c ->
                logV("Detected immersive exit due to rotation for task: ${c.taskInfo!!.taskId}")
                logV("Detected immersive exit due to rotation for task#%d", c.taskInfo!!.taskId)
                desktopRepository.setTaskInFullImmersiveState(
                    displayId = c.taskInfo!!.displayId,
                    taskId = c.taskInfo!!.taskId,
@@ -357,6 +390,32 @@ class DesktopFullImmersiveTransitionHandler(
            }
    }

    override fun onTransitionMerged(merged: IBinder, playing: IBinder) {
        logD("onTransitionMerged merged=%s playing=%s", merged, playing)
        val pendingExit = pendingExternalExitTransitions
            .firstOrNull { pendingExit -> pendingExit.transition == merged }
        if (pendingExit != null) {
            logV(
                "Pending exit transition %s for task#%s merged into %s",
                merged, pendingExit.taskId, playing
            )
            pendingExit.transition = playing
        }
    }

    override fun onTransitionFinished(transition: IBinder, aborted: Boolean) {
        logD("onTransitionFinished transition=%s aborted=%b", transition, aborted)
        val pendingExit = pendingExternalExitTransitions
            .firstOrNull { pendingExit -> pendingExit.transition == transition }
        if (pendingExit != null) {
            logV(
                "Pending exit transition %s for task#%s finished",
                transition, pendingExit
            )
            pendingExternalExitTransitions.remove(pendingExit)
        }
    }

    private fun clearState() {
        state = null
    }
@@ -399,7 +458,7 @@ class DesktopFullImmersiveTransitionHandler(
    data class ExternalPendingExit(
        val taskId: Int,
        val displayId: Int,
        val transition: IBinder,
        var transition: IBinder,
    )

    private enum class Direction {
@@ -410,6 +469,10 @@ class DesktopFullImmersiveTransitionHandler(
        ProtoLog.v(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments)
    }

    private fun logD(msg: String, vararg arguments: Any?) {
        ProtoLog.d(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments)
    }

    private companion object {
        private const val TAG = "DesktopImmersive"

+86 −16
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ import android.view.DragEvent
import android.view.KeyEvent
import android.view.MotionEvent
import android.view.SurfaceControl
import android.view.SurfaceControl.Transaction
import android.view.WindowManager.TRANSIT_CHANGE
import android.view.WindowManager.TRANSIT_CLOSE
import android.view.WindowManager.TRANSIT_NONE
@@ -59,6 +60,7 @@ import android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVI
import android.window.DesktopModeFlags.ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS
import android.window.RemoteTransition
import android.window.TransitionInfo
import android.window.TransitionInfo.Change
import android.window.TransitionRequestInfo
import android.window.WindowContainerTransaction
import androidx.annotation.BinderThread
@@ -115,6 +117,7 @@ import com.android.wm.shell.sysui.UserChangeListener
import com.android.wm.shell.transition.FocusTransitionObserver
import com.android.wm.shell.transition.OneShotRemoteHandler
import com.android.wm.shell.transition.Transitions
import com.android.wm.shell.transition.Transitions.TransitionFinishCallback
import com.android.wm.shell.windowdecor.DragPositioningCallbackUtility
import com.android.wm.shell.windowdecor.MoveToDesktopAnimator
import com.android.wm.shell.windowdecor.OnTaskRepositionAnimationListener
@@ -146,7 +149,7 @@ class DesktopTasksController(
    private val desktopModeDragAndDropTransitionHandler: DesktopModeDragAndDropTransitionHandler,
    private val toggleResizeDesktopTaskTransitionHandler: ToggleResizeDesktopTaskTransitionHandler,
    private val dragToDesktopTransitionHandler: DragToDesktopTransitionHandler,
    private val immersiveTransitionHandler: DesktopFullImmersiveTransitionHandler,
    private val desktopImmersiveController: DesktopImmersiveController,
    private val taskRepository: DesktopRepository,
    private val desktopModeLoggerTransitionObserver: DesktopModeLoggerTransitionObserver,
    private val launchAdjacentController: LaunchAdjacentController,
@@ -252,7 +255,7 @@ class DesktopTasksController(
        toggleResizeDesktopTaskTransitionHandler.setOnTaskResizeAnimationListener(listener)
        enterDesktopTaskTransitionHandler.setOnTaskResizeAnimationListener(listener)
        dragToDesktopTransitionHandler.onTaskResizeAnimationListener = listener
        immersiveTransitionHandler.onTaskResizeAnimationListener = listener
        desktopImmersiveController.onTaskResizeAnimationListener = listener
    }

    fun setOnTaskRepositionAnimationListener(listener: OnTaskRepositionAnimationListener) {
@@ -372,7 +375,7 @@ class DesktopTasksController(
        // TODO(342378842): Instead of using default display, support multiple displays
        val taskToMinimize = bringDesktopAppsToFrontBeforeShowingNewTask(
            DEFAULT_DISPLAY, wct, taskId)
        val runOnTransit = immersiveTransitionHandler.exitImmersiveIfApplicable(
        val runOnTransit = desktopImmersiveController.exitImmersiveIfApplicable(
            wct = wct,
            displayId = DEFAULT_DISPLAY,
            excludeTaskId = taskId,
@@ -403,7 +406,7 @@ class DesktopTasksController(
        }
        logV("moveRunningTaskToDesktop taskId=%d", task.taskId)
        exitSplitIfApplicable(wct, task)
        val runOnTransit = immersiveTransitionHandler.exitImmersiveIfApplicable(
        val runOnTransit = desktopImmersiveController.exitImmersiveIfApplicable(
            wct = wct,
            displayId = task.displayId,
            excludeTaskId = task.taskId,
@@ -452,7 +455,7 @@ class DesktopTasksController(
        val taskToMinimize =
            bringDesktopAppsToFrontBeforeShowingNewTask(taskInfo.displayId, wct, taskInfo.taskId)
        addMoveToDesktopChanges(wct, taskInfo)
        val runOnTransit = immersiveTransitionHandler.exitImmersiveIfApplicable(
        val runOnTransit = desktopImmersiveController.exitImmersiveIfApplicable(
            wct, taskInfo.displayId)
        val transition = dragToDesktopTransitionHandler.finishDragToDesktopTransition(wct)
        transition?.let {
@@ -499,7 +502,7 @@ class DesktopTasksController(
                taskId
            )
        )
        return immersiveTransitionHandler.exitImmersiveIfApplicable(wct, taskInfo)
        return desktopImmersiveController.exitImmersiveIfApplicable(wct, taskInfo)
    }

    fun minimizeTask(taskInfo: RunningTaskInfo) {
@@ -512,7 +515,7 @@ class DesktopTasksController(
            removeWallpaperActivity(wct)
        }
        // Notify immersive handler as it might need to exit immersive state.
        val runOnTransit = immersiveTransitionHandler.exitImmersiveIfApplicable(wct, taskInfo)
        val runOnTransit = desktopImmersiveController.exitImmersiveIfApplicable(wct, taskInfo)

        wct.reorder(taskInfo.token, false)
        val transition = freeformTaskTransitionStarter.startMinimizedModeTransition(wct)
@@ -616,7 +619,7 @@ class DesktopTasksController(
        logV("moveBackgroundTaskToFront taskId=%s", taskId)
        val wct = WindowContainerTransaction()
        // TODO: b/342378842 - Instead of using default display, support multiple displays
        val runOnTransit = immersiveTransitionHandler.exitImmersiveIfApplicable(
        val runOnTransit = desktopImmersiveController.exitImmersiveIfApplicable(
            wct = wct,
            displayId = DEFAULT_DISPLAY,
            excludeTaskId = taskId,
@@ -642,7 +645,7 @@ class DesktopTasksController(
        logV("moveTaskToFront taskId=%s", taskInfo.taskId)
        val wct = WindowContainerTransaction()
        wct.reorder(taskInfo.token, true /* onTop */, true /* includingParents */)
        val runOnTransit = immersiveTransitionHandler.exitImmersiveIfApplicable(
        val runOnTransit = desktopImmersiveController.exitImmersiveIfApplicable(
            wct = wct,
            displayId = taskInfo.displayId,
            excludeTaskId = taskInfo.taskId,
@@ -749,12 +752,12 @@ class DesktopTasksController(

    private fun moveDesktopTaskToFullImmersive(taskInfo: RunningTaskInfo) {
        check(taskInfo.isFreeform) { "Task must already be in freeform" }
        immersiveTransitionHandler.moveTaskToImmersive(taskInfo)
        desktopImmersiveController.moveTaskToImmersive(taskInfo)
    }

    private fun exitDesktopTaskFromFullImmersive(taskInfo: RunningTaskInfo) {
        check(taskInfo.isFreeform) { "Task must already be in freeform" }
        immersiveTransitionHandler.moveTaskToNonImmersive(taskInfo)
        desktopImmersiveController.moveTaskToNonImmersive(taskInfo)
    }

    /**
@@ -1233,6 +1236,67 @@ class DesktopTasksController(
        return result
    }

    /** Whether the given [change] in the [transition] is a known desktop change. */
    fun isDesktopChange(
        transition: IBinder,
        change: TransitionInfo.Change,
    ): Boolean {
        // Only the immersive controller is currently involved in mixed transitions.
        return Flags.enableFullyImmersiveInDesktop()
                && desktopImmersiveController.isImmersiveChange(transition, change)
    }

    /**
     * Whether the given transition [info] will potentially include a desktop change, in which
     * case the transition should be treated as mixed so that the change is in part animated by
     * one of the desktop transition handlers.
     */
    fun shouldPlayDesktopAnimation(info: TransitionRequestInfo): Boolean {
        // Only immersive mixed transition are currently supported.
        if (!Flags.enableFullyImmersiveInDesktop()) return false
        val triggerTask = info.triggerTask ?: return false
        if (!isDesktopModeShowing(triggerTask.displayId)) {
            return false
        }
        if (!TransitionUtil.isOpeningType(info.type)) {
            return false
        }
        taskRepository.getTaskInFullImmersiveState(displayId = triggerTask.displayId)
            ?: return false
        return when {
            triggerTask.isFullscreen -> {
                // Trigger fullscreen task will enter desktop, so any existing immersive task
                // should exit.
                shouldFullscreenTaskLaunchSwitchToDesktop(triggerTask)
            }
            triggerTask.isFreeform -> {
                // Trigger freeform task will enter desktop, so any existing immersive task should
                // exit.
                !shouldFreeformTaskLaunchSwitchToFullscreen(triggerTask)
            }
            else -> false
        }
    }

    /** Animate a desktop change found in a mixed transitions. */
    fun animateDesktopChange(
        transition: IBinder,
        change: Change,
        startTransaction: Transaction,
        finishTransaction: Transaction,
        finishCallback: TransitionFinishCallback,
    ) {
        if (!desktopImmersiveController.isImmersiveChange(transition, change)) {
            throw IllegalStateException("Only immersive changes support desktop mixed transitions")
        }
        desktopImmersiveController.animateResizeChange(
            change,
            startTransaction,
            finishTransaction,
            finishCallback
        )
    }

    private fun taskContainsDragAndDropCookie(taskInfo: RunningTaskInfo?) =
        taskInfo?.launchCookies?.any { it == dragAndDropFullscreenCookie } ?: false

@@ -1279,7 +1343,7 @@ class DesktopTasksController(
            wct.startTask(requestedTaskId, options.toBundle())
            val taskToMinimize = bringDesktopAppsToFrontBeforeShowingNewTask(
                callingTask.displayId, wct, requestedTaskId)
            val runOnTransit = immersiveTransitionHandler.exitImmersiveIfApplicable(
            val runOnTransit = desktopImmersiveController.exitImmersiveIfApplicable(
                wct = wct,
                displayId = callingTask.displayId,
                excludeTaskId = requestedTaskId,
@@ -1392,7 +1456,7 @@ class DesktopTasksController(
            return null
        }
        val wct = WindowContainerTransaction()
        if (!isDesktopModeShowing(task.displayId)) {
        if (shouldFreeformTaskLaunchSwitchToFullscreen(task)) {
            logD("Bring desktop tasks to front on transition=taskId=%d", task.taskId)
            if (taskRepository.isActiveTask(task.taskId) && !forceEnterDesktop(task.displayId)) {
                // We are outside of desktop mode and already existing desktop task is being
@@ -1423,7 +1487,7 @@ class DesktopTasksController(
        }
        // Desktop Mode is showing and we're launching a new Task:
        // 1) Exit immersive if needed.
        immersiveTransitionHandler.exitImmersiveIfApplicable(transition, wct, task.displayId)
        desktopImmersiveController.exitImmersiveIfApplicable(transition, wct, task.displayId)
        // 2) minimize a Task if needed.
        val taskToMinimize = addAndGetMinimizeChangesIfNeeded(task.displayId, wct, task.taskId)
        if (taskToMinimize != null) {
@@ -1438,7 +1502,7 @@ class DesktopTasksController(
        transition: IBinder
    ): WindowContainerTransaction? {
        logV("handleFullscreenTaskLaunch")
        if (isDesktopModeShowing(task.displayId) || forceEnterDesktop(task.displayId)) {
        if (shouldFullscreenTaskLaunchSwitchToDesktop(task)) {
            logD("Switch fullscreen task to freeform on transition: taskId=%d", task.taskId)
            return WindowContainerTransaction().also { wct ->
                addMoveToDesktopChanges(wct, task)
@@ -1454,7 +1518,7 @@ class DesktopTasksController(
                val taskToMinimize =
                    addAndGetMinimizeChangesIfNeeded(task.displayId, wct, task.taskId)
                addPendingMinimizeTransition(transition, taskToMinimize)
                immersiveTransitionHandler.exitImmersiveIfApplicable(
                desktopImmersiveController.exitImmersiveIfApplicable(
                    transition, wct, task.displayId
                )
            }
@@ -1462,6 +1526,12 @@ class DesktopTasksController(
        return null
    }

    private fun shouldFreeformTaskLaunchSwitchToFullscreen(task: RunningTaskInfo): Boolean =
        !isDesktopModeShowing(task.displayId)

    private fun shouldFullscreenTaskLaunchSwitchToDesktop(task: RunningTaskInfo): Boolean =
        isDesktopModeShowing(task.displayId) || forceEnterDesktop(task.displayId)

    /**
     * If a task is not compatible with desktop mode freeform, it should always be launched in
     * fullscreen.
+22 −6

File changed.

Preview size limit exceeded, changes collapsed.

+24 −4

File changed.

Preview size limit exceeded, changes collapsed.

Loading