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

Commit 33cfc157 authored by Massimo Carli's avatar Massimo Carli Committed by Android (Google) Code Review
Browse files

Merge "Per-app config for split screen aspect ratio"

parents 5976b15a 209d86a4
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -798,6 +798,7 @@ package android.content.pm {
    field public static final long OVERRIDE_MIN_ASPECT_RATIO_MEDIUM = 180326845L; // 0xabf91bdL
    field public static final float OVERRIDE_MIN_ASPECT_RATIO_MEDIUM_VALUE = 1.5f;
    field public static final long OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY = 203647190L; // 0xc2368d6L
    field public static final long OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN = 208648326L; // 0xc6fb886L
    field public static final int RESIZE_MODE_RESIZEABLE = 2; // 0x2
  }

+23 −29
Original line number Diff line number Diff line
@@ -1108,6 +1108,17 @@ public class ActivityInfo extends ComponentInfo implements Parcelable {
    @TestApi
    public static final float OVERRIDE_MIN_ASPECT_RATIO_LARGE_VALUE = 16 / 9f;

    /**
     * Enables the use of split screen aspect ratio. This allows an app to use all the available
     * space in split mode avoiding letterboxing.
     * @hide
     */
    @ChangeId
    @Disabled
    @Overridable
    @TestApi
    public static final long OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN = 208648326L;

    /**
     * Compares activity window layout min width/height with require space for multi window to
     * determine if it can be put into multi window mode.
@@ -1317,8 +1328,8 @@ public class ActivityInfo extends ComponentInfo implements Parcelable {
     * Returns true if the activity has maximum or minimum aspect ratio.
     * @hide
     */
    public boolean hasFixedAspectRatio(@ScreenOrientation int orientation) {
        return getMaxAspectRatio() != 0 || getMinAspectRatio(orientation) != 0;
    public boolean hasFixedAspectRatio() {
        return getMaxAspectRatio() != 0 || getMinAspectRatio() != 0;
    }

    /**
@@ -1460,30 +1471,10 @@ public class ActivityInfo extends ComponentInfo implements Parcelable {
    }

    /**
     * Returns the min aspect ratio of this activity.
     *
     * This takes into account the minimum aspect ratio as defined in the app's manifest and
     * possible overrides as per OVERRIDE_MIN_ASPECT_RATIO.
     *
     * In the rare cases where the manifest minimum aspect ratio is required, use
     * {@code getManifestMinAspectRatio}.
     * Returns the min aspect ratio of this activity as defined in the manifest file.
     * @hide
     */
    public float getMinAspectRatio(@ScreenOrientation int orientation) {
        if (applicationInfo == null || !isChangeEnabled(OVERRIDE_MIN_ASPECT_RATIO) || (
                isChangeEnabled(OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY)
                        && !isFixedOrientationPortrait(orientation))) {
            return mMinAspectRatio;
        }

        if (isChangeEnabled(OVERRIDE_MIN_ASPECT_RATIO_LARGE)) {
            return Math.max(OVERRIDE_MIN_ASPECT_RATIO_LARGE_VALUE, mMinAspectRatio);
        }

        if (isChangeEnabled(OVERRIDE_MIN_ASPECT_RATIO_MEDIUM)) {
            return Math.max(OVERRIDE_MIN_ASPECT_RATIO_MEDIUM_VALUE, mMinAspectRatio);
        }

    public float getMinAspectRatio() {
        return mMinAspectRatio;
    }

@@ -1512,7 +1503,13 @@ public class ActivityInfo extends ComponentInfo implements Parcelable {
        }
    }

    private boolean isChangeEnabled(long changeId) {
    /**
     * Checks if a changeId is enabled for the current user
     * @param changeId The changeId to verify
     * @return True of the changeId is enabled
     * @hide
     */
    public boolean isChangeEnabled(long changeId) {
        return CompatChanges.isChangeEnabled(changeId, applicationInfo.packageName,
                UserHandle.getUserHandleForUid(applicationInfo.uid));
    }
@@ -1633,12 +1630,9 @@ public class ActivityInfo extends ComponentInfo implements Parcelable {
        if (getMaxAspectRatio() != 0) {
            pw.println(prefix + "maxAspectRatio=" + getMaxAspectRatio());
        }
        final float minAspectRatio = getMinAspectRatio(screenOrientation);
        final float minAspectRatio = getMinAspectRatio();
        if (minAspectRatio != 0) {
            pw.println(prefix + "minAspectRatio=" + minAspectRatio);
            if (getManifestMinAspectRatio() !=  minAspectRatio) {
                pw.println(prefix + "getManifestMinAspectRatio=" + getManifestMinAspectRatio());
            }
        }
        if (supportsSizeChanges) {
            pw.println(prefix + "supportsSizeChanges=true");
+28 −3
Original line number Diff line number Diff line
@@ -78,6 +78,11 @@ import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_ALWAYS;
import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_DEFAULT;
import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_IF_ALLOWLISTED;
import static android.content.pm.ActivityInfo.LOCK_TASK_LAUNCH_MODE_NEVER;
import static android.content.pm.ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO;
import static android.content.pm.ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO_LARGE;
import static android.content.pm.ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO_MEDIUM;
import static android.content.pm.ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY;
import static android.content.pm.ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN;
import static android.content.pm.ActivityInfo.PERSIST_ACROSS_REBOOTS;
import static android.content.pm.ActivityInfo.PERSIST_ROOT_ONLY;
import static android.content.pm.ActivityInfo.RESIZE_MODE_FORCE_RESIZEABLE;
@@ -8751,15 +8756,35 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
    /**
     * Returns the min aspect ratio of this activity.
     */
    private float getMinAspectRatio() {
        return info.getMinAspectRatio(getRequestedOrientation());
    float getMinAspectRatio() {
        if (info.applicationInfo == null || !info.isChangeEnabled(OVERRIDE_MIN_ASPECT_RATIO) || (
                info.isChangeEnabled(OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY)
                        && !ActivityInfo.isFixedOrientationPortrait(getRequestedOrientation()))) {
            return info.getMinAspectRatio();
        }

        if (info.isChangeEnabled(OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN)) {
            return Math.max(mLetterboxUiController.getSplitScreenAspectRatio(),
                    info.getMinAspectRatio());
        }

        if (info.isChangeEnabled(OVERRIDE_MIN_ASPECT_RATIO_LARGE)) {
            return Math.max(ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO_LARGE_VALUE,
                    info.getMinAspectRatio());
        }

        if (info.isChangeEnabled(OVERRIDE_MIN_ASPECT_RATIO_MEDIUM)) {
            return Math.max(ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO_MEDIUM_VALUE,
                    info.getMinAspectRatio());
        }
        return info.getMinAspectRatio();
    }

    /**
     * Returns true if the activity has maximum or minimum aspect ratio.
     */
    private boolean hasFixedAspectRatio() {
        return info.hasFixedAspectRatio(getRequestedOrientation());
        return info.getMaxAspectRatio() != 0 || getMinAspectRatio() != 0;
    }

    /**
+3 −3
Original line number Diff line number Diff line
@@ -63,7 +63,7 @@ class LaunchParamsUtil {
     * Calculate the default size for a freeform environment. |defaultSize| is used as the default
     * DP size, but if this is null, the portrait phone size is used.
     */
    static Size getDefaultFreeformSize(@NonNull ActivityInfo info,
    static Size getDefaultFreeformSize(@NonNull ActivityRecord activityRecord,
            @NonNull TaskDisplayArea displayArea,
            @NonNull ActivityInfo.WindowLayout layout, int orientation,
            @NonNull Rect stableBounds) {
@@ -98,8 +98,8 @@ class LaunchParamsUtil {
        final float aspectRatio = (float) Math.max(width, height) / (float) Math.min(width, height);

        // Aspect ratio requirements.
        final float minAspectRatio = info.getMinAspectRatio(orientation);
        final float maxAspectRatio = info.getMaxAspectRatio();
        final float minAspectRatio = activityRecord.getMinAspectRatio();
        final float maxAspectRatio = activityRecord.info.getMaxAspectRatio();

        // Adjust the width and height to the aspect ratio requirements.
        int adjWidth = width;
+4 −0
Original line number Diff line number Diff line
@@ -257,6 +257,10 @@ final class LetterboxUiController {
                            : mLetterboxConfiguration.getFixedOrientationLetterboxAspectRatio();
        }

        return getSplitScreenAspectRatio();
    }

    float getSplitScreenAspectRatio() {
        int dividerWindowWidth =
                getResources().getDimensionPixelSize(R.dimen.docked_stack_divider_thickness);
        int dividerInsets =
Loading