diff options
| author | 2024-10-31 11:50:38 +0000 | |
|---|---|---|
| committer | 2024-10-31 11:50:38 +0000 | |
| commit | 7cda99e3d80c174c1a1eb640d7f925fec0481ab6 (patch) | |
| tree | 2a29f0919bd00a3403a11f71feb687ec46aaa154 | |
| parent | a1d05e9ee66e4c4c541fc5f8111d9b854bd54509 (diff) | |
| parent | 59302ac1943717bf6cbcf0b8faf992a1a59813dd (diff) | |
Merge "[2/n] API to ignore activity size restrictions on virtual display" into main
12 files changed, 273 insertions, 15 deletions
diff --git a/core/api/system-current.txt b/core/api/system-current.txt index c21d07752cbf..92785e3b260f 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -5286,11 +5286,13 @@ package android.hardware.display { public final class VirtualDisplayConfig implements android.os.Parcelable { method @FlaggedApi("android.companion.virtualdevice.flags.virtual_display_insets") @Nullable public android.view.DisplayCutout getDisplayCutout(); method @FlaggedApi("android.companion.virtual.flags.vdm_custom_home") public boolean isHomeSupported(); + method @FlaggedApi("com.android.window.flags.vdm_force_app_universal_resizable_api") public boolean isIgnoreActivitySizeRestrictions(); } public static final class VirtualDisplayConfig.Builder { method @FlaggedApi("android.companion.virtualdevice.flags.virtual_display_insets") @NonNull public android.hardware.display.VirtualDisplayConfig.Builder setDisplayCutout(@Nullable android.view.DisplayCutout); method @FlaggedApi("android.companion.virtual.flags.vdm_custom_home") @NonNull public android.hardware.display.VirtualDisplayConfig.Builder setHomeSupported(boolean); + method @FlaggedApi("com.android.window.flags.vdm_force_app_universal_resizable_api") @NonNull public android.hardware.display.VirtualDisplayConfig.Builder setIgnoreActivitySizeRestrictions(boolean); } } diff --git a/core/java/android/hardware/display/VirtualDisplayConfig.java b/core/java/android/hardware/display/VirtualDisplayConfig.java index b0994e6145ef..49944c76eb99 100644 --- a/core/java/android/hardware/display/VirtualDisplayConfig.java +++ b/core/java/android/hardware/display/VirtualDisplayConfig.java @@ -60,6 +60,7 @@ public final class VirtualDisplayConfig implements Parcelable { private final float mRequestedRefreshRate; private final boolean mIsHomeSupported; private final DisplayCutout mDisplayCutout; + private final boolean mIgnoreActivitySizeRestrictions; private VirtualDisplayConfig( @NonNull String name, @@ -74,7 +75,8 @@ public final class VirtualDisplayConfig implements Parcelable { @NonNull ArraySet<String> displayCategories, float requestedRefreshRate, boolean isHomeSupported, - @Nullable DisplayCutout displayCutout) { + @Nullable DisplayCutout displayCutout, + boolean ignoreActivitySizeRestrictions) { mName = name; mWidth = width; mHeight = height; @@ -88,6 +90,7 @@ public final class VirtualDisplayConfig implements Parcelable { mRequestedRefreshRate = requestedRefreshRate; mIsHomeSupported = isHomeSupported; mDisplayCutout = displayCutout; + mIgnoreActivitySizeRestrictions = ignoreActivitySizeRestrictions; } /** @@ -193,6 +196,20 @@ public final class VirtualDisplayConfig implements Parcelable { } /** + * Whether this virtual display ignores fixed orientation, aspect ratio and resizability + * of apps. + * + * @see Builder#setIgnoreActivitySizeRestrictions(boolean) + * @hide + */ + @FlaggedApi(com.android.window.flags.Flags.FLAG_VDM_FORCE_APP_UNIVERSAL_RESIZABLE_API) + @SystemApi + public boolean isIgnoreActivitySizeRestrictions() { + return mIgnoreActivitySizeRestrictions + && com.android.window.flags.Flags.vdmForceAppUniversalResizableApi(); + } + + /** * Returns the display categories. * * @see Builder#setDisplayCategories @@ -227,6 +244,7 @@ public final class VirtualDisplayConfig implements Parcelable { dest.writeFloat(mRequestedRefreshRate); dest.writeBoolean(mIsHomeSupported); DisplayCutout.ParcelableWrapper.writeCutoutToParcel(mDisplayCutout, dest, flags); + dest.writeBoolean(mIgnoreActivitySizeRestrictions); } @Override @@ -253,6 +271,7 @@ public final class VirtualDisplayConfig implements Parcelable { && Objects.equals(mDisplayCategories, that.mDisplayCategories) && mRequestedRefreshRate == that.mRequestedRefreshRate && mIsHomeSupported == that.mIsHomeSupported + && mIgnoreActivitySizeRestrictions == that.mIgnoreActivitySizeRestrictions && Objects.equals(mDisplayCutout, that.mDisplayCutout); } @@ -261,7 +280,8 @@ public final class VirtualDisplayConfig implements Parcelable { int hashCode = Objects.hash( mName, mWidth, mHeight, mDensityDpi, mFlags, mSurface, mUniqueId, mDisplayIdToMirror, mWindowManagerMirroringEnabled, mDisplayCategories, - mRequestedRefreshRate, mIsHomeSupported, mDisplayCutout); + mRequestedRefreshRate, mIsHomeSupported, mDisplayCutout, + mIgnoreActivitySizeRestrictions); return hashCode; } @@ -282,6 +302,7 @@ public final class VirtualDisplayConfig implements Parcelable { + " mRequestedRefreshRate=" + mRequestedRefreshRate + " mIsHomeSupported=" + mIsHomeSupported + " mDisplayCutout=" + mDisplayCutout + + " mIgnoreActivitySizeRestrictions=" + mIgnoreActivitySizeRestrictions + ")"; } @@ -299,6 +320,7 @@ public final class VirtualDisplayConfig implements Parcelable { mRequestedRefreshRate = in.readFloat(); mIsHomeSupported = in.readBoolean(); mDisplayCutout = DisplayCutout.ParcelableWrapper.readCutoutFromParcel(in); + mIgnoreActivitySizeRestrictions = in.readBoolean(); } @NonNull @@ -332,6 +354,7 @@ public final class VirtualDisplayConfig implements Parcelable { private float mRequestedRefreshRate = 0.0f; private boolean mIsHomeSupported = false; private DisplayCutout mDisplayCutout = null; + private boolean mIgnoreActivitySizeRestrictions = false; /** * Creates a new Builder. @@ -506,6 +529,24 @@ public final class VirtualDisplayConfig implements Parcelable { } /** + * Sets whether this display ignores fixed orientation, aspect ratio and resizability + * of apps. + * + * <p>Note: setting to {@code true} requires the display to have + * {@link DisplayManager#VIRTUAL_DISPLAY_FLAG_TRUSTED}. If this is false, this property + * is ignored.</p> + * + * @hide + */ + @FlaggedApi(com.android.window.flags.Flags.FLAG_VDM_FORCE_APP_UNIVERSAL_RESIZABLE_API) + @SystemApi + @NonNull + public Builder setIgnoreActivitySizeRestrictions(boolean enabled) { + mIgnoreActivitySizeRestrictions = enabled; + return this; + } + + /** * Builds the {@link VirtualDisplayConfig} instance. */ @NonNull @@ -523,7 +564,8 @@ public final class VirtualDisplayConfig implements Parcelable { mDisplayCategories, mRequestedRefreshRate, mIsHomeSupported, - mDisplayCutout); + mDisplayCutout, + mIgnoreActivitySizeRestrictions); } } } diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 3603cdbd775f..f39fbfbc8a05 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -1889,6 +1889,7 @@ public final class DisplayManagerService extends SystemService { final String displayUniqueId = VirtualDisplayAdapter.generateDisplayUniqueId( packageName, callingUid, virtualDisplayConfig); + boolean shouldClearDisplayWindowSettings = false; if (virtualDisplayConfig.isHomeSupported()) { if ((flags & VIRTUAL_DISPLAY_FLAG_TRUSTED) == 0) { Slog.w(TAG, "Display created with home support but lacks " @@ -1900,6 +1901,18 @@ public final class DisplayManagerService extends SystemService { } else { mWindowManagerInternal.setHomeSupportedOnDisplay(displayUniqueId, Display.TYPE_VIRTUAL, true); + shouldClearDisplayWindowSettings = true; + } + } + + if (virtualDisplayConfig.isIgnoreActivitySizeRestrictions()) { + if ((flags & VIRTUAL_DISPLAY_FLAG_TRUSTED) == 0) { + Slog.w(TAG, "Display created to ignore activity size restrictions, " + + "but lacks VIRTUAL_DISPLAY_FLAG_TRUSTED, ignoring the request."); + } else { + mWindowManagerInternal.setIgnoreActivitySizeRestrictionsOnDisplay( + displayUniqueId, Display.TYPE_VIRTUAL, true); + shouldClearDisplayWindowSettings = true; } } @@ -1922,8 +1935,7 @@ public final class DisplayManagerService extends SystemService { } } - if (displayId == Display.INVALID_DISPLAY && virtualDisplayConfig.isHomeSupported() - && (flags & VIRTUAL_DISPLAY_FLAG_TRUSTED) != 0) { + if (displayId == Display.INVALID_DISPLAY && shouldClearDisplayWindowSettings) { // Failed to create the virtual display, so we should clean up the WM settings // because it won't receive the onDisplayRemoved callback. mWindowManagerInternal.clearDisplaySettings(displayUniqueId, Display.TYPE_VIRTUAL); diff --git a/services/core/java/com/android/server/wm/AppCompatAspectRatioOverrides.java b/services/core/java/com/android/server/wm/AppCompatAspectRatioOverrides.java index f1dd41e7d74a..90c0866d7dff 100644 --- a/services/core/java/com/android/server/wm/AppCompatAspectRatioOverrides.java +++ b/services/core/java/com/android/server/wm/AppCompatAspectRatioOverrides.java @@ -37,6 +37,7 @@ import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLAS import static com.android.server.wm.AppCompatConfiguration.LETTERBOX_POSITION_MULTIPLIER_CENTER; import static com.android.server.wm.AppCompatConfiguration.MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO; import static com.android.server.wm.AppCompatUtils.isChangeEnabled; +import static com.android.server.wm.AppCompatUtils.isDisplayIgnoreActivitySizeRestrictions; import android.annotation.NonNull; import android.content.pm.IPackageManager; @@ -175,8 +176,17 @@ class AppCompatAspectRatioOverrides { && mActivityRecord.mDisplayContent.getIgnoreOrientationRequest(); } + /** + * Whether to ignore fixed orientation, aspect ratio and resizability of activity. + */ boolean hasFullscreenOverride() { - return shouldApplyUserFullscreenOverride() || isSystemOverrideToFullscreenEnabled(); + return shouldApplyUserFullscreenOverride() || isSystemOverrideToFullscreenEnabled() + || shouldIgnoreActivitySizeRestrictionsForDisplay(); + } + + boolean shouldIgnoreActivitySizeRestrictionsForDisplay() { + return isDisplayIgnoreActivitySizeRestrictions(mActivityRecord) + && !mAllowOrientationOverrideOptProp.isFalse(); } float getUserMinAspectRatio() { diff --git a/services/core/java/com/android/server/wm/AppCompatOrientationPolicy.java b/services/core/java/com/android/server/wm/AppCompatOrientationPolicy.java index e3a9d672c17f..7aed33d94223 100644 --- a/services/core/java/com/android/server/wm/AppCompatOrientationPolicy.java +++ b/services/core/java/com/android/server/wm/AppCompatOrientationPolicy.java @@ -53,11 +53,16 @@ class AppCompatOrientationPolicy { @ActivityInfo.ScreenOrientation int overrideOrientationIfNeeded(@ActivityInfo.ScreenOrientation int candidate) { + final AppCompatAspectRatioOverrides aspectRatioOverrides = + mAppCompatOverrides.getAppCompatAspectRatioOverrides(); + // Ignore all orientation requests of activities for eligible virtual displays. + if (aspectRatioOverrides.shouldIgnoreActivitySizeRestrictionsForDisplay()) { + return SCREEN_ORIENTATION_USER; + } final DisplayContent displayContent = mActivityRecord.mDisplayContent; final boolean isIgnoreOrientationRequestEnabled = displayContent != null && displayContent.getIgnoreOrientationRequest(); - final boolean hasFullscreenOverride = mAppCompatOverrides - .getAppCompatAspectRatioOverrides().hasFullscreenOverride(); + final boolean hasFullscreenOverride = aspectRatioOverrides.hasFullscreenOverride(); final boolean shouldCameraCompatControlOrientation = AppCompatCameraPolicy.shouldCameraCompatControlOrientation(mActivityRecord); if (hasFullscreenOverride && isIgnoreOrientationRequestEnabled @@ -76,8 +81,8 @@ class AppCompatOrientationPolicy { // In some cases (e.g. Kids app) we need to map the candidate orientation to some other // orientation. candidate = mActivityRecord.mWmService.mapOrientationRequest(candidate); - final boolean shouldApplyUserMinAspectRatioOverride = mAppCompatOverrides - .getAppCompatAspectRatioOverrides().shouldApplyUserMinAspectRatioOverride(); + final boolean shouldApplyUserMinAspectRatioOverride = aspectRatioOverrides + .shouldApplyUserMinAspectRatioOverride(); if (shouldApplyUserMinAspectRatioOverride && (!isFixedOrientation(candidate) || candidate == SCREEN_ORIENTATION_LOCKED)) { Slog.v(TAG, "Requested orientation " + screenOrientationToString(candidate) diff --git a/services/core/java/com/android/server/wm/AppCompatUtils.java b/services/core/java/com/android/server/wm/AppCompatUtils.java index 8d8424820990..db76eb9ac5d9 100644 --- a/services/core/java/com/android/server/wm/AppCompatUtils.java +++ b/services/core/java/com/android/server/wm/AppCompatUtils.java @@ -32,6 +32,8 @@ import android.view.InsetsSource; import android.view.InsetsState; import android.view.WindowInsets; +import com.android.window.flags.Flags; + import java.util.function.BooleanSupplier; /** @@ -86,10 +88,22 @@ final class AppCompatUtils { /** * @param activityRecord The {@link ActivityRecord} for the app package. * @param overrideChangeId The per-app override identifier. - * @return {@code true} if the per-app override is enable for the given activity. + * @return {@code true} if the per-app override is enable for the given activity and the + * display does not ignore fixed orientation, aspect ratio and resizability of activity. */ static boolean isChangeEnabled(@NonNull ActivityRecord activityRecord, long overrideChangeId) { - return activityRecord.info.isChangeEnabled(overrideChangeId); + return activityRecord.info.isChangeEnabled(overrideChangeId) + && !isDisplayIgnoreActivitySizeRestrictions(activityRecord); + } + + /** + * Whether the display ignores fixed orientation, aspect ratio and resizability of activities. + */ + static boolean isDisplayIgnoreActivitySizeRestrictions( + @NonNull ActivityRecord activityRecord) { + final DisplayContent dc = activityRecord.mDisplayContent; + return Flags.vdmForceAppUniversalResizableApi() && dc != null + && dc.isDisplayIgnoreActivitySizeRestrictions(); } /** diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index aac756f4e559..e827f44cb2a2 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -5789,6 +5789,17 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } /** + * Checks if this display is allowed to ignore fixed orientation, aspect ratio, + * and resizability of apps. + * + * <p>This can be set via + * {@link VirtualDisplayConfig.Builder#setIgnoreActivitySizeRestrictions}.</p> + */ + boolean isDisplayIgnoreActivitySizeRestrictions() { + return mWmService.mDisplayWindowSettings.isIgnoreActivitySizeRestrictionsLocked(this); + } + + /** * The direct child layer of the display to put all non-overlay windows. This is also used for * screen rotation animation so that there is a parent layer to put the animation leash. */ diff --git a/services/core/java/com/android/server/wm/DisplayWindowSettings.java b/services/core/java/com/android/server/wm/DisplayWindowSettings.java index e585efa8a3cc..c87b811b4231 100644 --- a/services/core/java/com/android/server/wm/DisplayWindowSettings.java +++ b/services/core/java/com/android/server/wm/DisplayWindowSettings.java @@ -275,6 +275,24 @@ class DisplayWindowSettings { mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); } + boolean isIgnoreActivitySizeRestrictionsLocked(@NonNull DisplayContent dc) { + final DisplayInfo displayInfo = dc.getDisplayInfo(); + final SettingsProvider.SettingsEntry settings = mSettingsProvider.getSettings(displayInfo); + return settings.mIgnoreActivitySizeRestrictions != null + && settings.mIgnoreActivitySizeRestrictions; + } + + void setIgnoreActivitySizeRestrictionsOnDisplayLocked(@NonNull String displayUniqueId, + int displayType, boolean enabled) { + final DisplayInfo displayInfo = new DisplayInfo(); + displayInfo.uniqueId = displayUniqueId; + displayInfo.type = displayType; + final SettingsProvider.SettingsEntry overrideSettings = + mSettingsProvider.getOverrideSettings(displayInfo); + overrideSettings.mIgnoreActivitySizeRestrictions = enabled; + mSettingsProvider.updateOverrideSettings(displayInfo, overrideSettings); + } + void clearDisplaySettings(@NonNull String displayUniqueId, int displayType) { final DisplayInfo displayInfo = new DisplayInfo(); displayInfo.uniqueId = displayUniqueId; @@ -474,6 +492,8 @@ class DisplayWindowSettings { Boolean mIgnoreDisplayCutout; @Nullable Boolean mDontMoveToTop; + @Nullable + Boolean mIgnoreActivitySizeRestrictions; SettingsEntry() {} @@ -557,6 +577,11 @@ class DisplayWindowSettings { mDontMoveToTop = other.mDontMoveToTop; changed = true; } + if (!Objects.equals(other.mIgnoreActivitySizeRestrictions, + mIgnoreActivitySizeRestrictions)) { + mIgnoreActivitySizeRestrictions = other.mIgnoreActivitySizeRestrictions; + changed = true; + } return changed; } @@ -649,6 +674,11 @@ class DisplayWindowSettings { mDontMoveToTop = delta.mDontMoveToTop; changed = true; } + if (delta.mIgnoreActivitySizeRestrictions != null && !Objects.equals( + delta.mIgnoreActivitySizeRestrictions, mIgnoreActivitySizeRestrictions)) { + mIgnoreActivitySizeRestrictions = delta.mIgnoreActivitySizeRestrictions; + changed = true; + } return changed; } @@ -667,7 +697,8 @@ class DisplayWindowSettings { && mFixedToUserRotation == null && mIgnoreOrientationRequest == null && mIgnoreDisplayCutout == null - && mDontMoveToTop == null; + && mDontMoveToTop == null + && mIgnoreActivitySizeRestrictions == null; } @Override @@ -691,7 +722,9 @@ class DisplayWindowSettings { && Objects.equals(mFixedToUserRotation, that.mFixedToUserRotation) && Objects.equals(mIgnoreOrientationRequest, that.mIgnoreOrientationRequest) && Objects.equals(mIgnoreDisplayCutout, that.mIgnoreDisplayCutout) - && Objects.equals(mDontMoveToTop, that.mDontMoveToTop); + && Objects.equals(mDontMoveToTop, that.mDontMoveToTop) + && Objects.equals(mIgnoreActivitySizeRestrictions, + that.mIgnoreActivitySizeRestrictions); } @Override @@ -700,7 +733,7 @@ class DisplayWindowSettings { mForcedHeight, mForcedDensity, mForcedScalingMode, mRemoveContentMode, mShouldShowWithInsecureKeyguard, mShouldShowSystemDecors, mIsHomeSupported, mImePolicy, mFixedToUserRotation, mIgnoreOrientationRequest, - mIgnoreDisplayCutout, mDontMoveToTop); + mIgnoreDisplayCutout, mDontMoveToTop, mIgnoreActivitySizeRestrictions); } @Override @@ -722,6 +755,7 @@ class DisplayWindowSettings { + ", mIgnoreOrientationRequest=" + mIgnoreOrientationRequest + ", mIgnoreDisplayCutout=" + mIgnoreDisplayCutout + ", mDontMoveToTop=" + mDontMoveToTop + + ", mForceAppsUniversalResizable=" + mIgnoreActivitySizeRestrictions + '}'; } } diff --git a/services/core/java/com/android/server/wm/WindowManagerInternal.java b/services/core/java/com/android/server/wm/WindowManagerInternal.java index 82d39a39d188..ce032b4f7f9a 100644 --- a/services/core/java/com/android/server/wm/WindowManagerInternal.java +++ b/services/core/java/com/android/server/wm/WindowManagerInternal.java @@ -859,6 +859,18 @@ public abstract class WindowManagerInternal { public abstract boolean isHomeSupportedOnDisplay(int displayId); /** + * Sets whether the relevant display content ignores fixed orientation, aspect ratio + * and resizability of apps. + * + * @param displayUniqueId The unique ID of the display. Note that the display may not yet be + * created, but whenever it is, this property will be applied. + * @param displayType The type of the display, e.g. {@link Display#TYPE_VIRTUAL}. + * @param enabled Whether app is universal resizable on this display. + */ + public abstract void setIgnoreActivitySizeRestrictionsOnDisplay( + @NonNull String displayUniqueId, int displayType, boolean enabled); + + /** * Removes any settings relevant to the given display. * * <p>This may be used when a property is set for a display unique ID before the display diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 97bf587cd10f..88b2d229e083 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -8384,6 +8384,20 @@ public class WindowManagerService extends IWindowManager.Stub } @Override + public void setIgnoreActivitySizeRestrictionsOnDisplay(@NonNull String displayUniqueId, + int displayType, boolean enabled) { + final long origId = Binder.clearCallingIdentity(); + try { + synchronized (mGlobalLock) { + mDisplayWindowSettings.setIgnoreActivitySizeRestrictionsOnDisplayLocked( + displayUniqueId, displayType, enabled); + } + } finally { + Binder.restoreCallingIdentity(origId); + } + } + + @Override public void clearDisplaySettings(String displayUniqueId, int displayType) { final long origId = Binder.clearCallingIdentity(); try { diff --git a/services/tests/wmtests/src/com/android/server/wm/AppCompatActivityRobot.java b/services/tests/wmtests/src/com/android/server/wm/AppCompatActivityRobot.java index 3742249bdffe..b8cfa7c39464 100644 --- a/services/tests/wmtests/src/com/android/server/wm/AppCompatActivityRobot.java +++ b/services/tests/wmtests/src/com/android/server/wm/AppCompatActivityRobot.java @@ -143,6 +143,10 @@ class AppCompatActivityRobot { doReturn(naturalOrientation).when(mDisplayContent).getNaturalOrientation(); } + void setDisplayIgnoreActivitySizeRestrictions(boolean enabled) { + doReturn(enabled).when(mDisplayContent).isDisplayIgnoreActivitySizeRestrictions(); + } + void configureTaskBounds(@NonNull Rect taskBounds) { doReturn(taskBounds).when(mTaskStack.top()).getBounds(); } diff --git a/services/tests/wmtests/src/com/android/server/wm/AppCompatAspectRatioOverridesTest.java b/services/tests/wmtests/src/com/android/server/wm/AppCompatAspectRatioOverridesTest.java index b83911337c5c..14ef913e28db 100644 --- a/services/tests/wmtests/src/com/android/server/wm/AppCompatAspectRatioOverridesTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/AppCompatAspectRatioOverridesTest.java @@ -17,9 +17,12 @@ package com.android.server.wm; import static android.content.pm.ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO; +import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_3_2; import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_FULLSCREEN; +import static android.view.Surface.ROTATION_90; import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE; +import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE; import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE; import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE; @@ -29,10 +32,13 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import android.compat.testing.PlatformCompatChangeRule; +import android.platform.test.annotations.EnableFlags; import android.platform.test.annotations.Presubmit; import androidx.annotation.NonNull; +import com.android.window.flags.Flags; + import libcore.junit.util.compat.CoreCompatChangeRule.DisableCompatChanges; import libcore.junit.util.compat.CoreCompatChangeRule.EnableCompatChanges; @@ -288,6 +294,93 @@ public class AppCompatAspectRatioOverridesTest extends WindowTestsBase { }); } + @Test + @EnableFlags(Flags.FLAG_VDM_FORCE_APP_UNIVERSAL_RESIZABLE_API) + public void testHasFullscreenOverride_displayIgnoreActivitySizeRestrictionsTrue() { + runTestScenario((robot) -> { + robot.applyOnActivity((a) -> { + a.setDisplayIgnoreActivitySizeRestrictions(true); + a.createActivityWithComponent(); + }); + + robot.checkHasFullscreenOverride(true); + }); + } + + @Test + @EnableFlags(Flags.FLAG_VDM_FORCE_APP_UNIVERSAL_RESIZABLE_API) + public void testHasFullscreenOverride_displayIgnoreActivitySizeRestrictionsFalse() { + runTestScenario((robot) -> { + robot.applyOnActivity((a) -> { + a.setDisplayIgnoreActivitySizeRestrictions(false); + a.createActivityWithComponent(); + }); + + robot.checkHasFullscreenOverride(false); + }); + } + + @Test + @EnableFlags(Flags.FLAG_VDM_FORCE_APP_UNIVERSAL_RESIZABLE_API) + public void testPropFalse_displayIgnoreActivitySizeRestrictionsTrue_notOverridden() { + runTestScenario((robot) -> { + robot.prop().disable(PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE); + robot.applyOnActivity((a) -> { + a.setDisplayIgnoreActivitySizeRestrictions(true); + a.createActivityWithComponent(); + }); + + robot.checkHasFullscreenOverride(false); + }); + } + + @Test + @EnableFlags(Flags.FLAG_VDM_FORCE_APP_UNIVERSAL_RESIZABLE_API) + public void testPropTrue_displayIgnoreActivitySizeRestrictionsFalse_notOverridden() { + runTestScenario((robot) -> { + robot.prop().enable(PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE); + robot.applyOnActivity((a) -> { + a.setDisplayIgnoreActivitySizeRestrictions(false); + a.createActivityWithComponent(); + }); + + robot.checkHasFullscreenOverride(false); + }); + } + + @Test + @EnableFlags(Flags.FLAG_VDM_FORCE_APP_UNIVERSAL_RESIZABLE_API) + public void testNotInSizeCompatMode_displayIgnoreActivitySizeRestrictionsTrue() { + runTestScenario((robot) -> { + robot.applyOnActivity((a) -> { + a.createActivityWithComponent(); + a.setDisplayIgnoreActivitySizeRestrictions(true); + a.configureTopActivity(/* minAspect */ -1f, /* maxAspect */-1f, + SCREEN_ORIENTATION_LANDSCAPE, true); + a.rotateDisplayForTopActivity(ROTATION_90); + + a.checkTopActivityInSizeCompatMode(false); + }); + }); + } + + @Test + @EnableFlags(Flags.FLAG_VDM_FORCE_APP_UNIVERSAL_RESIZABLE_API) + public void testInSizeCompatMode_displayIgnoreActivitySizeRestrictionsFalse() { + runTestScenario((robot) -> { + robot.applyOnActivity((a) -> { + a.createActivityWithComponent(); + a.setIgnoreOrientationRequest(true); + a.setDisplayIgnoreActivitySizeRestrictions(false); + a.configureTopActivity(/* minAspect */ -1f, /* maxAspect */-1f, + SCREEN_ORIENTATION_LANDSCAPE, true); + a.rotateDisplayForTopActivity(ROTATION_90); + + a.checkTopActivityInSizeCompatMode(true); + }); + }); + } + /** * Runs a test scenario providing a Robot. */ @@ -366,6 +459,11 @@ public class AppCompatAspectRatioOverridesTest extends WindowTestsBase { } } + void checkHasFullscreenOverride(boolean expected) { + assertEquals(expected, + getTopActivityAppCompatAspectRatioOverrides().hasFullscreenOverride()); + } + private AppCompatAspectRatioOverrides getTopActivityAppCompatAspectRatioOverrides() { return activity().top().mAppCompatController.getAppCompatAspectRatioOverrides(); } |