summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java26
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java8
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsTests.java20
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java28
4 files changed, 56 insertions, 26 deletions
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index f478e9bee18a..8bfa4269af1c 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -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;
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 8822193ab522..40b8274d4e51 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -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);
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsTests.java
index fb4f2ee77521..1cec0ef3d5cf 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsTests.java
@@ -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
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
index f85cdf0b5035..07244a4f2478 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
@@ -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.