Merge "Fix win mode issues for unresizable apps" into tm-qpr-dev am: c502685f7a am: 91e0220a58

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/19415032

Change-Id: I1caec871125d84c991428c5d8b8dd8faf79bfc27
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java b/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java
index da73fad..6d149da 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 @@
         // 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 @@
         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 @@
         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 59bf526..72f29d3 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 @@
     }
 
     @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 @@
         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));
@@ -923,8 +954,9 @@
         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