diff options
4 files changed, 204 insertions, 280 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index fec1af47d6e6..d9e143403e2d 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -661,7 +661,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A */ private CompatDisplayInsets mCompatDisplayInsets; - private final TaskFragment.ConfigOverrideHint mResolveConfigHint; + @VisibleForTesting + final TaskFragment.ConfigOverrideHint mResolveConfigHint; private final boolean mOptOutEdgeToEdge; @@ -8533,6 +8534,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A mIsEligibleForFixedOrientationLetterbox = false; mLetterboxBoundsForFixedOrientationAndAspectRatio = null; mLetterboxBoundsForAspectRatio = null; + mResolveConfigHint.resolveTmpOverrides(mDisplayContent, newParentConfiguration, + isFixedRotationTransforming()); // Can't use resolvedConfig.windowConfiguration.getWindowingMode() because it can be // different from windowing mode of the task (PiP) during transition from fullscreen to PiP @@ -8647,10 +8650,15 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } applySizeOverrideIfNeeded(newParentConfiguration, parentWindowingMode, resolvedConfig); + mResolveConfigHint.resetTmpOverrides(); logAppCompatState(); } + @Nullable Rect getParentAppBoundsOverride() { + return Rect.copyOrNull(mResolveConfigHint.mTmpParentAppBoundsOverride); + } + /** * If necessary, override configuration fields related to app bounds. * This will happen when the app is targeting SDK earlier than 35. @@ -8674,8 +8682,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A rotation = mDisplayContent.getRotation(); } if (!mOptOutEdgeToEdge && (!mResolveConfigHint.mUseOverrideInsetsForConfig - || getCompatDisplayInsets() != null || shouldCreateCompatDisplayInsets() - || isFloating(parentWindowingMode) || rotation == ROTATION_UNDEFINED)) { + || getCompatDisplayInsets() != null || isFloating(parentWindowingMode) + || rotation == ROTATION_UNDEFINED)) { // If the insets configuration decoupled logic is not enabled for the app, or the app // already has a compat override, or the context doesn't contain enough info to // calculate the override, skip the override. @@ -8697,7 +8705,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A : mDisplayContent.mBaseDisplayWidth; final int dh = rotated ? mDisplayContent.mBaseDisplayWidth : mDisplayContent.mBaseDisplayHeight; - final Rect nonDecorInsets = mDisplayContent.getDisplayPolicy() + final Rect nonDecorInsets = mDisplayContent.getDisplayPolicy() .getDecorInsetsInfo(rotation, dw, dh).mOverrideNonDecorInsets; // This should be the only place override the configuration for ActivityRecord. Override // the value if not calculated yet. @@ -8713,12 +8721,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } density *= DisplayMetrics.DENSITY_DEFAULT_SCALE; if (inOutConfig.screenWidthDp == Configuration.SCREEN_WIDTH_DP_UNDEFINED) { - final int overrideScreenWidthDp = (int) (outAppBounds.width() / density + 0.5f); - inOutConfig.screenWidthDp = overrideScreenWidthDp; + inOutConfig.screenWidthDp = (int) (outAppBounds.width() / density + 0.5f); } if (inOutConfig.screenHeightDp == Configuration.SCREEN_HEIGHT_DP_UNDEFINED) { - final int overrideScreenHeightDp = (int) (outAppBounds.height() / density + 0.5f); - inOutConfig.screenHeightDp = overrideScreenHeightDp; + inOutConfig.screenHeightDp = (int) (outAppBounds.height() / density + 0.5f); } if (inOutConfig.smallestScreenWidthDp == Configuration.SMALLEST_SCREEN_WIDTH_DP_UNDEFINED @@ -8829,7 +8835,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } final Rect screenResolvedBounds = mSizeCompatBounds != null ? mSizeCompatBounds : resolvedBounds; - final Rect parentAppBounds = newParentConfiguration.windowConfiguration.getAppBounds(); + final Rect parentAppBounds = mResolveConfigHint.mTmpParentAppBoundsOverride; final Rect parentBounds = newParentConfiguration.windowConfiguration.getBounds(); final float screenResolvedBoundsWidth = screenResolvedBounds.width(); final float parentAppBoundsWidth = parentAppBounds.width(); @@ -9238,7 +9244,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A */ private void resolveAspectRatioRestriction(Configuration newParentConfiguration) { final Configuration resolvedConfig = getResolvedOverrideConfiguration(); - final Rect parentAppBounds = newParentConfiguration.windowConfiguration.getAppBounds(); + final Rect parentAppBounds = mResolveConfigHint.mTmpParentAppBoundsOverride; final Rect parentBounds = newParentConfiguration.windowConfiguration.getBounds(); final Rect resolvedBounds = resolvedConfig.windowConfiguration.getBounds(); // Use tmp bounds to calculate aspect ratio so we can know whether the activity should use @@ -9267,19 +9273,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A @NonNull CompatDisplayInsets compatDisplayInsets) { final Configuration resolvedConfig = getResolvedOverrideConfiguration(); final Rect resolvedBounds = resolvedConfig.windowConfiguration.getBounds(); - final Insets insets; - if (mResolveConfigHint.mUseOverrideInsetsForConfig) { - // TODO(b/343197837): Add test to verify SCM behaviour with new bound configuration - // Insets are decoupled from configuration by default from V+, use legacy - // compatibility behaviour for apps targeting SDK earlier than 35 - // (see applySizeOverrideIfNeeded). - insets = Insets.of(mDisplayContent.getDisplayPolicy() - .getDecorInsetsInfo(mDisplayContent.mDisplayFrames.mRotation, - mDisplayContent.mDisplayFrames.mWidth, - mDisplayContent.mDisplayFrames.mHeight).mOverrideNonDecorInsets); - } else { - insets = Insets.NONE; - } // When an activity needs to be letterboxed because of fixed orientation, use fixed // orientation bounds (stored in resolved bounds) instead of parent bounds since the @@ -9290,22 +9283,22 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A final Rect containerBounds = useResolvedBounds ? new Rect(resolvedBounds) : newParentConfiguration.windowConfiguration.getBounds(); - final Rect parentAppBounds = - newParentConfiguration.windowConfiguration.getAppBounds(); - parentAppBounds.inset(insets); final Rect containerAppBounds = useResolvedBounds ? new Rect(resolvedConfig.windowConfiguration.getAppBounds()) - : parentAppBounds; + : mResolveConfigHint.mTmpParentAppBoundsOverride; final int requestedOrientation = getRequestedConfigurationOrientation(); final boolean orientationRequested = requestedOrientation != ORIENTATION_UNDEFINED; + final int parentOrientation = mResolveConfigHint.mUseOverrideInsetsForConfig + ? mResolveConfigHint.mTmpOverrideConfigOrientation + : newParentConfiguration.orientation; final int orientation = orientationRequested ? requestedOrientation // We should use the original orientation of the activity when possible to avoid // forcing the activity in the opposite orientation. : compatDisplayInsets.mOriginalRequestedOrientation != ORIENTATION_UNDEFINED ? compatDisplayInsets.mOriginalRequestedOrientation - : newParentConfiguration.orientation; + : parentOrientation; int rotation = newParentConfiguration.windowConfiguration.getRotation(); final boolean isFixedToUserRotation = mDisplayContent == null || mDisplayContent.getDisplayRotation().isFixedToUserRotation(); @@ -9347,7 +9340,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // Use parent orientation if it cannot be decided by bounds, so the activity can fit inside // the parent bounds appropriately. if (resolvedConfig.screenWidthDp == resolvedConfig.screenHeightDp) { - resolvedConfig.orientation = newParentConfiguration.orientation; + resolvedConfig.orientation = parentOrientation; } // Below figure is an example that puts an activity which was launched in a larger container diff --git a/services/core/java/com/android/server/wm/LetterboxUiController.java b/services/core/java/com/android/server/wm/LetterboxUiController.java index 194771f6b387..5e93e8930bab 100644 --- a/services/core/java/com/android/server/wm/LetterboxUiController.java +++ b/services/core/java/com/android/server/wm/LetterboxUiController.java @@ -1288,6 +1288,9 @@ final class LetterboxUiController { if (!allowHorizontalReachabilityForThinLetterbox()) { return false; } + final Rect parentAppBoundsOverride = mActivityRecord.getParentAppBoundsOverride(); + final Rect parentAppBounds = parentAppBoundsOverride != null + ? parentAppBoundsOverride : parentConfiguration.windowConfiguration.getAppBounds(); // Use screen resolved bounds which uses resolved bounds or size compat bounds // as activity bounds can sometimes be empty final Rect opaqueActivityBounds = mActivityRecord.mTransparentPolicy @@ -1297,10 +1300,8 @@ final class LetterboxUiController { && parentConfiguration.windowConfiguration.getWindowingMode() == WINDOWING_MODE_FULLSCREEN // Check whether the activity fills the parent vertically. - && parentConfiguration.windowConfiguration.getAppBounds().height() - <= opaqueActivityBounds.height() - && parentConfiguration.windowConfiguration.getAppBounds().width() - > opaqueActivityBounds.width(); + && parentAppBounds.height() <= opaqueActivityBounds.height() + && parentAppBounds.width() > opaqueActivityBounds.width(); } @VisibleForTesting @@ -1326,6 +1327,9 @@ final class LetterboxUiController { if (!allowVerticalReachabilityForThinLetterbox()) { return false; } + final Rect parentAppBoundsOverride = mActivityRecord.getParentAppBoundsOverride(); + final Rect parentAppBounds = parentAppBoundsOverride != null + ? parentAppBoundsOverride : parentConfiguration.windowConfiguration.getAppBounds(); // Use screen resolved bounds which uses resolved bounds or size compat bounds // as activity bounds can sometimes be empty. final Rect opaqueActivityBounds = mActivityRecord.mTransparentPolicy @@ -1335,10 +1339,8 @@ final class LetterboxUiController { && parentConfiguration.windowConfiguration.getWindowingMode() == WINDOWING_MODE_FULLSCREEN // Check whether the activity fills the parent horizontally. - && parentConfiguration.windowConfiguration.getAppBounds().width() - <= opaqueActivityBounds.width() - && parentConfiguration.windowConfiguration.getAppBounds().height() - > opaqueActivityBounds.height(); + && parentAppBounds.width() <= opaqueActivityBounds.width() + && parentAppBounds.height() > opaqueActivityBounds.height(); } @VisibleForTesting diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index b8b746a3de7f..187b1057b6fc 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -40,6 +40,8 @@ import static android.os.Process.INVALID_UID; import static android.os.Process.SYSTEM_UID; import static android.os.UserHandle.USER_NULL; import static android.view.Display.INVALID_DISPLAY; +import static android.view.Surface.ROTATION_270; +import static android.view.Surface.ROTATION_90; import static android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND; import static android.view.WindowManager.TRANSIT_CLOSE; import static android.view.WindowManager.TRANSIT_FLAG_OPEN_BEHIND; @@ -87,6 +89,7 @@ import android.content.PermissionChecker; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.res.Configuration; +import android.graphics.Insets; import android.graphics.Point; import android.graphics.Rect; import android.os.IBinder; @@ -2225,7 +2228,43 @@ class TaskFragment extends WindowContainer<WindowContainer> { static class ConfigOverrideHint { @Nullable DisplayInfo mTmpOverrideDisplayInfo; @Nullable ActivityRecord.CompatDisplayInsets mTmpCompatInsets; + @Nullable Rect mTmpParentAppBoundsOverride; + int mTmpOverrideConfigOrientation; boolean mUseOverrideInsetsForConfig; + + void resolveTmpOverrides(DisplayContent dc, Configuration parentConfig, + boolean isFixedRotationTransforming) { + mTmpParentAppBoundsOverride = new Rect(parentConfig.windowConfiguration.getAppBounds()); + final Insets insets; + if (mUseOverrideInsetsForConfig && dc != null) { + // Insets are decoupled from configuration by default from V+, use legacy + // compatibility behaviour for apps targeting SDK earlier than 35 + // (see applySizeOverrideIfNeeded). + int rotation = parentConfig.windowConfiguration.getRotation(); + if (rotation == ROTATION_UNDEFINED && !isFixedRotationTransforming) { + rotation = dc.getRotation(); + } + final boolean rotated = (rotation == ROTATION_90 || rotation == ROTATION_270); + final int dw = rotated ? dc.mBaseDisplayHeight : dc.mBaseDisplayWidth; + final int dh = rotated ? dc.mBaseDisplayWidth : dc.mBaseDisplayHeight; + DisplayPolicy.DecorInsets.Info decorInsets = dc.getDisplayPolicy() + .getDecorInsetsInfo(rotation, dw, dh); + final Rect stableBounds = decorInsets.mOverrideConfigFrame; + mTmpOverrideConfigOrientation = stableBounds.width() > stableBounds.height() + ? ORIENTATION_LANDSCAPE : ORIENTATION_PORTRAIT; + insets = Insets.of(decorInsets.mOverrideNonDecorInsets); + } else { + insets = Insets.NONE; + } + mTmpParentAppBoundsOverride.inset(insets); + } + + void resetTmpOverrides() { + mTmpOverrideDisplayInfo = null; + mTmpCompatInsets = null; + mTmpParentAppBoundsOverride = null; + mTmpOverrideConfigOrientation = ORIENTATION_UNDEFINED; + } } void computeConfigResourceOverrides(@NonNull Configuration inOutConfig, @@ -2311,7 +2350,9 @@ class TaskFragment extends WindowContainer<WindowContainer> { if (!customContainerPolicy && windowingMode != WINDOWING_MODE_FREEFORM) { final Rect containingAppBounds; if (insideParentBounds) { - containingAppBounds = parentConfig.windowConfiguration.getAppBounds(); + containingAppBounds = useOverrideInsetsForConfig + ? overrideHint.mTmpParentAppBoundsOverride + : parentConfig.windowConfiguration.getAppBounds(); } else { // Restrict appBounds to display non-decor rather than parent because the // override bounds are beyond the parent. Otherwise, it won't match the 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 7adac5b283c5..1a366b3e3a4f 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -105,7 +105,6 @@ import android.os.RemoteException; import android.os.UserHandle; import android.platform.test.annotations.EnableFlags; import android.platform.test.annotations.Presubmit; -import android.platform.test.annotations.RequiresFlagsDisabled; import android.provider.DeviceConfig; import android.provider.DeviceConfig.Properties; import android.view.InsetsFrameProvider; @@ -339,10 +338,9 @@ public class SizeCompatTests extends WindowTestsBase { } } - // TODO(b/333663877): Enable test after fix @Test - @RequiresFlagsDisabled({Flags.FLAG_INSETS_DECOUPLED_CONFIGURATION}) @EnableFlags(Flags.FLAG_IMMERSIVE_APP_REPOSITIONING) + @DisableCompatChanges({ActivityInfo.INSETS_DECOUPLED_CONFIGURATION_ENFORCED}) public void testRepositionLandscapeImmersiveAppWithDisplayCutout() { final int dw = 2100; final int dh = 2000; @@ -356,11 +354,14 @@ public class SizeCompatTests extends WindowTestsBase { mWm.mLetterboxConfiguration.setLetterboxVerticalPositionMultiplier(0.5f); mWm.mLetterboxConfiguration.setIsVerticalReachabilityEnabled(true); - doReturn(true).when(mActivity).isImmersiveMode(any()); - prepareMinAspectRatio(mActivity, OVERRIDE_MIN_ASPECT_RATIO_LARGE_VALUE, - SCREEN_ORIENTATION_LANDSCAPE); - addWindowToActivity(mActivity); - mActivity.mRootWindowContainer.performSurfacePlacement(); + final ActivityRecord activity = getActivityBuilderOnSameTask() + .setScreenOrientation(SCREEN_ORIENTATION_LANDSCAPE) + .setMinAspectRatio(OVERRIDE_MIN_ASPECT_RATIO_LARGE_VALUE) + .build(); + + doReturn(true).when(activity).isImmersiveMode(any()); + addWindowToActivity(activity); + activity.mRootWindowContainer.performSurfacePlacement(); final Function<ActivityRecord, Rect> innerBoundsOf = (ActivityRecord a) -> { @@ -371,22 +372,22 @@ public class SizeCompatTests extends WindowTestsBase { final Consumer<Integer> doubleClick = (Integer y) -> { - mActivity.mLetterboxUiController.handleVerticalDoubleTap(y); - mActivity.mRootWindowContainer.performSurfacePlacement(); + activity.mLetterboxUiController.handleVerticalDoubleTap(y); + activity.mRootWindowContainer.performSurfacePlacement(); }; - final Rect bounds = mActivity.getBounds(); + final Rect bounds = activity.getBounds(); assertTrue(bounds.top > cutoutHeight && bounds.bottom < dh); assertEquals(dw, bounds.width()); // Double click bottom. doubleClick.accept(dh - 10); - assertEquals(dh, innerBoundsOf.apply(mActivity).bottom); + assertEquals(dh, innerBoundsOf.apply(activity).bottom); // Double click top. doubleClick.accept(10); doubleClick.accept(10); - assertEquals(cutoutHeight, innerBoundsOf.apply(mActivity).top); + assertEquals(cutoutHeight, innerBoundsOf.apply(activity).top); } @Test @@ -417,26 +418,25 @@ public class SizeCompatTests extends WindowTestsBase { } @Test + @DisableCompatChanges({ActivityInfo.INSETS_DECOUPLED_CONFIGURATION_ENFORCED}) public void testFixedAspectRatioBoundsWithDecorInSquareDisplay() { - if (Flags.insetsDecoupledConfiguration()) { - // TODO (b/151861875): Re-enable it. This is disabled temporarily because the config - // bounds no longer contains display cutout. - return; - } final int notchHeight = 100; setUpApp(new TestDisplayContent.Builder(mAtm, 600, 800).setNotch(notchHeight).build()); final Rect displayBounds = mActivity.mDisplayContent.getWindowConfiguration().getBounds(); final float aspectRatio = 1.2f; - mActivity.info.setMaxAspectRatio(aspectRatio); - mActivity.info.setMinAspectRatio(aspectRatio); - prepareUnresizable(mActivity, -1f, SCREEN_ORIENTATION_UNSPECIFIED); - final Rect appBounds = mActivity.getWindowConfiguration().getAppBounds(); + final ActivityRecord activity = getActivityBuilderOnSameTask() + .setScreenOrientation(SCREEN_ORIENTATION_UNSPECIFIED) + .setMinAspectRatio(aspectRatio) + .setMaxAspectRatio(aspectRatio) + .setResizeMode(RESIZE_MODE_UNRESIZEABLE) + .build(); + final Rect appBounds = activity.getWindowConfiguration().getAppBounds(); // The parent configuration doesn't change since the first resolved configuration, so the // activity should fit in the parent naturally (size=583x700, appBounds=[9, 100 - 592, 800], // horizontal offset = round((600 - 583) / 2) = 9)). - assertFitted(); + assertFitted(activity); final int offsetX = (int) ((1f + displayBounds.width() - appBounds.width()) / 2); // The bounds must be horizontal centered. assertEquals(offsetX, appBounds.left); @@ -444,30 +444,30 @@ public class SizeCompatTests extends WindowTestsBase { // Ensure the app bounds keep the declared aspect ratio. assertEquals(appBounds.height(), appBounds.width() * aspectRatio, 0.5f /* delta */); // The decor height should be a part of the effective bounds. - assertEquals(mActivity.getBounds().height(), appBounds.height() + notchHeight); + assertEquals(activity.getBounds().height(), appBounds.height() + notchHeight); // Activity max bounds should be sandboxed; activity is letterboxed due to aspect ratio. - assertActivityMaxBoundsSandboxed(); + assertActivityMaxBoundsSandboxed(activity); // Activity max bounds ignore notch, since an app can be shown past the notch (although app // is currently limited by the notch). - assertThat(mActivity.getWindowConfiguration().getMaxBounds().height()) + assertThat(activity.getWindowConfiguration().getMaxBounds().height()) .isEqualTo(displayBounds.height()); - mActivity.setRequestedOrientation(SCREEN_ORIENTATION_LANDSCAPE); - assertFitted(); + activity.setRequestedOrientation(SCREEN_ORIENTATION_LANDSCAPE); + assertFitted(activity); // After the orientation of activity is changed, the display is rotated, the aspect // ratio should be the same (bounds=[0, 0 - 800, 583], appBounds=[100, 0 - 800, 583]). assertEquals(appBounds.width(), appBounds.height() * aspectRatio, 0.5f /* delta */); // Activity max bounds are sandboxed. - assertActivityMaxBoundsSandboxed(); + assertActivityMaxBoundsSandboxed(activity); - mActivity.setRequestedOrientation(SCREEN_ORIENTATION_PORTRAIT); - assertFitted(); + activity.setRequestedOrientation(SCREEN_ORIENTATION_PORTRAIT); + assertFitted(activity); // Activity max bounds should be sandboxed; activity is letterboxed due to aspect ratio. - assertActivityMaxBoundsSandboxed(); + assertActivityMaxBoundsSandboxed(activity); // Activity max bounds ignore notch, since an app can be shown past the notch (although app // is currently limited by the notch). - assertThat(mActivity.getWindowConfiguration().getMaxBounds().height()) + assertThat(activity.getWindowConfiguration().getMaxBounds().height()) .isEqualTo(displayBounds.height()); } @@ -674,12 +674,8 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testMoveToDifferentOrientationDisplay() { - if (Flags.insetsDecoupledConfiguration()) { - // TODO (b/151861875): Re-enable it. This is disabled temporarily because the config - // bounds no longer contains display cutout. - return; - } setUpDisplaySizeWithApp(1000, 2500); + mActivity.mResolveConfigHint.mUseOverrideInsetsForConfig = true; prepareUnresizable(mActivity, -1.f /* maxAspect */, SCREEN_ORIENTATION_PORTRAIT); assertFitted(); @@ -726,16 +722,12 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testFixedOrientationRotateCutoutDisplay() { - if (Flags.insetsDecoupledConfiguration()) { - // TODO (b/151861875): Re-enable it. This is disabled temporarily because the config - // bounds no longer contains display cutout. - return; - } // Create a display with a notch/cutout final int notchHeight = 60; final int width = 1000; setUpApp(new TestDisplayContent.Builder(mAtm, width, 2500) .setNotch(notchHeight).build()); + mActivity.mResolveConfigHint.mUseOverrideInsetsForConfig = true; // Bounds=[0, 0 - 1000, 1400], AppBounds=[0, 60 - 1000, 1460]. final float maxAspect = 1.4f; prepareUnresizable(mActivity, 1.4f /* maxAspect */, SCREEN_ORIENTATION_PORTRAIT); @@ -1328,12 +1320,8 @@ public class SizeCompatTests extends WindowTestsBase { setUpDisplaySizeWithApp(1000, 1200); // Create a size compat activity on the same task. - final ActivityRecord activity = new ActivityBuilder(mAtm) - .setTask(mTask) + final ActivityRecord activity = getActivityBuilderOnSameTask() .setScreenOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) - .setComponent(ComponentName.createRelative(mContext, - SizeCompatTests.class.getName())) - .setUid(android.os.Process.myUid()) .build(); // The per-package override forces the activity into a 3:2 aspect ratio @@ -1345,24 +1333,18 @@ public class SizeCompatTests extends WindowTestsBase { @Test @EnableCompatChanges({ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO, ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO_MEDIUM}) + @DisableCompatChanges({ActivityInfo.INSETS_DECOUPLED_CONFIGURATION_ENFORCED}) public void testOverrideMinAspectRatioLowerThanManifest() { - if (Flags.insetsDecoupledConfiguration()) { - // TODO (b/151861875): Re-enable it. This is disabled temporarily because the config - // bounds no longer contains display cutout. - return; - } - final DisplayContent display = new TestDisplayContent.Builder(mAtm, 1400, 1800) - .setNotch(200).setSystemDecorations(true).build(); + final int dh = 1800; + final int notchHeight = 200; + final DisplayContent display = new TestDisplayContent.Builder(mAtm, 1400, dh) + .setNotch(notchHeight).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) - .setTask(mTask) + final ActivityRecord activity = getActivityBuilderOnSameTask() .setScreenOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) - .setComponent(ComponentName.createRelative(mContext, - SizeCompatTests.class.getName())) .setMinAspectRatio(2f) - .setUid(android.os.Process.myUid()) .build(); // The per-package override should have no effect, because the manifest aspect ratio is @@ -1371,7 +1353,7 @@ public class SizeCompatTests extends WindowTestsBase { 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()); + dh - notchHeight, appBounds.height()); assertEquals("Bounds can include insets", mTask.getBounds().height(), activity.getBounds().height()); } @@ -1383,13 +1365,9 @@ public class SizeCompatTests extends WindowTestsBase { setUpDisplaySizeWithApp(1400, 1600); // Create a size compat activity on the same task. - final ActivityRecord activity = new ActivityBuilder(mAtm) - .setTask(mTask) + final ActivityRecord activity = getActivityBuilderOnSameTask() .setScreenOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) - .setComponent(ComponentName.createRelative(mContext, - SizeCompatTests.class.getName())) .setMinAspectRatio(1.1f) - .setUid(android.os.Process.myUid()) .build(); // The per-package override should have no effect, because the manifest aspect ratio is @@ -1406,12 +1384,8 @@ public class SizeCompatTests extends WindowTestsBase { setUpDisplaySizeWithApp(1500, 1600); // Create a size compat activity on the same task. - final ActivityRecord activity = new ActivityBuilder(mAtm) - .setTask(mTask) + final ActivityRecord activity = getActivityBuilderOnSameTask() .setScreenOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) - .setComponent(ComponentName.createRelative(mContext, - SizeCompatTests.class.getName())) - .setUid(android.os.Process.myUid()) .build(); // The per-package override forces the activity into a 16:9 aspect ratio @@ -1430,12 +1404,8 @@ public class SizeCompatTests extends WindowTestsBase { setUpDisplaySizeWithApp(1400, 1600); // Create a size compat activity on the same task. - final ActivityRecord activity = new ActivityBuilder(mAtm) - .setTask(mTask) + final ActivityRecord activity = getActivityBuilderOnSameTask() .setScreenOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) - .setComponent(ComponentName.createRelative(mContext, - SizeCompatTests.class.getName())) - .setUid(android.os.Process.myUid()) .build(); // The per-package override forces the activity into a 16:9 aspect ratio @@ -1455,12 +1425,7 @@ public class SizeCompatTests extends WindowTestsBase { setUpDisplaySizeWithApp(1000, 1200); // Create a size compat activity on the same task. - final ActivityRecord activity = new ActivityBuilder(mAtm) - .setTask(mTask) - .setComponent(ComponentName.createRelative(mContext, - SizeCompatTests.class.getName())) - .setUid(android.os.Process.myUid()) - .build(); + final ActivityRecord activity = getActivityBuilderOnSameTask().build(); // The per-package override should have no effect assertEquals(1200, activity.getBounds().height()); @@ -1487,12 +1452,8 @@ public class SizeCompatTests extends WindowTestsBase { setUpDisplaySizeWithApp(1000, 1200); // Create a size compat activity on the same task. - final ActivityRecord activity = new ActivityBuilder(mAtm) - .setTask(mTask) + final ActivityRecord activity = getActivityBuilderOnSameTask() .setScreenOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) - .setComponent(ComponentName.createRelative(mContext, - SizeCompatTests.class.getName())) - .setUid(android.os.Process.myUid()) .build(); // The per-package override should have no effect @@ -1517,12 +1478,8 @@ public class SizeCompatTests extends WindowTestsBase { setUpDisplaySizeWithApp(1000, 1200); // Create a size compat activity on the same task. - final ActivityRecord activity = new ActivityBuilder(mAtm) - .setTask(mTask) + final ActivityRecord activity = getActivityBuilderOnSameTask() .setScreenOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) - .setComponent(ComponentName.createRelative(mContext, - SizeCompatTests.class.getName())) - .setUid(android.os.Process.myUid()) .build(); // The per-package override forces the activity into a 3:2 aspect ratio @@ -1547,12 +1504,7 @@ public class SizeCompatTests extends WindowTestsBase { setUpDisplaySizeWithApp(1000, 1200); // Create a size compat activity on the same task. - final ActivityRecord activity = new ActivityBuilder(mAtm) - .setTask(mTask) - .setComponent(ComponentName.createRelative(mContext, - SizeCompatTests.class.getName())) - .setUid(android.os.Process.myUid()) - .build(); + final ActivityRecord activity = getActivityBuilderOnSameTask().build(); // The per-package override forces the activity into a 3:2 aspect ratio assertEquals(1200, activity.getBounds().height()); @@ -1571,12 +1523,8 @@ public class SizeCompatTests extends WindowTestsBase { setUpDisplaySizeWithApp(1000, 1200); // Create a size compat activity on the same task. - final ActivityRecord activity = new ActivityBuilder(mAtm) - .setTask(mTask) + final ActivityRecord activity = getActivityBuilderOnSameTask() .setScreenOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) - .setComponent(ComponentName.createRelative(mContext, - SizeCompatTests.class.getName())) - .setUid(android.os.Process.myUid()) .build(); // The per-package override forces the activity into a 3:2 aspect ratio @@ -1594,12 +1542,8 @@ public class SizeCompatTests extends WindowTestsBase { setUpDisplaySizeWithApp(1000, 1200); // Create a size compat activity on the same task. - final ActivityRecord activity = new ActivityBuilder(mAtm) - .setTask(mTask) + final ActivityRecord activity = getActivityBuilderOnSameTask() .setScreenOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) - .setComponent(ComponentName.createRelative(mContext, - SizeCompatTests.class.getName())) - .setUid(android.os.Process.myUid()) .build(); // The per-package override should have no effect @@ -1614,12 +1558,8 @@ public class SizeCompatTests extends WindowTestsBase { setUpDisplaySizeWithApp(/* dw= */ 1000, /* dh= */ 2800); // Create a size compat activity on the same task. - final ActivityRecord activity = new ActivityBuilder(mAtm) - .setTask(mTask) + final ActivityRecord activity = getActivityBuilderOnSameTask() .setScreenOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) - .setComponent(ComponentName.createRelative(mContext, - SizeCompatTests.class.getName())) - .setUid(android.os.Process.myUid()) .build(); final TestSplitOrganizer organizer = @@ -1697,15 +1637,11 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testLaunchWithFixedRotationTransform() { - if (Flags.insetsDecoupledConfiguration()) { - // TODO (b/151861875): Re-enable it. This is disabled temporarily because the config - // bounds no longer contains display cutout. - return; - } final int dw = 1000; final int dh = 2500; final int notchHeight = 200; setUpApp(new TestDisplayContent.Builder(mAtm, dw, dh).setNotch(notchHeight).build()); + mActivity.mResolveConfigHint.mUseOverrideInsetsForConfig = true; // The test assumes the notch will be at left side when the orientation is landscape. if (mContext.getResources().getBoolean( com.android.internal.R.bool.config_reverseDefaultRotation)) { @@ -2315,12 +2251,7 @@ public class SizeCompatTests extends WindowTestsBase { private void testUserOverrideAspectRatio(boolean isUnresizable, int screenOrientation, float expectedAspectRatio, @PackageManager.UserMinAspectRatio int aspectRatio, boolean enabled) { - final ActivityRecord activity = new ActivityBuilder(mAtm) - .setTask(mTask) - .setComponent(ComponentName.createRelative(mContext, - SizeCompatTests.class.getName())) - .setUid(android.os.Process.myUid()) - .build(); + final ActivityRecord activity = getActivityBuilderOnSameTask().build(); activity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); spyOn(activity.mWmService.mLetterboxConfiguration); doReturn(enabled).when(activity.mWmService.mLetterboxConfiguration) @@ -2351,12 +2282,8 @@ public class SizeCompatTests extends WindowTestsBase { final int displayWidth = 1400; final int displayHeight = 1600; setUpDisplaySizeWithApp(displayWidth, displayHeight); - final ActivityRecord activity = new ActivityBuilder(mAtm) - .setTask(mTask) - .setComponent(ComponentName.createRelative(mContext, - SizeCompatTests.class.getName())) + final ActivityRecord activity = getActivityBuilderOnSameTask() .setMinAspectRatio(1.1f) - .setUid(android.os.Process.myUid()) .build(); // Setup Letterbox Configuration activity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); @@ -2376,12 +2303,8 @@ public class SizeCompatTests extends WindowTestsBase { final int displayWidth = 1600; final int displayHeight = 1400; setUpDisplaySizeWithApp(displayWidth, displayHeight); - final ActivityRecord activity = new ActivityBuilder(mAtm) - .setTask(mTask) - .setComponent(ComponentName.createRelative(mContext, - SizeCompatTests.class.getName())) + final ActivityRecord activity = getActivityBuilderOnSameTask() .setMinAspectRatio(1.1f) - .setUid(android.os.Process.myUid()) .build(); // Setup Letterbox Configuration activity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); @@ -2402,12 +2325,8 @@ public class SizeCompatTests extends WindowTestsBase { final int displayWidth = 1400; final int displayHeight = 1600; setUpDisplaySizeWithApp(displayWidth, displayHeight); - final ActivityRecord activity = new ActivityBuilder(mAtm) - .setTask(mTask) - .setComponent(ComponentName.createRelative(mContext, - SizeCompatTests.class.getName())) + final ActivityRecord activity = getActivityBuilderOnSameTask() .setMinAspectRatio(1.1f) - .setUid(android.os.Process.myUid()) .build(); // Setup Letterbox Configuration activity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); @@ -2428,12 +2347,8 @@ public class SizeCompatTests extends WindowTestsBase { final int displayWidth = 1600; final int displayHeight = 1400; setUpDisplaySizeWithApp(displayWidth, displayHeight); - final ActivityRecord activity = new ActivityBuilder(mAtm) - .setTask(mTask) - .setComponent(ComponentName.createRelative(mContext, - SizeCompatTests.class.getName())) + final ActivityRecord activity = getActivityBuilderOnSameTask() .setMinAspectRatio(1.1f) - .setUid(android.os.Process.myUid()) .build(); // Setup Letterbox Configuration activity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); @@ -2454,12 +2369,7 @@ public class SizeCompatTests extends WindowTestsBase { 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(); + final ActivityRecord activity = getActivityBuilderOnSameTask().build(); activity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); // Simulate real display with top insets. @@ -2495,12 +2405,7 @@ public class SizeCompatTests extends WindowTestsBase { 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(); + final ActivityRecord activity = getActivityBuilderOnSameTask().build(); activity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); // Simulate real display with top insets. @@ -2538,12 +2443,7 @@ public class SizeCompatTests extends WindowTestsBase { mActivity.mWmService.mLetterboxConfiguration.setFixedOrientationLetterboxAspectRatio(1.33f); // Create a size compat activity on the same task. - final ActivityRecord activity = new ActivityBuilder(mAtm) - .setTask(mTask) - .setComponent(ComponentName.createRelative(mContext, - SizeCompatTests.class.getName())) - .setUid(android.os.Process.myUid()) - .build(); + final ActivityRecord activity = getActivityBuilderOnSameTask().build(); // Non-resizable portrait activity prepareUnresizable(activity, 0f, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); @@ -2573,12 +2473,7 @@ public class SizeCompatTests extends WindowTestsBase { mActivity.mWmService.mLetterboxConfiguration.setFixedOrientationLetterboxAspectRatio(1.33f); // Create a size compat activity on the same task. - final ActivityRecord activity = new ActivityBuilder(mAtm) - .setTask(mTask) - .setComponent(ComponentName.createRelative(mContext, - SizeCompatTests.class.getName())) - .setUid(android.os.Process.myUid()) - .build(); + final ActivityRecord activity = getActivityBuilderOnSameTask().build(); final TestSplitOrganizer organizer = new TestSplitOrganizer(mAtm, activity.getDisplayContent()); @@ -3636,17 +3531,13 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testLetterboxDetailsForStatusBar_letterboxNotOverlappingStatusBar() { - if (Flags.insetsDecoupledConfiguration()) { - // TODO (b/151861875): Re-enable it. This is disabled temporarily because the config - // bounds no longer contains display cutout. - return; - } // Align to center so that we don't overlap with the status bar mAtm.mWindowManager.mLetterboxConfiguration.setLetterboxVerticalPositionMultiplier(0.5f); final DisplayContent display = new TestDisplayContent.Builder(mAtm, 1000, 2800) .setNotch(100) .build(); setUpApp(display); + mActivity.mResolveConfigHint.mUseOverrideInsetsForConfig = true; TestWindowState statusBar = addStatusBar(mActivity.mDisplayContent); spyOn(statusBar); doReturn(new Rect(0, 0, statusBar.mRequestedWidth, statusBar.mRequestedHeight)) @@ -3658,12 +3549,12 @@ public class SizeCompatTests extends WindowTestsBase { // Refresh the letterbox mActivity.mRootWindowContainer.performSurfacePlacement(); - Rect mBounds = new Rect(mActivity.getWindowConfiguration().getBounds()); - assertEquals(mBounds, new Rect(0, 900, 1000, 2000)); + Rect bounds = new Rect(mActivity.getWindowConfiguration().getBounds()); + assertEquals(new Rect(0, 900, 1000, 2000), bounds); DisplayPolicy displayPolicy = mActivity.getDisplayContent().getDisplayPolicy(); LetterboxDetails[] expectedLetterboxDetails = {new LetterboxDetails( - mBounds, + bounds, mActivity.getDisplayContent().getBounds(), mActivity.findMainWindow().mAttrs.insetsFlags.appearance )}; @@ -3952,12 +3843,8 @@ public class SizeCompatTests extends WindowTestsBase { assertTrue(display.getDisplayPolicy().updateDecorInsetsInfo()); display.sendNewConfiguration(); - final ActivityRecord activity = new ActivityBuilder(mAtm) - .setTask(mTask) + final ActivityRecord activity = getActivityBuilderOnSameTask() .setScreenOrientation(SCREEN_ORIENTATION_PORTRAIT) - .setComponent(ComponentName.createRelative(mContext, - SizeCompatTests.class.getName())) - .setUid(android.os.Process.myUid()) .build(); // Activity should not be letterboxed and should have portrait app bounds even though @@ -3989,12 +3876,8 @@ public class SizeCompatTests extends WindowTestsBase { assertTrue(display.getDisplayPolicy().updateDecorInsetsInfo()); display.sendNewConfiguration(); - final ActivityRecord activity = new ActivityBuilder(mAtm) - .setTask(mTask) + final ActivityRecord activity = getActivityBuilderOnSameTask() .setScreenOrientation(SCREEN_ORIENTATION_PORTRAIT) - .setComponent(ComponentName.createRelative(mContext, - SizeCompatTests.class.getName())) - .setUid(android.os.Process.myUid()) .build(); final Rect bounds = activity.getBounds(); @@ -4021,14 +3904,11 @@ public class SizeCompatTests extends WindowTestsBase { 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()) + final ActivityRecord activity = getActivityBuilderOnSameTask() + .setResizeMode(RESIZE_MODE_UNRESIZEABLE) + .setScreenOrientation(SCREEN_ORIENTATION_LANDSCAPE) + .setMinAspectRatio(OVERRIDE_MIN_ASPECT_RATIO_LARGE_VALUE) .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); @@ -4042,11 +3922,6 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testApplyAspectRatio_activityAlignWithParentAppVertical() { - if (Flags.insetsDecoupledConfiguration()) { - // TODO (b/151861875): Re-enable it. This is disabled temporarily because the config - // bounds no longer contains display cutout. - return; - } // The display's app bounds will be (0, 100, 1000, 2350) final DisplayContent display = new TestDisplayContent.Builder(mAtm, 1000, 2500) .setCanRotate(false) @@ -4054,19 +3929,16 @@ public class SizeCompatTests extends WindowTestsBase { .build(); setUpApp(display); - prepareUnresizable(mActivity, 2.1f /* maxAspect */, SCREEN_ORIENTATION_UNSPECIFIED); + mActivity.mResolveConfigHint.mUseOverrideInsetsForConfig = true; + prepareUnresizable(mActivity, 2.1f, SCREEN_ORIENTATION_UNSPECIFIED); // The activity height is 2100 and the display's app bounds height is 2250, so the activity // can be aligned inside parentAppBounds - assertEquals(mActivity.getBounds(), new Rect(0, 0, 1000, 2200)); + assertEquals(new Rect(0, 0, 1000, 2200), mActivity.getBounds()); } @Test + @DisableCompatChanges({ActivityInfo.INSETS_DECOUPLED_CONFIGURATION_ENFORCED}) public void testApplyAspectRatio_activityCannotAlignWithParentAppVertical() { - if (Flags.insetsDecoupledConfiguration()) { - // TODO (b/151861875): Re-enable it. This is disabled temporarily because the config - // bounds no longer contains display cutout. - return; - } // The display's app bounds will be (0, 100, 1000, 2150) final DisplayContent display = new TestDisplayContent.Builder(mAtm, 1000, 2300) .setCanRotate(false) @@ -4074,19 +3946,21 @@ public class SizeCompatTests extends WindowTestsBase { .build(); setUpApp(display); - prepareUnresizable(mActivity, 2.1f /* maxAspect */, SCREEN_ORIENTATION_UNSPECIFIED); + + final ActivityRecord activity = getActivityBuilderOnSameTask() + .setResizeMode(RESIZE_MODE_UNRESIZEABLE) + .setMaxAspectRatio(2.1f) + .setScreenOrientation(SCREEN_ORIENTATION_UNSPECIFIED) + .build(); + // The activity height is 2100 and the display's app bounds height is 2050, so the activity // cannot be aligned inside parentAppBounds and it will fill the parentBounds of the display - assertEquals(mActivity.getBounds(), display.getBounds()); + assertEquals(activity.getBounds(), display.getBounds()); } @Test + @DisableCompatChanges({ActivityInfo.INSETS_DECOUPLED_CONFIGURATION_ENFORCED}) public void testApplyAspectRatio_activityAlignWithParentAppHorizontal() { - if (Flags.insetsDecoupledConfiguration()) { - // TODO (b/151861875): Re-enable it. This is disabled temporarily because the config - // bounds no longer contains display cutout. - return; - } // The display's app bounds will be (100, 0, 2350, 1000) final DisplayContent display = new TestDisplayContent.Builder(mAtm, 2500, 1000) .setCanRotate(false) @@ -4094,18 +3968,19 @@ public class SizeCompatTests extends WindowTestsBase { .build(); setUpApp(display); - prepareUnresizable(mActivity, 2.1f /* maxAspect */, SCREEN_ORIENTATION_UNSPECIFIED); + + final ActivityRecord activity = getActivityBuilderOnSameTask() + .setResizeMode(RESIZE_MODE_UNRESIZEABLE) + .setMaxAspectRatio(2.1f) + .setScreenOrientation(SCREEN_ORIENTATION_UNSPECIFIED) + .build(); // The activity width is 2100 and the display's app bounds width is 2250, so the activity // can be aligned inside parentAppBounds - assertEquals(mActivity.getBounds(), new Rect(175, 0, 2275, 1000)); + assertEquals(activity.getBounds(), new Rect(175, 0, 2275, 1000)); } @Test + @DisableCompatChanges({ActivityInfo.INSETS_DECOUPLED_CONFIGURATION_ENFORCED}) public void testApplyAspectRatio_activityCannotAlignWithParentAppHorizontal() { - if (Flags.insetsDecoupledConfiguration()) { - // TODO (b/151861875): Re-enable it. This is disabled temporarily because the config - // bounds no longer contains display cutout. - return; - } // The display's app bounds will be (100, 0, 2150, 1000) final DisplayContent display = new TestDisplayContent.Builder(mAtm, 2300, 1000) .setCanRotate(false) @@ -4113,10 +3988,14 @@ public class SizeCompatTests extends WindowTestsBase { .build(); setUpApp(display); - prepareUnresizable(mActivity, 2.1f /* maxAspect */, SCREEN_ORIENTATION_UNSPECIFIED); + final ActivityRecord activity = getActivityBuilderOnSameTask() + .setResizeMode(RESIZE_MODE_UNRESIZEABLE) + .setMaxAspectRatio(2.1f) + .setScreenOrientation(SCREEN_ORIENTATION_UNSPECIFIED) + .build(); // The activity width is 2100 and the display's app bounds width is 2050, so the activity // cannot be aligned inside parentAppBounds and it will fill the parentBounds of the display - assertEquals(mActivity.getBounds(), display.getBounds()); + assertEquals(activity.getBounds(), display.getBounds()); } @Test @@ -4344,26 +4223,23 @@ public class SizeCompatTests extends WindowTestsBase { @Test public void testUpdateResolvedBoundsPosition_alignToTop() { - if (Flags.insetsDecoupledConfiguration()) { - // TODO (b/151861875): Re-enable it. This is disabled temporarily because the config - // bounds no longer contains display cutout. - return; - } final int notchHeight = 100; final DisplayContent display = new TestDisplayContent.Builder(mAtm, 1000, 2800) .setNotch(notchHeight) .build(); setUpApp(display); + mActivity.mResolveConfigHint.mUseOverrideInsetsForConfig = true; // Prepare unresizable activity with max aspect ratio - prepareUnresizable(mActivity, /* maxAspect */ 1.1f, SCREEN_ORIENTATION_UNSPECIFIED); + prepareUnresizable(mActivity, 1.1f, SCREEN_ORIENTATION_UNSPECIFIED); - Rect mBounds = new Rect(mActivity.getWindowConfiguration().getBounds()); + Rect bounds = new Rect(mActivity.getWindowConfiguration().getBounds()); Rect appBounds = new Rect(mActivity.getWindowConfiguration().getAppBounds()); // The insets should be cut for aspect ratio and then added back because the appBounds // are aligned to the top of the parentAppBounds - assertEquals(mBounds, new Rect(0, 0, 1000, 1200)); - assertEquals(appBounds, new Rect(0, notchHeight, 1000, 1200)); + assertEquals(new Rect(0, notchHeight, 1000, 1200), appBounds); + assertEquals(new Rect(0, 0, 1000, 1200), bounds); + } private void assertVerticalPositionForDifferentDisplayConfigsForLandscapeActivity( @@ -4859,15 +4735,19 @@ public class SizeCompatTests extends WindowTestsBase { */ private ActivityRecord buildActivityRecord(boolean supportsSizeChanges, int resizeMode, @ScreenOrientation int screenOrientation) { - return new ActivityBuilder(mAtm) - .setTask(mTask) + return getActivityBuilderOnSameTask() .setResizeMode(resizeMode) .setSupportsSizeChanges(supportsSizeChanges) .setScreenOrientation(screenOrientation) + .build(); + } + + private ActivityBuilder getActivityBuilderOnSameTask() { + return new ActivityBuilder(mAtm) + .setTask(mTask) .setComponent(ComponentName.createRelative(mContext, SizeCompatTests.class.getName())) - .setUid(android.os.Process.myUid()) - .build(); + .setUid(android.os.Process.myUid()); } static void prepareMinAspectRatio(ActivityRecord activity, float minAspect, @@ -4931,21 +4811,29 @@ public class SizeCompatTests extends WindowTestsBase { } } - /** Asserts that the size of activity is larger than its parent so it is scaling. */ private void assertScaled() { - assertTrue(mActivity.inSizeCompatMode()); - assertNotEquals(1f, mActivity.getCompatScale(), 0.0001f /* delta */); + assertScaled(mActivity); + } + + /** Asserts that the size of activity is larger than its parent so it is scaling. */ + private void assertScaled(ActivityRecord activity) { + assertTrue(activity.inSizeCompatMode()); + assertNotEquals(1f, activity.getCompatScale(), 0.0001f /* delta */); } - /** Asserts that the activity is best fitted in the parent. */ private void assertFitted() { - final boolean inSizeCompatMode = mActivity.inSizeCompatMode(); + assertFitted(mActivity); + } + + /** Asserts that the activity is best fitted in the parent. */ + private void assertFitted(ActivityRecord activity) { + final boolean inSizeCompatMode = activity.inSizeCompatMode(); final String failedConfigInfo = inSizeCompatMode - ? ("ParentConfig=" + mActivity.getParent().getConfiguration() - + " ActivityConfig=" + mActivity.getConfiguration()) + ? ("ParentConfig=" + activity.getParent().getConfiguration() + + " ActivityConfig=" + activity.getConfiguration()) : ""; assertFalse(failedConfigInfo, inSizeCompatMode); - assertFalse(mActivity.hasSizeCompatBounds()); + assertFalse(activity.hasSizeCompatBounds()); } /** Asserts the activity max bounds inherit from the TaskDisplayArea. */ |