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

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

Merge "Revert^2 Use resolved bounds in CompatDisplayInsets if letterboxed for...

Merge "Revert^2 Use resolved bounds in CompatDisplayInsets if letterboxed for aspect ratio" into main
parents 609093a8 8ddcd1cf
Loading
Loading
Loading
Loading
+30 −15
Original line number Diff line number Diff line
@@ -821,6 +821,12 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
    @Nullable
    private Rect mLetterboxBoundsForFixedOrientationAndAspectRatio;

    // Bounds populated in resolveAspectRatioRestriction when this activity is letterboxed for
    // aspect ratio. If not null, they are used as parent container in
    // resolveSizeCompatModeConfiguration and in a constructor of CompatDisplayInsets.
    @Nullable
    private Rect mLetterboxBoundsForAspectRatio;

    // Whether the activity is eligible to be letterboxed for fixed orientation with respect to its
    // requested orientation, even when it's letterbox for another reason (e.g., size compat mode)
    // and therefore #isLetterboxedForFixedOrientationAndAspectRatio returns false.
@@ -8442,10 +8448,14 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
                    fullConfig.windowConfiguration.getRotation());
        }

        final Rect letterboxedContainerBounds =
                mLetterboxBoundsForFixedOrientationAndAspectRatio != null
                        ? mLetterboxBoundsForFixedOrientationAndAspectRatio
                        : mLetterboxBoundsForAspectRatio;
        // The role of CompatDisplayInsets is like the override bounds.
        mCompatDisplayInsets =
                new CompatDisplayInsets(
                        mDisplayContent, this, mLetterboxBoundsForFixedOrientationAndAspectRatio,
                        mDisplayContent, this, letterboxedContainerBounds,
                        mResolveConfigHint.mUseLegacyInsetsForStableBounds);
    }

@@ -8518,6 +8528,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
        mIsAspectRatioApplied = false;
        mIsEligibleForFixedOrientationLetterbox = false;
        mLetterboxBoundsForFixedOrientationAndAspectRatio = null;
        mLetterboxBoundsForAspectRatio = null;

        // Can't use resolvedConfig.windowConfiguration.getWindowingMode() because it can be
        // different from windowing mode of the task (PiP) during transition from fullscreen to PiP
@@ -8556,9 +8567,11 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
                computeConfigByResolveHint(resolvedConfig, newParentConfiguration);
            }
        // If activity in fullscreen mode is letterboxed because of fixed orientation then bounds
        // are already calculated in resolveFixedOrientationConfiguration.
        // are already calculated in resolveFixedOrientationConfiguration, or if in size compat
        // mode, it should already be calculated in resolveSizeCompatModeConfiguration.
        // Don't apply aspect ratio if app is overridden to fullscreen by device user/manufacturer.
        } else if (!isLetterboxedForFixedOrientationAndAspectRatio()
        }
        if (!isLetterboxedForFixedOrientationAndAspectRatio() && !mInSizeCompatModeForBounds
                && !mLetterboxUiController.hasFullscreenOverride()) {
            resolveAspectRatioRestriction(newParentConfiguration);
        }
@@ -9056,7 +9069,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
        }
        final CompatDisplayInsets compatDisplayInsets = getCompatDisplayInsets();

        if (compatDisplayInsets != null && !compatDisplayInsets.mIsInFixedOrientationLetterbox) {
        if (compatDisplayInsets != null
                && !compatDisplayInsets.mIsInFixedOrientationOrAspectRatioLetterbox) {
            // App prefers to keep its original size.
            // If the size compat is from previous fixed orientation letterboxing, we may want to
            // have fixed orientation letterbox again, otherwise it will show the size compat
@@ -9190,6 +9204,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
            // restrict, the bounds should be the requested override bounds.
            mResolveConfigHint.mTmpOverrideDisplayInfo = getFixedRotationTransformDisplayInfo();
            computeConfigByResolveHint(resolvedConfig, newParentConfiguration);
            mLetterboxBoundsForAspectRatio = new Rect(resolvedBounds);
        }
    }

