Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +37 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 } Loading Loading @@ -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) Loading Loading @@ -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, Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +22 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading services/core/java/com/android/server/wm/WindowOrganizerController.java +12 −9 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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"); Loading @@ -1332,6 +1334,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub if (isLockTaskModeViolation(wc.getParent(), wc.asTask(), isInLockTaskMode)) { break; } } if (syncId >= 0) { addToSyncSet(syncId, wc); } Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +37 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 } Loading Loading @@ -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) Loading Loading @@ -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, Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +22 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading
services/core/java/com/android/server/wm/WindowOrganizerController.java +12 −9 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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"); Loading @@ -1332,6 +1334,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub if (isLockTaskModeViolation(wc.getParent(), wc.asTask(), isInLockTaskMode)) { break; } } if (syncId >= 0) { addToSyncSet(syncId, wc); } Loading