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

Commit 2607caba 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
Merged-In: I2692845f8f624d1bdf0d944dfb350b4bc0983081
parent ab1c926d
Loading
Loading
Loading
Loading
+12 −13
Original line number Original line Diff line number Diff line
@@ -16,17 +16,17 @@


package com.android.server.wm;
package com.android.server.wm;


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


import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ORIENTATION;
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.annotation.Nullable;
import android.app.WindowConfiguration;
import android.content.ActivityInfoProto;
import android.content.ActivityInfoProto;
import android.view.Surface;
import android.view.Surface;


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


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


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


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


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


+76 −0
Original line number Original line 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();
    }
}