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:
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user