@@ -10753,10 +10768,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
        /** Whether the {@link Task} windowingMode represents a floating window*/
        final boolean mIsFloating;
        /**
         * Whether is letterboxed because of fixed orientation when the unresizable activity is
         * first shown.
         * Whether is letterboxed because of fixed orientation or aspect ratio when
         * the unresizable activity is first shown.
         */
        final boolean mIsInFixedOrientationLetterbox;
        final boolean mIsInFixedOrientationOrAspectRatioLetterbox;
        /**
         * The nonDecorInsets for each rotation. Includes the navigation bar and cutout insets. It
         * is used to compute the appBounds.
@@ -10771,7 +10786,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A

        /** Constructs the environment to simulate the bounds behavior of the given container. */
        CompatDisplayInsets(DisplayContent display, ActivityRecord container,
                @Nullable Rect fixedOrientationBounds, boolean useOverrideInsets) {
                @Nullable Rect letterboxedContainerBounds, boolean useOverrideInsets) {
            mOriginalRotation = display.getRotation();
            mIsFloating = container.getWindowConfiguration().tasksAreFloating();
            mOriginalRequestedOrientation = container.getRequestedConfigurationOrientation();
@@ -10786,22 +10801,22 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
                    mNonDecorInsets[rotation] = emptyRect;
                    mStableInsets[rotation] = emptyRect;
                }
                mIsInFixedOrientationLetterbox = false;
                mIsInFixedOrientationOrAspectRatioLetterbox = false;
                return;
            }

            final Task task = container.getTask();

            mIsInFixedOrientationLetterbox = fixedOrientationBounds != null;
            mIsInFixedOrientationOrAspectRatioLetterbox = letterboxedContainerBounds != null;

            // Store the bounds of the Task for the non-resizable activity to use in size compat
            // mode so that the activity will not be resized regardless the windowing mode it is
            // currently in.
            // When an activity needs to be letterboxed because of fixed orientation, use fixed
            // orientation bounds instead of task bounds since the activity will be displayed
            // within these even if it is in size compat mode.
            final Rect filledContainerBounds = mIsInFixedOrientationLetterbox
                    ? fixedOrientationBounds
            // When an activity needs to be letterboxed because of fixed orientation or aspect
            // ratio, use resolved bounds instead of task bounds since the activity will be
            // displayed within these even if it is in size compat mode.
            final Rect filledContainerBounds = mIsInFixedOrientationOrAspectRatioLetterbox
                    ? letterboxedContainerBounds
                    : task != null ? task.getBounds() : display.getBounds();
            final int filledContainerRotation = task != null
                    ? task.getConfiguration().windowConfiguration.getRotation()
+38 −2
Original line number Diff line number Diff line
@@ -1942,7 +1942,6 @@ public class SizeCompatTests extends WindowTestsBase {
        assertThat(mActivity.inSizeCompatMode()).isTrue();
        assertActivityMaxBoundsSandboxed();


        final int scale = dh / dw;

        // App bounds should be dh / scale x dw / scale
@@ -4209,6 +4208,43 @@ public class SizeCompatTests extends WindowTestsBase {
        assertTrue(bounds.height() > bounds.width());
    }

    @Test
    @DisableCompatChanges({ActivityInfo.INSETS_DECOUPLED_CONFIGURATION_ENFORCED})
    public void testFixedAspectRatioAppInPortraitCloseToSquareDisplay_notInSizeCompat() {
        setUpDisplaySizeWithApp(2200, 2280);
        mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
        final DisplayContent dc = mActivity.mDisplayContent;
        // Simulate taskbar, final app bounds are (0, 0, 2200, 2130) - landscape
        final WindowState navbar = createWindow(null, TYPE_NAVIGATION_BAR, mDisplayContent,
                "navbar");
        final Binder owner = new Binder();
        navbar.mAttrs.providedInsets = new InsetsFrameProvider[] {
                new InsetsFrameProvider(owner, 0, WindowInsets.Type.navigationBars())
                        .setInsetsSize(Insets.of(0, 0, 0, 150))
        };
        dc.getDisplayPolicy().addWindowLw(navbar, navbar.mAttrs);
        assertTrue(dc.getDisplayPolicy().updateDecorInsetsInfo());
        dc.sendNewConfiguration();

        final ActivityRecord activity = new ActivityBuilder(mAtm)
                .setTask(mTask)
                .setComponent(ComponentName.createRelative(mContext,
                        SizeCompatTests.class.getName()))
                .setUid(android.os.Process.myUid())
                .build();
        prepareMinAspectRatio(activity, OVERRIDE_MIN_ASPECT_RATIO_LARGE_VALUE,
                SCREEN_ORIENTATION_LANDSCAPE);
        // To force config to update again but with the same landscape orientation.
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);

        assertTrue(activity.shouldCreateCompatDisplayInsets());
        assertNotNull(activity.getCompatDisplayInsets());
        // Activity is not letterboxed for fixed orientation because orientation is respected
        // with insets, and should not be in size compat mode
        assertFalse(activity.isLetterboxedForFixedOrientationAndAspectRatio());
        assertFalse(activity.inSizeCompatMode());
    }

    @Test
    public void testApplyAspectRatio_activityAlignWithParentAppVertical() {
        if (Flags.insetsDecoupledConfiguration()) {