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

Commit 012fc1cc authored by Riddle Hsu's avatar Riddle Hsu Committed by Automerger Merge Worker
Browse files

Merge "Validate forced display size from settings" into udc-dev am: a8d94a19

parents 01b2b78f a8d94a19
Loading
Loading
Loading
Loading
+19 −7
Original line number Diff line number Diff line
@@ -2267,6 +2267,12 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
        if (cutout == null || cutout == DisplayCutout.NO_CUTOUT) {
            return WmDisplayCutout.NO_CUTOUT;
        }
        if (displayWidth == displayHeight) {
            Slog.w(TAG, "Ignore cutout because display size is square: " + displayWidth);
            // Avoid UnsupportedOperationException because DisplayCutout#computeSafeInsets doesn't
            // support square size.
            return WmDisplayCutout.NO_CUTOUT;
        }
        if (rotation == ROTATION_0) {
            return WmDisplayCutout.computeSafeInsets(
                    cutout, displayWidth, displayHeight);
@@ -3087,13 +3093,9 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp

        mIsSizeForced = mInitialDisplayWidth != width || mInitialDisplayHeight != height;
        if (mIsSizeForced) {
            // Set some sort of reasonable bounds on the size of the display that we will try
            // to emulate.
            final int minSize = 200;
            final int maxScale = 3;
            final int maxSize = Math.max(mInitialDisplayWidth, mInitialDisplayHeight) * maxScale;
            width = Math.min(Math.max(width, minSize), maxSize);
            height = Math.min(Math.max(height, minSize), maxSize);
            final Point size = getValidForcedSize(width, height);
            width = size.x;
            height = size.y;
        }

        Slog.i(TAG_WM, "Using new display size: " + width + "x" + height);
@@ -3108,6 +3110,16 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
        mWmService.mDisplayWindowSettings.setForcedSize(this, width, height);
    }

    /** Returns a reasonable size for setting forced display size. */
    Point getValidForcedSize(int w, int h) {
        final int minSize = 200;
        final int maxScale = 3;
        final int maxSize = Math.max(mInitialDisplayWidth, mInitialDisplayHeight) * maxScale;
        w = Math.min(Math.max(w, minSize), maxSize);
        h = Math.min(Math.max(h, minSize), maxSize);
        return new Point(w, h);
    }

    DisplayCutout loadDisplayCutout(int displayWidth, int displayHeight) {
        if (mDisplayPolicy == null || mInitialDisplayCutout == null) {
            return null;
+5 −3
Original line number Diff line number Diff line
@@ -5780,10 +5780,12 @@ public class WindowManagerService extends IWindowManager.Stub
        if (sizeStr != null && sizeStr.length() > 0) {
            final int pos = sizeStr.indexOf(',');
            if (pos > 0 && sizeStr.lastIndexOf(',') == pos) {
                int width, height;
                try {
                    width = Integer.parseInt(sizeStr.substring(0, pos));
                    height = Integer.parseInt(sizeStr.substring(pos + 1));
                    final Point size = displayContent.getValidForcedSize(
                            Integer.parseInt(sizeStr.substring(0, pos)),
                            Integer.parseInt(sizeStr.substring(pos + 1)));
                    final int width = size.x;
                    final int height = size.y;
                    if (displayContent.mBaseDisplayWidth != width
                            || displayContent.mBaseDisplayHeight != height) {
                        ProtoLog.i(WM_ERROR, "FORCED DISPLAY SIZE: %dx%d", width, height);
+14 −6
Original line number Diff line number Diff line
@@ -41,8 +41,9 @@ import static org.mockito.Matchers.eq;

import android.annotation.NonNull;
import android.app.WindowConfiguration;
import android.content.res.Configuration;
import android.content.ContentResolver;
import android.platform.test.annotations.Presubmit;
import android.provider.Settings;
import android.view.Display;
import android.view.DisplayInfo;
import android.view.Surface;
@@ -439,6 +440,7 @@ public class DisplayWindowSettingsTests extends WindowTestsBase {
    public void testDisplayWindowSettingsAppliedOnDisplayReady() {
        // Set forced densities for two displays in DisplayWindowSettings
        final DisplayContent dc = createMockSimulatedDisplay();
        final ContentResolver contentResolver = useFakeSettingsProvider();
        mDisplayWindowSettings.setForcedDensity(mPrimaryDisplay.getDisplayInfo(), 123,
                0 /* userId */);
        mDisplayWindowSettings.setForcedDensity(dc.getDisplayInfo(), 456, 0 /* userId */);
@@ -450,15 +452,21 @@ public class DisplayWindowSettingsTests extends WindowTestsBase {
        assertFalse(mPrimaryDisplay.mWaitingForConfig);
        assertFalse(dc.mWaitingForConfig);

        final int invalidW = Integer.MAX_VALUE;
        final int invalidH = Integer.MAX_VALUE;
        // Verify that applyForcedPropertiesForDefaultDisplay() handles invalid size request.
        Settings.Global.putString(contentResolver, Settings.Global.DISPLAY_SIZE_FORCED,
                invalidW + "," + invalidH);
        // Notify WM that the displays are ready and check that they are reconfigured.
        mWm.displayReady();
        waitUntilHandlersIdle();

        final Configuration config = new Configuration();
        mPrimaryDisplay.computeScreenConfiguration(config);
        assertEquals(123, config.densityDpi);
        dc.computeScreenConfiguration(config);
        assertEquals(456, config.densityDpi);
        // Density is set successfully.
        assertEquals(123, mPrimaryDisplay.getConfiguration().densityDpi);
        assertEquals(456, dc.getConfiguration().densityDpi);
        // Invalid size won't be applied.
        assertNotEquals(invalidW, mPrimaryDisplay.mBaseDisplayWidth);
        assertNotEquals(invalidH, mPrimaryDisplay.mBaseDisplayHeight);
    }

    @Test
+18 −10
Original line number Diff line number Diff line
@@ -66,6 +66,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityOptions;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
@@ -81,6 +82,7 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.UserHandle;
import android.provider.Settings;
import android.service.voice.IVoiceInteractionSession;
import android.util.SparseArray;
import android.view.Display;
@@ -109,6 +111,7 @@ import android.window.TransitionRequestInfo;

import com.android.internal.policy.AttributeCache;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.test.FakeSettingsProvider;
import com.android.server.wm.DisplayWindowSettings.SettingsProvider.SettingsEntry;

import org.junit.After;
@@ -146,6 +149,7 @@ class WindowTestsBase extends SystemServiceTestsBase {
    WindowManagerService mWm;
    private final IWindow mIWindow = new TestIWindow();
    private Session mMockSession;
    private boolean mUseFakeSettingsProvider;

    DisplayInfo mDisplayInfo = new DisplayInfo();
    DisplayContent mDefaultDisplay;
@@ -272,16 +276,9 @@ class WindowTestsBase extends SystemServiceTestsBase {

    @After
    public void tearDown() throws Exception {
        // Revert back to device overrides.
        mAtm.mWindowManager.mLetterboxConfiguration.resetFixedOrientationLetterboxAspectRatio();
        mAtm.mWindowManager.mLetterboxConfiguration.resetLetterboxHorizontalPositionMultiplier();
        mAtm.mWindowManager.mLetterboxConfiguration.resetLetterboxVerticalPositionMultiplier();
        mAtm.mWindowManager.mLetterboxConfiguration.resetIsHorizontalReachabilityEnabled();
        mAtm.mWindowManager.mLetterboxConfiguration.resetIsVerticalReachabilityEnabled();
        mAtm.mWindowManager.mLetterboxConfiguration
                .resetIsSplitScreenAspectRatioForUnresizableAppsEnabled();
        mAtm.mWindowManager.mLetterboxConfiguration
                .resetIsDisplayAspectRatioEnabledForFixedOrientationLetterbox();
        if (mUseFakeSettingsProvider) {
            FakeSettingsProvider.clearSettingsProvider();
        }
    }

    /**
@@ -428,6 +425,17 @@ class WindowTestsBase extends SystemServiceTestsBase {
        // Called before display is created.
    }

    /** Avoid writing values to real Settings. */
    ContentResolver useFakeSettingsProvider() {
        mUseFakeSettingsProvider = true;
        FakeSettingsProvider.clearSettingsProvider();
        final FakeSettingsProvider provider = new FakeSettingsProvider();
        // SystemServicesTestRule#setUpSystemCore has called spyOn for the ContentResolver.
        final ContentResolver resolver = mContext.getContentResolver();
        doReturn(provider.getIContentProvider()).when(resolver).acquireProvider(Settings.AUTHORITY);
        return resolver;
    }

    private WindowState createCommonWindow(WindowState parent, int type, String name) {
        final WindowState win = createWindow(parent, type, name);
        // Prevent common windows from been IME targets.