Add getString override that accepts format args

Also added the required contants for enterprise strings in SysUI

Bug: 188414133
Bug: 211422509
Bug: 188410712
Test: manual
Change-Id: I574f5ef1ec1f7ad6dc92a3509c30c9bcac4b6d37
This commit is contained in:
kholoud mohamed
2022-01-11 09:06:25 +00:00
committed by Kholoud Mohamed
parent 968b1b2095
commit ddf2c6dad2
4 changed files with 416 additions and 7 deletions

View File

@@ -1037,6 +1037,7 @@ package android.app.admin {
method @Nullable public android.content.ComponentName getProfileOwner() throws java.lang.IllegalArgumentException;
method @Nullable @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS}) public String getProfileOwnerNameAsUser(int) throws java.lang.IllegalArgumentException;
method @NonNull public String getString(@NonNull String, @NonNull java.util.concurrent.Callable<java.lang.String>);
method @NonNull public String getString(@NonNull String, @NonNull java.util.concurrent.Callable<java.lang.String>, @NonNull java.lang.Object...);
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS}) public int getUserProvisioningState();
method public boolean isDeviceManaged();
method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isDeviceProvisioned();

View File

@@ -14822,20 +14822,64 @@ public class DevicePolicyManager {
Objects.requireNonNull(stringId, "stringId can't be null");
Objects.requireNonNull(defaultStringLoader, "defaultStringLoader can't be null");
if (stringId.equals(INVALID_ID)) {
if (stringId.equals(DevicePolicyResources.Strings.INVALID_ID)) {
return ParcelableResource.loadDefaultString(defaultStringLoader);
}
if (mService != null) {
try {
ParcelableResource resource = mService.getString(stringId);
if (resource == null) {
return ParcelableResource.loadDefaultString(
defaultStringLoader);
return ParcelableResource.loadDefaultString(defaultStringLoader);
}
return resource.getString(
mContext,
defaultStringLoader);
return resource.getString(mContext, defaultStringLoader);
} catch (RemoteException e) {
Log.e(
TAG,
"Error getting the updated string from DevicePolicyManagerService.",
e);
return ParcelableResource.loadDefaultString(defaultStringLoader);
}
}
return ParcelableResource.loadDefaultString(defaultStringLoader);
}
/**
* Similar to {@link #getString(String, Callable)} but accepts {@code formatArgs} and returns a
* localized formatted string, substituting the format arguments as defined in
* {@link java.util.Formatter} and {@link java.lang.String#format}, (see
* {@link Resources#getString(int, Object...)}).
*
* <p>{@code defaultStringLoader} must return a non {@code null} {@link String}, otherwise a
* {@link NullPointerException} is thrown.
*
* @param stringId The IDs to get the updated resource for.
* @param defaultStringLoader To get the default string if no updated string was set for
* {@code stringId}.
* @param formatArgs The format arguments that will be used for substitution.
*
* @hide
*/
@SystemApi
@NonNull
@SuppressLint("SamShouldBeLast")
public String getString(
@NonNull @DevicePolicyResources.UpdatableStringId String stringId,
@NonNull Callable<String> defaultStringLoader,
@NonNull Object... formatArgs) {
Objects.requireNonNull(stringId, "stringId can't be null");
Objects.requireNonNull(defaultStringLoader, "defaultStringLoader can't be null");
if (stringId.equals(DevicePolicyResources.Strings.INVALID_ID)) {
return ParcelableResource.loadDefaultString(defaultStringLoader);
}
if (mService != null) {
try {
ParcelableResource resource = mService.getString(stringId);
if (resource == null) {
return ParcelableResource.loadDefaultString(defaultStringLoader);
}
return resource.getString(mContext, defaultStringLoader, formatArgs);
} catch (RemoteException e) {
Log.e(
TAG,

View File

@@ -30,6 +30,41 @@ import static android.app.admin.DevicePolicyResources.Strings.Launcher.WORK_PROF
import static android.app.admin.DevicePolicyResources.Strings.Launcher.WORK_PROFILE_PAUSED_DESCRIPTION;
import static android.app.admin.DevicePolicyResources.Strings.Launcher.WORK_PROFILE_PAUSED_TITLE;
import static android.app.admin.DevicePolicyResources.Strings.Launcher.WORK_PROFILE_PAUSE_BUTTON;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.BIOMETRIC_DIALOG_WORK_LOCK_FAILED_ATTEMPTS;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.BIOMETRIC_DIALOG_WORK_PASSWORD_LAST_ATTEMPT;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.BIOMETRIC_DIALOG_WORK_PATTERN_LAST_ATTEMPT;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.BIOMETRIC_DIALOG_WORK_PIN_LAST_ATTEMPT;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.KEYGUARD_MANAGEMENT_DISCLOSURE;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.KEYGUARD_NAMED_MANAGEMENT_DISCLOSURE;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.ONGOING_PRIVACY_DIALOG_WORK;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.QS_DIALOG_MANAGEMENT;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.QS_DIALOG_MANAGEMENT_CA_CERT;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.QS_DIALOG_MANAGEMENT_NAMED_VPN;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.QS_DIALOG_MANAGEMENT_NETWORK;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.QS_DIALOG_MANAGEMENT_TITLE;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.QS_DIALOG_MANAGEMENT_TWO_NAMED_VPN;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.QS_DIALOG_NAMED_MANAGEMENT;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.QS_DIALOG_PERSONAL_PROFILE_NAMED_VPN;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.QS_DIALOG_VIEW_POLICIES;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.QS_DIALOG_WORK_PROFILE_CA_CERT;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.QS_DIALOG_WORK_PROFILE_NAMED_VPN;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.QS_DIALOG_WORK_PROFILE_NETWORK;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.QS_MSG_MANAGEMENT;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.QS_MSG_MANAGEMENT_MONITORING;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.QS_MSG_MANAGEMENT_MULTIPLE_VPNS;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.QS_MSG_MANAGEMENT_NAMED_VPN;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.QS_MSG_NAMED_MANAGEMENT;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.QS_MSG_NAMED_MANAGEMENT_MONITORING;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.QS_MSG_NAMED_MANAGEMENT_MULTIPLE_VPNS;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.QS_MSG_NAMED_MANAGEMENT_NAMED_VPN;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.QS_MSG_NAMED_WORK_PROFILE_MONITORING;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.QS_MSG_PERSONAL_PROFILE_NAMED_VPN;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.QS_MSG_WORK_PROFILE_MONITORING;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.QS_MSG_WORK_PROFILE_NAMED_VPN;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.QS_MSG_WORK_PROFILE_NETWORK;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.STATUS_BAR_WORK_ICON_ACCESSIBILITY;
import static android.app.admin.DevicePolicyResources.Strings.SystemUi.WORK_LOCK_ACCESSIBILITY;
import android.annotation.IntDef;
import android.annotation.StringDef;
@@ -102,11 +137,30 @@ public final class DevicePolicyResources {
*/
@Retention(RetentionPolicy.SOURCE)
@StringDef({
// Launcher Strings
WORK_PROFILE_EDU, WORK_PROFILE_EDU_ACCEPT, WORK_PROFILE_PAUSED_TITLE,
WORK_PROFILE_PAUSED_DESCRIPTION, WORK_PROFILE_PAUSE_BUTTON, WORK_PROFILE_ENABLE_BUTTON,
ALL_APPS_WORK_TAB, ALL_APPS_PERSONAL_TAB, ALL_APPS_WORK_TAB_ACCESSIBILITY,
ALL_APPS_PERSONAL_TAB_ACCESSIBILITY, WORK_FOLDER_NAME, WIDGETS_WORK_TAB,
WIDGETS_PERSONAL_TAB, DISABLED_BY_ADMIN_MESSAGE
WIDGETS_PERSONAL_TAB, DISABLED_BY_ADMIN_MESSAGE,
// SysUI Strings
QS_MSG_MANAGEMENT, QS_MSG_NAMED_MANAGEMENT, QS_MSG_MANAGEMENT_MONITORING,
QS_MSG_NAMED_MANAGEMENT_MONITORING, QS_MSG_MANAGEMENT_NAMED_VPN,
QS_MSG_NAMED_MANAGEMENT_NAMED_VPN, QS_MSG_MANAGEMENT_MULTIPLE_VPNS,
QS_MSG_NAMED_MANAGEMENT_MULTIPLE_VPNS, QS_MSG_WORK_PROFILE_MONITORING,
QS_MSG_NAMED_WORK_PROFILE_MONITORING, QS_MSG_WORK_PROFILE_NETWORK,
QS_MSG_WORK_PROFILE_NAMED_VPN, QS_MSG_PERSONAL_PROFILE_NAMED_VPN,
QS_DIALOG_MANAGEMENT_TITLE, QS_DIALOG_VIEW_POLICIES, QS_DIALOG_MANAGEMENT,
QS_DIALOG_NAMED_MANAGEMENT, QS_DIALOG_MANAGEMENT_CA_CERT,
QS_DIALOG_WORK_PROFILE_CA_CERT, QS_DIALOG_MANAGEMENT_NETWORK,
QS_DIALOG_WORK_PROFILE_NETWORK, QS_DIALOG_MANAGEMENT_NAMED_VPN,
QS_DIALOG_MANAGEMENT_TWO_NAMED_VPN, QS_DIALOG_WORK_PROFILE_NAMED_VPN,
QS_DIALOG_PERSONAL_PROFILE_NAMED_VPN, BIOMETRIC_DIALOG_WORK_PIN_LAST_ATTEMPT,
BIOMETRIC_DIALOG_WORK_PATTERN_LAST_ATTEMPT, BIOMETRIC_DIALOG_WORK_PASSWORD_LAST_ATTEMPT,
BIOMETRIC_DIALOG_WORK_LOCK_FAILED_ATTEMPTS, STATUS_BAR_WORK_ICON_ACCESSIBILITY,
ONGOING_PRIVACY_DIALOG_WORK, KEYGUARD_MANAGEMENT_DISCLOSURE,
KEYGUARD_NAMED_MANAGEMENT_DISCLOSURE, WORK_LOCK_ACCESSIBILITY
})
public @interface UpdatableStringId {
}
@@ -296,6 +350,7 @@ public final class DevicePolicyResources {
private static Set<String> buildStringsSet() {
Set<String> strings = new HashSet<>();
strings.addAll(Launcher.buildStringsSet());
strings.addAll(SystemUi.buildStringsSet());
return strings;
}
@@ -404,5 +459,285 @@ public final class DevicePolicyResources {
return strings;
}
}
/**
* Class containing the identifiers used to update device management-related system strings
* in the SystemUi package.
*
* @hide
*/
public static final class SystemUi {
private SystemUi() {
}
/**
* Label in quick settings for toggling work profile on/off.
*/
public static final String QS_WORK_PROFILE_LABEL = "QS_WORK_PROFILE_LABEL";
/**
* Disclosure at the bottom of Quick Settings to indicate device management.
*/
public static final String QS_MSG_MANAGEMENT = "QS_MSG_MANAGEMENT";
/**
* Similar to {@link #QS_MSG_MANAGEMENT} but accepts the organization name as a
* param.
*/
public static final String QS_MSG_NAMED_MANAGEMENT = "QS_MSG_NAMED_MANAGEMENT";
/**
* Disclosure at the bottom of Quick Settings to indicate device management monitoring.
*/
public static final String QS_MSG_MANAGEMENT_MONITORING =
"QS_MSG_MANAGEMENT_MONITORING";
/**
* Similar to {@link #QS_MSG_MANAGEMENT_MONITORING} but accepts the
* organization name as a param.
*/
public static final String QS_MSG_NAMED_MANAGEMENT_MONITORING =
"QS_MSG_NAMED_MANAGEMENT_MONITORING";
/**
* Disclosure at the bottom of Quick Settings to indicate device management and the
* device is connected to a VPN, accepts VPN name as a param.
*/
public static final String QS_MSG_MANAGEMENT_NAMED_VPN =
"QS_MSG_MANAGEMENT_NAMED_VPN";
/**
* Similar to {@link #QS_MSG_MANAGEMENT_NAMED_VPN} but also accepts the
* organization name as a param.
*/
public static final String QS_MSG_NAMED_MANAGEMENT_NAMED_VPN =
"QS_MSG_NAMED_MANAGEMENT_NAMED_VPN";
/**
* Disclosure at the bottom of Quick Settings to indicate device management and the
* device is connected to multiple VPNs.
*/
public static final String QS_MSG_MANAGEMENT_MULTIPLE_VPNS =
"QS_MSG_MANAGEMENT_MULTIPLE_VPNS";
/**
* Similar to {@link #QS_MSG_MANAGEMENT_MULTIPLE_VPNS} but also accepts the
* organization name as a param.
*/
public static final String QS_MSG_NAMED_MANAGEMENT_MULTIPLE_VPNS =
"QS_MSG_NAMED_MANAGEMENT_MULTIPLE_VPNS";
/**
* Disclosure at the bottom of Quick Settings to indicate work profile monitoring.
*/
public static final String QS_MSG_WORK_PROFILE_MONITORING =
"QS_MSG_WORK_PROFILE_MONITORING";
/**
* Similar to {@link #QS_MSG_WORK_PROFILE_MONITORING} but accepts the
* organization name as a param.
*/
public static final String QS_MSG_NAMED_WORK_PROFILE_MONITORING =
"QS_MSG_NAMED_WORK_PROFILE_MONITORING";
/**
* Disclosure at the bottom of Quick Settings to indicate network activity is visible to
* admin.
*/
public static final String QS_MSG_WORK_PROFILE_NETWORK = "QS_MSG_WORK_PROFILE_NETWORK";
/**
* Disclosure at the bottom of Quick Settings to indicate work profile is connected to a
* VPN, accepts VPN name as a param.
*/
public static final String QS_MSG_WORK_PROFILE_NAMED_VPN =
"QS_MSG_WORK_PROFILE_NAMED_VPN";
/**
* Disclosure at the bottom of Quick Settings to indicate personal profile is connected
* to a VPN, accepts VPN name as a param.
*/
public static final String QS_MSG_PERSONAL_PROFILE_NAMED_VPN =
"QS_MSG_PERSONAL_PROFILE_NAMED_VPN";
/**
* Title for dialog to indicate device management.
*/
public static final String QS_DIALOG_MANAGEMENT_TITLE = "QS_DIALOG_MANAGEMENT_TITLE";
/**
* Label for button in the device management dialog to open a page with more information
* on the admin's abilities.
*/
public static final String QS_DIALOG_VIEW_POLICIES = "QS_DIALOG_VIEW_POLICIES";
/**
* Description for device management dialog to indicate admin abilities.
*/
public static final String QS_DIALOG_MANAGEMENT = "QS_DIALOG_MANAGEMENT";
/**
* Similar to {@link #QS_DIALOG_MANAGEMENT} but accepts the organization name as a
* param.
*/
public static final String QS_DIALOG_NAMED_MANAGEMENT = "QS_DIALOG_NAMED_MANAGEMENT";
/**
* Description for the managed device certificate authorities in the device management
* dialog.
*/
public static final String QS_DIALOG_MANAGEMENT_CA_CERT =
"QS_DIALOG_MANAGEMENT_CA_CERT";
/**
* Description for the work profile certificate authorities in the device management
* dialog.
*/
public static final String QS_DIALOG_WORK_PROFILE_CA_CERT =
"QS_DIALOG_WORK_PROFILE_CA_CERT";
/**
* Description for the managed device network logging in the device management dialog.
*/
public static final String QS_DIALOG_MANAGEMENT_NETWORK =
"QS_DIALOG_MANAGEMENT_NETWORK";
/**
* Description for the work profile network logging in the device management dialog.
*/
public static final String QS_DIALOG_WORK_PROFILE_NETWORK =
"QS_DIALOG_WORK_PROFILE_NETWORK";
/**
* Description for an active VPN in the device management dialog, accepts VPN name as a
* param.
*/
public static final String QS_DIALOG_MANAGEMENT_NAMED_VPN =
"QS_DIALOG_MANAGEMENT_NAMED_VPN";
/**
* Description for two active VPN in the device management dialog, accepts two VPN names
* as params.
*/
public static final String QS_DIALOG_MANAGEMENT_TWO_NAMED_VPN =
"QS_DIALOG_MANAGEMENT_TWO_NAMED_VPN";
/**
* Description for an active work profile VPN in the device management dialog, accepts
* VPN name as a param.
*/
public static final String QS_DIALOG_WORK_PROFILE_NAMED_VPN =
"QS_DIALOG_WORK_PROFILE_NAMED_VPN";
/**
* Description for an active personal profile VPN in the device management dialog,
* accepts VPN name as a param.
*/
public static final String QS_DIALOG_PERSONAL_PROFILE_NAMED_VPN =
"QS_DIALOG_PERSONAL_PROFILE_NAMED_VPN";
/**
* Content of a dialog shown when the user only has one attempt left to provide the
* correct pin before the work profile is removed.
*/
public static final String BIOMETRIC_DIALOG_WORK_PIN_LAST_ATTEMPT =
"BIOMETRIC_DIALOG_WORK_PIN_LAST_ATTEMPT";
/**
* Content of a dialog shown when the user only has one attempt left to provide the
* correct pattern before the work profile is removed.
*/
public static final String BIOMETRIC_DIALOG_WORK_PATTERN_LAST_ATTEMPT =
"BIOMETRIC_DIALOG_WORK_PATTERN_LAST_ATTEMPT";
/**
* Content of a dialog shown when the user only has one attempt left to provide the
* correct password before the work profile is removed.
*/
public static final String BIOMETRIC_DIALOG_WORK_PASSWORD_LAST_ATTEMPT =
"BIOMETRIC_DIALOG_WORK_PASSWORD_LAST_ATTEMPT";
/**
* Content of a dialog shown when the user has failed to provide the work lock too many
* times and the work profile is removed.
*/
public static final String BIOMETRIC_DIALOG_WORK_LOCK_FAILED_ATTEMPTS =
"BIOMETRIC_DIALOG_WORK_LOCK_FAILED_ATTEMPTS";
/**
* Accessibility label for managed profile icon in the status bar
*/
public static final String STATUS_BAR_WORK_ICON_ACCESSIBILITY =
"STATUS_BAR_WORK_ICON_ACCESSIBILITY";
/**
* Text appended to privacy dialog, indicating that the application is in the work
* profile.
*/
public static final String ONGOING_PRIVACY_DIALOG_WORK =
"ONGOING_PRIVACY_DIALOG_WORK";
/**
* Text on keyguard screen indicating device management.
*/
public static final String KEYGUARD_MANAGEMENT_DISCLOSURE =
"KEYGUARD_MANAGEMENT_DISCLOSURE";
/**
* Similar to {@link #KEYGUARD_MANAGEMENT_DISCLOSURE} but also accepts organization name
* as a param.
*/
public static final String KEYGUARD_NAMED_MANAGEMENT_DISCLOSURE =
"KEYGUARD_NAMED_MANAGEMENT_DISCLOSURE";
/**
* Content description for the work profile lock screen.
*/
public static final String WORK_LOCK_ACCESSIBILITY = "WORK_LOCK_ACCESSIBILITY";
/**
* @hide
*/
static Set<String> buildStringsSet() {
Set<String> strings = new HashSet<>();
strings.add(QS_WORK_PROFILE_LABEL);
strings.add(QS_MSG_MANAGEMENT);
strings.add(QS_MSG_NAMED_MANAGEMENT);
strings.add(QS_MSG_MANAGEMENT_MONITORING);
strings.add(QS_MSG_NAMED_MANAGEMENT_MONITORING);
strings.add(QS_MSG_MANAGEMENT_NAMED_VPN);
strings.add(QS_MSG_NAMED_MANAGEMENT_NAMED_VPN);
strings.add(QS_MSG_MANAGEMENT_MULTIPLE_VPNS);
strings.add(QS_MSG_NAMED_MANAGEMENT_MULTIPLE_VPNS);
strings.add(QS_MSG_WORK_PROFILE_MONITORING);
strings.add(QS_MSG_NAMED_WORK_PROFILE_MONITORING);
strings.add(QS_MSG_WORK_PROFILE_NETWORK);
strings.add(QS_MSG_WORK_PROFILE_NAMED_VPN);
strings.add(QS_MSG_PERSONAL_PROFILE_NAMED_VPN);
strings.add(QS_DIALOG_MANAGEMENT_TITLE);
strings.add(QS_DIALOG_VIEW_POLICIES);
strings.add(QS_DIALOG_MANAGEMENT);
strings.add(QS_DIALOG_NAMED_MANAGEMENT);
strings.add(QS_DIALOG_MANAGEMENT_CA_CERT);
strings.add(QS_DIALOG_WORK_PROFILE_CA_CERT);
strings.add(QS_DIALOG_MANAGEMENT_NETWORK);
strings.add(QS_DIALOG_WORK_PROFILE_NETWORK);
strings.add(QS_DIALOG_MANAGEMENT_NAMED_VPN);
strings.add(QS_DIALOG_MANAGEMENT_TWO_NAMED_VPN);
strings.add(QS_DIALOG_WORK_PROFILE_NAMED_VPN);
strings.add(QS_DIALOG_PERSONAL_PROFILE_NAMED_VPN);
strings.add(BIOMETRIC_DIALOG_WORK_PIN_LAST_ATTEMPT);
strings.add(BIOMETRIC_DIALOG_WORK_PATTERN_LAST_ATTEMPT);
strings.add(BIOMETRIC_DIALOG_WORK_PASSWORD_LAST_ATTEMPT);
strings.add(BIOMETRIC_DIALOG_WORK_LOCK_FAILED_ATTEMPTS);
strings.add(STATUS_BAR_WORK_ICON_ACCESSIBILITY);
strings.add(ONGOING_PRIVACY_DIALOG_WORK);
strings.add(KEYGUARD_MANAGEMENT_DISCLOSURE);
strings.add(KEYGUARD_NAMED_MANAGEMENT_DISCLOSURE);
strings.add(WORK_LOCK_ACCESSIBILITY);
return strings;
}
}
}
}

View File

@@ -216,6 +216,35 @@ public final class ParcelableResource implements Parcelable {
}
}
/**
* Loads the string with id {@code mResourceId} from {@code mPackageName} using the
* configuration returned from {@link Resources#getConfiguration} of the provided
* {@code context}.
*
* <p>Returns the default string by calling {@code defaultStringLoader} if the updated
* string was not found or could not be loaded.</p>
*/
@Nullable
public String getString(
Context context,
@NonNull Callable<String> defaultStringLoader,
@NonNull Object... formatArgs) {
// TODO(b/203548565): properly handle edge case when the device manager role holder is
// unavailable because it's being updated.
try {
Resources resources = getAppResourcesWithCallersConfiguration(context);
verifyResourceName(resources);
String rawString = resources.getString(mResourceId);
return String.format(
context.getResources().getConfiguration().getLocales().get(0),
rawString,
formatArgs);
} catch (PackageManager.NameNotFoundException | RuntimeException e) {
Slog.e(TAG, "Unable to load string resource " + mResourceName, e);
return loadDefaultString(defaultStringLoader);
}
}
private Resources getAppResourcesWithCallersConfiguration(Context context)
throws PackageManager.NameNotFoundException {
PackageManager pm = context.getPackageManager();