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

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/22728988

Change-Id: I35895f8b4f27eb22017edb20661873a7a7a7f302
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Riddle Hsu
2023-04-24 08:54:57 +00:00
committed by Automerger Merge Worker
4 changed files with 56 additions and 26 deletions

View File

@@ -2267,6 +2267,12 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
if (cutout == null || cutout == DisplayCutout.NO_CUTOUT) { if (cutout == null || cutout == DisplayCutout.NO_CUTOUT) {
return WmDisplayCutout.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) { if (rotation == ROTATION_0) {
return WmDisplayCutout.computeSafeInsets( return WmDisplayCutout.computeSafeInsets(
cutout, displayWidth, displayHeight); cutout, displayWidth, displayHeight);
@@ -3087,13 +3093,9 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
mIsSizeForced = mInitialDisplayWidth != width || mInitialDisplayHeight != height; mIsSizeForced = mInitialDisplayWidth != width || mInitialDisplayHeight != height;
if (mIsSizeForced) { if (mIsSizeForced) {
// Set some sort of reasonable bounds on the size of the display that we will try final Point size = getValidForcedSize(width, height);
// to emulate. width = size.x;
final int minSize = 200; height = size.y;
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);
} }
Slog.i(TAG_WM, "Using new display size: " + width + "x" + height); 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); 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) { DisplayCutout loadDisplayCutout(int displayWidth, int displayHeight) {
if (mDisplayPolicy == null || mInitialDisplayCutout == null) { if (mDisplayPolicy == null || mInitialDisplayCutout == null) {
return null; return null;

View File

@@ -5780,10 +5780,12 @@ public class WindowManagerService extends IWindowManager.Stub
if (sizeStr != null && sizeStr.length() > 0) { if (sizeStr != null && sizeStr.length() > 0) {
final int pos = sizeStr.indexOf(','); final int pos = sizeStr.indexOf(',');
if (pos > 0 && sizeStr.lastIndexOf(',') == pos) { if (pos > 0 && sizeStr.lastIndexOf(',') == pos) {
int width, height;
try { try {
width = Integer.parseInt(sizeStr.substring(0, pos)); final Point size = displayContent.getValidForcedSize(
height = Integer.parseInt(sizeStr.substring(pos + 1)); 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 if (displayContent.mBaseDisplayWidth != width
|| displayContent.mBaseDisplayHeight != height) { || displayContent.mBaseDisplayHeight != height) {
ProtoLog.i(WM_ERROR, "FORCED DISPLAY SIZE: %dx%d", width, height); ProtoLog.i(WM_ERROR, "FORCED DISPLAY SIZE: %dx%d", width, height);

View File

@@ -41,8 +41,9 @@ import static org.mockito.Matchers.eq;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.app.WindowConfiguration; import android.app.WindowConfiguration;
import android.content.res.Configuration; import android.content.ContentResolver;
import android.platform.test.annotations.Presubmit; import android.platform.test.annotations.Presubmit;
import android.provider.Settings;
import android.view.Display; import android.view.Display;
import android.view.DisplayInfo; import android.view.DisplayInfo;
import android.view.Surface; import android.view.Surface;
@@ -439,6 +440,7 @@ public class DisplayWindowSettingsTests extends WindowTestsBase {
public void testDisplayWindowSettingsAppliedOnDisplayReady() { public void testDisplayWindowSettingsAppliedOnDisplayReady() {
// Set forced densities for two displays in DisplayWindowSettings // Set forced densities for two displays in DisplayWindowSettings
final DisplayContent dc = createMockSimulatedDisplay(); final DisplayContent dc = createMockSimulatedDisplay();
final ContentResolver contentResolver = useFakeSettingsProvider();
mDisplayWindowSettings.setForcedDensity(mPrimaryDisplay.getDisplayInfo(), 123, mDisplayWindowSettings.setForcedDensity(mPrimaryDisplay.getDisplayInfo(), 123,
0 /* userId */); 0 /* userId */);
mDisplayWindowSettings.setForcedDensity(dc.getDisplayInfo(), 456, 0 /* userId */); mDisplayWindowSettings.setForcedDensity(dc.getDisplayInfo(), 456, 0 /* userId */);
@@ -450,15 +452,21 @@ public class DisplayWindowSettingsTests extends WindowTestsBase {
assertFalse(mPrimaryDisplay.mWaitingForConfig); assertFalse(mPrimaryDisplay.mWaitingForConfig);
assertFalse(dc.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. // Notify WM that the displays are ready and check that they are reconfigured.
mWm.displayReady(); mWm.displayReady();
waitUntilHandlersIdle(); waitUntilHandlersIdle();
final Configuration config = new Configuration(); // Density is set successfully.
mPrimaryDisplay.computeScreenConfiguration(config); assertEquals(123, mPrimaryDisplay.getConfiguration().densityDpi);
assertEquals(123, config.densityDpi); assertEquals(456, dc.getConfiguration().densityDpi);
dc.computeScreenConfiguration(config); // Invalid size won't be applied.
assertEquals(456, config.densityDpi); assertNotEquals(invalidW, mPrimaryDisplay.mBaseDisplayWidth);
assertNotEquals(invalidH, mPrimaryDisplay.mBaseDisplayHeight);
} }
@Test @Test

View File

@@ -66,6 +66,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.app.ActivityOptions; import android.app.ActivityOptions;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo;
@@ -81,6 +82,7 @@ import android.os.Handler;
import android.os.IBinder; import android.os.IBinder;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.UserHandle; import android.os.UserHandle;
import android.provider.Settings;
import android.service.voice.IVoiceInteractionSession; import android.service.voice.IVoiceInteractionSession;
import android.util.SparseArray; import android.util.SparseArray;
import android.view.Display; import android.view.Display;
@@ -109,6 +111,7 @@ import android.window.TransitionRequestInfo;
import com.android.internal.policy.AttributeCache; import com.android.internal.policy.AttributeCache;
import com.android.internal.util.ArrayUtils; import com.android.internal.util.ArrayUtils;
import com.android.internal.util.test.FakeSettingsProvider;
import com.android.server.wm.DisplayWindowSettings.SettingsProvider.SettingsEntry; import com.android.server.wm.DisplayWindowSettings.SettingsProvider.SettingsEntry;
import org.junit.After; import org.junit.After;
@@ -146,6 +149,7 @@ class WindowTestsBase extends SystemServiceTestsBase {
WindowManagerService mWm; WindowManagerService mWm;
private final IWindow mIWindow = new TestIWindow(); private final IWindow mIWindow = new TestIWindow();
private Session mMockSession; private Session mMockSession;
private boolean mUseFakeSettingsProvider;
DisplayInfo mDisplayInfo = new DisplayInfo(); DisplayInfo mDisplayInfo = new DisplayInfo();
DisplayContent mDefaultDisplay; DisplayContent mDefaultDisplay;
@@ -272,16 +276,9 @@ class WindowTestsBase extends SystemServiceTestsBase {
@After @After
public void tearDown() throws Exception { public void tearDown() throws Exception {
// Revert back to device overrides. if (mUseFakeSettingsProvider) {
mAtm.mWindowManager.mLetterboxConfiguration.resetFixedOrientationLetterboxAspectRatio(); FakeSettingsProvider.clearSettingsProvider();
mAtm.mWindowManager.mLetterboxConfiguration.resetLetterboxHorizontalPositionMultiplier(); }
mAtm.mWindowManager.mLetterboxConfiguration.resetLetterboxVerticalPositionMultiplier();
mAtm.mWindowManager.mLetterboxConfiguration.resetIsHorizontalReachabilityEnabled();
mAtm.mWindowManager.mLetterboxConfiguration.resetIsVerticalReachabilityEnabled();
mAtm.mWindowManager.mLetterboxConfiguration
.resetIsSplitScreenAspectRatioForUnresizableAppsEnabled();
mAtm.mWindowManager.mLetterboxConfiguration
.resetIsDisplayAspectRatioEnabledForFixedOrientationLetterbox();
} }
/** /**
@@ -428,6 +425,17 @@ class WindowTestsBase extends SystemServiceTestsBase {
// Called before display is created. // 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) { private WindowState createCommonWindow(WindowState parent, int type, String name) {
final WindowState win = createWindow(parent, type, name); final WindowState win = createWindow(parent, type, name);
// Prevent common windows from been IME targets. // Prevent common windows from been IME targets.