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

Commit c0a14d62 authored by Mina Granic's avatar Mina Granic Committed by Android (Google) Code Review
Browse files

Merge "Check camera-dictated aspect ratio on activities with desired orientation also." into main

parents ff09cab7 05aab206
Loading
Loading
Loading
Loading
+10 −8
Original line number Diff line number Diff line
@@ -70,15 +70,8 @@ class AppCompatAspectRatioPolicy {
        mAppCompatAspectRatioState.reset();
    }

    float getDesiredAspectRatio(@NonNull Configuration newParentConfig,
    private float getDesiredAspectRatio(@NonNull Configuration newParentConfig,
            @NonNull Rect parentBounds) {
        // If in camera compat mode, aspect ratio from the camera compat policy has priority over
        // default letterbox aspect ratio.
        if (AppCompatCameraPolicy.shouldCameraCompatControlAspectRatio(
                mActivityRecord)) {
            return AppCompatCameraPolicy.getCameraCompatAspectRatio(mActivityRecord);
        }

        final float letterboxAspectRatioOverride =
                mAppCompatOverrides.getAppCompatAspectRatioOverrides()
                        .getFixedOrientationLetterboxAspectRatio(newParentConfig);
@@ -120,7 +113,16 @@ class AppCompatAspectRatioPolicy {
        if (mTransparentPolicy.isRunning()) {
            return mTransparentPolicy.getInheritedMinAspectRatio();
        }

        final ActivityInfo info = mActivityRecord.info;

        // If in camera compat mode, aspect ratio from the camera compat policy has priority over
        // the default aspect ratio.
        if (AppCompatCameraPolicy.shouldCameraCompatControlAspectRatio(mActivityRecord)) {
            return Math.max(AppCompatCameraPolicy.getCameraCompatMinAspectRatio(mActivityRecord),
                    info.getMinAspectRatio());
        }

        final AppCompatAspectRatioOverrides aspectRatioOverrides =
                mAppCompatOverrides.getAppCompatAspectRatioOverrides();
        if (aspectRatioOverrides.shouldApplyUserMinAspectRatioOverride()) {
+1 −1
Original line number Diff line number Diff line
@@ -234,7 +234,7 @@ class AppCompatCameraPolicy {
    }

    // TODO(b/369070416): have policies implement the same interface.
    static float getCameraCompatAspectRatio(@NonNull ActivityRecord activity) {
    static float getCameraCompatMinAspectRatio(@NonNull ActivityRecord activity) {
        final AppCompatCameraPolicy cameraPolicy = getAppCompatCameraPolicy(activity);
        if (cameraPolicy == null) {
            return 1.0f;
+128 −0
Original line number Diff line number Diff line
@@ -87,6 +87,7 @@ import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.doCallRealMethod;
import static org.mockito.Mockito.times;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
@@ -4781,6 +4782,114 @@ public class SizeCompatTests extends WindowTestsBase {
                computeAspectRatio(sizeCompatAppBounds), DELTA_ASPECT_RATIO_TOLERANCE);
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
    public void testCameraCompatAspectRatioAppliedForFixedOrientationCameraActivities() {
        // Needed to create camera compat policy in DisplayContent.
        allowDesktopMode();
        // Create display that has all stable insets and does not rotate.
        final DisplayContent display = new TestDisplayContent.Builder(mAtm, 1080, 600)
                .setSystemDecorations(true).setCanRotate(false).build();

        final float cameraCompatAspectRatio = 4.0f;
        setupCameraCompatAspectRatio(cameraCompatAspectRatio, display);

        // Create task on test display.
        final Task task = new TaskBuilder(mSupervisor).setDisplay(display).build();

        // Create fixed portrait activity.
        final ActivityRecord fixedOrientationActivity = new ActivityBuilder(mAtm)
                .setTask(task).setScreenOrientation(SCREEN_ORIENTATION_PORTRAIT).build();
        final Rect fixedOrientationAppBounds = new Rect(fixedOrientationActivity.getConfiguration()
                .windowConfiguration.getAppBounds());

        assertEquals(cameraCompatAspectRatio, computeAspectRatio(fixedOrientationAppBounds),
                DELTA_ASPECT_RATIO_TOLERANCE);
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
    public void testCameraCompatAspectRatioForFixedOrientationCameraActivitiesPortraitWindow() {
        // Needed to create camera compat policy in DisplayContent.
        allowDesktopMode();
        // Create portrait display that has all stable insets and does not rotate.
        final DisplayContent display = new TestDisplayContent.Builder(mAtm, 1080, 1600)
                .setSystemDecorations(true).setCanRotate(false).build();

        final float cameraCompatAspectRatio = 4.0f;
        setupCameraCompatAspectRatio(cameraCompatAspectRatio, display);

        // Create task on test display.
        final Task task = new TaskBuilder(mSupervisor).setDisplay(display).build();

        // Create fixed portrait activity.
        final ActivityRecord fixedOrientationActivity = new ActivityBuilder(mAtm)
                .setTask(task).setScreenOrientation(SCREEN_ORIENTATION_PORTRAIT).build();
        final Rect fixedOrientationAppBounds = new Rect(fixedOrientationActivity.getConfiguration()
                .windowConfiguration.getAppBounds());

        assertEquals(cameraCompatAspectRatio, computeAspectRatio(fixedOrientationAppBounds),
                DELTA_ASPECT_RATIO_TOLERANCE);
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
    public void testCameraCompatAspectRatioAppliedInsteadOfDefaultAspectRatio() {
        // Needed to create camera compat policy in DisplayContent.
        allowDesktopMode();
        // Create display that has all stable insets and does not rotate.
        final DisplayContent display = new TestDisplayContent.Builder(mAtm, 1080, 600)
                .setSystemDecorations(true).setCanRotate(false).build();

        final float cameraCompatAspectRatio = 5.0f;
        setupCameraCompatAspectRatio(cameraCompatAspectRatio, display);

        // Create task on test display.
        final Task task = new TaskBuilder(mSupervisor).setDisplay(display).build();

        // App's target min aspect ratio - this should not be used, as camera controls aspect ratio.
        final float targetMinAspectRatio = 4.0f;

        // Create fixed portrait activity with min aspect ratio greater than parent aspect ratio.
        final ActivityRecord minAspectRatioActivity = new ActivityBuilder(mAtm)
                .setTask(task).setScreenOrientation(SCREEN_ORIENTATION_PORTRAIT)
                .setMinAspectRatio(targetMinAspectRatio).build();
        final Rect minAspectRatioAppBounds = new Rect(minAspectRatioActivity.getConfiguration()
                .windowConfiguration.getAppBounds());

        assertEquals(cameraCompatAspectRatio, computeAspectRatio(minAspectRatioAppBounds),
                DELTA_ASPECT_RATIO_TOLERANCE);
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
    public void testCameraCompatAspectRatio_defualtAspectRatioAppliedWhenGreater() {
        // Needed to create camera compat policy in DisplayContent.
        allowDesktopMode();
        // Create display that has all stable insets and does not rotate.
        final DisplayContent display = new TestDisplayContent.Builder(mAtm, 1080, 600)
                .setSystemDecorations(true).setCanRotate(false).build();

        final float cameraCompatAspectRatio = 5.0f;
        setupCameraCompatAspectRatio(cameraCompatAspectRatio, display);

        // Create task on test display.
        final Task task = new TaskBuilder(mSupervisor).setDisplay(display).build();

        // App's target min aspect ratio bigger than camera compat aspect ratio - use that instead.
        final float targetMinAspectRatio = 6.0f;

        // Create fixed portrait activity with min aspect ratio greater than parent aspect ratio.
        final ActivityRecord minAspectRatioActivity = new ActivityBuilder(mAtm)
                .setTask(task).setScreenOrientation(SCREEN_ORIENTATION_PORTRAIT)
                .setMinAspectRatio(targetMinAspectRatio).build();
        final Rect minAspectRatioAppBounds = new Rect(minAspectRatioActivity.getConfiguration()
                .windowConfiguration.getAppBounds());

        assertEquals(targetMinAspectRatio, computeAspectRatio(minAspectRatioAppBounds),
                DELTA_ASPECT_RATIO_TOLERANCE);
    }

    @Test
    public void testUniversalResizeable() {
        mWm.mConstants.mIgnoreActivityOrientationRequest = true;
@@ -4868,6 +4977,25 @@ public class SizeCompatTests extends WindowTestsBase {
        assertEquals(newDensity, mActivity.getConfiguration().densityDpi);
    }

    /**
     * {@code canEnterDesktopMode} is called when {@link CameraCompatFreeformPolicy} is created in
     * {@link AppCompatCameraPolicy}.
     *
     * <p>{@link #allowDesktopMode()} needs to be called before {@link DisplayContent} is created.
     */
    private void allowDesktopMode() {
        doReturn(true).when(() -> DesktopModeHelper.canEnterDesktopMode(any()));
    }

    private void setupCameraCompatAspectRatio(float cameraCompatAspectRatio,
            @NonNull DisplayContent display) {
        CameraCompatFreeformPolicy cameraPolicy = display.mAppCompatCameraPolicy
                .mCameraCompatFreeformPolicy;
        spyOn(cameraPolicy);
        doReturn(true).when(cameraPolicy).shouldCameraCompatControlAspectRatio(any());
        doReturn(cameraCompatAspectRatio).when(cameraPolicy).getCameraCompatAspectRatio(any());
    }

    private void setUpAllowThinLetterboxed(boolean thinLetterboxAllowed) {
        final AppCompatReachabilityOverrides reachabilityOverrides =
                mActivity.mAppCompatController.getAppCompatReachabilityOverrides();