diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java | 43 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java | 42 |
2 files changed, 59 insertions, 26 deletions
diff --git a/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java b/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java index da73fad99eb7..6d149da99cb0 100644 --- a/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java +++ b/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java @@ -278,29 +278,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) { @@ -667,7 +669,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. @@ -680,8 +682,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 59bf526b3e97..72f29d3b2e6a 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java @@ -893,10 +893,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; @@ -904,12 +905,42 @@ public class TaskLaunchParamsModifierTests extends WindowTestsBase { assertEquals(RESULT_CONTINUE, new CalculateRequestBuilder().setOptions(options).calculate()); - assertEquivalentWindowingMode(WINDOWING_MODE_FREEFORM, mResult.mWindowingMode, + assertEquals(WINDOWING_MODE_UNDEFINED, mResult.mWindowingMode); + } + + @Test + 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 testSkipsForceMaximizingAppsOnNonFreeformDisplay() { + 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)); @@ -923,8 +954,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 |