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

Commit b458c493 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Make large screen display ignore orientation request by default

- Make the behavior consistent on large screen.
  Enable ignore-orientation-request by smallestScreenWidthDp >= 600dp
  It can still be overridden by shell command or display_settings.xml.

- The regular large screen devices already configure their
  display_settings.xml with ignoreOrientationRequest="true".
  This can reduce duplication of display_settings.xml for new large
  screen devices every time.

- Make most tests of SizeCompatTests use default display. Because
  it is more efficient than creating a new display. That may reduce
  the test time by tens of seconds.

- Remove some incorrect assertDownScaled in SizeCompatTests which
  should not apply compat scale, e.g. a 700x1400 activity in
  a 2800x1400 display rotates to 1400x700. But it was accidentally
  passed by the fallback scale DisplayContent#mCompatibleScreenScale
  which is 0 on a TestDisplayContent.

Bug: 357141415
Flag: com.android.window.flags.universal_resizable_by_default
Test: atest SizeCompatTests

Change-Id: Id67309257d3af875ea6b2b2fb42c5fb5e01b9d6e
parent b8debc69
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -3212,8 +3212,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
     * will be ignored.
     */
    boolean isUniversalResizeable() {
        final boolean isLargeScreen = mDisplayContent != null && mDisplayContent.getConfiguration()
                .smallestScreenWidthDp >= WindowManager.LARGE_SCREEN_SMALLEST_SCREEN_WIDTH_DP
        final boolean isLargeScreen = mDisplayContent != null && mDisplayContent.isLargeScreen()
                && mDisplayContent.getIgnoreOrientationRequest();
        if (!canBeUniversalResizeable(info.applicationInfo, mWmService, isLargeScreen,
                true /* forActivity */)) {
+21 −0
Original line number Diff line number Diff line
@@ -438,6 +438,10 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
     */
    private boolean mSandboxDisplayApis = true;

    /** Whether {@link #setIgnoreOrientationRequest} is called to override the default policy. */
    @VisibleForTesting
    boolean mHasSetIgnoreOrientationRequest;

    /**
     * Overridden display density for current user. Initialized with {@link #mInitialDisplayDensity}
     * but can be set from Settings or via shell command "adb shell wm density".
@@ -6675,8 +6679,25 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
        return mDisplayPolicy.getSystemUiContext();
    }

    /** Returns {@code} true if the smallest screen width dp >= 600. */
    boolean isLargeScreen() {
        return getConfiguration().smallestScreenWidthDp
                >= WindowManager.LARGE_SCREEN_SMALLEST_SCREEN_WIDTH_DP;
    }

    @Override
    boolean getIgnoreOrientationRequest() {
        if (mHasSetIgnoreOrientationRequest
                || !com.android.window.flags.Flags.universalResizableByDefault()) {
            return super.getIgnoreOrientationRequest();
        }
        // Large screen (sw >= 600dp) ignores orientation request by default.
        return isLargeScreen() && !mWmService.isIgnoreOrientationRequestDisabled();
    }

    @Override
    boolean setIgnoreOrientationRequest(boolean ignoreOrientationRequest) {
        mHasSetIgnoreOrientationRequest = true;
        if (mSetIgnoreOrientationRequest == ignoreOrientationRequest) return false;
        final boolean rotationChanged = super.setIgnoreOrientationRequest(ignoreOrientationRequest);
        mWmService.mDisplayWindowSettings.setIgnoreOrientationRequest(
+3 −3
Original line number Diff line number Diff line
@@ -374,9 +374,9 @@ class DisplayWindowSettings {
        final DisplayInfo displayInfo = dc.getDisplayInfo();
        final SettingsProvider.SettingsEntry settings = mSettingsProvider.getSettings(displayInfo);

        final boolean ignoreOrientationRequest = settings.mIgnoreOrientationRequest != null
                ? settings.mIgnoreOrientationRequest : false;
        dc.setIgnoreOrientationRequest(ignoreOrientationRequest);
        if (settings.mIgnoreOrientationRequest != null) {
            dc.setIgnoreOrientationRequest(settings.mIgnoreOrientationRequest);
        }

        dc.getDisplayRotation().resetAllowAllRotations();
    }
+11 −1
Original line number Diff line number Diff line
@@ -554,6 +554,7 @@ public class ActivityRecordTests extends WindowTestsBase {

    @Test
    public void testSetRequestedOrientationUpdatesConfiguration() throws Exception {
        mDisplayContent.setIgnoreOrientationRequest(false);
        final ActivityRecord activity = new ActivityBuilder(mAtm)
                .setCreateTask(true)
                .setConfigChanges(ORIENTATION_CONFIG_CHANGES)
@@ -641,6 +642,7 @@ public class ActivityRecordTests extends WindowTestsBase {

    @Test
    public void ignoreRequestedOrientationForResizableInSplitWindows() {
        mDisplayContent.setIgnoreOrientationRequest(false);
        final ActivityRecord activity = createActivityWith2LevelTask();
        final Task task = activity.getTask();
        final Task rootTask = activity.getRootTask();
@@ -685,6 +687,7 @@ public class ActivityRecordTests extends WindowTestsBase {

    @Test
    public void respectRequestedOrientationForNonResizableInSplitWindows() {
        mDisplayContent.setIgnoreOrientationRequest(false);
        final TaskDisplayArea tda = mDisplayContent.getDefaultTaskDisplayArea();
        spyOn(tda);
        doReturn(true).when(tda).supportsNonResizableMultiWindow();
@@ -1906,6 +1909,7 @@ public class ActivityRecordTests extends WindowTestsBase {

    @Test
    public void testActivityOnCancelFixedRotationTransform() {
        mDisplayContent.setIgnoreOrientationRequest(false);
        final ActivityRecord activity = createActivityWithTask();
        final DisplayRotation displayRotation = activity.mDisplayContent.getDisplayRotation();
        final RemoteDisplayChangeController remoteDisplayChangeController = activity
@@ -2054,6 +2058,7 @@ public class ActivityRecordTests extends WindowTestsBase {

    @Test
    public void testFixedRotationSnapshotStartingWindow() {
        mDisplayContent.setIgnoreOrientationRequest(false);
        final ActivityRecord activity = createActivityWithTask();
        // TaskSnapshotSurface requires a fullscreen opaque window.
        final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
@@ -2278,6 +2283,7 @@ public class ActivityRecordTests extends WindowTestsBase {
    @Test
    public void testSupportsFreeform() {
        final ActivityRecord activity = new ActivityBuilder(mAtm)
                .setComponent(getUniqueComponentName(mContext.getPackageName()))
                .setCreateTask(true)
                .setResizeMode(ActivityInfo.RESIZE_MODE_UNRESIZEABLE)
                .setScreenOrientation(SCREEN_ORIENTATION_LANDSCAPE)
@@ -2410,6 +2416,7 @@ public class ActivityRecordTests extends WindowTestsBase {

    @Test
    public void testOrientationForScreenOrientationBehind() {
        mDisplayContent.setIgnoreOrientationRequest(false);
        final Task task = createTask(mDisplayContent);
        // Activity below
        new ActivityBuilder(mAtm)
@@ -2507,6 +2514,7 @@ public class ActivityRecordTests extends WindowTestsBase {
    @SetupWindows(addWindows = W_ACTIVITY)
    @Test
    public void testLandscapeSeascapeRotationByApp() {
        mDisplayContent.setIgnoreOrientationRequest(false);
        final Task task = new TaskBuilder(mSupervisor)
                .setDisplay(mDisplayContent).setCreateActivity(true).build();
        final ActivityRecord activity = task.getTopNonFinishingActivity();
@@ -2572,6 +2580,7 @@ public class ActivityRecordTests extends WindowTestsBase {
    @Test
    @Presubmit
    public void testGetOrientation() {
        mDisplayContent.setIgnoreOrientationRequest(false);
        // ActivityBuilder will resume top activities and cause the activity been added into
        // opening apps list. Since this test is focus on the effect of visible on getting
        // orientation, we skip app transition to avoid interference.
@@ -2663,8 +2672,8 @@ public class ActivityRecordTests extends WindowTestsBase {
    @Test
    public void testSetOrientation_restrictedByTargetSdk() {
        mSetFlagsRule.enableFlags(Flags.FLAG_UNIVERSAL_RESIZABLE_BY_DEFAULT);
        mDisplayContent.setIgnoreOrientationRequest(true);
        makeDisplayLargeScreen(mDisplayContent);
        assertTrue(mDisplayContent.getIgnoreOrientationRequest());

        assertSetOrientation(Build.VERSION_CODES.CUR_DEVELOPMENT, CATEGORY_SOCIAL, false);
        assertSetOrientation(Build.VERSION_CODES.CUR_DEVELOPMENT, CATEGORY_GAME, true);
@@ -2702,6 +2711,7 @@ public class ActivityRecordTests extends WindowTestsBase {

    @Test
    public void testRespectTopFullscreenOrientation() {
        mDisplayContent.setIgnoreOrientationRequest(false);
        final ActivityRecord activity = new ActivityBuilder(mAtm).setCreateTask(true).build();
        final Configuration displayConfig = activity.mDisplayContent.getConfiguration();
        final Configuration activityConfig = activity.getConfiguration();
+1 −0
Original line number Diff line number Diff line
@@ -511,6 +511,7 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase {
    @Test
    public void testSupportsMultiWindow_nonResizable() {
        final ActivityRecord activity = new ActivityBuilder(mAtm)
                .setComponent(getUniqueComponentName(mContext.getPackageName()))
                .setCreateTask(true)
                .setResizeMode(RESIZE_MODE_UNRESIZEABLE)
                .build();
Loading