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

Commit 9b489184 authored by Graciela Putri's avatar Graciela Putri Committed by Android (Google) Code Review
Browse files

Merge "Apply user aspect ratio override settings" into udc-qpr-dev

parents c1cfc4a9 a3f2c5ab
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -9416,6 +9416,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
        if (info.applicationInfo == null) {
            return info.getMinAspectRatio();
        }
        if (mLetterboxUiController.shouldApplyUserMinAspectRatioOverride()) {
            return mLetterboxUiController.getUserMinAspectRatio();
        }
        if (!mLetterboxUiController.shouldOverrideMinAspectRatio()) {
            return info.getMinAspectRatio();
        }
+61 −7
Original line number Diff line number Diff line
@@ -40,6 +40,12 @@ import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
import static android.content.pm.ActivityInfo.isFixedOrientation;
import static android.content.pm.ActivityInfo.isFixedOrientationLandscape;
import static android.content.pm.ActivityInfo.screenOrientationToString;
import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_16_9;
import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_3_2;
import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_4_3;
import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_DISPLAY_SIZE;
import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_SPLIT_SCREEN;
import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_UNSET;
import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
import static android.content.res.Configuration.ORIENTATION_UNDEFINED;
@@ -103,6 +109,7 @@ import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.RemoteException;
import android.util.Slog;
import android.view.InsetsSource;
import android.view.InsetsState;
@@ -237,6 +244,10 @@ final class LetterboxUiController {
    // Counter for ActivityRecord#setRequestedOrientation
    private int mSetOrientationRequestCounter = 0;

    // The min aspect ratio override set by user
    @PackageManager.UserMinAspectRatio
    private int mUserAspectRatio = USER_MIN_ASPECT_RATIO_UNSET;

    // The CompatDisplayInsets of the opaque activity beneath the translucent one.
    private ActivityRecord.CompatDisplayInsets mInheritedCompatDisplayInsets;

@@ -1059,7 +1070,7 @@ final class LetterboxUiController {

    private float getDefaultMinAspectRatioForUnresizableApps() {
        if (!mLetterboxConfiguration.getIsSplitScreenAspectRatioForUnresizableAppsEnabled()
                || mActivityRecord.getDisplayContent() == null) {
                || mActivityRecord.getDisplayArea() == null) {
            return mLetterboxConfiguration.getDefaultMinAspectRatioForUnresizableApps()
                    > MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO
                            ? mLetterboxConfiguration.getDefaultMinAspectRatioForUnresizableApps()
@@ -1071,8 +1082,8 @@ final class LetterboxUiController {

    float getSplitScreenAspectRatio() {
        // Getting the same aspect ratio that apps get in split screen.
        final DisplayContent displayContent = mActivityRecord.getDisplayContent();
        if (displayContent == null) {
        final DisplayArea displayArea = mActivityRecord.getDisplayArea();
        if (displayArea == null) {
            return getDefaultMinAspectRatioForUnresizableApps();
        }
        int dividerWindowWidth =
@@ -1080,7 +1091,7 @@ final class LetterboxUiController {
        int dividerInsets =
                getResources().getDimensionPixelSize(R.dimen.docked_stack_divider_insets);
        int dividerSize = dividerWindowWidth - dividerInsets * 2;
        final Rect bounds = new Rect(displayContent.getWindowConfiguration().getAppBounds());
        final Rect bounds = new Rect(displayArea.getWindowConfiguration().getAppBounds());
        if (bounds.width() >= bounds.height()) {
            bounds.inset(/* dx */ dividerSize / 2, /* dy */ 0);
            bounds.right = bounds.centerX();
@@ -1091,14 +1102,57 @@ final class LetterboxUiController {
        return computeAspectRatio(bounds);
    }

    boolean shouldApplyUserMinAspectRatioOverride() {
        if (!mLetterboxConfiguration.isUserAppAspectRatioSettingsEnabled()) {
            return false;
        }

        try {
            final int userAspectRatio = mActivityRecord.mAtmService.getPackageManager()
                    .getUserMinAspectRatio(mActivityRecord.packageName, mActivityRecord.mUserId);
            mUserAspectRatio = userAspectRatio;
            return userAspectRatio != USER_MIN_ASPECT_RATIO_UNSET;
        } catch (RemoteException e) {
            // Don't apply user aspect ratio override
            Slog.w(TAG, "Exception thrown retrieving aspect ratio user override " + this, e);
            return false;
        }
    }

    float getUserMinAspectRatio() {
        switch (mUserAspectRatio) {
            case USER_MIN_ASPECT_RATIO_DISPLAY_SIZE:
                return getDisplaySizeMinAspectRatio();
            case USER_MIN_ASPECT_RATIO_SPLIT_SCREEN:
                return getSplitScreenAspectRatio();
            case USER_MIN_ASPECT_RATIO_16_9:
                return 16 / 9f;
            case USER_MIN_ASPECT_RATIO_4_3:
                return 4 / 3f;
            case USER_MIN_ASPECT_RATIO_3_2:
                return 3 / 2f;
            default:
                throw new AssertionError("Unexpected user min aspect ratio override: "
                        + mUserAspectRatio);
        }
    }

    private float getDisplaySizeMinAspectRatio() {
        final DisplayArea displayArea = mActivityRecord.getDisplayArea();
        if (displayArea == null) {
            return mActivityRecord.info.getMinAspectRatio();
        }
        final Rect bounds = new Rect(displayArea.getWindowConfiguration().getAppBounds());
        return computeAspectRatio(bounds);
    }

    private float getDefaultMinAspectRatio() {
        final DisplayContent displayContent = mActivityRecord.getDisplayContent();
        if (displayContent == null
        if (mActivityRecord.getDisplayArea() == null
                || !mLetterboxConfiguration
                    .getIsDisplayAspectRatioEnabledForFixedOrientationLetterbox()) {
            return mLetterboxConfiguration.getFixedOrientationLetterboxAspectRatio();
        }
        return computeAspectRatio(new Rect(displayContent.getBounds()));
        return getDisplaySizeMinAspectRatio();
    }

    Resources getResources() {
+171 −0
Original line number Diff line number Diff line
@@ -27,6 +27,11 @@ import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_16_9;
import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_3_2;
import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_4_3;
import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_DISPLAY_SIZE;
import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_SPLIT_SCREEN;
import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
import static android.provider.DeviceConfig.NAMESPACE_CONSTRAIN_DISPLAY_APIS;
@@ -91,9 +96,12 @@ import android.compat.testing.PlatformCompatChangeRule;
import android.content.ComponentName;
import android.content.pm.ActivityInfo;
import android.content.pm.ActivityInfo.ScreenOrientation;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.os.Binder;
import android.os.RemoteException;
import android.os.UserHandle;
import android.platform.test.annotations.Presubmit;
import android.provider.DeviceConfig;
@@ -2254,6 +2262,169 @@ public class SizeCompatTests extends WindowTestsBase {
        assertFitted();
    }

    @Test
    public void testUserOverrideSplitScreenAspectRatioForLandscapeDisplay() {
        final int displayWidth = 1600;
        final int displayHeight = 1400;
        setUpDisplaySizeWithApp(displayWidth, displayHeight);

        float expectedAspectRatio = 1f * displayHeight / getExpectedSplitSize(displayWidth);

        testUserOverrideAspectRatio(expectedAspectRatio, USER_MIN_ASPECT_RATIO_SPLIT_SCREEN);
    }

    @Test
    public void testUserOverrideSplitScreenAspectRatioForPortraitDisplay() {
        final int displayWidth = 1400;
        final int displayHeight = 1600;
        setUpDisplaySizeWithApp(displayWidth, displayHeight);

        float expectedAspectRatio = 1f * displayWidth / getExpectedSplitSize(displayHeight);

        testUserOverrideAspectRatio(expectedAspectRatio, USER_MIN_ASPECT_RATIO_SPLIT_SCREEN);
    }

    @Test
    public void testUserOverrideDisplaySizeAspectRatioForLandscapeDisplay() {
        final int displayWidth = 1600;
        final int displayHeight = 1400;
        setUpDisplaySizeWithApp(displayWidth, displayHeight);

        float expectedAspectRatio = 1f * displayWidth / displayHeight;

        testUserOverrideAspectRatio(expectedAspectRatio, USER_MIN_ASPECT_RATIO_DISPLAY_SIZE);
    }

    @Test
    public void testUserOverrideDisplaySizeAspectRatioForPortraitDisplay() {
        final int displayWidth = 1400;
        final int displayHeight = 1600;
        setUpDisplaySizeWithApp(displayWidth, displayHeight);

        float expectedAspectRatio = 1f * displayHeight / displayWidth;

        testUserOverrideAspectRatio(expectedAspectRatio, USER_MIN_ASPECT_RATIO_DISPLAY_SIZE);
    }

    @Test
    public void testUserOverride32AspectRatioForPortraitDisplay() {
        setUpDisplaySizeWithApp(/* dw */ 1400, /* dh */ 1600);
        testUserOverrideAspectRatio(3 / 2f, USER_MIN_ASPECT_RATIO_3_2);
    }

    @Test
    public void testUserOverride32AspectRatioForLandscapeDisplay() {
        setUpDisplaySizeWithApp(/* dw */ 1600, /* dh */ 1400);
        testUserOverrideAspectRatio(3 / 2f, USER_MIN_ASPECT_RATIO_3_2);
    }

    @Test
    public void testUserOverride43AspectRatioForPortraitDisplay() {
        setUpDisplaySizeWithApp(/* dw */ 1400, /* dh */ 1600);
        testUserOverrideAspectRatio(4 / 3f, USER_MIN_ASPECT_RATIO_4_3);
    }

    @Test
    public void testUserOverride43AspectRatioForLandscapeDisplay() {
        setUpDisplaySizeWithApp(/* dw */ 1600, /* dh */ 1400);
        testUserOverrideAspectRatio(4 / 3f, USER_MIN_ASPECT_RATIO_4_3);
    }

    @Test
    public void testUserOverride169AspectRatioForPortraitDisplay() {
        setUpDisplaySizeWithApp(/* dw */ 1800, /* dh */ 1500);
        testUserOverrideAspectRatio(16 / 9f, USER_MIN_ASPECT_RATIO_16_9);
    }

    @Test
    public void testUserOverride169AspectRatioForLandscapeDisplay() {
        setUpDisplaySizeWithApp(/* dw */ 1500, /* dh */ 1800);
        testUserOverrideAspectRatio(16 / 9f, USER_MIN_ASPECT_RATIO_16_9);
    }

    @Test
    @EnableCompatChanges({ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO,
            ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO_LARGE})
    public void testUserOverrideAspectRatioOverSystemOverride() {
        setUpDisplaySizeWithApp(/* dw */ 1600, /* dh */ 1400);

        testUserOverrideAspectRatio(false,
                SCREEN_ORIENTATION_PORTRAIT,
                3 / 2f,
                USER_MIN_ASPECT_RATIO_3_2,
                true);
    }

    @Test
    public void testUserOverrideAspectRatioNotEnabled() {
        setUpDisplaySizeWithApp(/* dw */ 1600, /* dh */ 1400);

        // App aspect ratio doesn't change
        testUserOverrideAspectRatio(false,
                SCREEN_ORIENTATION_PORTRAIT,
                1f * 1600 / 1400,
                USER_MIN_ASPECT_RATIO_3_2,
                false);
    }

    private void testUserOverrideAspectRatio(float expectedAspectRatio,
            @PackageManager.UserMinAspectRatio int aspectRatio) {
        testUserOverrideAspectRatio(true,
                SCREEN_ORIENTATION_PORTRAIT,
                expectedAspectRatio,
                aspectRatio,
                true);

        testUserOverrideAspectRatio(false,
                SCREEN_ORIENTATION_PORTRAIT,
                expectedAspectRatio,
                aspectRatio,
                true);

        testUserOverrideAspectRatio(true,
                SCREEN_ORIENTATION_LANDSCAPE,
                expectedAspectRatio,
                aspectRatio,
                true);

        testUserOverrideAspectRatio(false,
                SCREEN_ORIENTATION_LANDSCAPE,
                expectedAspectRatio,
                aspectRatio,
                true);
    }

    private void testUserOverrideAspectRatio(boolean isUnresizable, int screenOrientation,
            float expectedAspectRatio, @PackageManager.UserMinAspectRatio int aspectRatio,
            boolean enabled) {
        final ActivityRecord activity = new ActivityBuilder(mAtm)
                .setTask(mTask)
                .setComponent(ComponentName.createRelative(mContext,
                        SizeCompatTests.class.getName()))
                .setUid(android.os.Process.myUid())
                .build();
        activity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
        activity.mWmService.mLetterboxConfiguration
                .setUserAppAspectRatioSettingsOverrideEnabled(enabled);
        // Set user aspect ratio override
        final IPackageManager pm = mAtm.getPackageManager();
        try {
            doReturn(aspectRatio).when(pm)
                    .getUserMinAspectRatio(activity.packageName, activity.mUserId);
        } catch (RemoteException ignored) {
        }

        prepareLimitedBounds(activity, screenOrientation, isUnresizable);

        final Rect afterBounds = activity.getBounds();
        final int width = afterBounds.width();
        final int height = afterBounds.height();
        final float afterAspectRatio =
                (float) Math.max(width, height) / (float) Math.min(width, height);

        assertEquals(expectedAspectRatio, afterAspectRatio, 0.001f);
    }

    @Test
    @EnableCompatChanges({ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO,
            ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN})