Loading services/core/java/com/android/server/wm/ActivityRecord.java +23 −13 Original line number Diff line number Diff line Loading @@ -2730,30 +2730,40 @@ final class ActivityRecord extends ConfigurationContainer { final int appHeight = resolvedAppBounds.height(); final int parentAppWidth = parentAppBounds.width(); final int parentAppHeight = parentAppBounds.height(); if (parentAppWidth == appWidth && parentAppHeight == appHeight) { // Matched the parent bounds. return false; } if (parentAppWidth > appWidth && parentAppHeight > appHeight) { // Both sides are smaller than the parent. return true; } if (parentAppWidth < appWidth || parentAppHeight < appHeight) { // One side is larger than the parent. return true; } if (info.hasFixedAspectRatio()) { // The rest of the condition is that only one side is smaller than the parent, but it still // needs to exclude the cases where the size is limited by the fixed aspect ratio. if (info.maxAspectRatio > 0) { final float aspectRatio = (0.5f + Math.max(appWidth, appHeight)) / Math.min(appWidth, appHeight); if (aspectRatio >= info.maxAspectRatio) { // The current size has reached the max aspect ratio. return false; } } if (info.minAspectRatio > 0) { // The activity should have at least the min aspect ratio, so this checks if the parent // still has available space to provide larger aspect ratio. final float parentAspectRatio = (0.5f + Math.max(parentAppWidth, parentAppHeight)) / Math.min(parentAppWidth, parentAppHeight); // Check if the parent still has available space in long side. if (aspectRatio < parentAspectRatio && (aspectRatio < info.maxAspectRatio || info.minAspectRatio > 0)) { return true; if (parentAspectRatio <= info.minAspectRatio) { // The long side has reached the parent. return false; } } final Rect resolvedBounds = resolvedConfig.windowConfiguration.getBounds(); // If the width or height is the same as parent, it is already the best fit of the override // bounds, therefore this condition is considered as not size compatibility mode. Here uses // right and bottom as width and height of parent because the bounds may contain decor // insets which has been accounted in override bounds. See {@link #computeBounds}. return parentAppBounds.right != resolvedBounds.width() && parentAppBounds.bottom != resolvedBounds.height(); return true; } /** Loading services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +4 −1 Original line number Diff line number Diff line Loading @@ -438,8 +438,11 @@ public class ActivityRecordTests extends ActivityTestsBase { doReturn(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) .when(mActivity.mAppWindowToken).getOrientationIgnoreVisibility(); mActivity.info.resizeMode = ActivityInfo.RESIZE_MODE_UNRESIZEABLE; mActivity.info.maxAspectRatio = 1; mActivity.info.minAspectRatio = mActivity.info.maxAspectRatio = 1; ensureActivityConfiguration(); // The parent configuration doesn't change since the first resolved configuration, so the // activity shouldn't be in the size compatibility mode. assertFalse(mActivity.inSizeCompatMode()); final Rect appBounds = mActivity.getWindowConfiguration().getAppBounds(); // Ensure the app bounds keep the declared aspect ratio. Loading Loading
services/core/java/com/android/server/wm/ActivityRecord.java +23 −13 Original line number Diff line number Diff line Loading @@ -2730,30 +2730,40 @@ final class ActivityRecord extends ConfigurationContainer { final int appHeight = resolvedAppBounds.height(); final int parentAppWidth = parentAppBounds.width(); final int parentAppHeight = parentAppBounds.height(); if (parentAppWidth == appWidth && parentAppHeight == appHeight) { // Matched the parent bounds. return false; } if (parentAppWidth > appWidth && parentAppHeight > appHeight) { // Both sides are smaller than the parent. return true; } if (parentAppWidth < appWidth || parentAppHeight < appHeight) { // One side is larger than the parent. return true; } if (info.hasFixedAspectRatio()) { // The rest of the condition is that only one side is smaller than the parent, but it still // needs to exclude the cases where the size is limited by the fixed aspect ratio. if (info.maxAspectRatio > 0) { final float aspectRatio = (0.5f + Math.max(appWidth, appHeight)) / Math.min(appWidth, appHeight); if (aspectRatio >= info.maxAspectRatio) { // The current size has reached the max aspect ratio. return false; } } if (info.minAspectRatio > 0) { // The activity should have at least the min aspect ratio, so this checks if the parent // still has available space to provide larger aspect ratio. final float parentAspectRatio = (0.5f + Math.max(parentAppWidth, parentAppHeight)) / Math.min(parentAppWidth, parentAppHeight); // Check if the parent still has available space in long side. if (aspectRatio < parentAspectRatio && (aspectRatio < info.maxAspectRatio || info.minAspectRatio > 0)) { return true; if (parentAspectRatio <= info.minAspectRatio) { // The long side has reached the parent. return false; } } final Rect resolvedBounds = resolvedConfig.windowConfiguration.getBounds(); // If the width or height is the same as parent, it is already the best fit of the override // bounds, therefore this condition is considered as not size compatibility mode. Here uses // right and bottom as width and height of parent because the bounds may contain decor // insets which has been accounted in override bounds. See {@link #computeBounds}. return parentAppBounds.right != resolvedBounds.width() && parentAppBounds.bottom != resolvedBounds.height(); return true; } /** Loading
services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +4 −1 Original line number Diff line number Diff line Loading @@ -438,8 +438,11 @@ public class ActivityRecordTests extends ActivityTestsBase { doReturn(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) .when(mActivity.mAppWindowToken).getOrientationIgnoreVisibility(); mActivity.info.resizeMode = ActivityInfo.RESIZE_MODE_UNRESIZEABLE; mActivity.info.maxAspectRatio = 1; mActivity.info.minAspectRatio = mActivity.info.maxAspectRatio = 1; ensureActivityConfiguration(); // The parent configuration doesn't change since the first resolved configuration, so the // activity shouldn't be in the size compatibility mode. assertFalse(mActivity.inSizeCompatMode()); final Rect appBounds = mActivity.getWindowConfiguration().getAppBounds(); // Ensure the app bounds keep the declared aspect ratio. Loading