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

Commit 543b24e2 authored by Vania Desmonda's avatar Vania Desmonda
Browse files

Fix crash when minimizing a window using keyboard shortcut as the

transition was not running on the shell main thread.

Fixes: 380039349
Flag: com.android.window.flags.enable_task_resizing_keyboard_shortcuts
Test: atest DesktopModeKeyGestureHandlerTest
Change-Id: Icc333f55e5f368fd08340d443e99b6f345f372e1
parent d5eaee40
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -854,14 +854,15 @@ public abstract class WMShellModule {
            Optional<DesktopTasksController> desktopTasksController,
            InputManager inputManager,
            ShellTaskOrganizer shellTaskOrganizer,
            FocusTransitionObserver focusTransitionObserver) {
            FocusTransitionObserver focusTransitionObserver,
            @ShellMainThread ShellExecutor mainExecutor) {
        if (DesktopModeStatus.canEnterDesktopMode(context) && useKeyGestureEventHandler()
                && manageKeyGestures()
                && (Flags.enableMoveToNextDisplayShortcut()
                || Flags.enableTaskResizingKeyboardShortcuts())) {
            return Optional.of(new DesktopModeKeyGestureHandler(context,
                    desktopModeWindowDecorViewModel, desktopTasksController,
                    inputManager, shellTaskOrganizer, focusTransitionObserver));
                    inputManager, shellTaskOrganizer, focusTransitionObserver, mainExecutor));
        }
        return Optional.empty();
    }
+8 −3
Original line number Diff line number Diff line
@@ -30,9 +30,11 @@ import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM
import android.content.Context
import com.android.hardware.input.Flags.manageKeyGestures
import com.android.window.flags.Flags.enableTaskResizingKeyboardShortcuts
import com.android.wm.shell.common.ShellExecutor
import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.ResizeTrigger
import com.android.wm.shell.transition.FocusTransitionObserver
import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE
import com.android.wm.shell.shared.annotations.ShellMainThread
import java.util.Optional

/**
@@ -45,6 +47,7 @@ class DesktopModeKeyGestureHandler(
    inputManager: InputManager,
    private val shellTaskOrganizer: ShellTaskOrganizer,
    private val focusTransitionObserver: FocusTransitionObserver,
    @ShellMainThread private val mainExecutor: ShellExecutor,
    ) : KeyGestureEventHandler {

    init {
@@ -102,10 +105,12 @@ class DesktopModeKeyGestureHandler(
            KeyGestureEvent.KEY_GESTURE_TYPE_MINIMIZE_FREEFORM_WINDOW -> {
                logV("Key gesture MINIMIZE_FREEFORM_WINDOW is handled")
                getGloballyFocusedFreeformTask()?.let {
                    mainExecutor.execute {
                        desktopTasksController.get().minimizeTask(
                            it,
                        )
                    }
                }
                return true
            }
            else -> return false
+6 −26
Original line number Diff line number Diff line
@@ -134,6 +134,12 @@ class DesktopModeKeyGestureHandlerTest : ShellTestCase() {
            null
        }.whenever(inputManager).registerKeyGestureEventHandler(any())
        shellInit.init()

        desktopModeKeyGestureHandler = DesktopModeKeyGestureHandler(
            context,
            Optional.of(desktopModeWindowDecorViewModel), Optional.of(desktopTasksController),
            inputManager, shellTaskOrganizer, focusTransitionObserver, testExecutor
        )
    }

    @After
@@ -151,11 +157,6 @@ class DesktopModeKeyGestureHandlerTest : ShellTestCase() {
        FLAG_USE_KEY_GESTURE_EVENT_HANDLER
    )
    fun keyGestureMoveToNextDisplay_shouldMoveToNextDisplay() {
        desktopModeKeyGestureHandler = DesktopModeKeyGestureHandler(
            context,
            Optional.of(desktopModeWindowDecorViewModel), Optional.of(desktopTasksController),
            inputManager, shellTaskOrganizer, focusTransitionObserver
        )
        // Set up two display ids
        whenever(rootTaskDisplayAreaOrganizer.displayIds)
            .thenReturn(intArrayOf(DEFAULT_DISPLAY, SECOND_DISPLAY))
@@ -187,11 +188,6 @@ class DesktopModeKeyGestureHandlerTest : ShellTestCase() {
        FLAG_ENABLE_TASK_RESIZING_KEYBOARD_SHORTCUTS
    )
    fun keyGestureSnapLeft_shouldSnapResizeTaskToLeft() {
        desktopModeKeyGestureHandler = DesktopModeKeyGestureHandler(
            context,
            Optional.of(desktopModeWindowDecorViewModel), Optional.of(desktopTasksController),
            inputManager, shellTaskOrganizer, focusTransitionObserver
        )
        val task = setUpFreeformTask()
        task.isFocused = true
        whenever(shellTaskOrganizer.getRunningTasks()).thenReturn(arrayListOf(task))
@@ -216,11 +212,6 @@ class DesktopModeKeyGestureHandlerTest : ShellTestCase() {
        FLAG_ENABLE_TASK_RESIZING_KEYBOARD_SHORTCUTS
    )
    fun keyGestureSnapRight_shouldSnapResizeTaskToRight() {
        desktopModeKeyGestureHandler = DesktopModeKeyGestureHandler(
            context,
            Optional.of(desktopModeWindowDecorViewModel), Optional.of(desktopTasksController),
            inputManager, shellTaskOrganizer, focusTransitionObserver
        )
        val task = setUpFreeformTask()
        task.isFocused = true
        whenever(shellTaskOrganizer.getRunningTasks()).thenReturn(arrayListOf(task))
@@ -245,11 +236,6 @@ class DesktopModeKeyGestureHandlerTest : ShellTestCase() {
        FLAG_ENABLE_TASK_RESIZING_KEYBOARD_SHORTCUTS
    )
    fun keyGestureToggleFreeformWindowSize_shouldToggleTaskSize() {
        desktopModeKeyGestureHandler = DesktopModeKeyGestureHandler(
            context,
            Optional.of(desktopModeWindowDecorViewModel), Optional.of(desktopTasksController),
            inputManager, shellTaskOrganizer, focusTransitionObserver
        )
        val task = setUpFreeformTask()
        task.isFocused = true
        whenever(shellTaskOrganizer.getRunningTasks()).thenReturn(arrayListOf(task))
@@ -276,11 +262,6 @@ class DesktopModeKeyGestureHandlerTest : ShellTestCase() {
        FLAG_ENABLE_TASK_RESIZING_KEYBOARD_SHORTCUTS
    )
    fun keyGestureMinimizeFreeformWindow_shouldMinimizeTask() {
        desktopModeKeyGestureHandler = DesktopModeKeyGestureHandler(
            context,
            Optional.of(desktopModeWindowDecorViewModel), Optional.of(desktopTasksController),
            inputManager, shellTaskOrganizer, focusTransitionObserver
        )
        val task = setUpFreeformTask()
        task.isFocused = true
        whenever(shellTaskOrganizer.getRunningTasks()).thenReturn(arrayListOf(task))
@@ -294,7 +275,6 @@ class DesktopModeKeyGestureHandlerTest : ShellTestCase() {
        val result = keyGestureEventHandler.handleKeyGestureEvent(event, null)

        assertThat(result).isTrue()
        verify(desktopTasksController).minimizeTask(task)
    }

    private fun setUpFreeformTask(