diff options
4 files changed, 60 insertions, 16 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index f8e8ca477496..2332000cc571 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -3174,14 +3174,23 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return getWindowConfiguration().canReceiveKeys() && !mWaitForEnteringPinnedMode; } - boolean isResizeable() { - return isResizeable(/* checkPictureInPictureSupport */ true); + /** + * Returns {@code true} if the fixed orientation, aspect ratio, resizability of this activity + * will be ignored. + */ + boolean isUniversalResizeable() { + return mWmService.mConstants.mIgnoreActivityOrientationRequest + && info.applicationInfo.category != ApplicationInfo.CATEGORY_GAME + // If the user preference respects aspect ratio, then it becomes non-resizable. + && !mAppCompatController.getAppCompatOverrides().getAppCompatAspectRatioOverrides() + .shouldApplyUserMinAspectRatioOverride(); } - boolean isResizeable(boolean checkPictureInPictureSupport) { + boolean isResizeable() { return mAtmService.mForceResizableActivities || ActivityInfo.isResizeableMode(info.resizeMode) - || (info.supportsPictureInPicture() && checkPictureInPictureSupport) + || info.supportsPictureInPicture() + || isUniversalResizeable() // If the activity can be embedded, it should inherit the bounds of task fragment. || isEmbedded(); } @@ -8165,11 +8174,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A @Override @ActivityInfo.ScreenOrientation protected int getOverrideOrientation() { - final int candidateOrientation; - if (!mWmService.mConstants.mIgnoreActivityOrientationRequest - || info.applicationInfo.category == ApplicationInfo.CATEGORY_GAME) { - candidateOrientation = super.getOverrideOrientation(); - } else { + int candidateOrientation = super.getOverrideOrientation(); + if (isUniversalResizeable() && ActivityInfo.isFixedOrientation(candidateOrientation)) { candidateOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; } return mAppCompatController.getOrientationPolicy() diff --git a/services/core/java/com/android/server/wm/AppCompatAspectRatioPolicy.java b/services/core/java/com/android/server/wm/AppCompatAspectRatioPolicy.java index 51ef87dcab1b..6946b6a71fab 100644 --- a/services/core/java/com/android/server/wm/AppCompatAspectRatioPolicy.java +++ b/services/core/java/com/android/server/wm/AppCompatAspectRatioPolicy.java @@ -114,9 +114,6 @@ class AppCompatAspectRatioPolicy { return mTransparentPolicy.getInheritedMinAspectRatio(); } final ActivityInfo info = mActivityRecord.info; - if (info.applicationInfo == null) { - return info.getMinAspectRatio(); - } final AppCompatAspectRatioOverrides aspectRatioOverrides = mAppCompatOverrides.getAppCompatAspectRatioOverrides(); if (aspectRatioOverrides.shouldApplyUserMinAspectRatioOverride()) { @@ -128,6 +125,9 @@ class AppCompatAspectRatioPolicy { mActivityRecord); if (!aspectRatioOverrides.shouldOverrideMinAspectRatio() && !shouldOverrideMinAspectRatioForCamera) { + if (mActivityRecord.isUniversalResizeable()) { + return 0; + } return info.getMinAspectRatio(); } @@ -170,6 +170,9 @@ class AppCompatAspectRatioPolicy { if (mTransparentPolicy.isRunning()) { return mTransparentPolicy.getInheritedMaxAspectRatio(); } + if (mActivityRecord.isUniversalResizeable()) { + return 0; + } return mActivityRecord.info.getMaxAspectRatio(); } diff --git a/services/core/java/com/android/server/wm/DesktopAppCompatAspectRatioPolicy.java b/services/core/java/com/android/server/wm/DesktopAppCompatAspectRatioPolicy.java index 192469183a54..6e6f76aaa48c 100644 --- a/services/core/java/com/android/server/wm/DesktopAppCompatAspectRatioPolicy.java +++ b/services/core/java/com/android/server/wm/DesktopAppCompatAspectRatioPolicy.java @@ -188,10 +188,6 @@ public class DesktopAppCompatAspectRatioPolicy { } final ActivityInfo info = mActivityRecord.info; - if (info.applicationInfo == null) { - return info.getMinAspectRatio(); - } - final AppCompatAspectRatioOverrides aspectRatioOverrides = mAppCompatOverrides.getAppCompatAspectRatioOverrides(); if (shouldApplyUserMinAspectRatioOverride(task)) { @@ -203,6 +199,9 @@ public class DesktopAppCompatAspectRatioPolicy { && dc.mAppCompatCameraPolicy.shouldOverrideMinAspectRatioForCamera(mActivityRecord); if (!aspectRatioOverrides.shouldOverrideMinAspectRatio() && !shouldOverrideMinAspectRatioForCamera) { + if (mActivityRecord.isUniversalResizeable()) { + return 0; + } return info.getMinAspectRatio(); } @@ -246,6 +245,9 @@ public class DesktopAppCompatAspectRatioPolicy { if (mTransparentPolicy.isRunning()) { return mTransparentPolicy.getInheritedMaxAspectRatio(); } + if (mActivityRecord.isUniversalResizeable()) { + return 0; + } return mActivityRecord.info.getMaxAspectRatio(); } diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java index 8fa4667c3b24..adc969c40e35 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -4849,6 +4849,39 @@ public class SizeCompatTests extends WindowTestsBase { } @Test + public void testUniversalResizeable() { + mWm.mConstants.mIgnoreActivityOrientationRequest = true; + setUpApp(mDisplayContent); + final float maxAspect = 1.8f; + final float minAspect = 1.5f; + prepareLimitedBounds(mActivity, maxAspect, minAspect, + ActivityInfo.SCREEN_ORIENTATION_LOCKED, true /* isUnresizable */); + + assertTrue(mActivity.isUniversalResizeable()); + assertTrue(mActivity.isResizeable()); + assertFalse(mActivity.shouldCreateAppCompatDisplayInsets()); + assertEquals(SCREEN_ORIENTATION_UNSPECIFIED, mActivity.getOverrideOrientation()); + assertEquals(mActivity.getTask().getBounds(), mActivity.getBounds()); + final AppCompatAspectRatioPolicy aspectRatioPolicy = mActivity.mAppCompatController + .getAppCompatAspectRatioPolicy(); + assertEquals(0, aspectRatioPolicy.getMaxAspectRatio(), 0 /* delta */); + assertEquals(0, aspectRatioPolicy.getMinAspectRatio(), 0 /* delta */); + + // Compat override can still take effect. + final AppCompatAspectRatioOverrides aspectRatioOverrides = + mActivity.mAppCompatController.getAppCompatAspectRatioOverrides(); + spyOn(aspectRatioOverrides); + doReturn(true).when(aspectRatioOverrides).shouldOverrideMinAspectRatio(); + assertEquals(minAspect, aspectRatioPolicy.getMinAspectRatio(), 0 /* delta */); + + // User override can still take effect. + doReturn(true).when(aspectRatioOverrides).shouldApplyUserMinAspectRatioOverride(); + assertFalse(mActivity.isResizeable()); + assertEquals(maxAspect, aspectRatioPolicy.getMaxAspectRatio(), 0 /* delta */); + assertNotEquals(SCREEN_ORIENTATION_UNSPECIFIED, mActivity.getOverrideOrientation()); + } + + @Test public void testClearSizeCompat_resetOverrideConfig() { final int origDensity = 480; final int newDensity = 520; |