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

Commit d20c0fd3 authored by Oleg Blinnikov's avatar Oleg Blinnikov Committed by Android (Google) Code Review
Browse files

Merge "Virtual Display demo rotation" into main

parents 38af8f3c 059ce8f4
Loading
Loading
Loading
Loading
+21 −4
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
import static android.view.Display.TYPE_EXTERNAL;
import static android.view.Display.TYPE_OVERLAY;
import static android.view.Display.TYPE_VIRTUAL;
import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE;
import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_JUMPCUT;
import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_ROTATE;
@@ -1794,20 +1795,36 @@ public class DisplayRotation {
        }
    }

    @VisibleForTesting
    int getDemoUserRotationOverride() {
        return SystemProperties.getInt("persist.demo.userrotation", Surface.ROTATION_0);
    }

    @VisibleForTesting
    @NonNull
    String getDemoUserRotationPackage() {
        return SystemProperties.get("persist.demo.userrotation.package_name");
    }

    @Surface.Rotation
    private int getUserRotationOverride() {
        final int userRotationOverride = SystemProperties.getInt("persist.demo.userrotation",
                Surface.ROTATION_0);
        final int userRotationOverride = getDemoUserRotationOverride();
        if (userRotationOverride == Surface.ROTATION_0) {
            return userRotationOverride;
        }

        final var display = mDisplayContent.mDisplay;
        final var display = mDisplayContent.getDisplay();
        if (display.getType() == TYPE_EXTERNAL || display.getType() == TYPE_OVERLAY) {
            // TODO b/329442350 add chromecast virtual displays here
            return userRotationOverride;
        }

        if (display.getType() == TYPE_VIRTUAL) {
            final var packageName = getDemoUserRotationPackage();
            if (!packageName.isEmpty() && packageName.equals(display.getOwnerPackageName())) {
                return userRotationOverride;
            }
        }

        return Surface.ROTATION_0;
    }

+76 −0
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.eq;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.reset;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.same;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.times;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
@@ -66,6 +67,7 @@ import android.os.PowerManagerInternal;
import android.os.SystemClock;
import android.platform.test.annotations.Presubmit;
import android.provider.Settings;
import android.view.Display;
import android.view.DisplayAddress;
import android.view.IRotationWatcher;
import android.view.Surface;
@@ -216,6 +218,79 @@ public class DisplayRotationTests {
                WindowManagerPolicy.USER_ROTATION_LOCKED, Surface.ROTATION_180);
    }

    @Test
    public void testUserRotationSystemProperty_NonDefault_InternalDisplay() throws Exception {
        mBuilder.setIsDefaultDisplay(false).build();
        when(mMockDisplayContent.getDisplay().getType()).thenReturn(Display.TYPE_INTERNAL);
        spyOn(mTarget);
        when(mTarget.getDemoUserRotationOverride()).thenReturn(Surface.ROTATION_90);

        mTarget.restoreSettings(WindowManagerPolicy.USER_ROTATION_FREE, Surface.ROTATION_270,
                /*fixedToUserRotation=*/ 0);

        assertEquals(Surface.ROTATION_270, mTarget.getUserRotation());
        assertEquals(WindowManagerPolicy.USER_ROTATION_FREE, mTarget.getUserRotationMode());
        assertEquals(0, mTarget.getFixedToUserRotationMode());
    }

    @Test
    public void testUserRotationSystemProperty_NonDefault_ExternalDisplay() throws Exception {
        mBuilder.setIsDefaultDisplay(false).build();
        when(mMockDisplayContent.getDisplay().getType()).thenReturn(Display.TYPE_EXTERNAL);
        spyOn(mTarget);
        when(mTarget.getDemoUserRotationOverride()).thenReturn(Surface.ROTATION_90);

        mTarget.restoreSettings(WindowManagerPolicy.USER_ROTATION_FREE, Surface.ROTATION_270,
                /*fixedToUserRotation=*/ 0);

        assertEquals(WindowManagerPolicy.USER_ROTATION_LOCKED, mTarget.getUserRotationMode());
        assertEquals(Surface.ROTATION_90, mTarget.getUserRotation());
        assertEquals(0, mTarget.getFixedToUserRotationMode());
    }

    @Test
    public void testUserRotationSystemProperty_NonDefault_OverlayDisplay() throws Exception {
        mBuilder.setIsDefaultDisplay(false).build();
        when(mMockDisplayContent.getDisplay().getType()).thenReturn(Display.TYPE_OVERLAY);
        spyOn(mTarget);
        when(mTarget.getDemoUserRotationOverride()).thenReturn(Surface.ROTATION_90);

        mTarget.restoreSettings(WindowManagerPolicy.USER_ROTATION_FREE, Surface.ROTATION_270,
                /*fixedToUserRotation=*/ 0);

        assertEquals(WindowManagerPolicy.USER_ROTATION_LOCKED, mTarget.getUserRotationMode());
        assertEquals(Surface.ROTATION_90, mTarget.getUserRotation());
        assertEquals(0, mTarget.getFixedToUserRotationMode());
    }

    @Test
    public void testUserRotationSystemProperty_NonDefault_VirtualDisplay() throws Exception {
        mBuilder.setIsDefaultDisplay(false).build();
        when(mMockDisplayContent.getDisplay().getType()).thenReturn(Display.TYPE_VIRTUAL);
        final var packageName = "abc";
        when(mMockDisplayContent.getDisplay().getOwnerPackageName()).thenReturn(packageName);
        spyOn(mTarget);
        when(mTarget.getDemoUserRotationOverride()).thenReturn(Surface.ROTATION_90);

        // Without package name
        when(mTarget.getDemoUserRotationPackage()).thenReturn("");
        mTarget.restoreSettings(WindowManagerPolicy.USER_ROTATION_FREE, Surface.ROTATION_270,
                /*fixedToUserRotation=*/ 0);

        assertEquals(WindowManagerPolicy.USER_ROTATION_FREE, mTarget.getUserRotationMode());
        assertEquals(Surface.ROTATION_270, mTarget.getUserRotation());
        assertEquals(0, mTarget.getFixedToUserRotationMode());

        // Use package name
        when(mTarget.getDemoUserRotationPackage()).thenReturn(packageName);
        mTarget.restoreSettings(WindowManagerPolicy.USER_ROTATION_FREE, Surface.ROTATION_270,
                /*fixedToUserRotation=*/ 0);

        assertEquals(WindowManagerPolicy.USER_ROTATION_LOCKED, mTarget.getUserRotation());
        assertEquals(Surface.ROTATION_90, mTarget.getUserRotationMode());
        assertEquals(0, mTarget.getFixedToUserRotationMode());
    }

    @Test
    public void testPersistUserRotation_UnlockRotation_DefaultDisplay() throws Exception {
        mBuilder.build();
@@ -1450,6 +1525,7 @@ public class DisplayRotationTests {
            mMockContext = mock(Context.class);

            mMockDisplayContent = mock(DisplayContent.class);
            when(mMockDisplayContent.getDisplay()).thenReturn(mock(Display.class));
            mMockDisplayContent.isDefaultDisplay = mIsDefaultDisplay;
            when(mMockDisplayContent.calculateDisplayCutoutForRotation(anyInt()))
                    .thenReturn(NO_CUTOUT);