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

Commit 0a699200 authored by Orhan Uysal's avatar Orhan Uysal Committed by Android (Google) Code Review
Browse files

Merge "Move task to fullscreen on startLockTaskMode." into main

parents d0b375db 148c4d2e
Loading
Loading
Loading
Loading
+37 −1
Original line number Diff line number Diff line
@@ -61,6 +61,7 @@ import android.view.WindowManager.TRANSIT_CLOSE
import android.view.WindowManager.TRANSIT_NONE
import android.view.WindowManager.TRANSIT_OPEN
import android.view.WindowManager.TRANSIT_PIP
import android.view.WindowManager.TRANSIT_START_LOCK_TASK_MODE
import android.view.WindowManager.TRANSIT_TO_BACK
import android.view.WindowManager.TRANSIT_TO_FRONT
import android.view.WindowManager.transitTypeToString
@@ -3237,7 +3238,9 @@ class DesktopTasksController(
                // Handle task moving requests
                request.requestedLocation != null -> true
                // Only handle open or to front transitions
                request.type != TRANSIT_OPEN && request.type != TRANSIT_TO_FRONT -> {
                request.type != TRANSIT_OPEN &&
                    request.type != TRANSIT_TO_FRONT &&
                    request.type != TRANSIT_START_LOCK_TASK_MODE -> {
                    reason = "transition type not handled (${request.type})"
                    false
                }
@@ -3274,6 +3277,8 @@ class DesktopTasksController(
                // Check if freeform task launch during recents should be handled
                shouldHandleMidRecentsFreeformLaunch ->
                    handleMidRecentsFreeformTaskLaunch(triggerTask, transition)
                request.type == TRANSIT_START_LOCK_TASK_MODE ->
                    handleLockTask(triggerTask, transition)
                // Check if the closing task needs to be handled
                TransitionUtil.isClosingType(request.type) ->
                    handleTaskClosing(triggerTask, transition, request.type)
@@ -3567,6 +3572,37 @@ class DesktopTasksController(
        }
    }

    private fun handleLockTask(
        task: RunningTaskInfo,
        transition: IBinder,
    ): WindowContainerTransaction? {
        logV("handleLockTask taskId=%d", task.taskId)
        if (
            !DesktopExperienceFlags.ENABLE_DESKTOP_WINDOWING_ENTERPRISE_BUGFIX.isTrue() ||
                !task.isFreeform
        )
            return null

        val wct = WindowContainerTransaction()
        val runOnTransitStart =
            addMoveToFullscreenChanges(
                wct = wct,
                taskInfo = task,
                willExitDesktop =
                    willExitDesktop(
                        triggerTaskId = task.taskId,
                        displayId = task.displayId,
                        userId = task.userId,
                        forceExitDesktop = true,
                    ),
            )
        moveHomeTaskToTop(DEFAULT_DISPLAY, wct)
        wct.reorder(task.token, /* onTop= */ true)

        runOnTransitStart?.invoke(transition)
        return wct
    }

    private fun handleHomeTaskLaunch(
        task: RunningTaskInfo,
        transition: IBinder,
+22 −0
Original line number Diff line number Diff line
@@ -74,6 +74,7 @@ import android.view.WindowManager
import android.view.WindowManager.TRANSIT_CHANGE
import android.view.WindowManager.TRANSIT_CLOSE
import android.view.WindowManager.TRANSIT_OPEN
import android.view.WindowManager.TRANSIT_START_LOCK_TASK_MODE
import android.view.WindowManager.TRANSIT_TO_BACK
import android.view.WindowManager.TRANSIT_TO_FRONT
import android.widget.Toast
@@ -7454,6 +7455,27 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
            )
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_ENTERPRISE_BUGFIX)
    fun handleRequest_lockTaskMode_freeformTask_movesTaskToFullscreen() {
        val freeformTask = setUpFreeformTask()
        val homeTask = setUpHomeTask()
        val transition = createTransition(task = freeformTask, type = TRANSIT_START_LOCK_TASK_MODE)

        val wct = controller.handleRequest(Binder(), transition)

        assertNotNull(wct) { "Should handle request" }

        // Check for moving to fullscreen
        assertThat(wct.changes[freeformTask.token.asBinder()]?.windowingMode)
            .isEqualTo(WINDOWING_MODE_UNDEFINED)
        assertThat(findBoundsChange(wct, freeformTask)).isEqualTo(Rect())
        // Check for home task reorder
        wct.assertReorder(homeTask, toTop = true)
        // Check for task reorder
        wct.assertReorder(freeformTask, toTop = true)
    }

    @Test
    fun handleRequest_freeformTask_displayDoesntHandleDesktop_returnNull() {
        desktopState.overrideDesktopModeSupportPerDisplay[SECOND_DISPLAY] = false
+12 −9
Original line number Diff line number Diff line
@@ -129,6 +129,7 @@ import android.util.Pair;
import android.util.Slog;
import android.view.SurfaceControl;
import android.view.WindowManager;
import android.window.DesktopExperienceFlags;
import android.window.IDisplayAreaOrganizerController;
import android.window.IMultitaskingController;
import android.window.ITaskFragmentOrganizer;
@@ -1322,8 +1323,9 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
                    Slog.e(TAG, "Attempt to operate on detached container: " + wc);
                    break;
                }
                // There is no use case to ask the reparent operation in lock-task mode now, so keep
                // skipping this operation as usual.
                if (!DesktopExperienceFlags.ENABLE_DESKTOP_WINDOWING_ENTERPRISE_BUGFIX.isTrue()) {
                    // There is no use case to ask the reparent operation in lock-task mode now,
                    // so keep skipping this operation as usual.
                    if (isInLockTaskMode && type == HIERARCHY_OP_TYPE_REPARENT) {
                        Slog.w(TAG, "Skip applying hierarchy operation " + hop
                                + " while in lock task mode");
@@ -1332,6 +1334,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
                    if (isLockTaskModeViolation(wc.getParent(), wc.asTask(), isInLockTaskMode)) {
                        break;
                    }
                }
                if (syncId >= 0) {
                    addToSyncSet(syncId, wc);
                }