diff options
3 files changed, 52 insertions, 9 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index df13c13b208a..607b7e78c4ad 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -8388,6 +8388,12 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } } + @NonNull Rect getScreenResolvedBounds() { + final Configuration resolvedConfig = getResolvedOverrideConfiguration(); + final Rect resolvedBounds = resolvedConfig.windowConfiguration.getBounds(); + return mSizeCompatBounds != null ? mSizeCompatBounds : resolvedBounds; + } + void recomputeConfiguration() { // We check if the current activity is transparent. In that case we need to // recomputeConfiguration of the first opaque activity beneath, to allow a diff --git a/services/core/java/com/android/server/wm/LetterboxUiController.java b/services/core/java/com/android/server/wm/LetterboxUiController.java index 54137eb41c5f..93c9a1171354 100644 --- a/services/core/java/com/android/server/wm/LetterboxUiController.java +++ b/services/core/java/com/android/server/wm/LetterboxUiController.java @@ -977,6 +977,8 @@ final class LetterboxUiController { * </ul> */ private boolean isHorizontalReachabilityEnabled(Configuration parentConfiguration) { + // Use screen resolved bounds which uses resolved bounds or size compat bounds + // as activity bounds can sometimes be empty return mLetterboxConfiguration.getIsHorizontalReachabilityEnabled() && parentConfiguration.windowConfiguration.getWindowingMode() == WINDOWING_MODE_FULLSCREEN @@ -984,7 +986,7 @@ final class LetterboxUiController { && mActivityRecord.getOrientationForReachability() == ORIENTATION_PORTRAIT) // Check whether the activity fills the parent vertically. && parentConfiguration.windowConfiguration.getAppBounds().height() - <= mActivityRecord.getBounds().height(); + <= mActivityRecord.getScreenResolvedBounds().height(); } @VisibleForTesting @@ -1004,6 +1006,8 @@ final class LetterboxUiController { * </ul> */ private boolean isVerticalReachabilityEnabled(Configuration parentConfiguration) { + // Use screen resolved bounds which uses resolved bounds or size compat bounds + // as activity bounds can sometimes be empty return mLetterboxConfiguration.getIsVerticalReachabilityEnabled() && parentConfiguration.windowConfiguration.getWindowingMode() == WINDOWING_MODE_FULLSCREEN @@ -1011,7 +1015,7 @@ final class LetterboxUiController { && mActivityRecord.getOrientationForReachability() == ORIENTATION_LANDSCAPE) // Check whether the activity fills the parent horizontally. && parentConfiguration.windowConfiguration.getBounds().width() - == mActivityRecord.getBounds().width(); + == mActivityRecord.getScreenResolvedBounds().width(); } @VisibleForTesting 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 3e423c4d29ec..d266da1d87bf 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -3077,12 +3077,44 @@ public class SizeCompatTests extends WindowTestsBase { assertTrue(mActivity.inSizeCompatMode()); // Vertical reachability is disabled because the app does not match parent width - assertNotEquals(mActivity.getBounds().width(), mActivity.mDisplayContent.getBounds() - .width()); + assertNotEquals(mActivity.getScreenResolvedBounds().width(), + mActivity.mDisplayContent.getBounds().width()); assertFalse(mActivity.mLetterboxUiController.isVerticalReachabilityEnabled()); } @Test + public void testIsVerticalReachabilityEnabled_emptyBounds_true() { + setUpDisplaySizeWithApp(/* dw */ 1000, /* dh */ 2800); + mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + mWm.mLetterboxConfiguration.setIsVerticalReachabilityEnabled(true); + + prepareUnresizable(mActivity, SCREEN_ORIENTATION_LANDSCAPE); + + // Set up activity with empty bounds to mock loading of app + mActivity.getWindowConfiguration().setBounds(null); + assertEquals(new Rect(0, 0, 0, 0), mActivity.getBounds()); + + // Vertical reachability is still enabled as resolved bounds is not empty + assertTrue(mActivity.mLetterboxUiController.isVerticalReachabilityEnabled()); + } + + @Test + public void testIsHorizontalReachabilityEnabled_emptyBounds_true() { + setUpDisplaySizeWithApp(/* dw */ 2800, /* dh */ 1000); + mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + mWm.mLetterboxConfiguration.setIsHorizontalReachabilityEnabled(true); + + prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT); + + // Set up activity with empty bounds to mock loading of app + mActivity.getWindowConfiguration().setBounds(null); + assertEquals(new Rect(0, 0, 0, 0), mActivity.getBounds()); + + // Horizontal reachability is still enabled as resolved bounds is not empty + assertTrue(mActivity.mLetterboxUiController.isHorizontalReachabilityEnabled()); + } + + @Test public void testIsHorizontalReachabilityEnabled_doesNotMatchParentHeight_false() { setUpDisplaySizeWithApp(2800, 1000); mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); @@ -3098,8 +3130,8 @@ public class SizeCompatTests extends WindowTestsBase { assertTrue(mActivity.inSizeCompatMode()); // Horizontal reachability is disabled because the app does not match parent height - assertNotEquals(mActivity.getBounds().height(), mActivity.mDisplayContent.getBounds() - .height()); + assertNotEquals(mActivity.getScreenResolvedBounds().height(), + mActivity.mDisplayContent.getBounds().height()); assertFalse(mActivity.mLetterboxUiController.isHorizontalReachabilityEnabled()); } @@ -3119,8 +3151,8 @@ public class SizeCompatTests extends WindowTestsBase { assertTrue(mActivity.inSizeCompatMode()); // Horizontal reachability is enabled because the app matches parent height - assertEquals(mActivity.getBounds().height(), mActivity.mDisplayContent.getBounds() - .height()); + assertEquals(mActivity.getScreenResolvedBounds().height(), + mActivity.mDisplayContent.getBounds().height()); assertTrue(mActivity.mLetterboxUiController.isHorizontalReachabilityEnabled()); } @@ -3140,7 +3172,8 @@ public class SizeCompatTests extends WindowTestsBase { assertTrue(mActivity.inSizeCompatMode()); // Vertical reachability is enabled because the app matches parent width - assertEquals(mActivity.getBounds().width(), mActivity.mDisplayContent.getBounds().width()); + assertEquals(mActivity.getScreenResolvedBounds().width(), + mActivity.mDisplayContent.getBounds().width()); assertTrue(mActivity.mLetterboxUiController.isVerticalReachabilityEnabled()); } |