RESTRICT AUTOMERGE move device policy resource APIs to a separate class

Bug: 217388602
Test: atest EnterpriseResourcesTests
Change-Id: I83b399f36dfe3ba93d625807659dee59d872097e
This commit is contained in:
kholoud mohamed
2022-03-11 15:39:19 +00:00
parent 81709c37b8
commit 832f2b114b
9 changed files with 567 additions and 482 deletions

View File

@@ -7418,12 +7418,6 @@ package android.app.admin {
method @NonNull public java.util.List<java.lang.String> getDelegatedScopes(@Nullable android.content.ComponentName, @NonNull String);
method public CharSequence getDeviceOwnerLockScreenInfo();
method @Nullable public String getDevicePolicyManagementRoleHolderPackage();
method @Nullable public android.graphics.drawable.Drawable getDrawable(@NonNull String, @NonNull String, @NonNull java.util.function.Supplier<android.graphics.drawable.Drawable>);
method @Nullable public android.graphics.drawable.Drawable getDrawable(@NonNull String, @NonNull String, @NonNull String, @NonNull java.util.function.Supplier<android.graphics.drawable.Drawable>);
method @Nullable public android.graphics.drawable.Icon getDrawableAsIcon(@NonNull String, @NonNull String, @NonNull String, @Nullable android.graphics.drawable.Icon);
method @Nullable public android.graphics.drawable.Icon getDrawableAsIcon(@NonNull String, @NonNull String, @Nullable android.graphics.drawable.Icon);
method @Nullable public android.graphics.drawable.Drawable getDrawableForDensity(@NonNull String, @NonNull String, int, @NonNull java.util.function.Supplier<android.graphics.drawable.Drawable>);
method @Nullable public android.graphics.drawable.Drawable getDrawableForDensity(@NonNull String, @NonNull String, @NonNull String, int, @NonNull java.util.function.Supplier<android.graphics.drawable.Drawable>);
method public CharSequence getEndUserSessionMessage(@NonNull android.content.ComponentName);
method @NonNull public String getEnrollmentSpecificId();
method @Nullable public android.app.admin.FactoryResetProtectionPolicy getFactoryResetProtectionPolicy(@Nullable android.content.ComponentName);
@@ -7470,14 +7464,13 @@ package android.app.admin {
method @NonNull public java.util.List<android.app.admin.PreferentialNetworkServiceConfig> getPreferentialNetworkServiceConfigs();
method public int getRequiredPasswordComplexity();
method public long getRequiredStrongAuthTimeout(@Nullable android.content.ComponentName);
method @NonNull public android.app.admin.DevicePolicyResourcesManager getResources();
method public boolean getScreenCaptureDisabled(@Nullable android.content.ComponentName);
method public java.util.List<android.os.UserHandle> getSecondaryUsers(@NonNull android.content.ComponentName);
method public CharSequence getShortSupportMessage(@NonNull android.content.ComponentName);
method public CharSequence getStartUserSessionMessage(@NonNull android.content.ComponentName);
method @Deprecated public boolean getStorageEncryption(@Nullable android.content.ComponentName);
method public int getStorageEncryptionStatus();
method @Nullable public String getString(@NonNull String, @NonNull java.util.function.Supplier<java.lang.String>);
method @Nullable public String getString(@NonNull String, @NonNull java.util.function.Supplier<java.lang.String>, @NonNull java.lang.Object...);
method @Nullable public android.app.admin.SystemUpdatePolicy getSystemUpdatePolicy();
method @Nullable public android.os.PersistableBundle getTransferOwnershipBundle();
method @Nullable public java.util.List<android.os.PersistableBundle> getTrustAgentConfiguration(@Nullable android.content.ComponentName, @NonNull android.content.ComponentName);
@@ -7842,6 +7835,17 @@ package android.app.admin {
field public static final String UNDEFINED = "UNDEFINED";
}
public class DevicePolicyResourcesManager {
method @Nullable public android.graphics.drawable.Drawable getDrawable(@NonNull String, @NonNull String, @NonNull java.util.function.Supplier<android.graphics.drawable.Drawable>);
method @Nullable public android.graphics.drawable.Drawable getDrawable(@NonNull String, @NonNull String, @NonNull String, @NonNull java.util.function.Supplier<android.graphics.drawable.Drawable>);
method @Nullable public android.graphics.drawable.Icon getDrawableAsIcon(@NonNull String, @NonNull String, @NonNull String, @Nullable android.graphics.drawable.Icon);
method @Nullable public android.graphics.drawable.Icon getDrawableAsIcon(@NonNull String, @NonNull String, @Nullable android.graphics.drawable.Icon);
method @Nullable public android.graphics.drawable.Drawable getDrawableForDensity(@NonNull String, @NonNull String, int, @NonNull java.util.function.Supplier<android.graphics.drawable.Drawable>);
method @Nullable public android.graphics.drawable.Drawable getDrawableForDensity(@NonNull String, @NonNull String, @NonNull String, int, @NonNull java.util.function.Supplier<android.graphics.drawable.Drawable>);
method @Nullable public String getString(@NonNull String, @NonNull java.util.function.Supplier<java.lang.String>);
method @Nullable public String getString(@NonNull String, @NonNull java.util.function.Supplier<java.lang.String>, @NonNull java.lang.Object...);
}
public final class DnsEvent extends android.app.admin.NetworkEvent implements android.os.Parcelable {
method public String getHostname();
method public java.util.List<java.net.InetAddress> getInetAddresses();

View File

@@ -1109,16 +1109,12 @@ package android.app.admin {
method @RequiresPermission("android.permission.NOTIFY_PENDING_SYSTEM_UPDATE") public void notifyPendingSystemUpdate(long, boolean);
method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public boolean packageHasActiveAdmins(String);
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS, android.Manifest.permission.PROVISION_DEMO_DEVICE}) public void provisionFullyManagedDevice(@NonNull android.app.admin.FullyManagedDeviceProvisioningParams) throws android.app.admin.ProvisioningException;
method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_MANAGEMENT_RESOURCES) public void resetDrawables(@NonNull java.util.Set<java.lang.String>);
method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_MANAGEMENT_RESOURCES) public void resetStrings(@NonNull java.util.Set<java.lang.String>);
method @RequiresPermission(android.Manifest.permission.TRIGGER_LOST_MODE) public void sendLostModeLocationUpdate(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>);
method @Deprecated @RequiresPermission(android.Manifest.permission.MANAGE_DEVICE_ADMINS) public boolean setActiveProfileOwner(@NonNull android.content.ComponentName, String) throws java.lang.IllegalArgumentException;
method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public void setDeviceProvisioningConfigApplied();
method @RequiresPermission(android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS) public void setDpcDownloaded(boolean);
method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_MANAGEMENT_RESOURCES) public void setDrawables(@NonNull java.util.Set<android.app.admin.DevicePolicyDrawableResource>);
method @Deprecated @RequiresPermission(value=android.Manifest.permission.GRANT_PROFILE_OWNER_DEVICE_IDS_ACCESS, conditional=true) public void setProfileOwnerCanAccessDeviceIds(@NonNull android.content.ComponentName);
method public void setSecondaryLockscreenEnabled(@NonNull android.content.ComponentName, boolean);
method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_MANAGEMENT_RESOURCES) public void setStrings(@NonNull java.util.Set<android.app.admin.DevicePolicyStringResource>);
method @RequiresPermission(android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS) public void setUserProvisioningState(int, @NonNull android.os.UserHandle);
method @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public boolean shouldAllowBypassingDevicePolicyManagementRoleQualification();
field public static final String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED = "android.account.DEVICE_OR_PROFILE_OWNER_ALLOWED";
@@ -1209,6 +1205,13 @@ package android.app.admin {
field public static final String WORK_PROFILE_DEFAULT_APPS_TITLE = "PermissionController.WORK_PROFILE_DEFAULT_APPS_TITLE";
}
public class DevicePolicyResourcesManager {
method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_MANAGEMENT_RESOURCES) public void resetDrawables(@NonNull java.util.Set<java.lang.String>);
method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_MANAGEMENT_RESOURCES) public void resetStrings(@NonNull java.util.Set<java.lang.String>);
method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_MANAGEMENT_RESOURCES) public void setDrawables(@NonNull java.util.Set<android.app.admin.DevicePolicyDrawableResource>);
method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_MANAGEMENT_RESOURCES) public void setStrings(@NonNull java.util.Set<android.app.admin.DevicePolicyStringResource>);
}
public final class DevicePolicyStringResource implements android.os.Parcelable {
ctor public DevicePolicyStringResource(@NonNull android.content.Context, @NonNull String, @StringRes int);
method public int describeContents();

View File

@@ -28,7 +28,7 @@ import java.util.Objects;
/**
* Used to pass in the required information for updating an enterprise drawable resource using
* {@link DevicePolicyManager#setDrawables}.
* {@link DevicePolicyResourcesManager#setDrawables}.
*
* @hide
*/
@@ -42,7 +42,7 @@ public final class DevicePolicyDrawableResource implements Parcelable {
/**
* Creates an object containing the required information for updating an enterprise drawable
* resource using {@link DevicePolicyManager#setDrawables}.
* resource using {@link DevicePolicyResourcesManager#setDrawables}.
*
* <p>It will be used to update the drawable defined by {@code drawableId} with style
* {@code drawableStyle} located in source {@code drawableSource} to the drawable with ID
@@ -89,7 +89,7 @@ public final class DevicePolicyDrawableResource implements Parcelable {
/**
* Creates an object containing the required information for updating an enterprise drawable
* resource using {@link DevicePolicyManager#setDrawables}.
* resource using {@link DevicePolicyResourcesManager#setDrawables}.
* <p>It will be used to update the drawable defined by {@code drawableId} with style
* {@code drawableStyle} to the drawable with ID {@code resourceIdInCallingPackage} in the
* calling package</p>

View File

@@ -174,6 +174,7 @@ public class DevicePolicyManager {
private final Context mContext;
private final IDevicePolicyManager mService;
private final boolean mParentInstance;
private final DevicePolicyResourcesManager mResourcesManager;
/** @hide */
public DevicePolicyManager(Context context, IDevicePolicyManager service) {
@@ -187,6 +188,7 @@ public class DevicePolicyManager {
mContext = context;
mService = service;
mParentInstance = parentInstance;
mResourcesManager = new DevicePolicyResourcesManager(context, service);
}
/** @hide test will override it. */
@@ -3746,7 +3748,8 @@ public class DevicePolicyManager {
/**
* Broadcast action: notify system apps (e.g. settings, SysUI, etc) that the device management
* resources with IDs {@link #EXTRA_RESOURCE_IDS} has been updated, the updated resources can be
* retrieved using {@link #getDrawable} and {@code #getString}.
* retrieved using {@link DevicePolicyResourcesManager#getDrawable} and
* {@link DevicePolicyResourcesManager#getString}.
*
* <p>This broadcast is sent to registered receivers only.
*
@@ -15303,469 +15306,12 @@ public class DevicePolicyManager {
}
/**
* For each {@link DevicePolicyDrawableResource} item in {@code drawables}, if
* {@link DevicePolicyDrawableResource#getDrawableSource()} is not set, it updates the drawable
* resource for the combination of {@link DevicePolicyDrawableResource#getDrawableId()} and
* {@link DevicePolicyDrawableResource#getDrawableStyle()} to the drawable with resource ID
* {@link DevicePolicyDrawableResource#getResourceIdInCallingPackage()},
* meaning any system UI surface calling {@link #getDrawable} with {@code drawableId} and
* {@code drawableStyle} will get the new resource after this API is called.
*
* <p>Otherwise, if {@link DevicePolicyDrawableResource#getDrawableSource()} is set, it
* overrides any drawables that was set for the same {@code drawableId} and
* {@code drawableStyle} for the provided source.
*
* <p>Sends a broadcast with action {@link #ACTION_DEVICE_POLICY_RESOURCE_UPDATED} to
* registered receivers when a resource has been updated successfully.
*
* <p>Important notes to consider when using this API:
* <ul>
* <li>{@link #getDrawable} references the resource
* {@link DevicePolicyDrawableResource#getResourceIdInCallingPackage()} in the
* calling package each time it gets called. You have to ensure that the resource is always
* available in the calling package as long as it is used as an updated resource.
* <li>You still have to re-call {@code setDrawables} even if you only make changes to the
* content of the resource with ID
* {@link DevicePolicyDrawableResource#getResourceIdInCallingPackage()} as the content might be
* cached and would need updating.
* </ul>
*
* @param drawables The list of {@link DevicePolicyDrawableResource} to update.
*
* @hide
* Returns a {@link DevicePolicyResourcesManager} containing the required APIs to set, reset,
* and get device policy related resources.
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void setDrawables(@NonNull Set<DevicePolicyDrawableResource> drawables) {
if (mService != null) {
try {
mService.setDrawables(new ArrayList<>(drawables));
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
}
/**
* Removes all updated drawables for the list of {@code drawableIds} that was previously set by
* calling {@link #setDrawables}, meaning any subsequent calls to {@link #getDrawable} for the
* provided IDs with any {@code drawableStyle} and any {@code drawableSource} will return the
* default drawable from {@code defaultDrawableLoader}.
*
* <p>Sends a broadcast with action {@link #ACTION_DEVICE_POLICY_RESOURCE_UPDATED} to
* registered receivers when a resource has been reset successfully.
*
* @param drawableIds The list of IDs to remove.
*
* @hide
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void resetDrawables(@NonNull Set<String> drawableIds) {
if (mService != null) {
try {
mService.resetDrawables(new ArrayList<>(drawableIds));
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
}
/**
* Returns the appropriate updated drawable for the {@code drawableId} with style
* {@code drawableStyle} if one was set using {@code setDrawables}, otherwise returns the
* drawable from {@code defaultDrawableLoader}.
*
* <p>Also returns the drawable from {@code defaultDrawableLoader} if {@code drawableId}
* is {@link DevicePolicyResources#UNDEFINED}.
*
* <p>Calls to this API will not return {@code null} unless no updated drawable was found
* and the call to {@code defaultDrawableLoader} returned {@code null}.
*
* <p>This API uses the screen density returned from {@link Resources#getConfiguration()}, to
* set a different value use
* {@link #getDrawableForDensity(String, String, int, Supplier)}.
*
* <p>Callers should register for {@link #ACTION_DEVICE_POLICY_RESOURCE_UPDATED} to get
* notified when a resource has been updated.
*
* <p>Note that each call to this API loads the resource from the package that called
* {@code setDrawables} to set the updated resource.
*
* @param drawableId The drawable ID to get the updated resource for.
* @param drawableStyle The drawable style to use.
* @param defaultDrawableLoader To get the default drawable if no updated drawable was set for
* the provided params.
*/
@Nullable
public Drawable getDrawable(
@NonNull String drawableId,
@NonNull String drawableStyle,
@NonNull Supplier<Drawable> defaultDrawableLoader) {
return getDrawable(
drawableId, drawableStyle, DevicePolicyResources.UNDEFINED, defaultDrawableLoader);
}
/**
* Similar to {@link #getDrawable(String, String, Supplier)}, but also accepts
* a {@code drawableSource} which could result in returning a different drawable than
* {@link #getDrawable(String, String, Supplier)} if an override was set for that specific
* source.
*
* <p> If {@code drawableSource} is {@link DevicePolicyResources#UNDEFINED}, it returns the
* appropriate string for {@code drawableId} and {@code drawableStyle} similar to
* {@link #getDrawable(String, String, Supplier)}.
*
* <p>Calls to this API will not return {@code null} unless no updated drawable was found
* and the call to {@code defaultDrawableLoader} returned {@code null}.
*
* <p>Callers should register for {@link #ACTION_DEVICE_POLICY_RESOURCE_UPDATED} to get
* notified when a resource has been updated.
*
* @param drawableId The drawable ID to get the updated resource for.
* @param drawableStyle The drawable style to use.
* @param drawableSource The source for the caller.
* @param defaultDrawableLoader To get the default drawable if no updated drawable was set for
* the provided params.
*/
@Nullable
public Drawable getDrawable(
@NonNull String drawableId,
@NonNull String drawableStyle,
@NonNull String drawableSource,
@NonNull Supplier<Drawable> defaultDrawableLoader) {
Objects.requireNonNull(drawableId, "drawableId can't be null");
Objects.requireNonNull(drawableStyle, "drawableStyle can't be null");
Objects.requireNonNull(drawableSource, "drawableSource can't be null");
Objects.requireNonNull(defaultDrawableLoader, "defaultDrawableLoader can't be null");
if (drawableId.equals(DevicePolicyResources.UNDEFINED)) {
return ParcelableResource.loadDefaultDrawable(defaultDrawableLoader);
}
if (mService != null) {
try {
ParcelableResource resource = mService.getDrawable(
drawableId, drawableStyle, drawableSource);
if (resource == null) {
return ParcelableResource.loadDefaultDrawable(
defaultDrawableLoader);
}
return resource.getDrawable(
mContext,
/* density= */ 0,
defaultDrawableLoader);
} catch (RemoteException e) {
Log.e(
TAG,
"Error getting the updated drawable from DevicePolicyManagerService.",
e);
return ParcelableResource.loadDefaultDrawable(defaultDrawableLoader);
}
}
return ParcelableResource.loadDefaultDrawable(defaultDrawableLoader);
}
/**
* Similar to {@link #getDrawable(String, String, Supplier)}, but also accepts
* {@code density}. See {@link Resources#getDrawableForDensity(int, int, Resources.Theme)}.
*
* <p>Calls to this API will not return {@code null} unless no updated drawable was found
* and the call to {@code defaultDrawableLoader} returned {@code null}.
*
* <p>Callers should register for {@link #ACTION_DEVICE_POLICY_RESOURCE_UPDATED} to get
* notified when a resource has been updated.
*
* @param drawableId The drawable ID to get the updated resource for.
* @param drawableStyle The drawable style to use.
* @param density The desired screen density indicated by the resource as
* found in {@link DisplayMetrics}. A value of 0 means to use the
* density returned from {@link Resources#getConfiguration()}.
* @param defaultDrawableLoader To get the default drawable if no updated drawable was set for
* the provided params.
*/
@Nullable
public Drawable getDrawableForDensity(
@NonNull String drawableId,
@NonNull String drawableStyle,
int density,
@NonNull Supplier<Drawable> defaultDrawableLoader) {
return getDrawableForDensity(
drawableId,
drawableStyle,
DevicePolicyResources.UNDEFINED,
density,
defaultDrawableLoader);
}
/**
* Similar to {@link #getDrawable(String, String, String, Supplier)}, but also accepts
* {@code density}. See {@link Resources#getDrawableForDensity(int, int, Resources.Theme)}.
*
* <p>Calls to this API will not return {@code null} unless no updated drawable was found
* and the call to {@code defaultDrawableLoader} returned {@code null}.
*
* <p>Callers should register for {@link #ACTION_DEVICE_POLICY_RESOURCE_UPDATED} to get
* notified when a resource has been updated.
*
* @param drawableId The drawable ID to get the updated resource for.
* @param drawableStyle The drawable style to use.
* @param drawableSource The source for the caller.
* @param density The desired screen density indicated by the resource as
* found in {@link DisplayMetrics}. A value of 0 means to use the
* density returned from {@link Resources#getConfiguration()}.
* @param defaultDrawableLoader To get the default drawable if no updated drawable was set for
* the provided params.
*/
@Nullable
public Drawable getDrawableForDensity(
@NonNull String drawableId,
@NonNull String drawableStyle,
@NonNull String drawableSource,
int density,
@NonNull Supplier<Drawable> defaultDrawableLoader) {
Objects.requireNonNull(drawableId, "drawableId can't be null");
Objects.requireNonNull(drawableStyle, "drawableStyle can't be null");
Objects.requireNonNull(drawableSource, "drawableSource can't be null");
Objects.requireNonNull(defaultDrawableLoader, "defaultDrawableLoader can't be null");
if (drawableId.equals(DevicePolicyResources.UNDEFINED)) {
return ParcelableResource.loadDefaultDrawable(defaultDrawableLoader);
}
if (mService != null) {
try {
ParcelableResource resource = mService.getDrawable(
drawableId, drawableStyle, drawableSource);
if (resource == null) {
return ParcelableResource.loadDefaultDrawable(
defaultDrawableLoader);
}
return resource.getDrawable(mContext, density, defaultDrawableLoader);
} catch (RemoteException e) {
Log.e(
TAG,
"Error getting the updated drawable from DevicePolicyManagerService.",
e);
return ParcelableResource.loadDefaultDrawable(defaultDrawableLoader);
}
}
return ParcelableResource.loadDefaultDrawable(defaultDrawableLoader);
}
/**
* Similar to {@link #getDrawable(String, String, String, Supplier)} but returns an
* {@link Icon} instead of a {@link Drawable}.
*
* @param drawableId The drawable ID to get the updated resource for.
* @param drawableStyle The drawable style to use.
* @param drawableSource The source for the caller.
* @param defaultIcon Returned if no updated drawable was set for the provided params.
*/
@Nullable
public Icon getDrawableAsIcon(
@NonNull String drawableId,
@NonNull String drawableStyle,
@NonNull String drawableSource,
@Nullable Icon defaultIcon) {
Objects.requireNonNull(drawableId, "drawableId can't be null");
Objects.requireNonNull(drawableStyle, "drawableStyle can't be null");
Objects.requireNonNull(drawableSource, "drawableSource can't be null");
Objects.requireNonNull(defaultIcon, "defaultIcon can't be null");
if (drawableId.equals(DevicePolicyResources.UNDEFINED)) {
return defaultIcon;
}
if (mService != null) {
try {
ParcelableResource resource = mService.getDrawable(
drawableId, drawableStyle, drawableSource);
if (resource == null) {
return defaultIcon;
}
return Icon.createWithResource(resource.getPackageName(), resource.getResourceId());
} catch (RemoteException e) {
Log.e(
TAG,
"Error getting the updated drawable from DevicePolicyManagerService.",
e);
return defaultIcon;
}
}
return defaultIcon;
}
/**
* Similar to {@link #getDrawable(String, String, Supplier)} but returns an {@link Icon}
* instead of a {@link Drawable}.
*
* @param drawableId The drawable ID to get the updated resource for.
* @param drawableStyle The drawable style to use.
* @param defaultIcon Returned if no updated drawable was set for the provided params.
*/
@Nullable
public Icon getDrawableAsIcon(
@NonNull String drawableId,
@NonNull String drawableStyle,
@Nullable Icon defaultIcon) {
return getDrawableAsIcon(
drawableId, drawableStyle, DevicePolicyResources.UNDEFINED, defaultIcon);
}
/**
* For each {@link DevicePolicyStringResource} item in {@code strings}, it updates the string
* resource for {@link DevicePolicyStringResource#getStringId()} to the string with ID
* {@code callingPackageResourceId}, meaning any system UI surface calling {@link #getString}
* with {@code stringId} will get the new resource after this API is called.
*
* <p>Sends a broadcast with action {@link #ACTION_DEVICE_POLICY_RESOURCE_UPDATED} to
* registered receivers when a resource has been updated successfully.
*
* <p>Important notes to consider when using this API:
* <ul>
* <li> {@link #getString} references the resource {@code callingPackageResourceId} in the
* calling package each time it gets called. You have to ensure that the resource is always
* available in the calling package as long as it is used as an updated resource.
* <li> You still have to re-call {@code setStrings} even if you only make changes to the
* content of the resource with ID {@code callingPackageResourceId} as the content might be
* cached and would need updating.
* </ul>
*
* @param strings The list of {@link DevicePolicyStringResource} to update.
*
* @hide
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void setStrings(@NonNull Set<DevicePolicyStringResource> strings) {
if (mService != null) {
try {
mService.setStrings(new ArrayList<>(strings));
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
}
/**
* Removes the updated strings for the list of {@code stringIds} that was previously set by
* calling {@link #setStrings}, meaning any subsequent calls to {@link #getString} for the
* provided IDs will return the default string from {@code defaultStringLoader}.
*
* <p>Sends a broadcast with action {@link #ACTION_DEVICE_POLICY_RESOURCE_UPDATED} to
* registered receivers when a resource has been reset successfully.
*
* @param stringIds The list of IDs to remove the updated resources for.
*
* @hide
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void resetStrings(@NonNull Set<String> stringIds) {
if (mService != null) {
try {
mService.resetStrings(new ArrayList<>(stringIds));
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
}
/**
* Returns the appropriate updated string for the {@code stringId} (see
* {@link DevicePolicyResources.Strings}) if one was set using
* {@code setStrings}, otherwise returns the string from {@code defaultStringLoader}.
*
* <p>Also returns the string from {@code defaultStringLoader} if {@code stringId} is
* {@link DevicePolicyResources#UNDEFINED}.
*
* <p>Calls to this API will not return {@code null} unless no updated drawable was found
* and the call to {@code defaultStringLoader} returned {@code null}.
*
* <p>Callers should register for {@link #ACTION_DEVICE_POLICY_RESOURCE_UPDATED} to get
* notified when a resource has been updated.
*
* <p>Note that each call to this API loads the resource from the package that called
* {@code setStrings} to set the updated resource.
*
* @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}.
*/
@Nullable
public String getString(
@NonNull String stringId,
@NonNull Supplier<String> defaultStringLoader) {
Objects.requireNonNull(stringId, "stringId can't be null");
Objects.requireNonNull(defaultStringLoader, "defaultStringLoader can't be null");
if (stringId.equals(DevicePolicyResources.UNDEFINED)) {
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);
} 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, Supplier)} 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>Calls to this API will not return {@code null} unless no updated drawable was found
* and the call to {@code defaultStringLoader} returned {@code null}.
*
* @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.
*/
@Nullable
@SuppressLint("SamShouldBeLast")
public String getString(
@NonNull String stringId,
@NonNull Supplier<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.UNDEFINED)) {
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,
"Error getting the updated string from DevicePolicyManagerService.",
e);
return ParcelableResource.loadDefaultString(defaultStringLoader);
}
}
return ParcelableResource.loadDefaultString(defaultStringLoader);
@NonNull
public DevicePolicyResourcesManager getResources() {
return mResourcesManager;
}
/**

View File

@@ -22,7 +22,8 @@ import android.os.UserHandle;
/**
* Class containing the required identifiers to update device management resources.
*
* <p>See {@link DevicePolicyManager#getDrawable} and {@link DevicePolicyManager#getString}.
* <p>See {@link DevicePolicyResourcesManager#getDrawable} and
* {@link DevicePolicyResourcesManager#getString}.
*/
public final class DevicePolicyResources {

View File

@@ -0,0 +1,528 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.app.admin;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
import android.os.RemoteException;
import android.util.DisplayMetrics;
import android.util.Log;
import java.util.ArrayList;
import java.util.Objects;
import java.util.Set;
import java.util.function.Supplier;
/**
* Class containing required APIs to set, reset, and get device policy related resources.
*/
public class DevicePolicyResourcesManager {
private static String TAG = "DevicePolicyResourcesManager";
private final Context mContext;
private final IDevicePolicyManager mService;
/**
* @hide
*/
protected DevicePolicyResourcesManager(Context context, IDevicePolicyManager service) {
mContext = context;
mService = service;
}
/**
* For each {@link DevicePolicyDrawableResource} item in {@code drawables}, if
* {@link DevicePolicyDrawableResource#getDrawableSource()} is not set, it updates the drawable
* resource for the combination of {@link DevicePolicyDrawableResource#getDrawableId()} and
* {@link DevicePolicyDrawableResource#getDrawableStyle()} to the drawable with resource ID
* {@link DevicePolicyDrawableResource#getResourceIdInCallingPackage()},
* meaning any system UI surface calling {@link #getDrawable} with {@code drawableId} and
* {@code drawableStyle} will get the new resource after this API is called.
*
* <p>Otherwise, if {@link DevicePolicyDrawableResource#getDrawableSource()} is set, it
* overrides any drawables that was set for the same {@code drawableId} and
* {@code drawableStyle} for the provided source.
*
* <p>Sends a broadcast with action
* {@link DevicePolicyManager#ACTION_DEVICE_POLICY_RESOURCE_UPDATED} to registered receivers
* when a resource has been updated successfully.
*
* <p>Important notes to consider when using this API:
* <ul>
* <li>{@link #getDrawable} references the resource
* {@link DevicePolicyDrawableResource#getResourceIdInCallingPackage()} in the
* calling package each time it gets called. You have to ensure that the resource is always
* available in the calling package as long as it is used as an updated resource.
* <li>You still have to re-call {@code setDrawables} even if you only make changes to the
* content of the resource with ID
* {@link DevicePolicyDrawableResource#getResourceIdInCallingPackage()} as the content might be
* cached and would need updating.
* </ul>
*
* @param drawables The list of {@link DevicePolicyDrawableResource} to update.
*
* @hide
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void setDrawables(@NonNull Set<DevicePolicyDrawableResource> drawables) {
if (mService != null) {
try {
mService.setDrawables(new ArrayList<>(drawables));
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
}
/**
* Removes all updated drawables for the list of {@code drawableIds} that was previously set by
* calling {@link #setDrawables}, meaning any subsequent calls to {@link #getDrawable} for the
* provided IDs with any {@code drawableStyle} and any {@code drawableSource} will return the
* default drawable from {@code defaultDrawableLoader}.
*
* <p>Sends a broadcast with action
* {@link DevicePolicyManager#ACTION_DEVICE_POLICY_RESOURCE_UPDATED} to registered receivers
* when a resource has been reset successfully.
*
* @param drawableIds The list of IDs to remove.
*
* @hide
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void resetDrawables(@NonNull Set<String> drawableIds) {
if (mService != null) {
try {
mService.resetDrawables(new ArrayList<>(drawableIds));
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
}
/**
* Returns the appropriate updated drawable for the {@code drawableId} with style
* {@code drawableStyle} if one was set using {@code setDrawables}, otherwise returns the
* drawable from {@code defaultDrawableLoader}.
*
* <p>Also returns the drawable from {@code defaultDrawableLoader} if {@code drawableId}
* is {@link DevicePolicyResources#UNDEFINED}.
*
* <p>Calls to this API will not return {@code null} unless no updated drawable was found
* and the call to {@code defaultDrawableLoader} returned {@code null}.
*
* <p>This API uses the screen density returned from {@link Resources#getConfiguration()}, to
* set a different value use
* {@link #getDrawableForDensity(String, String, int, Supplier)}.
*
* <p>Callers should register for
* {@link DevicePolicyManager#ACTION_DEVICE_POLICY_RESOURCE_UPDATED} to get notified when a
* resource has been updated.
*
* <p>Note that each call to this API loads the resource from the package that called
* {@code setDrawables} to set the updated resource.
*
* @param drawableId The drawable ID to get the updated resource for.
* @param drawableStyle The drawable style to use.
* @param defaultDrawableLoader To get the default drawable if no updated drawable was set for
* the provided params.
*/
@Nullable
public Drawable getDrawable(
@NonNull String drawableId,
@NonNull String drawableStyle,
@NonNull Supplier<Drawable> defaultDrawableLoader) {
return getDrawable(
drawableId, drawableStyle, DevicePolicyResources.UNDEFINED, defaultDrawableLoader);
}
/**
* Similar to {@link #getDrawable(String, String, Supplier)}, but also accepts
* a {@code drawableSource} which could result in returning a different drawable than
* {@link #getDrawable(String, String, Supplier)} if an override was set for that specific
* source.
*
* <p> If {@code drawableSource} is {@link DevicePolicyResources#UNDEFINED}, it returns the
* appropriate string for {@code drawableId} and {@code drawableStyle} similar to
* {@link #getDrawable(String, String, Supplier)}.
*
* <p>Calls to this API will not return {@code null} unless no updated drawable was found
* and the call to {@code defaultDrawableLoader} returned {@code null}.
*
* <p>Callers should register for
* {@link DevicePolicyManager#ACTION_DEVICE_POLICY_RESOURCE_UPDATED} to get notified when a
* resource has been updated.
*
* @param drawableId The drawable ID to get the updated resource for.
* @param drawableStyle The drawable style to use.
* @param drawableSource The source for the caller.
* @param defaultDrawableLoader To get the default drawable if no updated drawable was set for
* the provided params.
*/
@Nullable
public Drawable getDrawable(
@NonNull String drawableId,
@NonNull String drawableStyle,
@NonNull String drawableSource,
@NonNull Supplier<Drawable> defaultDrawableLoader) {
Objects.requireNonNull(drawableId, "drawableId can't be null");
Objects.requireNonNull(drawableStyle, "drawableStyle can't be null");
Objects.requireNonNull(drawableSource, "drawableSource can't be null");
Objects.requireNonNull(defaultDrawableLoader, "defaultDrawableLoader can't be null");
if (drawableId.equals(DevicePolicyResources.UNDEFINED)) {
return ParcelableResource.loadDefaultDrawable(defaultDrawableLoader);
}
if (mService != null) {
try {
ParcelableResource resource = mService.getDrawable(
drawableId, drawableStyle, drawableSource);
if (resource == null) {
return ParcelableResource.loadDefaultDrawable(
defaultDrawableLoader);
}
return resource.getDrawable(
mContext,
/* density= */ 0,
defaultDrawableLoader);
} catch (RemoteException e) {
Log.e(
TAG,
"Error getting the updated drawable from DevicePolicyManagerService.",
e);
return ParcelableResource.loadDefaultDrawable(defaultDrawableLoader);
}
}
return ParcelableResource.loadDefaultDrawable(defaultDrawableLoader);
}
/**
* Similar to {@link #getDrawable(String, String, Supplier)}, but also accepts
* {@code density}. See {@link Resources#getDrawableForDensity(int, int, Resources.Theme)}.
*
* <p>Calls to this API will not return {@code null} unless no updated drawable was found
* and the call to {@code defaultDrawableLoader} returned {@code null}.
*
* <p>Callers should register for
* {@link DevicePolicyManager#ACTION_DEVICE_POLICY_RESOURCE_UPDATED} to get notified when a
* resource has been updated.
*
* @param drawableId The drawable ID to get the updated resource for.
* @param drawableStyle The drawable style to use.
* @param density The desired screen density indicated by the resource as
* found in {@link DisplayMetrics}. A value of 0 means to use the
* density returned from {@link Resources#getConfiguration()}.
* @param defaultDrawableLoader To get the default drawable if no updated drawable was set for
* the provided params.
*/
@Nullable
public Drawable getDrawableForDensity(
@NonNull String drawableId,
@NonNull String drawableStyle,
int density,
@NonNull Supplier<Drawable> defaultDrawableLoader) {
return getDrawableForDensity(
drawableId,
drawableStyle,
DevicePolicyResources.UNDEFINED,
density,
defaultDrawableLoader);
}
/**
* Similar to {@link #getDrawable(String, String, String, Supplier)}, but also accepts
* {@code density}. See {@link Resources#getDrawableForDensity(int, int, Resources.Theme)}.
*
* <p>Calls to this API will not return {@code null} unless no updated drawable was found
* and the call to {@code defaultDrawableLoader} returned {@code null}.
*
* <p>Callers should register for
* {@link DevicePolicyManager#ACTION_DEVICE_POLICY_RESOURCE_UPDATED} to get notified when a
* resource has been updated.
*
* @param drawableId The drawable ID to get the updated resource for.
* @param drawableStyle The drawable style to use.
* @param drawableSource The source for the caller.
* @param density The desired screen density indicated by the resource as
* found in {@link DisplayMetrics}. A value of 0 means to use the
* density returned from {@link Resources#getConfiguration()}.
* @param defaultDrawableLoader To get the default drawable if no updated drawable was set for
* the provided params.
*/
@Nullable
public Drawable getDrawableForDensity(
@NonNull String drawableId,
@NonNull String drawableStyle,
@NonNull String drawableSource,
int density,
@NonNull Supplier<Drawable> defaultDrawableLoader) {
Objects.requireNonNull(drawableId, "drawableId can't be null");
Objects.requireNonNull(drawableStyle, "drawableStyle can't be null");
Objects.requireNonNull(drawableSource, "drawableSource can't be null");
Objects.requireNonNull(defaultDrawableLoader, "defaultDrawableLoader can't be null");
if (drawableId.equals(DevicePolicyResources.UNDEFINED)) {
return ParcelableResource.loadDefaultDrawable(defaultDrawableLoader);
}
if (mService != null) {
try {
ParcelableResource resource = mService.getDrawable(
drawableId, drawableStyle, drawableSource);
if (resource == null) {
return ParcelableResource.loadDefaultDrawable(
defaultDrawableLoader);
}
return resource.getDrawable(mContext, density, defaultDrawableLoader);
} catch (RemoteException e) {
Log.e(
TAG,
"Error getting the updated drawable from DevicePolicyManagerService.",
e);
return ParcelableResource.loadDefaultDrawable(defaultDrawableLoader);
}
}
return ParcelableResource.loadDefaultDrawable(defaultDrawableLoader);
}
/**
* Similar to {@link #getDrawable(String, String, String, Supplier)} but returns an
* {@link Icon} instead of a {@link Drawable}.
*
* @param drawableId The drawable ID to get the updated resource for.
* @param drawableStyle The drawable style to use.
* @param drawableSource The source for the caller.
* @param defaultIcon Returned if no updated drawable was set for the provided params.
*/
@Nullable
public Icon getDrawableAsIcon(
@NonNull String drawableId,
@NonNull String drawableStyle,
@NonNull String drawableSource,
@Nullable Icon defaultIcon) {
Objects.requireNonNull(drawableId, "drawableId can't be null");
Objects.requireNonNull(drawableStyle, "drawableStyle can't be null");
Objects.requireNonNull(drawableSource, "drawableSource can't be null");
Objects.requireNonNull(defaultIcon, "defaultIcon can't be null");
if (drawableId.equals(DevicePolicyResources.UNDEFINED)) {
return defaultIcon;
}
if (mService != null) {
try {
ParcelableResource resource = mService.getDrawable(
drawableId, drawableStyle, drawableSource);
if (resource == null) {
return defaultIcon;
}
return Icon.createWithResource(resource.getPackageName(), resource.getResourceId());
} catch (RemoteException e) {
Log.e(
TAG,
"Error getting the updated drawable from DevicePolicyManagerService.",
e);
return defaultIcon;
}
}
return defaultIcon;
}
/**
* Similar to {@link #getDrawable(String, String, Supplier)} but returns an {@link Icon}
* instead of a {@link Drawable}.
*
* @param drawableId The drawable ID to get the updated resource for.
* @param drawableStyle The drawable style to use.
* @param defaultIcon Returned if no updated drawable was set for the provided params.
*/
@Nullable
public Icon getDrawableAsIcon(
@NonNull String drawableId,
@NonNull String drawableStyle,
@Nullable Icon defaultIcon) {
return getDrawableAsIcon(
drawableId, drawableStyle, DevicePolicyResources.UNDEFINED, defaultIcon);
}
/**
* For each {@link DevicePolicyStringResource} item in {@code strings}, it updates the string
* resource for {@link DevicePolicyStringResource#getStringId()} to the string with ID
* {@code callingPackageResourceId}, meaning any system UI surface calling {@link #getString}
* with {@code stringId} will get the new resource after this API is called.
*
* <p>Sends a broadcast with action
* {@link DevicePolicyManager#ACTION_DEVICE_POLICY_RESOURCE_UPDATED} to registered receivers
* when a resource has been updated successfully.
*
* <p>Important notes to consider when using this API:
* <ul>
* <li> {@link #getString} references the resource {@code callingPackageResourceId} in the
* calling package each time it gets called. You have to ensure that the resource is always
* available in the calling package as long as it is used as an updated resource.
* <li> You still have to re-call {@code setStrings} even if you only make changes to the
* content of the resource with ID {@code callingPackageResourceId} as the content might be
* cached and would need updating.
* </ul>
*
* @param strings The list of {@link DevicePolicyStringResource} to update.
*
* @hide
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void setStrings(@NonNull Set<DevicePolicyStringResource> strings) {
if (mService != null) {
try {
mService.setStrings(new ArrayList<>(strings));
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
}
/**
* Removes the updated strings for the list of {@code stringIds} that was previously set by
* calling {@link #setStrings}, meaning any subsequent calls to {@link #getString} for the
* provided IDs will return the default string from {@code defaultStringLoader}.
*
* <p>Sends a broadcast with action
* {@link DevicePolicyManager#ACTION_DEVICE_POLICY_RESOURCE_UPDATED} to registered receivers
* when a resource has been reset successfully.
*
* @param stringIds The list of IDs to remove the updated resources for.
*
* @hide
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_MANAGEMENT_RESOURCES)
public void resetStrings(@NonNull Set<String> stringIds) {
if (mService != null) {
try {
mService.resetStrings(new ArrayList<>(stringIds));
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
}
/**
* Returns the appropriate updated string for the {@code stringId} (see
* {@link DevicePolicyResources.Strings}) if one was set using
* {@code setStrings}, otherwise returns the string from {@code defaultStringLoader}.
*
* <p>Also returns the string from {@code defaultStringLoader} if {@code stringId} is
* {@link DevicePolicyResources#UNDEFINED}.
*
* <p>Calls to this API will not return {@code null} unless no updated drawable was found
* and the call to {@code defaultStringLoader} returned {@code null}.
*
* <p>Callers should register for
* {@link DevicePolicyManager#ACTION_DEVICE_POLICY_RESOURCE_UPDATED} to get notified when a
* resource has been updated.
*
* <p>Note that each call to this API loads the resource from the package that called
* {@code setStrings} to set the updated resource.
*
* @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}.
*/
@Nullable
public String getString(
@NonNull String stringId,
@NonNull Supplier<String> defaultStringLoader) {
Objects.requireNonNull(stringId, "stringId can't be null");
Objects.requireNonNull(defaultStringLoader, "defaultStringLoader can't be null");
if (stringId.equals(DevicePolicyResources.UNDEFINED)) {
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);
} 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, Supplier)} 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>Calls to this API will not return {@code null} unless no updated drawable was found
* and the call to {@code defaultStringLoader} returned {@code null}.
*
* @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.
*/
@Nullable
@SuppressLint("SamShouldBeLast")
public String getString(
@NonNull String stringId,
@NonNull Supplier<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.UNDEFINED)) {
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,
"Error getting the updated string from DevicePolicyManagerService.",
e);
return ParcelableResource.loadDefaultString(defaultStringLoader);
}
}
return ParcelableResource.loadDefaultString(defaultStringLoader);
}
}

