[3/n] Add aspect ratio app info page

Apps > App Info > Advanced > Aspect ratio

Adds link from aspect ratio app list page to app info. Stops activity if
user chooses a different aspect ratio override.

To enable feature:
adb shell device_config put window_manager enable_app_compat_user_aspect_ratio_settings true
adb shell am force-stop com.android.settings

Bug: 287448187
Test: Manual
      All Settings CUJs passed
      atest SettingsRoboTests:UserAspectRatioDetailsTest
      atest SettingsSpaUnitTests:UserAspectRatioAppPreferenceTest
Change-Id: Id47f291459e62267bf15d629c163dde73d96928a
This commit is contained in:
Graciela Wissen Putri
2023-06-26 16:58:33 +00:00
parent c8eb80bcc2
commit 57984f02d5
13 changed files with 735 additions and 22 deletions

View File

@@ -28,6 +28,7 @@ import android.provider.DeviceConfig;
import android.util.ArrayMap;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.android.settings.R;
@@ -91,6 +92,32 @@ public class UserAspectRatioManager {
aspectRatio, mContext.getString(R.string.user_aspect_ratio_app_default));
}
/**
* @return corresponding aspect ratio string for package name and user
*/
@NonNull
public String getUserMinAspectRatioEntry(@NonNull String packageName, int uid)
throws RemoteException {
final int aspectRatio = getUserMinAspectRatioValue(packageName, uid);
return getUserMinAspectRatioEntry(aspectRatio);
}
/**
* Whether user aspect ratio option is specified in
* {@link R.array.config_userAspectRatioOverrideValues}
*/
public boolean containsAspectRatioOption(@PackageManager.UserMinAspectRatio int option) {
return mUserAspectRatioMap.containsKey(option);
}
/**
* Sets user-specified {@link PackageManager.UserMinAspectRatio} override for an app
*/
public void setUserMinAspectRatio(@NonNull String packageName, int uid,
@PackageManager.UserMinAspectRatio int aspectRatio) throws RemoteException {
mIPm.setUserMinAspectRatio(packageName, uid, aspectRatio);
}
/**
* Whether an app's aspect ratio can be overridden by user. Only apps with launcher entry
* will be overridable.
@@ -122,14 +149,17 @@ public class UserAspectRatioManager {
final Map<Integer, String> userMinAspectRatioMap = new ArrayMap<>();
for (int i = 0; i < userMinAspectRatioValues.length; i++) {
final int aspectRatioVal = userMinAspectRatioValues[i];
final String aspectRatioString = getAspectRatioStringOrDefault(
userMinAspectRatioStrings[i], aspectRatioVal);
switch (aspectRatioVal) {
// Only map known values of UserMinAspectRatio and ignore unknown entries
case PackageManager.USER_MIN_ASPECT_RATIO_UNSET:
case PackageManager.USER_MIN_ASPECT_RATIO_SPLIT_SCREEN:
case PackageManager.USER_MIN_ASPECT_RATIO_DISPLAY_SIZE:
case PackageManager.USER_MIN_ASPECT_RATIO_4_3:
case PackageManager.USER_MIN_ASPECT_RATIO_16_9:
case PackageManager.USER_MIN_ASPECT_RATIO_3_2:
userMinAspectRatioMap.put(aspectRatioVal, userMinAspectRatioStrings[i]);
userMinAspectRatioMap.put(aspectRatioVal, aspectRatioString);
}
}
if (!userMinAspectRatioMap.containsKey(PackageManager.USER_MIN_ASPECT_RATIO_UNSET)) {
@@ -139,6 +169,29 @@ public class UserAspectRatioManager {
return userMinAspectRatioMap;
}
@NonNull
private String getAspectRatioStringOrDefault(@Nullable String aspectRatioString,
@PackageManager.UserMinAspectRatio int aspectRatioVal) {
if (aspectRatioString != null) {
return aspectRatioString;
}
// Options are customized per device and if strings are set to @null, use default
switch (aspectRatioVal) {
case PackageManager.USER_MIN_ASPECT_RATIO_SPLIT_SCREEN:
return mContext.getString(R.string.user_aspect_ratio_half_screen);
case PackageManager.USER_MIN_ASPECT_RATIO_DISPLAY_SIZE:
return mContext.getString(R.string.user_aspect_ratio_device_size);
case PackageManager.USER_MIN_ASPECT_RATIO_4_3:
return mContext.getString(R.string.user_aspect_ratio_4_3);
case PackageManager.USER_MIN_ASPECT_RATIO_16_9:
return mContext.getString(R.string.user_aspect_ratio_16_9);
case PackageManager.USER_MIN_ASPECT_RATIO_3_2:
return mContext.getString(R.string.user_aspect_ratio_3_2);
default:
return mContext.getString(R.string.user_aspect_ratio_app_default);
}
}
@VisibleForTesting
void addInfoHasLauncherEntry(@NonNull ResolveInfo infoHasLauncherEntry) {
mInfoHasLauncherEntryList.add(infoHasLauncherEntry);