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

Commit dd0f6850 authored by Massimo Carli's avatar Massimo Carli
Browse files

Fix letterbox for SCREEN_ORIENTATION_BEHIND

At the moment, an activity with "behind" doesn’t go in
letterbox as expected when it’s at the top of a portrait-only
one which was letterboxed in landscape device orientation.

An activity with "behind" orientation will be letterboxed if it is
the activity that's immediately beneath it

Test: Launch an activity using SCREEN_ORIENTATION_BEHIND on top
of a fixed orientation activity and check it's letterboxed. Also run
`atest ActivityRecordTests`

Fix: 244309481

Change-Id: I221e4c2a778a4e2ea11795e82366bf5bb08a5507
parent d51a509c
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -7634,6 +7634,31 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
        ensureActivityConfiguration(0 /* globalChanges */, false /* preserveWindow */);
    }

    /**
     * Returns the requested {@link Configuration.Orientation} for the current activity.
     *
     * <p>When The current orientation is set to {@link SCREEN_ORIENTATION_BEHIND} it returns the
     * requested orientation for the activity below which is the first activity with an explicit
     * (different from {@link SCREEN_ORIENTATION_UNSET}) orientation which is not {@link
     * SCREEN_ORIENTATION_BEHIND}.
     */
    @Configuration.Orientation
    @Override
    int getRequestedConfigurationOrientation(boolean forDisplay) {
        if (mOrientation == SCREEN_ORIENTATION_BEHIND && task != null) {
            // We use Task here because we want to be consistent with what happens in
            // multi-window mode where other tasks orientations are ignored.
            final ActivityRecord belowCandidate = task.getActivity(
                    a -> a.mOrientation != SCREEN_ORIENTATION_UNSET && !a.finishing
                            && a.mOrientation != ActivityInfo.SCREEN_ORIENTATION_BEHIND, this,
                    false /* includeBoundary */, true /* traverseTopToBottom */);
            if (belowCandidate != null) {
                return belowCandidate.getRequestedConfigurationOrientation(forDisplay);
            }
        }
        return super.getRequestedConfigurationOrientation(forDisplay);
    }

    @Override
    void onCancelFixedRotationTransform(int originalDisplayRotation) {
        if (this != mDisplayContent.getLastOrientationSource()) {
+16 −0
Original line number Diff line number Diff line
@@ -2319,6 +2319,22 @@ public class ActivityRecordTests extends WindowTestsBase {
        assertTrue(activity1.getTask().getTaskInfo().launchCookies.contains(launchCookie));
    }

    @Test
    public void testOrientationForScreenOrientationBehind() {
        final Task task = createTask(mDisplayContent);
        // Activity below
        new ActivityBuilder(mAtm)
                .setTask(task)
                .setScreenOrientation(SCREEN_ORIENTATION_PORTRAIT)
                .build();
        final ActivityRecord activityTop = new ActivityBuilder(mAtm)
                .setTask(task)
                .setScreenOrientation(SCREEN_ORIENTATION_BEHIND)
                .build();
        final int topOrientation = activityTop.getRequestedConfigurationOrientation();
        assertEquals(SCREEN_ORIENTATION_PORTRAIT, topOrientation);
    }

    private void verifyProcessInfoUpdate(ActivityRecord activity, State state,
            boolean shouldUpdate, boolean activityChange) {
        reset(activity.app);