diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/ActivityRecord.java | 23 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java | 30 |
2 files changed, 39 insertions, 14 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index ae076f84a4de..62c8d8e889bd 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -8070,7 +8070,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A ? letterboxAspectRatioOverride : computeAspectRatio(parentBounds); // Apply aspect ratio to resolved bounds mIsAspectRatioApplied = applyAspectRatio(resolvedBounds, containingBoundsWithInsets, - containingBounds, desiredAspectRatio, true); + containingBounds, desiredAspectRatio); if (mCompatDisplayInsets != null) { mCompatDisplayInsets.getBoundsByRotation( @@ -8496,7 +8496,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A private boolean applyAspectRatio(Rect outBounds, Rect containingAppBounds, Rect containingBounds) { return applyAspectRatio(outBounds, containingAppBounds, containingBounds, - 0 /* desiredAspectRatio */, false /* fixedOrientationLetterboxed */); + 0 /* desiredAspectRatio */); } /** @@ -8507,23 +8507,18 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A */ // TODO(b/36505427): Consider moving this method and similar ones to ConfigurationContainer. private boolean applyAspectRatio(Rect outBounds, Rect containingAppBounds, - Rect containingBounds, float desiredAspectRatio, boolean fixedOrientationLetterboxed) { + Rect containingBounds, float desiredAspectRatio) { final float maxAspectRatio = info.getMaxAspectRatio(); final Task rootTask = getRootTask(); final float minAspectRatio = getMinAspectRatio(); - // Not using ActivityRecord#isResizeable() directly because app compatibility testing - // showed that android:supportsPictureInPicture="true" alone is not sufficient signal for - // not letterboxing an app. - // TODO(214602463): Remove multi-window check since orientation and aspect ratio - // restrictions should always be applied in multi-window. + final TaskFragment organizedTf = getOrganizedTaskFragment(); if (task == null || rootTask == null - || (inMultiWindowMode() && isResizeable(/* checkPictureInPictureSupport */ false) - && !fixedOrientationLetterboxed) || (maxAspectRatio < 1 && minAspectRatio < 1 && desiredAspectRatio < 1) - || isInVrUiMode(getConfiguration())) { - // We don't enforce aspect ratio if the activity task is in multiwindow unless it is in - // size-compat mode or is letterboxed from fixed orientation. We also don't set it if we - // are in VR mode. + // Don't set aspect ratio if we are in VR mode. + || isInVrUiMode(getConfiguration()) + // TODO(b/232898850): Always respect aspect ratio requests. + // Don't set aspect ratio for activity in ActivityEmbedding split. + || (organizedTf != null && !organizedTf.fillsParent())) { return false; } diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java index 9dc51976d22f..0240cc315e7b 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -1249,6 +1249,36 @@ public class SizeCompatTests extends WindowTestsBase { } @Test + @EnableCompatChanges({ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO, + ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO_LARGE}) + public void testOverrideMinAspectRatioLargeForResizableAppInSplitScreen() { + setUpDisplaySizeWithApp(/* dw= */ 1000, /* dh= */ 2800); + + // Create a size compat activity on the same task. + final ActivityRecord activity = new ActivityBuilder(mAtm) + .setTask(mTask) + .setScreenOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) + .setComponent(ComponentName.createRelative(mContext, + SizeCompatTests.class.getName())) + .setUid(android.os.Process.myUid()) + .build(); + + final TestSplitOrganizer organizer = + new TestSplitOrganizer(mAtm, activity.getDisplayContent()); + + // Move activity to split screen which takes half of the screen. + mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false , "test"); + organizer.mPrimary.setBounds(0, 0, 1000, 1400); + assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode()); + assertEquals(WINDOWING_MODE_MULTI_WINDOW, activity.getWindowingMode()); + + // The per-package override forces the activity into a 16:9 aspect ratio + assertEquals(1400, activity.getBounds().height()); + assertEquals(1400 / ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO_LARGE_VALUE, + activity.getBounds().width(), 0.5); + } + + @Test public void testLaunchWithFixedRotationTransform() { final int dw = 1000; final int dh = 2500; |