diff options
3 files changed, 20 insertions, 65 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 8ab01f0601fe..7d5aa96db0b8 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -813,12 +813,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A @Nullable private Rect mLetterboxBoundsForFixedOrientationAndAspectRatio; - // Bounds populated in resolveAspectRatioRestriction when this activity is letterboxed for - // aspect ratio. If not null, they are used as parent container in - // resolveSizeCompatModeConfiguration and in a constructor of CompatDisplayInsets. - @Nullable - private Rect mLetterboxBoundsForAspectRatio; - // Whether the activity is eligible to be letterboxed for fixed orientation with respect to its // requested orientation, even when it's letterbox for another reason (e.g., size compat mode) // and therefore #isLetterboxedForFixedOrientationAndAspectRatio returns false. @@ -8408,14 +8402,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A fullConfig.windowConfiguration.getRotation()); } - final Rect letterboxedContainerBounds = - mLetterboxBoundsForFixedOrientationAndAspectRatio != null - ? mLetterboxBoundsForFixedOrientationAndAspectRatio - : mLetterboxBoundsForAspectRatio; - // The role of CompatDisplayInsets is like the override bounds. mCompatDisplayInsets = - new CompatDisplayInsets(mDisplayContent, this, letterboxedContainerBounds); + new CompatDisplayInsets( + mDisplayContent, this, mLetterboxBoundsForFixedOrientationAndAspectRatio); } private void clearSizeCompatModeAttributes() { @@ -8487,7 +8477,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A mIsAspectRatioApplied = false; mIsEligibleForFixedOrientationLetterbox = false; mLetterboxBoundsForFixedOrientationAndAspectRatio = null; - mLetterboxBoundsForAspectRatio = null; // Can't use resolvedConfig.windowConfiguration.getWindowingMode() because it can be // different from windowing mode of the task (PiP) during transition from fullscreen to PiP @@ -8522,11 +8511,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A getTaskFragment().computeConfigResourceOverrides(resolvedConfig, newParentConfiguration); } - } // If activity in fullscreen mode is letterboxed because of fixed orientation then bounds - // are already calculated in resolveFixedOrientationConfiguration, or if in size compat - // mode, it should already be calculated in resolveSizeCompatModeConfiguration - if (!isLetterboxedForFixedOrientationAndAspectRatio() && !mInSizeCompatModeForBounds) { + // are already calculated in resolveFixedOrientationConfiguration. + } else if (!isLetterboxedForFixedOrientationAndAspectRatio()) { resolveAspectRatioRestriction(newParentConfiguration); } @@ -8933,8 +8920,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } final CompatDisplayInsets compatDisplayInsets = getCompatDisplayInsets(); - if (compatDisplayInsets != null - && !compatDisplayInsets.mIsInFixedOrientationOrAspectRatioLetterbox) { + if (compatDisplayInsets != null && !compatDisplayInsets.mIsInFixedOrientationLetterbox) { // App prefers to keep its original size. // If the size compat is from previous fixed orientation letterboxing, we may want to // have fixed orientation letterbox again, otherwise it will show the size compat @@ -9066,7 +9052,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // restrict, the bounds should be the requested override bounds. getTaskFragment().computeConfigResourceOverrides(resolvedConfig, newParentConfiguration, getFixedRotationTransformDisplayInfo()); - mLetterboxBoundsForAspectRatio = new Rect(resolvedBounds); } } @@ -10635,10 +10620,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A /** Whether the {@link Task} windowingMode represents a floating window*/ final boolean mIsFloating; /** - * Whether is letterboxed because of fixed orientation or aspect ratio when the - * unresizable activity is first shown. + * Whether is letterboxed because of fixed orientation when the unresizable activity is + * first shown. */ - final boolean mIsInFixedOrientationOrAspectRatioLetterbox; + final boolean mIsInFixedOrientationLetterbox; /** * The nonDecorInsets for each rotation. Includes the navigation bar and cutout insets. It * is used to compute the appBounds. @@ -10653,7 +10638,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A /** Constructs the environment to simulate the bounds behavior of the given container. */ CompatDisplayInsets(DisplayContent display, ActivityRecord container, - @Nullable Rect letterboxedContainerBounds) { + @Nullable Rect fixedOrientationBounds) { mOriginalRotation = display.getRotation(); mIsFloating = container.getWindowConfiguration().tasksAreFloating(); mOriginalRequestedOrientation = container.getRequestedConfigurationOrientation(); @@ -10668,21 +10653,22 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A mNonDecorInsets[rotation] = emptyRect; mStableInsets[rotation] = emptyRect; } - mIsInFixedOrientationOrAspectRatioLetterbox = false; + mIsInFixedOrientationLetterbox = false; return; } final Task task = container.getTask(); - mIsInFixedOrientationOrAspectRatioLetterbox = letterboxedContainerBounds != null; + mIsInFixedOrientationLetterbox = fixedOrientationBounds != null; + // Store the bounds of the Task for the non-resizable activity to use in size compat // mode so that the activity will not be resized regardless the windowing mode it is // currently in. - // When an activity needs to be letterboxed because of fixed orientation or aspect - // ratio, use resolved bounds instead of task bounds since the activity will be - // displayed within these even if it is in size compat mode. - final Rect filledContainerBounds = mIsInFixedOrientationOrAspectRatioLetterbox - ? letterboxedContainerBounds + // When an activity needs to be letterboxed because of fixed orientation, use fixed + // orientation bounds instead of task bounds since the activity will be displayed + // within these even if it is in size compat mode. + final Rect filledContainerBounds = mIsInFixedOrientationLetterbox + ? fixedOrientationBounds : task != null ? task.getBounds() : display.getBounds(); final int filledContainerRotation = task != null ? task.getConfiguration().windowConfiguration.getRotation() 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 b6aaf77d5ab7..b96f39d7a4e1 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -27,7 +27,6 @@ import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE; import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; -import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_16_9; import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_3_2; @@ -1911,7 +1910,8 @@ public class SizeCompatTests extends WindowTestsBase { assertThat(mActivity.inSizeCompatMode()).isTrue(); assertActivityMaxBoundsSandboxed(); - final int scale = dh / dw; + + final int scale = dh / dw; // App bounds should be dh / scale x dw / scale assertEquals(dw, rotatedDisplayBounds.width()); @@ -4101,37 +4101,6 @@ public class SizeCompatTests extends WindowTestsBase { } @Test - public void testFixedAspectRatioAppInPortraitCloseToSquareDisplay_notInSizeCompat() { - setUpDisplaySizeWithApp(2200, 2280); - mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); - final DisplayContent display = mActivity.mDisplayContent; - // Simulate taskbar, final app bounds are (0, 0, 2200, 2130) - landscape - final WindowState navbar = createWindow(null, TYPE_NAVIGATION_BAR, mDisplayContent, - "navbar"); - final Binder owner = new Binder(); - navbar.mAttrs.providedInsets = new InsetsFrameProvider[] { - new InsetsFrameProvider(owner, 0, WindowInsets.Type.navigationBars()) - .setInsetsSize(Insets.of(0, 0, 0, 150)) - }; - display.getDisplayPolicy().addWindowLw(navbar, navbar.mAttrs); - assertTrue(navbar.providesDisplayDecorInsets() - && display.getDisplayPolicy().updateDecorInsetsInfo()); - display.sendNewConfiguration(); - - prepareMinAspectRatio(mActivity, OVERRIDE_MIN_ASPECT_RATIO_LARGE_VALUE, - SCREEN_ORIENTATION_LANDSCAPE); - // To force config to update again but with the same landscape orientation. - mActivity.setRequestedOrientation(SCREEN_ORIENTATION_SENSOR_LANDSCAPE); - - assertTrue(mActivity.shouldCreateCompatDisplayInsets()); - assertNotNull(mActivity.getCompatDisplayInsets()); - // Activity is not letterboxed for fixed orientation because orientation is respected - // with insets, and should not be in size compat mode - assertFalse(mActivity.isLetterboxedForFixedOrientationAndAspectRatio()); - assertFalse(mActivity.inSizeCompatMode()); - } - - @Test public void testApplyAspectRatio_activityAlignWithParentAppVertical() { // The display's app bounds will be (0, 100, 1000, 2350) final DisplayContent display = new TestDisplayContent.Builder(mAtm, 1000, 2500) diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java index b467acf678cb..961fdfb14bf3 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java @@ -799,7 +799,7 @@ public class TaskTests extends WindowTestsBase { final ActivityRecord activity = new ActivityBuilder(mAtm).setTask(task).build(); final ActivityRecord.CompatDisplayInsets compatInsets = new ActivityRecord.CompatDisplayInsets( - display, activity, /* letterboxedContainerBounds */ null); + display, activity, /* fixedOrientationBounds= */ null); task.computeConfigResourceOverrides(inOutConfig, parentConfig, compatInsets); assertEquals(largerLandscapeBounds, inOutConfig.windowConfiguration.getAppBounds()); |