From d6a7541ede8b0783654b45b87954394cadeba4d0 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Thu, 3 Jun 2021 20:32:44 +0800 Subject: [PATCH] Include insets in bounds with restricted aspect ratio The target of aspect ratio is app bounds. The output of applyAspectRatio is raw bounds. Because the insets of all sides will be clipped when resolving the configuration by computeConfigResourceOverrides, the raw aspect ration bounds should also include insets of all sides. Otherwise it wastes the available space of insets area. Fixes: 159745191 Fixes: 189558761 Test: SizeCompatTests#testOverrideMinAspectRatioLowerThanManifest CtsWindowManagerDeviceTestCases:AspectRatioTests Test: Set screen size to 1000x2200 with gesture navigation. Launch a landscape app with max aspect ratio 1.9. The bottom of screen shouldn't have an empty area. Change-Id: I55b9662425173f0df086439e121395682d951b60 --- .../com/android/server/wm/ActivityRecord.java | 21 ++++++++++++------- .../android/server/wm/SizeCompatTests.java | 13 +++++++++--- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index d4df2f258a047..9c43dd3941240 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -7729,13 +7729,20 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return false; } - // Compute configuration based on max supported width and height. - // Also account for the left / top insets (e.g. from display cutouts), which will be clipped - // away later in {@link Task#computeConfigResourceOverrides()}. Otherwise, the app - // bounds would end up too small. - outBounds.set(containingBounds.left, containingBounds.top, - activityWidth + containingAppBounds.left, - activityHeight + containingAppBounds.top); + // Compute configuration based on max or min supported width and height. + // Also account for the insets (e.g. display cutouts, navigation bar), which will be + // clipped away later in {@link Task#computeConfigResourceOverrides()}, i.e., the out + // bounds are the app bounds restricted by aspect ratio + clippable insets. Otherwise, + // the app bounds would end up too small. + int right = activityWidth + containingAppBounds.left; + if (right >= containingAppBounds.right) { + right += containingBounds.right - containingAppBounds.right; + } + int bottom = activityHeight + containingAppBounds.top; + if (bottom >= containingAppBounds.bottom) { + bottom += containingBounds.bottom - containingAppBounds.bottom; + } + outBounds.set(containingBounds.left, containingBounds.top, right, bottom); return true; } 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 1827730e99aa9..db7e43757f53d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -982,7 +982,9 @@ public class SizeCompatTests extends WindowTestsBase { @EnableCompatChanges({ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO, ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO_MEDIUM}) public void testOverrideMinAspectRatioLowerThanManifest() { - setUpDisplaySizeWithApp(1400, 1600); + final DisplayContent display = new TestDisplayContent.Builder(mAtm, 1400, 1800) + .setNotch(200).setSystemDecorations(true).build(); + mTask = new TaskBuilder(mSupervisor).setDisplay(display).build(); // Create a size compat activity on the same task. final ActivityRecord activity = new ActivityBuilder(mAtm) @@ -996,8 +998,13 @@ public class SizeCompatTests extends WindowTestsBase { // The per-package override should have no effect, because the manifest aspect ratio is // larger (2:1) - assertEquals(1600, activity.getBounds().height()); - assertEquals(800, activity.getBounds().width()); + final Rect appBounds = activity.getWindowConfiguration().getAppBounds(); + assertEquals("App bounds must have min aspect ratio", 2f, + (float) appBounds.height() / appBounds.width(), 0.0001f /* delta */); + assertEquals("Long side must fit task", + mTask.getWindowConfiguration().getAppBounds().height(), appBounds.height()); + assertEquals("Bounds can include insets", mTask.getBounds().height(), + activity.getBounds().height()); } @Test