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

Commit 148c4d2e authored by Orhan Uysal's avatar Orhan Uysal
Browse files

Move task to fullscreen on startLockTaskMode.

When a transition starts to enter lock task mode, move the task to
fullscreen. To do that with desks, we need to enable reparenting
operations during lock task.

Bug: 402443859
Test: Manual using TestDPC & atest DesktopTasksControllerTest
Flag: com.android.window.flags.enable_desktop_windowing_enterprise_bugfix
Change-Id: I632416c82cb4da969dd027a1abe88a91f227da2b
parent 7697ea30
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);
                }