Loading src/com/android/settings/applications/appcompat/UserAspectRatioManager.java +34 −6 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ import static java.lang.Boolean.FALSE; import android.app.AppGlobals; import android.app.compat.CompatChanges; import android.content.Context; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.LauncherApps; Loading @@ -44,6 +45,7 @@ import android.os.RemoteException; import android.os.UserHandle; import android.provider.DeviceConfig; import android.util.ArrayMap; import android.util.Log; import android.util.SparseIntArray; import androidx.annotation.NonNull; Loading Loading @@ -71,6 +73,7 @@ public class UserAspectRatioManager { private static final boolean DEFAULT_VALUE_ENABLE_USER_ASPECT_RATIO_FULLSCREEN = true; final boolean mIsUserMinAspectRatioAppDefaultFlagEnabled = Flags.userMinAspectRatioAppDefault(); private final boolean mIgnoreActivityOrientationRequest; private final Context mContext; private final IPackageManager mIPm; Loading @@ -90,6 +93,8 @@ public class UserAspectRatioManager { mUserAspectRatioA11yMap = new ArrayMap<>(); mUserAspectRatioOrder = new SparseIntArray(); mUserAspectRatioMap = getUserMinAspectRatioMapping(); mIgnoreActivityOrientationRequest = getValueFromDeviceConfig( "ignore_activity_orientation_request", false); } /** Loading @@ -113,6 +118,24 @@ public class UserAspectRatioManager { ? aspectRatio : USER_MIN_ASPECT_RATIO_UNSET; } // TODO b/374903057 reuse method from ActivityRecord boolean isUniversalResizeable(@NonNull String packageName, int userId) { try { final ApplicationInfo info = mIPm.getApplicationInfo( packageName, 0 /* flags */, userId); if (info == null || info.category == ApplicationInfo.CATEGORY_GAME) { return false; } final boolean compatEnabled = Flags.universalResizableByDefault() && info.isChangeEnabled(ActivityInfo.UNIVERSAL_RESIZABLE_BY_DEFAULT); return compatEnabled || mIgnoreActivityOrientationRequest; } catch (RemoteException e) { Log.e("UserAspectRatioManager", "Could not access application info for " + packageName + ":\n" + e); return false; } } /** * @return corresponding string for {@link PackageManager.UserMinAspectRatio} value */ Loading @@ -127,7 +150,7 @@ public class UserAspectRatioManager { return appDefault; } return isCurrentSelectionFromManufacturerOverride(packageName, userId, aspectRatio) return isUnsetAndRequiresFullscreenOverride(packageName, userId, aspectRatio) ? getUserMinAspectRatioEntry(USER_MIN_ASPECT_RATIO_FULLSCREEN, packageName, userId) : mUserAspectRatioMap.getOrDefault(aspectRatio, appDefault); } Loading @@ -139,7 +162,7 @@ public class UserAspectRatioManager { public CharSequence getAccessibleEntry(@PackageManager.UserMinAspectRatio int aspectRatio, @NonNull String packageName) { final int userId = mContext.getUserId(); return isCurrentSelectionFromManufacturerOverride(packageName, userId, aspectRatio) return isUnsetAndRequiresFullscreenOverride(packageName, userId, aspectRatio) ? getAccessibleEntry(USER_MIN_ASPECT_RATIO_FULLSCREEN, packageName) : mUserAspectRatioA11yMap.getOrDefault(aspectRatio, getUserMinAspectRatioEntry(aspectRatio, packageName, userId)); Loading Loading @@ -203,7 +226,7 @@ public class UserAspectRatioManager { @PackageManager.UserMinAspectRatio int userOverride) { return (userOverride != USER_MIN_ASPECT_RATIO_UNSET && userOverride != USER_MIN_ASPECT_RATIO_APP_DEFAULT) || isCurrentSelectionFromManufacturerOverride(app.packageName, getUserId(app.uid), || isUnsetAndRequiresFullscreenOverride(app.packageName, getUserId(app.uid), userOverride); } Loading @@ -224,7 +247,7 @@ public class UserAspectRatioManager { /** * Whether the device manufacturer has overridden app's orientation to * {@link android.content.pm.ActivityInfo#SCREEN_ORIENTATION_USER} to force app to fullscreen * and app has not opted-out from the treatment * or app is universal resizeable, and app has not opted-out from the treatment */ boolean isOverrideToFullscreenEnabled(String pkgName, int userId) { Boolean appAllowsOrientationOverride = readComponentProperty(mContext.getPackageManager(), Loading @@ -232,7 +255,8 @@ public class UserAspectRatioManager { return mIsUserMinAspectRatioAppDefaultFlagEnabled && hasAspectRatioOption(USER_MIN_ASPECT_RATIO_FULLSCREEN, pkgName) && !FALSE.equals(appAllowsOrientationOverride) && isFullscreenCompatChangeEnabled(pkgName, userId); && (isFullscreenCompatChangeEnabled(pkgName, userId) || isUniversalResizeable(pkgName, userId)); } boolean isFullscreenCompatChangeEnabled(String pkgName, int userId) { Loading @@ -240,7 +264,11 @@ public class UserAspectRatioManager { OVERRIDE_ANY_ORIENTATION_TO_USER, pkgName, UserHandle.of(userId)); } private boolean isCurrentSelectionFromManufacturerOverride(String pkgName, int userId, /** * Whether the aspect ratio is unset and we desire to interpret it as fullscreen rather than * app default because of manufacturer override or because the app is universal resizeable */ private boolean isUnsetAndRequiresFullscreenOverride(String pkgName, int userId, @PackageManager.UserMinAspectRatio int aspectRatio) { return aspectRatio == USER_MIN_ASPECT_RATIO_UNSET && isOverrideToFullscreenEnabled(pkgName, userId); Loading tests/unit/src/com/android/settings/applications/appcompat/UserAspectRatioManagerTest.java +66 −10 Original line number Diff line number Diff line Loading @@ -331,9 +331,7 @@ public class UserAspectRatioManagerTest { .isEqualTo(getUserMinAspectRatioEntry(USER_MIN_ASPECT_RATIO_UNSET, mPackageName)); } @Test public void testGetUserMinAspectRatioEntry_enabledFullscreenOverride_returnsFullscreen() { setIsOverrideToFullscreenEnabled(true); private void assertUnsetIsFullscreen() { // Fullscreen option is pre-selected assertThat(getUserMinAspectRatioEntry(USER_MIN_ASPECT_RATIO_UNSET, mPackageName)) .isEqualTo(ResourcesUtils.getResourcesString( Loading @@ -347,9 +345,7 @@ public class UserAspectRatioManagerTest { "user_aspect_ratio_app_default")); } @Test public void testGetUserMinAspectRatioEntry_disabledFullscreenOverride_returnsUnchanged() { setIsOverrideToFullscreenEnabled(false); private void assertUnsetIsAppDefault() { // Fullscreen option is not pre-selected assertThat(getUserMinAspectRatioEntry(USER_MIN_ASPECT_RATIO_UNSET, mPackageName)) .isEqualTo(ResourcesUtils.getResourcesString( Loading @@ -358,9 +354,43 @@ public class UserAspectRatioManagerTest { } @Test public void testIsOverrideToFullscreenEnabled_returnsTrue() public void testGetUserMinAspectRatioEntry_enabledFullscreenCompatChange_returnsFullscreen() { setIsOverrideToFullscreenEnabledBecauseCompatChange(true); assertUnsetIsFullscreen(); } @Test public void testGetUserMinAspectRatioEntry_enabledFullscreenOverrideUniRes_returnsFullscreen() { setIsOverrideToFullscreenEnabledBecauseUniversalResizeable(true); assertUnsetIsFullscreen(); } @Test public void testGetUserMinAspectRatioEntry_noFullscreenCompatChange_returnsUnchanged() { setIsOverrideToFullscreenEnabledBecauseCompatChange(false); assertUnsetIsAppDefault(); } @Test public void testGetUserMinAspectRatioEntry_noFullscreenUnivRes_returnsUnchanged() { setIsOverrideToFullscreenEnabledBecauseUniversalResizeable(false); assertUnsetIsAppDefault(); } @Test public void testIsOverrideToFullscreenEnabledCompatChange_returnsTrue() throws PackageManager.NameNotFoundException { setIsOverrideToFullscreenEnabledBecauseCompatChange(true); assertTrue(mUtils.isOverrideToFullscreenEnabled(mPackageName, mContext.getUserId())); mockProperty(PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE, true); assertTrue(mUtils.isOverrideToFullscreenEnabled(mPackageName, mContext.getUserId())); } @Test public void testIsOverrideToFullscreenEnabledUnivRes_returnsTrue() throws PackageManager.NameNotFoundException { setIsOverrideToFullscreenEnabled(true); setIsOverrideToFullscreenEnabledBecauseUniversalResizeable(true); assertTrue(mUtils.isOverrideToFullscreenEnabled(mPackageName, mContext.getUserId())); mockProperty(PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE, true); Loading @@ -370,7 +400,7 @@ public class UserAspectRatioManagerTest { @Test public void testIsOverrideToFullscreenEnabled_optOut_returnsFalse() throws PackageManager.NameNotFoundException { setIsOverrideToFullscreenEnabled(true); setIsOverrideToFullscreenEnabledBecauseCompatChange(true); mockProperty(PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE, false); assertFalse(mUtils.isOverrideToFullscreenEnabled(mPackageName, mContext.getUserId())); } Loading @@ -381,6 +411,12 @@ public class UserAspectRatioManagerTest { assertFalse(mUtils.isOverrideToFullscreenEnabled(mPackageName, mContext.getUserId())); } @Test public void testIsOverrideToFullscreenEnabledUnivRes_flagDisabled_returnsFalse() { mUtils.setFullscreenCompatChange(true); assertFalse(mUtils.isOverrideToFullscreenEnabled(mPackageName, mContext.getUserId())); } @Test public void testIsOverrideToFullscreenEnabled_optionDisabled_returnsFalse() { mUtils.setFullscreenCompatChange(true); Loading @@ -389,7 +425,7 @@ public class UserAspectRatioManagerTest { assertFalse(mUtils.isOverrideToFullscreenEnabled(mPackageName, mContext.getUserId())); } private void setIsOverrideToFullscreenEnabled(boolean enabled) { private void setIsOverrideToFullscreenEnabledBecauseCompatChange(boolean enabled) { if (enabled) { mSetFlagsRule.enableFlags(FLAG_USER_MIN_ASPECT_RATIO_APP_DEFAULT); mUtils = new FakeUserAspectRatioManager(mContext, mIPm); Loading @@ -399,6 +435,16 @@ public class UserAspectRatioManagerTest { .thenReturn(enabled); } private void setIsOverrideToFullscreenEnabledBecauseUniversalResizeable(boolean enabled) { if (enabled) { mSetFlagsRule.enableFlags(FLAG_USER_MIN_ASPECT_RATIO_APP_DEFAULT); mUtils = new FakeUserAspectRatioManager(mContext, mIPm); } mUtils.setUniversalResizeable(enabled); when(mUtils.hasAspectRatioOption(USER_MIN_ASPECT_RATIO_FULLSCREEN, mPackageName)) .thenReturn(enabled); } private void enableAllDefaultAspectRatioOptions() { final int[] aspectRatioOptions = new int[] { USER_MIN_ASPECT_RATIO_UNSET, Loading Loading @@ -457,6 +503,7 @@ public class UserAspectRatioManagerTest { private static class FakeUserAspectRatioManager extends UserAspectRatioManager { private boolean mFullscreenCompatChange = false; private boolean mIsUniversalResizeable = false; private FakeUserAspectRatioManager(@NonNull Context context, IPackageManager pm) { super(context, pm); Loading @@ -467,8 +514,17 @@ public class UserAspectRatioManagerTest { return mFullscreenCompatChange; } @Override boolean isUniversalResizeable(String pkgName, int userId) { return mIsUniversalResizeable; } void setFullscreenCompatChange(boolean enabled) { mFullscreenCompatChange = enabled; } void setUniversalResizeable(boolean enabled) { mIsUniversalResizeable = enabled; } } } Loading
src/com/android/settings/applications/appcompat/UserAspectRatioManager.java +34 −6 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ import static java.lang.Boolean.FALSE; import android.app.AppGlobals; import android.app.compat.CompatChanges; import android.content.Context; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.LauncherApps; Loading @@ -44,6 +45,7 @@ import android.os.RemoteException; import android.os.UserHandle; import android.provider.DeviceConfig; import android.util.ArrayMap; import android.util.Log; import android.util.SparseIntArray; import androidx.annotation.NonNull; Loading Loading @@ -71,6 +73,7 @@ public class UserAspectRatioManager { private static final boolean DEFAULT_VALUE_ENABLE_USER_ASPECT_RATIO_FULLSCREEN = true; final boolean mIsUserMinAspectRatioAppDefaultFlagEnabled = Flags.userMinAspectRatioAppDefault(); private final boolean mIgnoreActivityOrientationRequest; private final Context mContext; private final IPackageManager mIPm; Loading @@ -90,6 +93,8 @@ public class UserAspectRatioManager { mUserAspectRatioA11yMap = new ArrayMap<>(); mUserAspectRatioOrder = new SparseIntArray(); mUserAspectRatioMap = getUserMinAspectRatioMapping(); mIgnoreActivityOrientationRequest = getValueFromDeviceConfig( "ignore_activity_orientation_request", false); } /** Loading @@ -113,6 +118,24 @@ public class UserAspectRatioManager { ? aspectRatio : USER_MIN_ASPECT_RATIO_UNSET; } // TODO b/374903057 reuse method from ActivityRecord boolean isUniversalResizeable(@NonNull String packageName, int userId) { try { final ApplicationInfo info = mIPm.getApplicationInfo( packageName, 0 /* flags */, userId); if (info == null || info.category == ApplicationInfo.CATEGORY_GAME) { return false; } final boolean compatEnabled = Flags.universalResizableByDefault() && info.isChangeEnabled(ActivityInfo.UNIVERSAL_RESIZABLE_BY_DEFAULT); return compatEnabled || mIgnoreActivityOrientationRequest; } catch (RemoteException e) { Log.e("UserAspectRatioManager", "Could not access application info for " + packageName + ":\n" + e); return false; } } /** * @return corresponding string for {@link PackageManager.UserMinAspectRatio} value */ Loading @@ -127,7 +150,7 @@ public class UserAspectRatioManager { return appDefault; } return isCurrentSelectionFromManufacturerOverride(packageName, userId, aspectRatio) return isUnsetAndRequiresFullscreenOverride(packageName, userId, aspectRatio) ? getUserMinAspectRatioEntry(USER_MIN_ASPECT_RATIO_FULLSCREEN, packageName, userId) : mUserAspectRatioMap.getOrDefault(aspectRatio, appDefault); } Loading @@ -139,7 +162,7 @@ public class UserAspectRatioManager { public CharSequence getAccessibleEntry(@PackageManager.UserMinAspectRatio int aspectRatio, @NonNull String packageName) { final int userId = mContext.getUserId(); return isCurrentSelectionFromManufacturerOverride(packageName, userId, aspectRatio) return isUnsetAndRequiresFullscreenOverride(packageName, userId, aspectRatio) ? getAccessibleEntry(USER_MIN_ASPECT_RATIO_FULLSCREEN, packageName) : mUserAspectRatioA11yMap.getOrDefault(aspectRatio, getUserMinAspectRatioEntry(aspectRatio, packageName, userId)); Loading Loading @@ -203,7 +226,7 @@ public class UserAspectRatioManager { @PackageManager.UserMinAspectRatio int userOverride) { return (userOverride != USER_MIN_ASPECT_RATIO_UNSET && userOverride != USER_MIN_ASPECT_RATIO_APP_DEFAULT) || isCurrentSelectionFromManufacturerOverride(app.packageName, getUserId(app.uid), || isUnsetAndRequiresFullscreenOverride(app.packageName, getUserId(app.uid), userOverride); } Loading @@ -224,7 +247,7 @@ public class UserAspectRatioManager { /** * Whether the device manufacturer has overridden app's orientation to * {@link android.content.pm.ActivityInfo#SCREEN_ORIENTATION_USER} to force app to fullscreen * and app has not opted-out from the treatment * or app is universal resizeable, and app has not opted-out from the treatment */ boolean isOverrideToFullscreenEnabled(String pkgName, int userId) { Boolean appAllowsOrientationOverride = readComponentProperty(mContext.getPackageManager(), Loading @@ -232,7 +255,8 @@ public class UserAspectRatioManager { return mIsUserMinAspectRatioAppDefaultFlagEnabled && hasAspectRatioOption(USER_MIN_ASPECT_RATIO_FULLSCREEN, pkgName) && !FALSE.equals(appAllowsOrientationOverride) && isFullscreenCompatChangeEnabled(pkgName, userId); && (isFullscreenCompatChangeEnabled(pkgName, userId) || isUniversalResizeable(pkgName, userId)); } boolean isFullscreenCompatChangeEnabled(String pkgName, int userId) { Loading @@ -240,7 +264,11 @@ public class UserAspectRatioManager { OVERRIDE_ANY_ORIENTATION_TO_USER, pkgName, UserHandle.of(userId)); } private boolean isCurrentSelectionFromManufacturerOverride(String pkgName, int userId, /** * Whether the aspect ratio is unset and we desire to interpret it as fullscreen rather than * app default because of manufacturer override or because the app is universal resizeable */ private boolean isUnsetAndRequiresFullscreenOverride(String pkgName, int userId, @PackageManager.UserMinAspectRatio int aspectRatio) { return aspectRatio == USER_MIN_ASPECT_RATIO_UNSET && isOverrideToFullscreenEnabled(pkgName, userId); Loading
tests/unit/src/com/android/settings/applications/appcompat/UserAspectRatioManagerTest.java +66 −10 Original line number Diff line number Diff line Loading @@ -331,9 +331,7 @@ public class UserAspectRatioManagerTest { .isEqualTo(getUserMinAspectRatioEntry(USER_MIN_ASPECT_RATIO_UNSET, mPackageName)); } @Test public void testGetUserMinAspectRatioEntry_enabledFullscreenOverride_returnsFullscreen() { setIsOverrideToFullscreenEnabled(true); private void assertUnsetIsFullscreen() { // Fullscreen option is pre-selected assertThat(getUserMinAspectRatioEntry(USER_MIN_ASPECT_RATIO_UNSET, mPackageName)) .isEqualTo(ResourcesUtils.getResourcesString( Loading @@ -347,9 +345,7 @@ public class UserAspectRatioManagerTest { "user_aspect_ratio_app_default")); } @Test public void testGetUserMinAspectRatioEntry_disabledFullscreenOverride_returnsUnchanged() { setIsOverrideToFullscreenEnabled(false); private void assertUnsetIsAppDefault() { // Fullscreen option is not pre-selected assertThat(getUserMinAspectRatioEntry(USER_MIN_ASPECT_RATIO_UNSET, mPackageName)) .isEqualTo(ResourcesUtils.getResourcesString( Loading @@ -358,9 +354,43 @@ public class UserAspectRatioManagerTest { } @Test public void testIsOverrideToFullscreenEnabled_returnsTrue() public void testGetUserMinAspectRatioEntry_enabledFullscreenCompatChange_returnsFullscreen() { setIsOverrideToFullscreenEnabledBecauseCompatChange(true); assertUnsetIsFullscreen(); } @Test public void testGetUserMinAspectRatioEntry_enabledFullscreenOverrideUniRes_returnsFullscreen() { setIsOverrideToFullscreenEnabledBecauseUniversalResizeable(true); assertUnsetIsFullscreen(); } @Test public void testGetUserMinAspectRatioEntry_noFullscreenCompatChange_returnsUnchanged() { setIsOverrideToFullscreenEnabledBecauseCompatChange(false); assertUnsetIsAppDefault(); } @Test public void testGetUserMinAspectRatioEntry_noFullscreenUnivRes_returnsUnchanged() { setIsOverrideToFullscreenEnabledBecauseUniversalResizeable(false); assertUnsetIsAppDefault(); } @Test public void testIsOverrideToFullscreenEnabledCompatChange_returnsTrue() throws PackageManager.NameNotFoundException { setIsOverrideToFullscreenEnabledBecauseCompatChange(true); assertTrue(mUtils.isOverrideToFullscreenEnabled(mPackageName, mContext.getUserId())); mockProperty(PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE, true); assertTrue(mUtils.isOverrideToFullscreenEnabled(mPackageName, mContext.getUserId())); } @Test public void testIsOverrideToFullscreenEnabledUnivRes_returnsTrue() throws PackageManager.NameNotFoundException { setIsOverrideToFullscreenEnabled(true); setIsOverrideToFullscreenEnabledBecauseUniversalResizeable(true); assertTrue(mUtils.isOverrideToFullscreenEnabled(mPackageName, mContext.getUserId())); mockProperty(PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE, true); Loading @@ -370,7 +400,7 @@ public class UserAspectRatioManagerTest { @Test public void testIsOverrideToFullscreenEnabled_optOut_returnsFalse() throws PackageManager.NameNotFoundException { setIsOverrideToFullscreenEnabled(true); setIsOverrideToFullscreenEnabledBecauseCompatChange(true); mockProperty(PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE, false); assertFalse(mUtils.isOverrideToFullscreenEnabled(mPackageName, mContext.getUserId())); } Loading @@ -381,6 +411,12 @@ public class UserAspectRatioManagerTest { assertFalse(mUtils.isOverrideToFullscreenEnabled(mPackageName, mContext.getUserId())); } @Test public void testIsOverrideToFullscreenEnabledUnivRes_flagDisabled_returnsFalse() { mUtils.setFullscreenCompatChange(true); assertFalse(mUtils.isOverrideToFullscreenEnabled(mPackageName, mContext.getUserId())); } @Test public void testIsOverrideToFullscreenEnabled_optionDisabled_returnsFalse() { mUtils.setFullscreenCompatChange(true); Loading @@ -389,7 +425,7 @@ public class UserAspectRatioManagerTest { assertFalse(mUtils.isOverrideToFullscreenEnabled(mPackageName, mContext.getUserId())); } private void setIsOverrideToFullscreenEnabled(boolean enabled) { private void setIsOverrideToFullscreenEnabledBecauseCompatChange(boolean enabled) { if (enabled) { mSetFlagsRule.enableFlags(FLAG_USER_MIN_ASPECT_RATIO_APP_DEFAULT); mUtils = new FakeUserAspectRatioManager(mContext, mIPm); Loading @@ -399,6 +435,16 @@ public class UserAspectRatioManagerTest { .thenReturn(enabled); } private void setIsOverrideToFullscreenEnabledBecauseUniversalResizeable(boolean enabled) { if (enabled) { mSetFlagsRule.enableFlags(FLAG_USER_MIN_ASPECT_RATIO_APP_DEFAULT); mUtils = new FakeUserAspectRatioManager(mContext, mIPm); } mUtils.setUniversalResizeable(enabled); when(mUtils.hasAspectRatioOption(USER_MIN_ASPECT_RATIO_FULLSCREEN, mPackageName)) .thenReturn(enabled); } private void enableAllDefaultAspectRatioOptions() { final int[] aspectRatioOptions = new int[] { USER_MIN_ASPECT_RATIO_UNSET, Loading Loading @@ -457,6 +503,7 @@ public class UserAspectRatioManagerTest { private static class FakeUserAspectRatioManager extends UserAspectRatioManager { private boolean mFullscreenCompatChange = false; private boolean mIsUniversalResizeable = false; private FakeUserAspectRatioManager(@NonNull Context context, IPackageManager pm) { super(context, pm); Loading @@ -467,8 +514,17 @@ public class UserAspectRatioManagerTest { return mFullscreenCompatChange; } @Override boolean isUniversalResizeable(String pkgName, int userId) { return mIsUniversalResizeable; } void setFullscreenCompatChange(boolean enabled) { mFullscreenCompatChange = enabled; } void setUniversalResizeable(boolean enabled) { mIsUniversalResizeable = enabled; } } }