View File

@@ -28,7 +28,7 @@ import java.util.Objects;
/**
* Used to pass in the required information for updating an enterprise string resource using
* {@link DevicePolicyManager#setStrings}.
* {@link DevicePolicyResourcesManager#setStrings}.
*
* @hide
*/
@@ -40,7 +40,7 @@ public final class DevicePolicyStringResource implements Parcelable {
/**
* Creates an object containing the required information for updating an enterprise string
* resource using {@link DevicePolicyManager#setStrings}.
* resource using {@link DevicePolicyResourcesManager#setStrings}.
*
* <p>It will be used to update the string defined by {@code stringId} to the string with ID
* {@code resourceIdInCallingPackage} in the calling package</p>

View File

@@ -43,7 +43,8 @@ import java.util.function.Supplier;
/**
* Used to store the required information to load a resource that was updated using
* {@link DevicePolicyManager#setDrawables} and {@link DevicePolicyManager#setStrings}.
* {@link DevicePolicyResourcesManager#setDrawables} and
* {@link DevicePolicyResourcesManager#setStrings}.
*
* @hide
*/

View File

@@ -158,6 +158,7 @@ import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.mockito.Mockito;
import org.mockito.internal.util.collections.Sets;
@@ -186,6 +187,7 @@ import java.util.concurrent.TimeUnit;
*/
@SmallTest
@Presubmit
@Ignore("b/225415867")
public class DevicePolicyManagerTest extends DpmTestBase {
private static final String TAG = DevicePolicyManagerTest.class.getSimpleName();