Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 67aa17ab authored by Mariia Sandrikova's avatar Mariia Sandrikova
Browse files

Make aspect ratio of task letterboxing configurable.

Fix: 170215894
Test: go/wm-smoke
Test: manual with 'adb shell cmd window set-task-letterbox-aspect-ratio'
and 'adb shell cmd window set-task-letterbox-aspect-ratio'

Change-Id: I4ea35f065dd20dd2bfbf813734beed633cb3a101
parent 316c10ed
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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>
+2 −0
Original line number Diff line number Diff line
@@ -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>
+9 −0
Original line number Diff line number Diff line
@@ -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;

@@ -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;
+61 −0
Original line number Diff line number Diff line
@@ -454,6 +454,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;
@@ -962,6 +970,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;
@@ -1190,6 +1202,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);

@@ -3755,6 +3769,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(
+45 −0
Original line number Diff line number Diff line
@@ -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:
@@ -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());

@@ -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;
    }
@@ -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) {