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

Commit da316ca8 authored by Graciela Wissen Putri's avatar Graciela Wissen Putri Committed by Graciela Putri
Browse files

[2/n] Limit system fullscreen override to default display

Fullscreen override applied to apps on close to square devices will not
work as well when moved to external displays. This is due to internal
testing which only considered the current internal displays that have
smalller UI changes on task resize.

Limit the current system full-screen override to apply only to the
default display.

Flag: com.android.window.flags.limit_system_fullscreen_override_to_default_display
Bug: 423802240
Test: atest AppCompatAspectRatioOverridesTest
Change-Id: Iec832f9f7f44e547d66602f0d350f32cc97088cb
parent 428e9eb9
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -1605,11 +1605,11 @@ public class ActivityInfo extends ComponentInfo implements Parcelable {
     * fullscreen. While display rotation is fixed to landscape, the orientation requested by the
     * activity will be still respected by bounds resolution logic. For instance, if an activity
     * requests portrait orientation and this override is set, then activity will appear in the
     * letterbox mode for fixed orientation with the display rotated to the lanscape natural
     * letterbox mode for fixed orientation with the display rotated to the landscape natural
     * orientation.
     *
     * <p>This override is applicable only when natural orientation of the device is
     * landscape and display ignores orientation requestes.
     * landscape and display ignores orientation requests.
     *
     * <p>Main use case for this override are camera-using activities that are portrait-only and
     * assume alignment with natural device orientation. Such activities can automatically be
@@ -1626,8 +1626,9 @@ public class ActivityInfo extends ComponentInfo implements Parcelable {

    /**
     * Enables {@link #SCREEN_ORIENTATION_USER} which overrides any orientation requested
     * by the activity. Fixed orientation apps can be overridden to fullscreen on large
     * screen devices with ignoreOrientationRequest enabled with this override.
     * by the activity. Fixed-orientation and fixed&ndash;aspect ratio apps can be overridden
     * to full screen on large screen devices when this override is enabled. The override
     * applies only to default displays that have {@code ignoreOrientationRequest} set to true.
     *
     * @hide
     */
+37 −5
Original line number Diff line number Diff line
@@ -27,10 +27,12 @@ import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_DISPLAY_SI
import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_FULLSCREEN;
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.view.Display.DEFAULT_DISPLAY;
import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE;
import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE;
import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE;
import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE;
import static android.window.DesktopExperienceFlags.LIMIT_SYSTEM_FULLSCREEN_OVERRIDE_TO_DEFAULT_DISPLAY;

import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME;
@@ -40,6 +42,7 @@ import static com.android.server.wm.AppCompatUtils.isChangeEnabled;
import static com.android.server.wm.AppCompatUtils.isDisplayIgnoreActivitySizeRestrictions;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
@@ -79,6 +82,8 @@ class AppCompatAspectRatioOverrides {
    private final AppCompatDeviceStateQuery mAppCompatDeviceStateQuery;
    @NonNull
    private final AppCompatReachabilityOverrides mAppCompatReachabilityOverrides;
    @Nullable
    private Boolean mIsSystemFullscreenOverrideEnabled;

    AppCompatAspectRatioOverrides(@NonNull ActivityRecord activityRecord,
            @NonNull AppCompatConfiguration appCompatConfiguration,
@@ -161,12 +166,31 @@ class AppCompatAspectRatioOverrides {
    }

    boolean isSystemOverrideToFullscreenEnabled() {
        final int aspectRatio = getUserMinAspectRatioOverrideCode();
        return isSystemOverrideToFullscreenEnabled(mActivityRecord.mDisplayContent);
    }

        return isChangeEnabled(mActivityRecord, OVERRIDE_ANY_ORIENTATION_TO_USER)
    boolean isSystemOverrideToFullscreenEnabled(@Nullable DisplayContent dc) {
        if (mIsSystemFullscreenOverrideEnabled != null) {
            return mIsSystemFullscreenOverrideEnabled;
        }
        final int aspectRatio = getUserMinAspectRatioOverrideCode();
        final boolean baseOverride =
                isChangeEnabled(mActivityRecord, OVERRIDE_ANY_ORIENTATION_TO_USER)
                        && !mAllowOrientationOverrideOptProp.isFalse()
                        && (aspectRatio == USER_MIN_ASPECT_RATIO_UNSET
                            || aspectRatio == USER_MIN_ASPECT_RATIO_FULLSCREEN);

        if (dc != null
                && LIMIT_SYSTEM_FULLSCREEN_OVERRIDE_TO_DEFAULT_DISPLAY.isTrue()) {
            // If attached to display, cache full-screen override to maintain consistent
            // override behaviour when activity is moved between displays.
            // Only apply full-screen override if activity was started in default display.
            mIsSystemFullscreenOverrideEnabled = baseOverride
                    && dc.getDisplayId() == DEFAULT_DISPLAY;
            return mIsSystemFullscreenOverrideEnabled;
        }

        return baseOverride;
    }

    /**
@@ -183,13 +207,21 @@ class AppCompatAspectRatioOverrides {
    }

    /**
     * Whether to ignore fixed orientation, aspect ratio and resizability of activity.
     * Whether to ignore fixed orientation, aspect ratio, and resizability of the activity.
     */
    boolean hasFullscreenOverride() {
        return shouldApplyUserFullscreenOverride() || isSystemOverrideToFullscreenEnabled()
                || shouldIgnoreActivitySizeRestrictionsForDisplay();
    }

    /**
     * Whether to ignore fixed orientation, aspect ratio, and resizability of the activity.
     */
    boolean hasFullscreenOverride(@NonNull DisplayContent dc) {
        return shouldApplyUserFullscreenOverride() || isSystemOverrideToFullscreenEnabled(dc)
                || shouldIgnoreActivitySizeRestrictionsForDisplay();
    }

    boolean shouldIgnoreActivitySizeRestrictionsForDisplay() {
        return isDisplayIgnoreActivitySizeRestrictions(mActivityRecord)
                && !mAllowOrientationOverrideOptProp.isFalse();
+2 −1
Original line number Diff line number Diff line
@@ -1921,10 +1921,11 @@ class Task extends TaskFragment {
    private void updateForceResizeOverrides(@NonNull ActivityRecord r) {
        final AppCompatResizeOverrides resizeOverrides = r.mAppCompatController
                .getResizeOverrides();
        // Pass task's displayContent as activity's displayContent is not attached yet.
        mForceResizeOverride = resizeOverrides.shouldOverrideForceResizeApp()
                || r.isUniversalResizeable()
                || r.mAppCompatController.getAspectRatioOverrides()
                    .hasFullscreenOverride();
                    .hasFullscreenOverride(mDisplayContent);
        mForceNonResizeOverride = resizeOverrides.shouldOverrideForceNonResizeApp();
    }

+4 −0
Original line number Diff line number Diff line
@@ -158,6 +158,10 @@ class AppCompatActivityRobot {
        doReturn(enabled).when(mDisplayContent).isDisplayIgnoreActivitySizeRestrictions();
    }

    void setDisplayId(int displayId) {
        doReturn(displayId).when(mDisplayContent).getDisplayId();
    }

    void configureTaskBounds(@NonNull Rect taskBounds) {
        doReturn(taskBounds).when(mTaskStack.top()).getBounds();
    }
+57 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import static android.content.pm.ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_3_2;
import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_FULLSCREEN;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Surface.ROTATION_90;
import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE;
import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE;
@@ -32,6 +33,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;

import android.compat.testing.PlatformCompatChangeRule;
import android.content.pm.ActivityInfo;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.annotations.Presubmit;

@@ -381,6 +383,61 @@ public class AppCompatAspectRatioOverridesTest extends WindowTestsBase {
        });
    }


    @Test
    @EnableFlags(Flags.FLAG_LIMIT_SYSTEM_FULLSCREEN_OVERRIDE_TO_DEFAULT_DISPLAY)
    @EnableCompatChanges(ActivityInfo.OVERRIDE_ANY_ORIENTATION_TO_USER)
    public void testSystemFullscreenOverride_isDefaultDisplay_true() {
        runTestScenario((robot) -> {
            robot.applyOnActivity((a) -> {
                a.setDisplayId(DEFAULT_DISPLAY);
                a.createActivityWithComponent();
                a.setIgnoreOrientationRequest(true);
                a.configureTopActivity(/* minAspect */ -1f, /* maxAspect */-1f,
                        SCREEN_ORIENTATION_LANDSCAPE, true);
            });

            robot.checkHasFullscreenOverride(true);
        });
    }

    @Test
    @EnableFlags(Flags.FLAG_LIMIT_SYSTEM_FULLSCREEN_OVERRIDE_TO_DEFAULT_DISPLAY)
    @EnableCompatChanges(ActivityInfo.OVERRIDE_ANY_ORIENTATION_TO_USER)
    public void testSystemFullscreenOverride_notDefaultDisplay_false() {
        runTestScenario((robot) -> {
            robot.applyOnActivity((a) -> {
                a.setDisplayId(DEFAULT_DISPLAY + 2);
                a.createActivityWithComponent();
                a.setIgnoreOrientationRequest(true);
                a.configureTopActivity(/* minAspect */ -1f, /* maxAspect */-1f,
                        SCREEN_ORIENTATION_LANDSCAPE, true);
            });

            robot.checkHasFullscreenOverride(false);
        });
    }

    @Test
    @EnableFlags(Flags.FLAG_LIMIT_SYSTEM_FULLSCREEN_OVERRIDE_TO_DEFAULT_DISPLAY)
    @EnableCompatChanges(ActivityInfo.OVERRIDE_ANY_ORIENTATION_TO_USER)
    public void testSystemFullscreenOverride_movedOutOfDefaultDisplay_true() {
        runTestScenario((robot) -> {
            robot.applyOnActivity((a) -> {
                a.setDisplayId(DEFAULT_DISPLAY);
                a.createActivityWithComponent();
                a.setIgnoreOrientationRequest(true);
                a.configureTopActivity(/* minAspect */ -1f, /* maxAspect */-1f,
                        SCREEN_ORIENTATION_LANDSCAPE, true);

                // Simulate display move.
                a.setDisplayId(DEFAULT_DISPLAY + 2);
            });

            robot.checkHasFullscreenOverride(true);
        });
    }

    /**
     * Runs a test scenario providing a Robot.
     */
Loading