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

Commit 19cf6c63 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Ignore fixed aspect ratio and resizability for universal resizable

So if the flag is enabled, the activity can always fill the parent
bounds when resizing. Note that there is per-app compat override,
the override still has a higher priority.

Bug: 357141415
Flag: com.android.window.flags.universal_resizable_by_default
Test: atest SizeCompatTests#testUniversalResizeable
Change-Id: I05aab5d6ed0f9300e6e0194e2f97b5339af60435
parent 65e59d9a
Loading
Loading
Loading
Loading
+15 −9
Original line number Diff line number Diff line
@@ -3161,14 +3161,23 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
        return getWindowConfiguration().canReceiveKeys() && !mWaitForEnteringPinnedMode;
    }

    boolean isResizeable() {
        return isResizeable(/* checkPictureInPictureSupport */ true);
    /**
     * Returns {@code true} if the fixed orientation, aspect ratio, resizability of this activity
     * will be ignored.
     */
    boolean isUniversalResizeable() {
        return mWmService.mConstants.mIgnoreActivityOrientationRequest
                && info.applicationInfo.category != ApplicationInfo.CATEGORY_GAME
                // If the user preference respects aspect ratio, then it becomes non-resizable.
                && !mAppCompatController.getAppCompatOverrides().getAppCompatAspectRatioOverrides()
                        .shouldApplyUserMinAspectRatioOverride();
    }

    boolean isResizeable(boolean checkPictureInPictureSupport) {
    boolean isResizeable() {
        return mAtmService.mForceResizableActivities
                || ActivityInfo.isResizeableMode(info.resizeMode)
                || (info.supportsPictureInPicture() && checkPictureInPictureSupport)
                || info.supportsPictureInPicture()
                || isUniversalResizeable()
                // If the activity can be embedded, it should inherit the bounds of task fragment.
                || isEmbedded();
    }
@@ -8152,11 +8161,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
    @Override
    @ActivityInfo.ScreenOrientation
    protected int getOverrideOrientation() {
        final int candidateOrientation;
        if (!mWmService.mConstants.mIgnoreActivityOrientationRequest
                || info.applicationInfo.category == ApplicationInfo.CATEGORY_GAME) {
            candidateOrientation = super.getOverrideOrientation();
        } else {
        int candidateOrientation = super.getOverrideOrientation();
        if (isUniversalResizeable() && ActivityInfo.isFixedOrientation(candidateOrientation)) {
            candidateOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
        }
        return mAppCompatController.getOrientationPolicy()
+6 −3
Original line number Diff line number Diff line
@@ -114,9 +114,6 @@ class AppCompatAspectRatioPolicy {
            return mTransparentPolicy.getInheritedMinAspectRatio();
        }
        final ActivityInfo info = mActivityRecord.info;
        if (info.applicationInfo == null) {
            return info.getMinAspectRatio();
        }
        final AppCompatAspectRatioOverrides aspectRatioOverrides =
                mAppCompatOverrides.getAppCompatAspectRatioOverrides();
        if (aspectRatioOverrides.shouldApplyUserMinAspectRatioOverride()) {
@@ -128,6 +125,9 @@ class AppCompatAspectRatioPolicy {
                        mActivityRecord);
        if (!aspectRatioOverrides.shouldOverrideMinAspectRatio()
                && !shouldOverrideMinAspectRatioForCamera) {
            if (mActivityRecord.isUniversalResizeable()) {
                return 0;
            }
            return info.getMinAspectRatio();
        }

@@ -170,6 +170,9 @@ class AppCompatAspectRatioPolicy {
        if (mTransparentPolicy.isRunning()) {
            return mTransparentPolicy.getInheritedMaxAspectRatio();
        }
        if (mActivityRecord.isUniversalResizeable()) {
            return 0;
        }
        return mActivityRecord.info.getMaxAspectRatio();
    }

+6 −4
Original line number Diff line number Diff line
@@ -188,10 +188,6 @@ public class DesktopAppCompatAspectRatioPolicy {
        }

        final ActivityInfo info = mActivityRecord.info;
        if (info.applicationInfo == null) {
            return info.getMinAspectRatio();
        }

        final AppCompatAspectRatioOverrides aspectRatioOverrides =
                mAppCompatOverrides.getAppCompatAspectRatioOverrides();
        if (shouldApplyUserMinAspectRatioOverride(task)) {
@@ -203,6 +199,9 @@ public class DesktopAppCompatAspectRatioPolicy {
                && dc.mAppCompatCameraPolicy.shouldOverrideMinAspectRatioForCamera(mActivityRecord);
        if (!aspectRatioOverrides.shouldOverrideMinAspectRatio()
                && !shouldOverrideMinAspectRatioForCamera) {
            if (mActivityRecord.isUniversalResizeable()) {
                return 0;
            }
            return info.getMinAspectRatio();
        }

@@ -246,6 +245,9 @@ public class DesktopAppCompatAspectRatioPolicy {
        if (mTransparentPolicy.isRunning()) {
            return mTransparentPolicy.getInheritedMaxAspectRatio();
        }
        if (mActivityRecord.isUniversalResizeable()) {
            return 0;
        }
        return mActivityRecord.info.getMaxAspectRatio();
    }

+33 −0
Original line number Diff line number Diff line
@@ -4845,6 +4845,39 @@ public class SizeCompatTests extends WindowTestsBase {
                computeAspectRatio(sizeCompatAppBounds), DELTA_ASPECT_RATIO_TOLERANCE);
    }

    @Test
    public void testUniversalResizeable() {
        mWm.mConstants.mIgnoreActivityOrientationRequest = true;
        setUpApp(mDisplayContent);
        final float maxAspect = 1.8f;
        final float minAspect = 1.5f;
        prepareLimitedBounds(mActivity, maxAspect, minAspect,
                ActivityInfo.SCREEN_ORIENTATION_LOCKED, true /* isUnresizable */);

        assertTrue(mActivity.isUniversalResizeable());
        assertTrue(mActivity.isResizeable());
        assertFalse(mActivity.shouldCreateAppCompatDisplayInsets());
        assertEquals(SCREEN_ORIENTATION_UNSPECIFIED, mActivity.getOverrideOrientation());
        assertEquals(mActivity.getTask().getBounds(), mActivity.getBounds());
        final AppCompatAspectRatioPolicy aspectRatioPolicy = mActivity.mAppCompatController
                .getAppCompatAspectRatioPolicy();
        assertEquals(0, aspectRatioPolicy.getMaxAspectRatio(), 0 /* delta */);
        assertEquals(0, aspectRatioPolicy.getMinAspectRatio(), 0 /* delta */);

        // Compat override can still take effect.
        final AppCompatAspectRatioOverrides aspectRatioOverrides =
                mActivity.mAppCompatController.getAppCompatAspectRatioOverrides();
        spyOn(aspectRatioOverrides);
        doReturn(true).when(aspectRatioOverrides).shouldOverrideMinAspectRatio();
        assertEquals(minAspect, aspectRatioPolicy.getMinAspectRatio(), 0 /* delta */);

        // User override can still take effect.
        doReturn(true).when(aspectRatioOverrides).shouldApplyUserMinAspectRatioOverride();
        assertFalse(mActivity.isResizeable());
        assertEquals(maxAspect, aspectRatioPolicy.getMaxAspectRatio(), 0 /* delta */);
        assertNotEquals(SCREEN_ORIENTATION_UNSPECIFIED, mActivity.getOverrideOrientation());
    }

    @Test
    public void testClearSizeCompat_resetOverrideConfig() {
        final int origDensity = 480;