diff options
| author | 2024-11-23 07:53:14 +0000 | |
|---|---|---|
| committer | 2024-11-23 07:53:14 +0000 | |
| commit | ce03a3f350d7b8580ec22201eb30b18b148d9c09 (patch) | |
| tree | ad9acf90abd91953c6abe3f4508bc5eed51bde52 | |
| parent | 6861943e672dd820e8fb39d406f96b534f7eaa50 (diff) | |
| parent | 49a1ec603c8f9018951a76842f6ea525bf9f1362 (diff) | |
Merge changes from topic "desktop_mode_exit_max_cuj" into main
* changes:
Add base scenario test for desktop mode unmaximize app window
Add DESKTOP_MODE_UNMAXIMIZE_WINDOW instrumentation.
8 files changed, 152 insertions, 14 deletions
diff --git a/core/java/com/android/internal/jank/Cuj.java b/core/java/com/android/internal/jank/Cuj.java index 1204ef3f48fc..fc415377f1ee 100644 --- a/core/java/com/android/internal/jank/Cuj.java +++ b/core/java/com/android/internal/jank/Cuj.java @@ -235,8 +235,19 @@ public class Cuj { */ public static final int CUJ_DESKTOP_MODE_SNAP_RESIZE = 118; + /** + * Track unmaximize window interaction in desktop mode. + * + * <p> Tracking starts when the maximize button or option is clicked {@link + * com.android.wm.shell.windowdecor.DesktopModeWindowDecorViewModel#onClick} + * and finishes when the animation finishes {@link + * com.android.wm.shell.windowdecor.ToggleResizeDesktopTaskTransitionHandler#startAnimation} + * </p> + */ + public static final int CUJ_DESKTOP_MODE_UNMAXIMIZE_WINDOW = 119; + // When adding a CUJ, update this and make sure to also update CUJ_TO_STATSD_INTERACTION_TYPE. - @VisibleForTesting static final int LAST_CUJ = CUJ_DESKTOP_MODE_SNAP_RESIZE; + @VisibleForTesting static final int LAST_CUJ = CUJ_DESKTOP_MODE_UNMAXIMIZE_WINDOW; /** @hide */ @IntDef({ @@ -346,7 +357,8 @@ public class Cuj { CUJ_LAUNCHER_KEYBOARD_QUICK_SWITCH_APP_LAUNCH, CUJ_DESKTOP_MODE_ENTER_APP_HANDLE_DRAG_RELEASE, CUJ_DESKTOP_MODE_EXIT_MODE_ON_LAST_WINDOW_CLOSE, - CUJ_DESKTOP_MODE_SNAP_RESIZE + CUJ_DESKTOP_MODE_SNAP_RESIZE, + CUJ_DESKTOP_MODE_UNMAXIMIZE_WINDOW }) @Retention(RetentionPolicy.SOURCE) public @interface CujType {} @@ -467,6 +479,7 @@ public class Cuj { CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_DESKTOP_MODE_ENTER_APP_HANDLE_DRAG_RELEASE] = FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__DESKTOP_MODE_ENTER_APP_HANDLE_DRAG_RELEASE; CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_DESKTOP_MODE_EXIT_MODE_ON_LAST_WINDOW_CLOSE] = FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__DESKTOP_MODE_EXIT_MODE_ON_LAST_WINDOW_CLOSE; CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_DESKTOP_MODE_SNAP_RESIZE] = FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__DESKTOP_MODE_SNAP_RESIZE; + CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_DESKTOP_MODE_UNMAXIMIZE_WINDOW] = FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__DESKTOP_MODE_UNMAXIMIZE_WINDOW; } private Cuj() { @@ -699,6 +712,8 @@ public class Cuj { return "DESKTOP_MODE_EXIT_MODE_ON_LAST_WINDOW_CLOSE"; case CUJ_DESKTOP_MODE_SNAP_RESIZE: return "DESKTOP_MODE_SNAP_RESIZE"; + case CUJ_DESKTOP_MODE_UNMAXIMIZE_WINDOW: + return "DESKTOP_MODE_UNMAXIMIZE_WINDOW"; } return "UNKNOWN"; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt index ad28dcc5598a..c479ab382acb 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt @@ -797,6 +797,8 @@ class DesktopTasksController( taskInfo: RunningTaskInfo, resizeTrigger: ResizeTrigger, inputMethod: InputMethod, + maximizeCujRecorder: (() -> Unit)? = null, + unmaximizeCujRecorder: (() -> Unit)? = null, ) { val currentTaskBounds = taskInfo.configuration.windowConfiguration.bounds desktopModeEventLogger.logTaskResizingStarted( @@ -818,6 +820,7 @@ class DesktopTasksController( // helpful to eliminate the current task from logic to calculate taskbar corner rounding. val willMaximize = !isMaximized if (isMaximized) { + unmaximizeCujRecorder?.invoke() // The desktop task is at the maximized width and/or height of the stable bounds. // If the task's pre-maximize stable bounds were saved, toggle the task to those bounds. // Otherwise, toggle to the default bounds. @@ -833,6 +836,7 @@ class DesktopTasksController( } } } else { + maximizeCujRecorder?.invoke() // Save current bounds so that task can be restored back to original bounds if necessary // and toggle to the stable bounds. desktopTilingDecorViewModel.removeTaskIfTiled(taskInfo.displayId, taskInfo.taskId) @@ -889,7 +893,7 @@ class DesktopTasksController( toggleDesktopTaskSize( taskInfo, ResizeTrigger.DRAG_TO_TOP_RESIZE_TRIGGER, - DesktopModeEventLogger.getInputMethodFromMotionEvent(motionEvent) + DesktopModeEventLogger.getInputMethodFromMotionEvent(motionEvent), ) } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/ToggleResizeDesktopTaskTransitionHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/ToggleResizeDesktopTaskTransitionHandler.kt index 941115083717..6df3302f47a5 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/ToggleResizeDesktopTaskTransitionHandler.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/ToggleResizeDesktopTaskTransitionHandler.kt @@ -119,6 +119,7 @@ class ToggleResizeDesktopTaskTransitionHandler( initialBounds = null boundsAnimator = null interactionJankMonitor.end(Cuj.CUJ_DESKTOP_MODE_MAXIMIZE_WINDOW) + interactionJankMonitor.end(Cuj.CUJ_DESKTOP_MODE_UNMAXIMIZE_WINDOW) interactionJankMonitor.end(Cuj.CUJ_DESKTOP_MODE_SNAP_RESIZE) } ) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java index f8a409014f6c..04ef7c1dc461 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java @@ -586,11 +586,18 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, if (decoration == null) { return; } - mInteractionJankMonitor.begin( - decoration.mTaskSurface, mContext, mMainHandler, - Cuj.CUJ_DESKTOP_MODE_MAXIMIZE_WINDOW, source); mDesktopTasksController.toggleDesktopTaskSize(decoration.mTaskInfo, resizeTrigger, - DesktopModeEventLogger.getInputMethodFromMotionEvent(motionEvent)); + DesktopModeEventLogger.getInputMethodFromMotionEvent(motionEvent), () -> { + mInteractionJankMonitor.begin( + decoration.mTaskSurface, mContext, mMainHandler, + Cuj.CUJ_DESKTOP_MODE_MAXIMIZE_WINDOW, source); + return null; + }, () -> { + mInteractionJankMonitor.begin( + decoration.mTaskSurface, mContext, mMainHandler, + Cuj.CUJ_DESKTOP_MODE_UNMAXIMIZE_WINDOW, source); + return null; + }); decoration.closeHandleMenu(); decoration.closeMaximizeMenu(); } diff --git a/libs/WindowManager/Shell/tests/e2e/desktopmode/scenarios/src/com/android/wm/shell/functional/UnmaximizeAppWindowTest.kt b/libs/WindowManager/Shell/tests/e2e/desktopmode/scenarios/src/com/android/wm/shell/functional/UnmaximizeAppWindowTest.kt new file mode 100644 index 000000000000..7a71d4bf7a27 --- /dev/null +++ b/libs/WindowManager/Shell/tests/e2e/desktopmode/scenarios/src/com/android/wm/shell/functional/UnmaximizeAppWindowTest.kt @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.wm.shell.functional + +import android.platform.test.annotations.Postsubmit +import com.android.wm.shell.scenarios.UnmaximizeAppWindow +import org.junit.runner.RunWith +import org.junit.runners.BlockJUnit4ClassRunner + +/* Functional test for [UnmaximizeAppWindow]. */ +@RunWith(BlockJUnit4ClassRunner::class) +@Postsubmit +class UnmaximizeAppWindowTest : UnmaximizeAppWindow() diff --git a/libs/WindowManager/Shell/tests/e2e/desktopmode/scenarios/src/com/android/wm/shell/scenarios/UnmaximizeAppWindow.kt b/libs/WindowManager/Shell/tests/e2e/desktopmode/scenarios/src/com/android/wm/shell/scenarios/UnmaximizeAppWindow.kt new file mode 100644 index 000000000000..741125031b0a --- /dev/null +++ b/libs/WindowManager/Shell/tests/e2e/desktopmode/scenarios/src/com/android/wm/shell/scenarios/UnmaximizeAppWindow.kt @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.wm.shell.scenarios + +import android.app.Instrumentation +import android.tools.NavBar +import android.tools.Rotation +import android.tools.flicker.rules.ChangeDisplayOrientationRule +import android.tools.traces.parsers.WindowManagerStateHelper +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.uiautomator.UiDevice +import com.android.launcher3.tapl.LauncherInstrumentation +import com.android.server.wm.flicker.helpers.DesktopModeAppHelper +import com.android.server.wm.flicker.helpers.NonResizeableAppHelper +import com.android.server.wm.flicker.helpers.SimpleAppHelper +import com.android.window.flags.Flags +import com.android.wm.shell.Utils +import org.junit.After +import org.junit.Assume +import org.junit.Before +import org.junit.Ignore +import org.junit.Rule +import org.junit.Test + +/** + * Testing "unmaximizing" a window e.g. making it get out of/exit a window that was already + * maximized. + */ +@Ignore("Test Base Class") +abstract class UnmaximizeAppWindow +constructor(private val rotation: Rotation = Rotation.ROTATION_0, isResizable: Boolean = true) { + + private val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation() + private val tapl = LauncherInstrumentation() + private val wmHelper = WindowManagerStateHelper(instrumentation) + private val device = UiDevice.getInstance(instrumentation) + private val testApp = if (isResizable) { + DesktopModeAppHelper(SimpleAppHelper(instrumentation)) + } else { + DesktopModeAppHelper(NonResizeableAppHelper(instrumentation)) + } + + @Rule @JvmField val testSetupRule = Utils.testSetupRule(NavBar.MODE_GESTURAL, rotation) + + @Before + fun setup() { + Assume.assumeTrue(Flags.enableDesktopWindowingMode() && tapl.isTablet) + tapl.setEnableRotation(true) + tapl.setExpectedRotation(rotation.value) + ChangeDisplayOrientationRule.setRotation(rotation) + testApp.enterDesktopMode(wmHelper, device) + // Press the buttonn once to setup app window to be maximized already + testApp.maximiseDesktopApp(wmHelper, device) + } + + @Test + open fun unmaximizeAppWindow() { + // Re-press button to exit maximized state + testApp.maximiseDesktopApp(wmHelper, device) + } + + @After + fun teardown() { + testApp.exit(wmHelper) + } +} 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 19397c23af48..d4682c1325f2 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 @@ -258,7 +258,7 @@ class DesktopModeKeyGestureHandlerTest : ShellTestCase() { verify(desktopTasksController).toggleDesktopTaskSize( task, ResizeTrigger.MAXIMIZE_MENU, - DesktopModeEventLogger.Companion.InputMethod.KEYBOARD + DesktopModeEventLogger.Companion.InputMethod.KEYBOARD, ) } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt index 6c910f56f069..153be07bd204 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt @@ -398,9 +398,11 @@ class DesktopModeWindowDecorViewModelTests : DesktopModeWindowDecorViewModelTest maxOrRestoreListenerCaptor.value.invoke() verify(mockDesktopTasksController).toggleDesktopTaskSize( - decor.mTaskInfo, - ResizeTrigger.MAXIMIZE_MENU, - InputMethod.UNKNOWN_INPUT_METHOD + eq(decor.mTaskInfo), + eq(ResizeTrigger.MAXIMIZE_MENU), + eq(InputMethod.UNKNOWN_INPUT_METHOD), + any(), + any() ) } @@ -1059,9 +1061,11 @@ class DesktopModeWindowDecorViewModelTests : DesktopModeWindowDecorViewModelTest verify(mockDesktopTasksController) .toggleDesktopTaskSize( - decor.mTaskInfo, - ResizeTrigger.MAXIMIZE_BUTTON, - InputMethod.UNKNOWN_INPUT_METHOD + eq(decor.mTaskInfo), + eq(ResizeTrigger.MAXIMIZE_BUTTON), + eq(InputMethod.UNKNOWN_INPUT_METHOD), + any(), + any(), ) } |