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

Commit a8d94a19 authored by Riddle Hsu's avatar Riddle Hsu Committed by Android (Google) Code Review
Browse files

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

parents 750d5d68 0c1fb935
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.