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

Commit aeb50b9a authored by yunho.shin's avatar yunho.shin Committed by Riddle Hsu
Browse files

Use root Activity to determine size compatibility in freeform mode.

If a non-resizable activity is over a resizable activity in the same freeform task,
the second activity is going to use size compat mode and it is going to be scaled down
in freeform window.

The goal is to use root activity's properties for the whole task in freeform mode.

Test: manual test steps
    1. Start resizable activity in freeform mode.
    2. Start second non-resizable and fixed orientation activity in same task.
    3. Observe that freeform should not be size compat mode in freeform window.
      atest WmTests:SizeCompatTests#testShouldUseSizeCompatModeOnResizableTask

Bug: 146581799
Change-Id: Ic47db90f4203bc8a5795accb12c3009cf9f9525a
(cherry picked from commit 89b8a17690f65ccc7fe0beac22d0f7236bb2cbbe)
parent b85c3a8f
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -6354,6 +6354,14 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
     *         aspect ratio.
     */
    boolean shouldUseSizeCompatMode() {
        if (inMultiWindowMode() || getWindowConfiguration().hasWindowDecorCaption()) {
            final ActivityRecord root = task != null ? task.getRootActivity() : null;
            if (root != null && root != this && !root.shouldUseSizeCompatMode()) {
                // If the root activity doesn't use size compatibility mode, the activities above
                // are forced to be the same for consistent visual appearance.
                return false;
            }
        }
        return !isResizeable() && (info.isFixedOrientation() || info.hasFixedAspectRatio())
                // The configuration of non-standard type should be enforced by system.
                && isActivityTypeStandard()
+27 −0
Original line number Diff line number Diff line
@@ -391,6 +391,33 @@ public class SizeCompatTests extends ActivityTestsBase {
        assertEquals(null, compatTokens.get(0));
    }

    @Test
    public void testShouldUseSizeCompatModeOnResizableTask() {
        setUpApp(new TestDisplayContent.Builder(mService, 1000, 2500).build());

        // Make the task root resizable.
        mActivity.info.resizeMode = ActivityInfo.RESIZE_MODE_RESIZEABLE;

        // Create a size compat activity on the same task.
        final ActivityRecord activity = new ActivityBuilder(mService)
                .setTask(mTask)
                .setResizeMode(ActivityInfo.RESIZE_MODE_UNRESIZEABLE)
                .setScreenOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
                .build();
        assertTrue(activity.shouldUseSizeCompatMode());

        // The non-resizable activity should not be size compat because it is on a resizable task
        // in multi-window mode.
        mStack.setWindowingMode(WindowConfiguration.WINDOWING_MODE_FREEFORM);
        assertFalse(activity.shouldUseSizeCompatMode());

        // The non-resizable activity should not be size compat because the display support
        // changing windowing mode from fullscreen to freeform.
        mStack.mDisplayContent.setDisplayWindowingMode(WindowConfiguration.WINDOWING_MODE_FREEFORM);
        mStack.setWindowingMode(WindowConfiguration.WINDOWING_MODE_FULLSCREEN);
        assertFalse(activity.shouldUseSizeCompatMode());
    }

    /**
     * Setup {@link #mActivity} as a size-compat-mode-able activity with fixed aspect and/or
     * orientation.