diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/LetterboxUiController.java | 4 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java | 91 |
2 files changed, 88 insertions, 7 deletions
diff --git a/services/core/java/com/android/server/wm/LetterboxUiController.java b/services/core/java/com/android/server/wm/LetterboxUiController.java index b9ac89095112..aa80155671a2 100644 --- a/services/core/java/com/android/server/wm/LetterboxUiController.java +++ b/services/core/java/com/android/server/wm/LetterboxUiController.java @@ -845,7 +845,7 @@ final class LetterboxUiController { int dividerInsets = getResources().getDimensionPixelSize(R.dimen.docked_stack_divider_insets); int dividerSize = dividerWindowWidth - dividerInsets * 2; - final Rect bounds = new Rect(displayContent.getBounds()); + final Rect bounds = new Rect(displayContent.getWindowConfiguration().getAppBounds()); if (bounds.width() >= bounds.height()) { bounds.inset(/* dx */ dividerSize / 2, /* dy */ 0); bounds.right = bounds.centerX(); @@ -1500,7 +1500,7 @@ final class LetterboxUiController { } private void inheritConfiguration(ActivityRecord firstOpaque) { - // To avoid wrong behaviour, we're not forcing a specific aspet ratio to activities + // To avoid wrong behaviour, we're not forcing a specific aspect ratio to activities // which are not already providing one (e.g. permission dialogs) and presumably also // not resizable. if (mActivityRecord.getMinAspectRatio() != UNDEFINED_ASPECT_RATIO) { 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 d77b6ada268e..239805d2d79b 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -104,7 +104,6 @@ import libcore.junit.util.compat.CoreCompatChangeRule.DisableCompatChanges; import libcore.junit.util.compat.CoreCompatChangeRule.EnableCompatChanges; import org.junit.After; -import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -1988,7 +1987,7 @@ public class SizeCompatTests extends WindowTestsBase { float expectedAspectRatio = 1f * displayWidth / getExpectedSplitSize(displayHeight); final Rect afterBounds = activity.getBounds(); final float afterAspectRatio = (float) (afterBounds.height()) / afterBounds.width(); - Assert.assertEquals(expectedAspectRatio, afterAspectRatio, 0.001f); + assertEquals(expectedAspectRatio, afterAspectRatio, 0.001f); } @Test @@ -2013,7 +2012,7 @@ public class SizeCompatTests extends WindowTestsBase { float expectedAspectRatio = 1f * displayHeight / getExpectedSplitSize(displayWidth); final Rect afterBounds = activity.getBounds(); final float afterAspectRatio = (float) (afterBounds.height()) / afterBounds.width(); - Assert.assertEquals(expectedAspectRatio, afterAspectRatio, 0.001f); + assertEquals(expectedAspectRatio, afterAspectRatio, 0.001f); } @Test @@ -2039,7 +2038,7 @@ public class SizeCompatTests extends WindowTestsBase { float expectedAspectRatio = 1f * displayWidth / getExpectedSplitSize(displayHeight); final Rect afterBounds = activity.getBounds(); final float afterAspectRatio = (float) (afterBounds.width()) / afterBounds.height(); - Assert.assertEquals(expectedAspectRatio, afterAspectRatio, 0.001f); + assertEquals(expectedAspectRatio, afterAspectRatio, 0.001f); } @Test @@ -2065,7 +2064,89 @@ public class SizeCompatTests extends WindowTestsBase { float expectedAspectRatio = 1f * displayHeight / getExpectedSplitSize(displayWidth); final Rect afterBounds = activity.getBounds(); final float afterAspectRatio = (float) (afterBounds.width()) / afterBounds.height(); - Assert.assertEquals(expectedAspectRatio, afterAspectRatio, 0.001f); + assertEquals(expectedAspectRatio, afterAspectRatio, 0.001f); + } + + @Test + @EnableCompatChanges({ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO, + ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN}) + public void testOverrideSplitScreenAspectRatio_splitScreenActivityInPortrait_notLetterboxed() { + mAtm.mDevEnableNonResizableMultiWindow = true; + final int screenWidth = 1800; + final int screenHeight = 1000; + setUpDisplaySizeWithApp(screenWidth, screenHeight); + final ActivityRecord activity = new ActivityBuilder(mAtm) + .setTask(mTask) + .setComponent(ComponentName.createRelative(mContext, + SizeCompatTests.class.getName())) + .setUid(android.os.Process.myUid()) + .build(); + + activity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + // Simulate real display with top insets. + final int topInset = 30; + activity.mDisplayContent.getWindowConfiguration() + .setAppBounds(0, topInset, screenWidth, screenHeight); + + 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, getExpectedSplitSize(screenWidth), screenHeight); + assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode()); + assertEquals(WINDOWING_MODE_MULTI_WINDOW, activity.getWindowingMode()); + + // Unresizable portrait-only activity. + prepareUnresizable(activity, 3f, SCREEN_ORIENTATION_PORTRAIT); + + // Activity should have the aspect ratio of a split screen activity and occupy exactly one + // half of the screen, so there is no letterbox + float expectedAspectRatio = 1f * screenHeight / getExpectedSplitSize(screenWidth); + final Rect afterBounds = activity.getBounds(); + final float afterAspectRatio = (float) (afterBounds.height()) / afterBounds.width(); + assertEquals(expectedAspectRatio, afterAspectRatio, 0.001f); + assertFalse(activity.areBoundsLetterboxed()); + } + + @Test + @EnableCompatChanges({ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO, + ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN}) + public void testOverrideSplitScreenAspectRatio_splitScreenActivityInLandscape_notLetterboxed() { + mAtm.mDevEnableNonResizableMultiWindow = true; + final int screenWidth = 1000; + final int screenHeight = 1800; + setUpDisplaySizeWithApp(screenWidth, screenHeight); + final ActivityRecord activity = new ActivityBuilder(mAtm) + .setTask(mTask) + .setComponent(ComponentName.createRelative(mContext, + SizeCompatTests.class.getName())) + .setUid(android.os.Process.myUid()) + .build(); + + activity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + // Simulate real display with top insets. + final int leftInset = 30; + activity.mDisplayContent.getWindowConfiguration() + .setAppBounds(leftInset, 0, screenWidth, screenHeight); + + 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, screenWidth, getExpectedSplitSize(screenHeight)); + assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode()); + assertEquals(WINDOWING_MODE_MULTI_WINDOW, activity.getWindowingMode()); + + // Unresizable landscape-only activity. + prepareUnresizable(activity, 3f, SCREEN_ORIENTATION_LANDSCAPE); + + // Activity should have the aspect ratio of a split screen activity and occupy exactly one + // half of the screen, so there is no letterbox + float expectedAspectRatio = 1f * screenWidth / getExpectedSplitSize(screenHeight); + final Rect afterBounds = activity.getBounds(); + final float afterAspectRatio = (float) (afterBounds.width()) / afterBounds.height(); + assertEquals(expectedAspectRatio, afterAspectRatio, 0.001f); + assertFalse(activity.areBoundsLetterboxed()); } @Test |