From 383b0006c5e024c3dc63bc0884a7aae23c039516 Mon Sep 17 00:00:00 2001 From: Kazuki Takise Date: Thu, 27 Oct 2022 17:14:58 +0900 Subject: [PATCH] Fix win mode issues for unresizable apps Some unresizable apps are launched in freeform in freeform display, but the override windowing mode of this task needs to be left UNDEFINED. Otherwise, the task would remain freeform even when the display transitions from freeform to fullscreen. On the other hand, fullscreen unresizable apps need to remain fullscreen regardless of the windowing mode of the display. Also, with this CL, the same unresizable policies are applied in fullscreen display too as the display could be freeform later anyway. Bug: 185427982 Test: atest WmTests:TaskLaunchParamsModifierTests Change-Id: I7279be115d88731566c19be691ff562d5885a3af --- .../server/wm/TaskLaunchParamsModifier.java | 43 +++++++++--------- .../wm/TaskLaunchParamsModifierTests.java | 44 ++++++++++++++++--- 2 files changed, 60 insertions(+), 27 deletions(-) diff --git a/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java b/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java index 14a2d0383019e..39499523833e1 100644 --- a/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java +++ b/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java @@ -277,29 +277,31 @@ class TaskLaunchParamsModifier implements LaunchParamsModifier { // is set with the suggestedDisplayArea. If it is set, but the eventual TaskDisplayArea is // different, we should recalcuating the bounds. boolean hasInitialBoundsForSuggestedDisplayAreaInFreeformMode = false; - if (suggestedDisplayArea.inFreeformWindowingMode()) { - if (launchMode == WINDOWING_MODE_PINNED) { - if (DEBUG) appendLog("picture-in-picture"); - } else if (!root.isResizeable()) { - if (shouldLaunchUnresizableAppInFreeform(root, suggestedDisplayArea, options)) { - launchMode = WINDOWING_MODE_FREEFORM; - if (outParams.mBounds.isEmpty()) { - getTaskBounds(root, suggestedDisplayArea, layout, launchMode, - hasInitialBounds, outParams.mBounds); - hasInitialBoundsForSuggestedDisplayAreaInFreeformMode = true; - } - if (DEBUG) appendLog("unresizable-freeform"); - } else { - launchMode = WINDOWING_MODE_FULLSCREEN; - outParams.mBounds.setEmpty(); - if (DEBUG) appendLog("unresizable-forced-maximize"); + // shouldSetAsOverrideWindowingMode is set if the task needs to retain the launchMode + // regardless of the windowing mode of the parent. + boolean shouldSetAsOverrideWindowingMode = false; + if (launchMode == WINDOWING_MODE_PINNED) { + if (DEBUG) appendLog("picture-in-picture"); + } else if (!root.isResizeable()) { + if (shouldLaunchUnresizableAppInFreeformInFreeformMode(root, suggestedDisplayArea, + options)) { + launchMode = WINDOWING_MODE_UNDEFINED; + if (outParams.mBounds.isEmpty()) { + getTaskBounds(root, suggestedDisplayArea, layout, launchMode, hasInitialBounds, + outParams.mBounds); + hasInitialBoundsForSuggestedDisplayAreaInFreeformMode = true; } + if (DEBUG) appendLog("unresizable-freeform"); + } else { + launchMode = WINDOWING_MODE_FULLSCREEN; + outParams.mBounds.setEmpty(); + shouldSetAsOverrideWindowingMode = true; + if (DEBUG) appendLog("unresizable-forced-maximize"); } - } else { - if (DEBUG) appendLog("non-freeform-task-display-area"); } // If launch mode matches display windowing mode, let it inherit from display. outParams.mWindowingMode = launchMode == suggestedDisplayArea.getWindowingMode() + && !shouldSetAsOverrideWindowingMode ? WINDOWING_MODE_UNDEFINED : launchMode; if (phase == PHASE_WINDOWING_MODE) { @@ -650,7 +652,7 @@ class TaskLaunchParamsModifier implements LaunchParamsModifier { inOutBounds.offset(xOffset, yOffset); } - private boolean shouldLaunchUnresizableAppInFreeform(ActivityRecord activity, + private boolean shouldLaunchUnresizableAppInFreeformInFreeformMode(ActivityRecord activity, TaskDisplayArea displayArea, @Nullable ActivityOptions options) { if (options != null && options.getLaunchWindowingMode() == WINDOWING_MODE_FULLSCREEN) { // Do not launch the activity in freeform if it explicitly requested fullscreen mode. @@ -663,8 +665,7 @@ class TaskLaunchParamsModifier implements LaunchParamsModifier { final int displayOrientation = orientationFromBounds(displayArea.getBounds()); final int activityOrientation = resolveOrientation(activity, displayArea, displayArea.getBounds()); - if (displayArea.getWindowingMode() == WINDOWING_MODE_FREEFORM - && displayOrientation != activityOrientation) { + if (displayOrientation != activityOrientation) { return true; } diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java index 1188f49ae60e9..2a88eb0e7b617 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java @@ -825,10 +825,11 @@ public class TaskLaunchParamsModifierTests extends WindowTestsBase { } @Test - public void testLaunchesPortraitUnresizableOnFreeformDisplayWithFreeformSizeCompat() { + public void testLaunchesPortraitUnresizableOnFreeformLandscapeDisplay() { mAtm.mDevEnableNonResizableMultiWindow = true; final TestDisplayContent freeformDisplay = createNewDisplayContent( WINDOWING_MODE_FREEFORM); + assertTrue(freeformDisplay.getBounds().width() > freeformDisplay.getBounds().height()); final ActivityOptions options = ActivityOptions.makeBasic(); mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea(); mActivity.info.resizeMode = RESIZE_MODE_UNRESIZEABLE; @@ -836,12 +837,42 @@ public class TaskLaunchParamsModifierTests extends WindowTestsBase { assertEquals(RESULT_CONTINUE, new CalculateRequestBuilder().setOptions(options).calculate()); - assertEquivalentWindowingMode(WINDOWING_MODE_FREEFORM, mResult.mWindowingMode, - WINDOWING_MODE_FREEFORM); + assertEquals(WINDOWING_MODE_UNDEFINED, mResult.mWindowingMode); } @Test - public void testSkipsForceMaximizingAppsOnNonFreeformDisplay() { + public void testLaunchesLandscapeUnresizableOnFreeformLandscapeDisplay() { + mAtm.mDevEnableNonResizableMultiWindow = true; + final TestDisplayContent freeformDisplay = createNewDisplayContent( + WINDOWING_MODE_FREEFORM); + assertTrue(freeformDisplay.getBounds().width() > freeformDisplay.getBounds().height()); + final ActivityOptions options = ActivityOptions.makeBasic(); + mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea(); + mActivity.info.resizeMode = RESIZE_MODE_UNRESIZEABLE; + mActivity.info.screenOrientation = SCREEN_ORIENTATION_LANDSCAPE; + assertEquals(RESULT_CONTINUE, + new CalculateRequestBuilder().setOptions(options).calculate()); + + assertEquals(WINDOWING_MODE_FULLSCREEN, mResult.mWindowingMode); + } + + @Test + public void testLaunchesUndefinedUnresizableOnFreeformLandscapeDisplay() { + mAtm.mDevEnableNonResizableMultiWindow = true; + final TestDisplayContent freeformDisplay = createNewDisplayContent( + WINDOWING_MODE_FREEFORM); + assertTrue(freeformDisplay.getBounds().width() > freeformDisplay.getBounds().height()); + final ActivityOptions options = ActivityOptions.makeBasic(); + mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea(); + mActivity.info.resizeMode = RESIZE_MODE_UNRESIZEABLE; + assertEquals(RESULT_CONTINUE, + new CalculateRequestBuilder().setOptions(options).calculate()); + + assertEquals(WINDOWING_MODE_FULLSCREEN, mResult.mWindowingMode); + } + + @Test + public void testForceMaximizingAppsOnNonFreeformDisplay() { final ActivityOptions options = ActivityOptions.makeBasic(); options.setLaunchWindowingMode(WINDOWING_MODE_FREEFORM); options.setLaunchBounds(new Rect(0, 0, 200, 100)); @@ -855,8 +886,9 @@ public class TaskLaunchParamsModifierTests extends WindowTestsBase { assertEquals(RESULT_CONTINUE, new CalculateRequestBuilder().setOptions(options).calculate()); - assertEquivalentWindowingMode(WINDOWING_MODE_FREEFORM, mResult.mWindowingMode, - WINDOWING_MODE_FULLSCREEN); + // Non-resizable apps must be launched in fullscreen in a fullscreen display regardless of + // other properties. + assertEquals(WINDOWING_MODE_FULLSCREEN, mResult.mWindowingMode); } @Test