From 543b24e29f2d4718e70fc2a64db710ca4848f704 Mon Sep 17 00:00:00 2001 From: Vania Desmonda Date: Fri, 22 Nov 2024 16:07:02 +0000 Subject: 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 --- .../com/android/wm/shell/dagger/WMShellModule.java | 5 ++-- .../desktopmode/DesktopModeKeyGestureHandler.kt | 11 ++++++-- .../DesktopModeKeyGestureHandlerTest.kt | 32 ++++------------------ 3 files changed, 17 insertions(+), 31 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java index 0f636588476a..a8a3e3ee8c0d 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java @@ -854,14 +854,15 @@ public abstract class WMShellModule { Optional 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(); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeKeyGestureHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeKeyGestureHandler.kt index 6cb23b81f1e4..e0ddc9f498df 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeKeyGestureHandler.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeKeyGestureHandler.kt @@ -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,9 +105,11 @@ class DesktopModeKeyGestureHandler( KeyGestureEvent.KEY_GESTURE_TYPE_MINIMIZE_FREEFORM_WINDOW -> { logV("Key gesture MINIMIZE_FREEFORM_WINDOW is handled") getGloballyFocusedFreeformTask()?.let { - desktopTasksController.get().minimizeTask( - it, - ) + mainExecutor.execute { + desktopTasksController.get().minimizeTask( + it, + ) + } } return true } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeKeyGestureHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeKeyGestureHandlerTest.kt index 887bdc259f54..df2cfcca66ed 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeKeyGestureHandlerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeKeyGestureHandlerTest.kt @@ -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( -- cgit v1.2.3-59-g8ed1b