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

Commit 4d4ab9fb authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Separate natural display orientation for configuration

The usages of getNaturalOrientation in DisplayRotationCompatPolicy
assumes that the orientation is based on the logical display size
without considering insets.

For example,
Logical display size 2076x2152=portrait

If the navigation bar occupies height 146.
Then the available size for app is 2076x2006=landscape

Fix: 323224894
Test: atest DisplayContentTests#testOrientationForAspectRatio

Change-Id: I31f0660fa15b756020f7e2f3f675e50a35b86869
parent a9d2c1f1
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -5159,6 +5159,15 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp

    /** @return the orientation of the display when it's rotation is ROTATION_0. */
    int getNaturalOrientation() {
        return mBaseDisplayWidth <= mBaseDisplayHeight
                ? ORIENTATION_PORTRAIT : ORIENTATION_LANDSCAPE;
    }

    /**
     * Returns the orientation which is used for app's Configuration (excluding decor insets) when
     * the display rotation is ROTATION_0.
     */
    int getNaturalConfigurationOrientation() {
        final Configuration config = getConfiguration();
        if (config.windowConfiguration.getDisplayRotation() == ROTATION_0) {
            return config.orientation;
+1 −1
Original line number Diff line number Diff line
@@ -1589,7 +1589,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
        if (requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_NOSENSOR) {
            // NOSENSOR means the display's "natural" orientation, so return that.
            if (mDisplayContent != null) {
                return mDisplayContent.getNaturalOrientation();
                return mDisplayContent.getNaturalConfigurationOrientation();
            }
        } else if (requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_LOCKED) {
            // LOCKED means the activity's orientation remains unchanged, so return existing value.
+7 −1
Original line number Diff line number Diff line
@@ -1003,7 +1003,13 @@ public class DisplayContentTests extends WindowTestsBase {
        dc.computeScreenConfiguration(config, ROTATION_0);
        dc.onRequestedOverrideConfigurationChanged(config);
        assertEquals(Configuration.ORIENTATION_LANDSCAPE, config.orientation);
        assertEquals(Configuration.ORIENTATION_LANDSCAPE, dc.getNaturalOrientation());
        assertEquals(Configuration.ORIENTATION_LANDSCAPE, dc.getNaturalConfigurationOrientation());
        window.setOverrideOrientation(SCREEN_ORIENTATION_NOSENSOR);
        assertEquals(Configuration.ORIENTATION_LANDSCAPE,
                window.getRequestedConfigurationOrientation());
        // Note that getNaturalOrientation is based on logical display size. So it is portrait if
        // the display width equals to height.
        assertEquals(Configuration.ORIENTATION_PORTRAIT, dc.getNaturalOrientation());
    }

    @Test