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

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

Fix restore orientation for nosensor in folded state

We should save and restore the user rotation only if the
current user rotation mode is USER_ROTATION_LOCKED

Fix: 289023967
Test: tested locally
Test: atest WmTests:DisplayRotationReversionControllerTests
Test: atest WmTests:DisplayRotationCompatPolicyTests
Test: atest WmTests:DisplayContentTests

Change-Id: I2692845f8f624d1bdf0d944dfb350b4bc0983081
parent 86a91b19
Loading
Loading
Loading
Loading
+13 −14
Original line number Diff line number Diff line
@@ -16,17 +16,17 @@

package com.android.server.wm;

import static android.app.WindowConfiguration.ROTATION_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;

import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ORIENTATION;
import static com.android.server.policy.WindowManagerPolicy.USER_ROTATION_LOCKED;

import android.annotation.Nullable;
import android.app.WindowConfiguration;
import android.content.ActivityInfoProto;
import android.view.Surface;

import com.android.internal.protolog.common.ProtoLog;
import com.android.server.policy.WindowManagerPolicy;

/**
 * Defines the behavior of reversion from device rotation overrides.
@@ -51,9 +51,7 @@ final class DisplayRotationReversionController {
    private static final int NUM_SLOTS = 3;

    @Surface.Rotation
    private int mUserRotationOverridden = WindowConfiguration.ROTATION_UNDEFINED;
    @WindowManagerPolicy.UserRotationMode
    private int mUserRotationModeOverridden;
    private int mUserRotationOverridden = ROTATION_UNDEFINED;

    private final boolean[] mSlots = new boolean[NUM_SLOTS];
    private final DisplayContent mDisplayContent;
@@ -115,11 +113,12 @@ final class DisplayRotationReversionController {
            return false;
        }
        // Only override if the rotation is frozen and there are no other active slots.
        if (mDisplayContent.getDisplayRotation().isRotationFrozen()) {
            mDisplayContent.getDisplayRotation().setUserRotation(
                    mUserRotationModeOverridden,
                    mUserRotationOverridden,
        final DisplayRotation displayRotation = mDisplayContent.getDisplayRotation();
        if (mUserRotationOverridden != ROTATION_UNDEFINED
                && displayRotation.getUserRotationMode() == USER_ROTATION_LOCKED) {
            displayRotation.setUserRotation(USER_ROTATION_LOCKED, mUserRotationOverridden,
                /* caller= */ "DisplayRotationReversionController#revertOverride");
            mUserRotationOverridden = ROTATION_UNDEFINED;
            return true;
        } else {
            return false;
@@ -127,10 +126,10 @@ final class DisplayRotationReversionController {
    }

    private void maybeSaveUserRotation() {
        if (!isAnyOverrideActive()) {
            mUserRotationModeOverridden =
                    mDisplayContent.getDisplayRotation().getUserRotationMode();
            mUserRotationOverridden = mDisplayContent.getDisplayRotation().getUserRotation();
        final DisplayRotation displayRotation = mDisplayContent.getDisplayRotation();
        if (!isAnyOverrideActive()
                && displayRotation.getUserRotationMode() == USER_ROTATION_LOCKED) {
            mUserRotationOverridden = displayRotation.getUserRotation();
        }
    }

+76 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.server.wm;

import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
import static com.android.server.policy.WindowManagerPolicy.USER_ROTATION_FREE;
import static com.android.server.policy.WindowManagerPolicy.USER_ROTATION_LOCKED;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;

import android.platform.test.annotations.Presubmit;

import androidx.test.filters.SmallTest;

import org.junit.Before;
import org.junit.Test;

/**
 * Test class for {@link DisplayRotationReversionController}.
 *
 * Build/Install/Run:
 *  atest WmTests:DisplayRotationReversionControllerTests
 */
@SmallTest
@Presubmit
public class DisplayRotationReversionControllerTests {

    private DisplayContent mDisplayContent;

    private DisplayRotationReversionController mDisplayRotationReversionController;

    @Before
    public void setUp() {
        mDisplayContent = mock(DisplayContent.class);
        mDisplayRotationReversionController = new DisplayRotationReversionController(
                mDisplayContent);
    }

    @Test
    public void beforeOverrideApplied_useDisplayRotationWhenUserRotationLocked() {
        final DisplayRotation displayRotation = mock(DisplayRotation.class);
        doReturn(displayRotation).when(mDisplayContent).getDisplayRotation();
        doReturn(USER_ROTATION_LOCKED).when(displayRotation).getUserRotationMode();

        mDisplayRotationReversionController.beforeOverrideApplied(0);

        verify(displayRotation).getUserRotation();
    }

    @Test
    public void beforeOverrideApplied_dontUseDisplayRotationWhenNotUserRotationLocked() {
        final DisplayRotation displayRotation = mock(DisplayRotation.class);
        doReturn(displayRotation).when(mDisplayContent).getDisplayRotation();
        doReturn(USER_ROTATION_FREE).when(displayRotation).getUserRotationMode();

        mDisplayRotationReversionController.beforeOverrideApplied(0);

        verify(displayRotation, never()).getUserRotation();
    }
}