Loading services/core/java/com/android/server/wm/DisplayContent.java +19 −7 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); Loading @@ -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; Loading services/core/java/com/android/server/wm/WindowManagerService.java +5 −3 Original line number Diff line number Diff line Loading @@ -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); Loading services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsTests.java +14 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 */); Loading @@ -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 Loading services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +18 −10 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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(); } } /** Loading Loading @@ -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. Loading Loading
services/core/java/com/android/server/wm/DisplayContent.java +19 −7 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); Loading @@ -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; Loading
services/core/java/com/android/server/wm/WindowManagerService.java +5 −3 Original line number Diff line number Diff line Loading @@ -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); Loading
services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsTests.java +14 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 */); Loading @@ -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 Loading
services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +18 −10 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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(); } } /** Loading Loading @@ -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. Loading