diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 6e6d4e3ff9e59..d8ec7cc101596 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -3961,6 +3961,7 @@ public class DevicePolicyManager { * * @throws SecurityException if caller is not device owner or profile owner of org-owned device * or if called on a parent instance + * @throws UnsupportedOperationException if the device does not support MTE * @param policy the MTE policy to be set */ public void setMtePolicy(@MtePolicy int policy) { diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 9c64054be37e9..c67ffd5a0d71d 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -20254,6 +20254,17 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { DevicePolicyManager.MTE_ENABLED); Preconditions.checkArgument( allowedModes.contains(flags), "Provided mode is not one of the allowed values."); + // In general, this API should be available when "bootctl_settings_toggle" is set, which + // signals that there is a control for MTE in the user settings and this API fundamentally + // is a way for the device admin to override that setting. + // Allow bootctl_device_policy_manager as an override, e.g. to offer the + // DevicePolicyManager only without a visible user setting. + if (!mInjector.systemPropertiesGetBoolean( + "ro.arm64.memtag.bootctl_device_policy_manager", + mInjector.systemPropertiesGetBoolean( + "ro.arm64.memtag.bootctl_settings_toggle", false))) { + throw new UnsupportedOperationException("device does not support MTE"); + } final CallerIdentity caller = getCallerIdentity(); if (flags == DevicePolicyManager.MTE_DISABLED) { Preconditions.checkCallAuthorization(isDefaultDeviceOwner(caller));