diff options
| author | 2024-04-18 08:13:13 +0000 | |
|---|---|---|
| committer | 2024-04-18 08:13:13 +0000 | |
| commit | d4a85368d909cde3ba215456d950222063b39ed9 (patch) | |
| tree | 39659a2a78ccad9d94bd5598587e41a5a5594c51 | |
| parent | 609093a80dc48c4b72b19fc6f39dcd8a297c4af2 (diff) | |
| parent | 8ddcd1cfcd23d56a6a5f16e39fb98c7a69faf607 (diff) | |
Merge "Revert^2 Use resolved bounds in CompatDisplayInsets if letterboxed for aspect ratio" into main
| -rw-r--r-- | services/core/java/com/android/server/wm/ActivityRecord.java | 45 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java | 40 |
2 files changed, 68 insertions, 17 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 06003e4b910a..54e932a80ee9 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -821,6 +821,12 @@ 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. @@ -8442,10 +8448,14 @@ 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, mLetterboxBoundsForFixedOrientationAndAspectRatio, + mDisplayContent, this, letterboxedContainerBounds, mResolveConfigHint.mUseLegacyInsetsForStableBounds); } @@ -8518,6 +8528,7 @@ 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 @@ -8556,9 +8567,11 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A computeConfigByResolveHint(resolvedConfig, newParentConfiguration); } // If activity in fullscreen mode is letterboxed because of fixed orientation then bounds - // are already calculated in resolveFixedOrientationConfiguration. + // are already calculated in resolveFixedOrientationConfiguration, or if in size compat + // mode, it should already be calculated in resolveSizeCompatModeConfiguration. // Don't apply aspect ratio if app is overridden to fullscreen by device user/manufacturer. - } else if (!isLetterboxedForFixedOrientationAndAspectRatio() + } + if (!isLetterboxedForFixedOrientationAndAspectRatio() && !mInSizeCompatModeForBounds && !mLetterboxUiController.hasFullscreenOverride()) { resolveAspectRatioRestriction(newParentConfiguration); } @@ -9056,7 +9069,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } final CompatDisplayInsets compatDisplayInsets = getCompatDisplayInsets(); - if (compatDisplayInsets != null && !compatDisplayInsets.mIsInFixedOrientationLetterbox) { + if (compatDisplayInsets != null + && !compatDisplayInsets.mIsInFixedOrientationOrAspectRatioLetterbox) { // 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 @@ -9190,6 +9204,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // restrict, the bounds should be the requested override bounds. mResolveConfigHint.mTmpOverrideDisplayInfo = getFixedRotationTransformDisplayInfo(); computeConfigByResolveHint(resolvedConfig, newParentConfiguration); + mLetterboxBoundsForAspectRatio = new Rect(resolvedBounds); } } @@ -10753,10 +10768,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 when the unresizable activity is - * first shown. + * Whether is letterboxed because of fixed orientation or aspect ratio when + * the unresizable activity is first shown. */ - final boolean mIsInFixedOrientationLetterbox; + final boolean mIsInFixedOrientationOrAspectRatioLetterbox; /** * The nonDecorInsets for each rotation. Includes the navigation bar and cutout insets. It * is used to compute the appBounds. @@ -10771,7 +10786,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 fixedOrientationBounds, boolean useOverrideInsets) { + @Nullable Rect letterboxedContainerBounds, boolean useOverrideInsets) { mOriginalRotation = display.getRotation(); mIsFloating = container.getWindowConfiguration().tasksAreFloating(); mOriginalRequestedOrientation = container.getRequestedConfigurationOrientation(); @@ -10786,22 +10801,22 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A mNonDecorInsets[rotation] = emptyRect; mStableInsets[rotation] = emptyRect; } - mIsInFixedOrientationLetterbox = false; + mIsInFixedOrientationOrAspectRatioLetterbox = false; return; } final Task task = container.getTask(); - mIsInFixedOrientationLetterbox = fixedOrientationBounds != null; + mIsInFixedOrientationOrAspectRatioLetterbox = letterboxedContainerBounds != 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, 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 + // 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 : 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 aa780edffc60..03302ce9052a 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -1942,8 +1942,7 @@ 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()); @@ -4210,6 +4209,43 @@ public class SizeCompatTests extends WindowTestsBase { } @Test + @DisableCompatChanges({ActivityInfo.INSETS_DECOUPLED_CONFIGURATION_ENFORCED}) + public void testFixedAspectRatioAppInPortraitCloseToSquareDisplay_notInSizeCompat() { + setUpDisplaySizeWithApp(2200, 2280); + mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); + final DisplayContent dc = 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)) + }; + dc.getDisplayPolicy().addWindowLw(navbar, navbar.mAttrs); + assertTrue(dc.getDisplayPolicy().updateDecorInsetsInfo()); + dc.sendNewConfiguration(); + + final ActivityRecord activity = new ActivityBuilder(mAtm) + .setTask(mTask) + .setComponent(ComponentName.createRelative(mContext, + SizeCompatTests.class.getName())) + .setUid(android.os.Process.myUid()) + .build(); + prepareMinAspectRatio(activity, OVERRIDE_MIN_ASPECT_RATIO_LARGE_VALUE, + SCREEN_ORIENTATION_LANDSCAPE); + // To force config to update again but with the same landscape orientation. + activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); + + assertTrue(activity.shouldCreateCompatDisplayInsets()); + assertNotNull(activity.getCompatDisplayInsets()); + // Activity is not letterboxed for fixed orientation because orientation is respected + // with insets, and should not be in size compat mode + assertFalse(activity.isLetterboxedForFixedOrientationAndAspectRatio()); + assertFalse(activity.inSizeCompatMode()); + } + + @Test public void testApplyAspectRatio_activityAlignWithParentAppVertical() { if (Flags.insetsDecoupledConfiguration()) { // TODO (b/151861875): Re-enable it. This is disabled temporarily because the config |