diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 633e2161b5eeb..f38264c412114 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -4668,11 +4668,11 @@
-
- - 0.0
+
+ - 0.0
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index ff9d26fb2363a..2fff7b5f6298b 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -4181,7 +4181,7 @@
-
+
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 77c369f723233..298128a6a222e 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -211,7 +211,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import static com.android.server.wm.WindowManagerService.LETTERBOX_BACKGROUND_APP_COLOR_BACKGROUND;
import static com.android.server.wm.WindowManagerService.LETTERBOX_BACKGROUND_APP_COLOR_BACKGROUND_FLOATING;
import static com.android.server.wm.WindowManagerService.LETTERBOX_BACKGROUND_SOLID_COLOR;
-import static com.android.server.wm.WindowManagerService.MIN_TASK_LETTERBOX_ASPECT_RATIO;
+import static com.android.server.wm.WindowManagerService.MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO;
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL;
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_WILL_PLACE_SURFACES;
import static com.android.server.wm.WindowManagerService.letterboxBackgroundTypeToString;
@@ -6994,6 +6994,13 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
float aspect = Math.max(parentWidth, parentHeight)
/ (float) Math.min(parentWidth, parentHeight);
+ // Override from config_fixedOrientationLetterboxAspectRatio or via ADB with
+ // set-fixed-orientation-letterbox-aspect-ratio.
+ final float letterboxAspectRatioOverride =
+ mWmService.getFixedOrientationLetterboxAspectRatio();
+ aspect = letterboxAspectRatioOverride > MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO
+ ? letterboxAspectRatioOverride : aspect;
+
// Adjust the fixed orientation letterbox bounds to fit the app request aspect ratio in
// order to use the extra available space.
final float maxAspectRatio = info.maxAspectRatio;
@@ -7004,16 +7011,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
aspect = minAspectRatio;
}
- // Override from config_letterboxAspectRatio or via ADB with set-letterbox-aspect-ratio.
- // TODO(b/175212232): Rename getTaskLetterboxAspectRatio and all related methods since fixed
- // orientation letterbox is on the activity level now.
- final float letterboxAspectRatioOverride = mWmService.getTaskLetterboxAspectRatio();
- // Activity min/max aspect ratio restrictions will be respected by the activity-level
- // letterboxing (size-compat mode). Therefore this override can control the maximum screen
- // area that can be occupied by the app in the letterbox mode.
- aspect = letterboxAspectRatioOverride > MIN_TASK_LETTERBOX_ASPECT_RATIO
- ? letterboxAspectRatioOverride : aspect;
-
// Store the current bounds to be able to revert to size compat mode values below if needed.
Rect mTmpFullBounds = new Rect(resolvedBounds);
if (forcedOrientation == ORIENTATION_LANDSCAPE) {
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index c9e1605f7f0de..04a560b21da3a 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -463,12 +463,12 @@ public class WindowManagerService extends IWindowManager.Stub
private static final int ANIMATION_COMPLETED_TIMEOUT_MS = 5000;
/**
- * Override of task letterbox aspect ratio that is set via ADB with
- * set-task-letterbox-aspect-ratio or via {@link
- * com.android.internal.R.dimen.config_taskLetterboxAspectRatio} will be ignored
+ * Override of aspect ratio for fixed orientation letterboxing that is set via ADB with
+ * set-fixed-orientation-letterbox-aspect-ratio or via {@link
+ * com.android.internal.R.dimen.config_fixedOrientationLetterboxAspectRatio} will be ignored
* if it is <= this value.
*/
- static final float MIN_TASK_LETTERBOX_ASPECT_RATIO = 1.0f;
+ static final float MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO = 1.0f;
@VisibleForTesting
WindowManagerConstants mConstants;
@@ -1003,9 +1003,9 @@ public class WindowManagerService extends IWindowManager.Stub
private boolean mAnimationsDisabled = false;
boolean mPointerLocationEnabled = false;
- // Aspect ratio of task level letterboxing, values <= MIN_TASK_LETTERBOX_ASPECT_RATIO will be
- // ignored.
- private volatile float mTaskLetterboxAspectRatio;
+ // Aspect ratio of letterbox for fixed orientation, values <=
+ // MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO will be ignored.
+ private volatile float mFixedOrientationLetterboxAspectRatio;
/** Enum for Letterbox background type. */
@Retention(RetentionPolicy.SOURCE)
@@ -1256,8 +1256,8 @@ public class WindowManagerService extends IWindowManager.Stub
mAssistantOnTopOfDream = context.getResources().getBoolean(
com.android.internal.R.bool.config_assistantOnTopOfDream);
- mTaskLetterboxAspectRatio = context.getResources().getFloat(
- com.android.internal.R.dimen.config_taskLetterboxAspectRatio);
+ mFixedOrientationLetterboxAspectRatio = context.getResources().getFloat(
+ com.android.internal.R.dimen.config_fixedOrientationLetterboxAspectRatio);
mLetterboxActivityCornersRadius = context.getResources().getInteger(
com.android.internal.R.integer.config_letterboxActivityCornersRadius);
mLetterboxBackgroundColor = Color.valueOf(context.getResources().getColor(
@@ -3853,29 +3853,29 @@ public class WindowManagerService extends IWindowManager.Stub
}
/**
- * Overrides the aspect ratio of task level letterboxing. If given value is <= {@link
- * #MIN_TASK_LETTERBOX_ASPECT_RATIO}, both it and a value of {@link
- * com.android.internal.R.dimen.config_taskLetterboxAspectRatio} will be ignored and
+ * Overrides the aspect ratio of letterbox for fixed orientation. If given value is <= {@link
+ * #MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO}, both it and a value of {@link
+ * com.android.internal.R.dimen.config_fixedOrientationLetterboxAspectRatio} will be ignored and
* the framework implementation will be used to determine the aspect ratio.
*/
- void setTaskLetterboxAspectRatio(float aspectRatio) {
- mTaskLetterboxAspectRatio = aspectRatio;
+ void setFixedOrientationLetterboxAspectRatio(float aspectRatio) {
+ mFixedOrientationLetterboxAspectRatio = aspectRatio;
}
/**
- * Resets the aspect ratio of task level letterboxing to {@link
- * com.android.internal.R.dimen.config_taskLetterboxAspectRatio}.
+ * Resets the aspect ratio of letterbox for fixed orientation to {@link
+ * com.android.internal.R.dimen.config_fixedOrientationLetterboxAspectRatio}.
*/
- void resetTaskLetterboxAspectRatio() {
- mTaskLetterboxAspectRatio = mContext.getResources().getFloat(
- com.android.internal.R.dimen.config_taskLetterboxAspectRatio);
+ void resetFixedOrientationLetterboxAspectRatio() {
+ mFixedOrientationLetterboxAspectRatio = mContext.getResources().getFloat(
+ com.android.internal.R.dimen.config_fixedOrientationLetterboxAspectRatio);
}
/**
- * Gets the aspect ratio of task level letterboxing.
+ * Gets the aspect ratio of letterbox for fixed orientation.
*/
- float getTaskLetterboxAspectRatio() {
- return mTaskLetterboxAspectRatio;
+ float getFixedOrientationLetterboxAspectRatio() {
+ return mFixedOrientationLetterboxAspectRatio;
}
/**
diff --git a/services/core/java/com/android/server/wm/WindowManagerShellCommand.java b/services/core/java/com/android/server/wm/WindowManagerShellCommand.java
index 645786c02fc05..a46a8d56e226d 100644
--- a/services/core/java/com/android/server/wm/WindowManagerShellCommand.java
+++ b/services/core/java/com/android/server/wm/WindowManagerShellCommand.java
@@ -117,10 +117,10 @@ public class WindowManagerShellCommand extends ShellCommand {
return runGetIgnoreOrientationRequest(pw);
case "dump-visible-window-views":
return runDumpVisibleWindowViews(pw);
- case "set-task-letterbox-aspect-ratio":
- return runSetTaskLetterboxAspectRatio(pw);
- case "get-task-letterbox-aspect-ratio":
- return runGetTaskLetterboxAspectRatio(pw);
+ case "set-fixed-orientation-letterbox-aspect-ratio":
+ return runSetFixedOrientationLetterboxAspectRatio(pw);
+ case "get-fixed-orientation-letterbox-aspect-ratio":
+ return runGetFixedOrientationLetterboxAspectRatio(pw);
case "set-letterbox-activity-corners-radius":
return runSetLetterboxActivityCornersRadius(pw);
case "get-letterbox-activity-corners-radius":
@@ -531,12 +531,12 @@ public class WindowManagerShellCommand extends ShellCommand {
return 0;
}
- private int runSetTaskLetterboxAspectRatio(PrintWriter pw) throws RemoteException {
+ private int runSetFixedOrientationLetterboxAspectRatio(PrintWriter pw) throws RemoteException {
final float aspectRatio;
try {
String arg = getNextArgRequired();
if ("reset".equals(arg)) {
- mInternal.resetTaskLetterboxAspectRatio();
+ mInternal.resetFixedOrientationLetterboxAspectRatio();
return 0;
}
aspectRatio = Float.parseFloat(arg);
@@ -549,13 +549,13 @@ public class WindowManagerShellCommand extends ShellCommand {
return -1;
}
- mInternal.setTaskLetterboxAspectRatio(aspectRatio);
+ mInternal.setFixedOrientationLetterboxAspectRatio(aspectRatio);
return 0;
}
- private int runGetTaskLetterboxAspectRatio(PrintWriter pw) throws RemoteException {
- final float aspectRatio = mInternal.getTaskLetterboxAspectRatio();
- if (aspectRatio <= WindowManagerService.MIN_TASK_LETTERBOX_ASPECT_RATIO) {
+ private int runGetFixedOrientationLetterboxAspectRatio(PrintWriter pw) throws RemoteException {
+ final float aspectRatio = mInternal.getFixedOrientationLetterboxAspectRatio();
+ if (aspectRatio <= WindowManagerService.MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO) {
pw.println("Letterbox aspect ratio is not set");
} else {
pw.println("Letterbox aspect ratio is " + aspectRatio);
@@ -692,8 +692,8 @@ public class WindowManagerShellCommand extends ShellCommand {
// set-ignore-orientation-request
mInterface.setIgnoreOrientationRequest(displayId, false /* ignoreOrientationRequest */);
- // set-task-letterbox-aspect-ratio
- mInternal.resetTaskLetterboxAspectRatio();
+ // set-fixed-orientation-letterbox-aspect-ratio
+ mInternal.resetFixedOrientationLetterboxAspectRatio();
// set-letterbox-activity-corners-radius
mInternal.resetLetterboxActivityCornersRadius();
@@ -734,12 +734,12 @@ public class WindowManagerShellCommand extends ShellCommand {
pw.println(" set-ignore-orientation-request [-d DISPLAY_ID] [true|1|false|0]");
pw.println(" get-ignore-orientation-request [-d DISPLAY_ID] ");
pw.println(" If app requested orientation should be ignored.");
- pw.println(" set-task-letterbox-aspect-ratio [reset|aspectRatio]");
- pw.println(" get-task-letterbox-aspect-ratio");
- pw.println(" Aspect ratio of task level letterboxing. If aspectRatio <= "
- + WindowManagerService.MIN_TASK_LETTERBOX_ASPECT_RATIO);
- pw.println(" both it and R.dimen.config_taskLetterboxAspectRatio will be ignored");
- pw.println(" and framework implementation will be used to determine aspect ratio.");
+ pw.println(" set-fixed-orientation-letterbox-aspect-ratio [reset|aspectRatio]");
+ pw.println(" get-fixed-orientation-letterbox-aspect-ratio");
+ pw.println(" Aspect ratio of letterbox for fixed orientation. If aspectRatio <= "
+ + WindowManagerService.MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO);
+ pw.println(" both it and R.dimen.config_fixedOrientationLetterboxAspectRatio will be");
+ pw.println(" ignored and framework implementation will determine aspect ratio.");
pw.println(" set-letterbox-activity-corners-radius [reset|cornersRadius]");
pw.println(" get-letterbox-activity-corners-radius");
pw.println(" Corners radius for activities in the letterbox mode. If radius < 0,");
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 b73c664078740..2f1d7eb404ad9 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
@@ -655,7 +655,7 @@ public class SizeCompatTests extends WindowTestsBase {
mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
// Portrait fixed app without max aspect.
- prepareUnresizable(mActivity, 0, SCREEN_ORIENTATION_PORTRAIT);
+ prepareUnresizable(mActivity, /* maxAspect= */ 0, SCREEN_ORIENTATION_PORTRAIT);
final Rect displayBounds = new Rect(mActivity.mDisplayContent.getBounds());
final Rect activityBounds = new Rect(mActivity.getBounds());
@@ -675,6 +675,96 @@ public class SizeCompatTests extends WindowTestsBase {
activityBounds.width());
}
+ @Test
+ public void testDisplayIgnoreOrientationRequest_fixedOrientationAppRespectMinAspectRatio() {
+ // Set up a display in landscape and ignoring orientation request.
+ setUpDisplaySizeWithApp(2800, 1400);
+ mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+
+ // Portrait fixed app with min aspect ratio higher that aspect ratio override for fixed
+ // orientation letterbox.
+ mActivity.mWmService.setFixedOrientationLetterboxAspectRatio(1.1f);
+ mActivity.info.minAspectRatio = 3;
+ prepareUnresizable(mActivity, /* maxAspect= */ 0, SCREEN_ORIENTATION_PORTRAIT);
+
+ final Rect displayBounds = new Rect(mActivity.mDisplayContent.getBounds());
+ final Rect activityBounds = new Rect(mActivity.getBounds());
+
+ // Display shouldn't be rotated.
+ assertEquals(SCREEN_ORIENTATION_UNSPECIFIED,
+ mActivity.mDisplayContent.getLastOrientation());
+ assertTrue(displayBounds.width() > displayBounds.height());
+
+ // App should launch in fixed orientation letterbox.
+ assertTrue(mActivity.isLetterboxedForFixedOrientationAndAspectRatio());
+ assertFalse(mActivity.inSizeCompatMode());
+
+ // Activity bounds should respect minimum aspect ratio for activity.
+ assertEquals(displayBounds.height(), activityBounds.height());
+ assertEquals((int) Math.rint(displayBounds.height() / mActivity.info.minAspectRatio),
+ activityBounds.width());
+ }
+
+ @Test
+ public void testDisplayIgnoreOrientationRequest_fixedOrientationAppRespectMaxAspectRatio() {
+ // Set up a display in landscape and ignoring orientation request.
+ setUpDisplaySizeWithApp(2800, 1400);
+ mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+
+ // Portrait fixed app with max aspect ratio lower that aspect ratio override for fixed
+ // orientation letterbox.
+ mActivity.mWmService.setFixedOrientationLetterboxAspectRatio(3);
+ prepareUnresizable(mActivity, /* maxAspect= */ 2, SCREEN_ORIENTATION_PORTRAIT);
+
+ final Rect displayBounds = new Rect(mActivity.mDisplayContent.getBounds());
+ final Rect activityBounds = new Rect(mActivity.getBounds());
+
+ // Display shouldn't be rotated.
+ assertEquals(SCREEN_ORIENTATION_UNSPECIFIED,
+ mActivity.mDisplayContent.getLastOrientation());
+ assertTrue(displayBounds.width() > displayBounds.height());
+
+ // App should launch in fixed orientation letterbox.
+ assertTrue(mActivity.isLetterboxedForFixedOrientationAndAspectRatio());
+ assertFalse(mActivity.inSizeCompatMode());
+
+ // Activity bounds should respect maximum aspect ratio for activity.
+ assertEquals(displayBounds.height(), activityBounds.height());
+ assertEquals((int) Math.rint(displayBounds.height() / mActivity.info.maxAspectRatio),
+ activityBounds.width());
+ }
+
+ @Test
+ public void testDisplayIgnoreOrientationRequest_fixedOrientationAppWithAspectRatioOverride() {
+ // Set up a display in landscape and ignoring orientation request.
+ setUpDisplaySizeWithApp(2800, 1400);
+ mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+
+ // Portrait fixed app with min aspect ratio higher that aspect ratio override for fixed
+ // orientation letterbox.
+ final float fixedOrientationLetterboxAspectRatio = 1.1f;
+ mActivity.mWmService.setFixedOrientationLetterboxAspectRatio(
+ fixedOrientationLetterboxAspectRatio);
+ prepareUnresizable(mActivity, 0, SCREEN_ORIENTATION_PORTRAIT);
+
+ final Rect displayBounds = new Rect(mActivity.mDisplayContent.getBounds());
+ final Rect activityBounds = new Rect(mActivity.getBounds());
+
+ // Display shouldn't be rotated.
+ assertEquals(SCREEN_ORIENTATION_UNSPECIFIED,
+ mActivity.mDisplayContent.getLastOrientation());
+ assertTrue(displayBounds.width() > displayBounds.height());
+
+ // App should launch in fixed orientation letterbox.
+ assertTrue(mActivity.isLetterboxedForFixedOrientationAndAspectRatio());
+ assertFalse(mActivity.inSizeCompatMode());
+
+ // Activity bounds should respect aspect ratio override for fixed orientation letterbox.
+ assertEquals(displayBounds.height(), activityBounds.height());
+ assertEquals((int) Math.rint(displayBounds.height() / fixedOrientationLetterboxAspectRatio),
+ activityBounds.width());
+ }
+
@Test
public void
testDisplayIgnoreOrientationRequest_orientationLetterboxBecameSizeCompatAfterRotate() {