Loading core/res/res/values/config.xml +6 −0 Original line number Diff line number Diff line Loading @@ -4469,4 +4469,10 @@ TODO: b/170470621 - remove once we can have multiple Internal displays in DMS as well as a notification from DisplayStateManager. --> <string-array name="config_internalFoldedPhysicalDisplayIds" translatable="false" /> <!-- Aspect ratio of task level letterboxing. Values <= 1.0 will be ignored. Note: Activity min/max aspect ratio restrictions will still 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. --> <item name="config_taskLetterboxAspectRatio" format="float" type="dimen">0.0</item> </resources> core/res/res/values/symbols.xml +2 −0 Original line number Diff line number Diff line Loading @@ -4084,4 +4084,6 @@ <java-symbol type="dimen" name="controls_thumbnail_image_max_height" /> <java-symbol type="dimen" name="controls_thumbnail_image_max_width" /> <java-symbol type="dimen" name="config_taskLetterboxAspectRatio" /> </resources> services/core/java/com/android/server/wm/Task.java +9 −0 Original line number Diff line number Diff line Loading @@ -149,6 +149,7 @@ import static com.android.server.wm.WindowContainerChildProto.TASK; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STACK; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_MOVEMENT; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowManagerService.MIN_TASK_LETTERBOX_ASPECT_RATIO; import static com.android.server.wm.WindowManagerService.dipToPixel; import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_BEFORE_ANIM; Loading Loading @@ -2960,6 +2961,14 @@ class Task extends WindowContainer<WindowContainer> { } } // Override from config_letterboxAspectRatio or via ADB with set-letterbox-aspect-ratio. 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; if (forcedOrientation == ORIENTATION_LANDSCAPE) { final int height = (int) Math.rint(parentWidth / aspect); final int top = parentBounds.centerY() - height / 2; Loading services/core/java/com/android/server/wm/WindowManagerService.java +61 −0 Original line number Diff line number Diff line Loading @@ -453,6 +453,14 @@ public class WindowManagerService extends IWindowManager.Stub /** System UI can create more window context... */ private static final int SYSTEM_UI_MULTIPLIER = 2; /** * 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 * if it is <= this value. */ static final float MIN_TASK_LETTERBOX_ASPECT_RATIO = 1.0f; final WindowManagerConstants mConstants; final WindowTracing mWindowTracing; Loading Loading @@ -961,6 +969,10 @@ 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 float mTaskLetterboxAspectRatio; final InputManagerService mInputManager; final DisplayManagerInternal mDisplayManagerInternal; final DisplayManager mDisplayManager; Loading Loading @@ -1189,6 +1201,8 @@ public class WindowManagerService extends IWindowManager.Stub com.android.internal.R.bool.config_perDisplayFocusEnabled); mAssistantOnTopOfDream = context.getResources().getBoolean( com.android.internal.R.bool.config_assistantOnTopOfDream); mTaskLetterboxAspectRatio = context.getResources().getFloat( com.android.internal.R.dimen.config_taskLetterboxAspectRatio); mInputManager = inputManager; // Must be before createDisplayContentLocked. mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class); Loading Loading @@ -3754,6 +3768,53 @@ 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 * the framework implementation will be used to determine the aspect ratio. */ void setTaskLetterboxAspectRatio(float aspectRatio) { final long origId = Binder.clearCallingIdentity(); try { synchronized (mGlobalLock) { mTaskLetterboxAspectRatio = aspectRatio; } } finally { Binder.restoreCallingIdentity(origId); } } /** * Resets the aspect ratio of task level letterboxing to {@link * com.android.internal.R.dimen.config_taskLetterboxAspectRatio}. */ void resetTaskLetterboxAspectRatio() { final long origId = Binder.clearCallingIdentity(); try { synchronized (mGlobalLock) { mTaskLetterboxAspectRatio = mContext.getResources().getFloat( com.android.internal.R.dimen.config_taskLetterboxAspectRatio); } } finally { Binder.restoreCallingIdentity(origId); } } /** * Gets the aspect ratio of task level letterboxing. */ float getTaskLetterboxAspectRatio() { final long origId = Binder.clearCallingIdentity(); try { synchronized (mGlobalLock) { return mTaskLetterboxAspectRatio; } } finally { Binder.restoreCallingIdentity(origId); } } @Override public void setIgnoreOrientationRequest(int displayId, boolean ignoreOrientationRequest) { mAtmInternal.enforceCallerIsRecentsOrHasPermission( Loading services/core/java/com/android/server/wm/WindowManagerShellCommand.java +45 −0 Original line number Diff line number Diff line Loading @@ -111,6 +111,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 "reset": return runReset(pw); default: Loading Loading @@ -509,6 +513,38 @@ public class WindowManagerShellCommand extends ShellCommand { return 0; } private int runSetTaskLetterboxAspectRatio(PrintWriter pw) throws RemoteException { final float aspectRatio; try { String arg = getNextArgRequired(); if ("reset".equals(arg)) { mInternal.resetTaskLetterboxAspectRatio(); return 0; } aspectRatio = Float.parseFloat(arg); } catch (NumberFormatException e) { getErrPrintWriter().println("Error: bad aspect ratio format " + e); return -1; } catch (IllegalArgumentException e) { getErrPrintWriter().println( "Error: 'reset' or aspect ratio should be provided as an argument " + e); return -1; } mInternal.setTaskLetterboxAspectRatio(aspectRatio); return 0; } private int runGetTaskLetterboxAspectRatio(PrintWriter pw) throws RemoteException { final float aspectRatio = mInternal.getTaskLetterboxAspectRatio(); if (aspectRatio <= WindowManagerService.MIN_TASK_LETTERBOX_ASPECT_RATIO) { pw.println("Letterbox aspect ratio is not set"); } else { pw.println("Letterbox aspect ratio is " + aspectRatio); } return 0; } private int runReset(PrintWriter pw) throws RemoteException { int displayId = getDisplayId(getNextArg()); Loading @@ -533,6 +569,9 @@ public class WindowManagerShellCommand extends ShellCommand { // set-ignore-orientation-request mInterface.setIgnoreOrientationRequest(displayId, false /* ignoreOrientationRequest */); // set-task-letterbox-aspect-ratio mInternal.resetTaskLetterboxAspectRatio(); pw.println("Reset all settings for displayId=" + displayId); return 0; } Loading Loading @@ -563,6 +602,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(" reset [-d DISPLAY_ID]"); pw.println(" Reset all override settings."); if (!IS_USER) { Loading Loading
core/res/res/values/config.xml +6 −0 Original line number Diff line number Diff line Loading @@ -4469,4 +4469,10 @@ TODO: b/170470621 - remove once we can have multiple Internal displays in DMS as well as a notification from DisplayStateManager. --> <string-array name="config_internalFoldedPhysicalDisplayIds" translatable="false" /> <!-- Aspect ratio of task level letterboxing. Values <= 1.0 will be ignored. Note: Activity min/max aspect ratio restrictions will still 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. --> <item name="config_taskLetterboxAspectRatio" format="float" type="dimen">0.0</item> </resources>
core/res/res/values/symbols.xml +2 −0 Original line number Diff line number Diff line Loading @@ -4084,4 +4084,6 @@ <java-symbol type="dimen" name="controls_thumbnail_image_max_height" /> <java-symbol type="dimen" name="controls_thumbnail_image_max_width" /> <java-symbol type="dimen" name="config_taskLetterboxAspectRatio" /> </resources>
services/core/java/com/android/server/wm/Task.java +9 −0 Original line number Diff line number Diff line Loading @@ -149,6 +149,7 @@ import static com.android.server.wm.WindowContainerChildProto.TASK; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STACK; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_MOVEMENT; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowManagerService.MIN_TASK_LETTERBOX_ASPECT_RATIO; import static com.android.server.wm.WindowManagerService.dipToPixel; import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_BEFORE_ANIM; Loading Loading @@ -2960,6 +2961,14 @@ class Task extends WindowContainer<WindowContainer> { } } // Override from config_letterboxAspectRatio or via ADB with set-letterbox-aspect-ratio. 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; if (forcedOrientation == ORIENTATION_LANDSCAPE) { final int height = (int) Math.rint(parentWidth / aspect); final int top = parentBounds.centerY() - height / 2; Loading
services/core/java/com/android/server/wm/WindowManagerService.java +61 −0 Original line number Diff line number Diff line Loading @@ -453,6 +453,14 @@ public class WindowManagerService extends IWindowManager.Stub /** System UI can create more window context... */ private static final int SYSTEM_UI_MULTIPLIER = 2; /** * 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 * if it is <= this value. */ static final float MIN_TASK_LETTERBOX_ASPECT_RATIO = 1.0f; final WindowManagerConstants mConstants; final WindowTracing mWindowTracing; Loading Loading @@ -961,6 +969,10 @@ 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 float mTaskLetterboxAspectRatio; final InputManagerService mInputManager; final DisplayManagerInternal mDisplayManagerInternal; final DisplayManager mDisplayManager; Loading Loading @@ -1189,6 +1201,8 @@ public class WindowManagerService extends IWindowManager.Stub com.android.internal.R.bool.config_perDisplayFocusEnabled); mAssistantOnTopOfDream = context.getResources().getBoolean( com.android.internal.R.bool.config_assistantOnTopOfDream); mTaskLetterboxAspectRatio = context.getResources().getFloat( com.android.internal.R.dimen.config_taskLetterboxAspectRatio); mInputManager = inputManager; // Must be before createDisplayContentLocked. mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class); Loading Loading @@ -3754,6 +3768,53 @@ 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 * the framework implementation will be used to determine the aspect ratio. */ void setTaskLetterboxAspectRatio(float aspectRatio) { final long origId = Binder.clearCallingIdentity(); try { synchronized (mGlobalLock) { mTaskLetterboxAspectRatio = aspectRatio; } } finally { Binder.restoreCallingIdentity(origId); } } /** * Resets the aspect ratio of task level letterboxing to {@link * com.android.internal.R.dimen.config_taskLetterboxAspectRatio}. */ void resetTaskLetterboxAspectRatio() { final long origId = Binder.clearCallingIdentity(); try { synchronized (mGlobalLock) { mTaskLetterboxAspectRatio = mContext.getResources().getFloat( com.android.internal.R.dimen.config_taskLetterboxAspectRatio); } } finally { Binder.restoreCallingIdentity(origId); } } /** * Gets the aspect ratio of task level letterboxing. */ float getTaskLetterboxAspectRatio() { final long origId = Binder.clearCallingIdentity(); try { synchronized (mGlobalLock) { return mTaskLetterboxAspectRatio; } } finally { Binder.restoreCallingIdentity(origId); } } @Override public void setIgnoreOrientationRequest(int displayId, boolean ignoreOrientationRequest) { mAtmInternal.enforceCallerIsRecentsOrHasPermission( Loading
services/core/java/com/android/server/wm/WindowManagerShellCommand.java +45 −0 Original line number Diff line number Diff line Loading @@ -111,6 +111,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 "reset": return runReset(pw); default: Loading Loading @@ -509,6 +513,38 @@ public class WindowManagerShellCommand extends ShellCommand { return 0; } private int runSetTaskLetterboxAspectRatio(PrintWriter pw) throws RemoteException { final float aspectRatio; try { String arg = getNextArgRequired(); if ("reset".equals(arg)) { mInternal.resetTaskLetterboxAspectRatio(); return 0; } aspectRatio = Float.parseFloat(arg); } catch (NumberFormatException e) { getErrPrintWriter().println("Error: bad aspect ratio format " + e); return -1; } catch (IllegalArgumentException e) { getErrPrintWriter().println( "Error: 'reset' or aspect ratio should be provided as an argument " + e); return -1; } mInternal.setTaskLetterboxAspectRatio(aspectRatio); return 0; } private int runGetTaskLetterboxAspectRatio(PrintWriter pw) throws RemoteException { final float aspectRatio = mInternal.getTaskLetterboxAspectRatio(); if (aspectRatio <= WindowManagerService.MIN_TASK_LETTERBOX_ASPECT_RATIO) { pw.println("Letterbox aspect ratio is not set"); } else { pw.println("Letterbox aspect ratio is " + aspectRatio); } return 0; } private int runReset(PrintWriter pw) throws RemoteException { int displayId = getDisplayId(getNextArg()); Loading @@ -533,6 +569,9 @@ public class WindowManagerShellCommand extends ShellCommand { // set-ignore-orientation-request mInterface.setIgnoreOrientationRequest(displayId, false /* ignoreOrientationRequest */); // set-task-letterbox-aspect-ratio mInternal.resetTaskLetterboxAspectRatio(); pw.println("Reset all settings for displayId=" + displayId); return 0; } Loading Loading @@ -563,6 +602,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(" reset [-d DISPLAY_ID]"); pw.println(" Reset all override settings."); if (!IS_USER) { Loading