diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 85f88135510ba..a3eff45be0b45 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -208,6 +208,7 @@ package android { field public static final String MIGRATE_HEALTH_CONNECT_DATA = "android.permission.MIGRATE_HEALTH_CONNECT_DATA"; field public static final String MODIFY_APPWIDGET_BIND_PERMISSIONS = "android.permission.MODIFY_APPWIDGET_BIND_PERMISSIONS"; field public static final String MODIFY_AUDIO_ROUTING = "android.permission.MODIFY_AUDIO_ROUTING"; + field public static final String MODIFY_AUDIO_SYSTEM_SETTINGS = "android.permission.MODIFY_AUDIO_SYSTEM_SETTINGS"; field public static final String MODIFY_CELL_BROADCASTS = "android.permission.MODIFY_CELL_BROADCASTS"; field public static final String MODIFY_DAY_NIGHT_MODE = "android.permission.MODIFY_DAY_NIGHT_MODE"; field @Deprecated public static final String MODIFY_NETWORK_ACCOUNTING = "android.permission.MODIFY_NETWORK_ACCOUNTING"; @@ -6608,8 +6609,8 @@ package android.media { } public class AudioDeviceVolumeManager { - method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public android.media.VolumeInfo getDeviceVolume(@NonNull android.media.VolumeInfo, @NonNull android.media.AudioDeviceAttributes); - method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setDeviceVolume(@NonNull android.media.VolumeInfo, @NonNull android.media.AudioDeviceAttributes); + method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, android.Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS}) public android.media.VolumeInfo getDeviceVolume(@NonNull android.media.VolumeInfo, @NonNull android.media.AudioDeviceAttributes); + method @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, android.Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS}) public void setDeviceVolume(@NonNull android.media.VolumeInfo, @NonNull android.media.AudioDeviceAttributes); } public final class AudioFocusInfo implements android.os.Parcelable { diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 81b3af0e0e60e..ccdd69ee846c7 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -5326,6 +5326,14 @@ + + + + diff --git a/media/java/android/media/AudioDeviceVolumeManager.java b/media/java/android/media/AudioDeviceVolumeManager.java index 4e2ce91342fcc..77fa9dc0f6fc6 100644 --- a/media/java/android/media/AudioDeviceVolumeManager.java +++ b/media/java/android/media/AudioDeviceVolumeManager.java @@ -16,6 +16,7 @@ package android.media; +import android.Manifest; import android.annotation.CallbackExecutor; import android.annotation.IntDef; import android.annotation.NonNull; @@ -318,8 +319,10 @@ public class AudioDeviceVolumeManager { * @param ada the device for which volume is to be modified */ @SystemApi - // TODO alternatively require MODIFY_AUDIO_SYSTEM_SETTINGS when defined - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(anyOf = { + Manifest.permission.MODIFY_AUDIO_ROUTING, + Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS + }) public void setDeviceVolume(@NonNull VolumeInfo vi, @NonNull AudioDeviceAttributes ada) { try { getService().setDeviceVolume(vi, ada, mPackageName); @@ -340,8 +343,10 @@ public class AudioDeviceVolumeManager { * @param ada the device for which volume is to be retrieved */ @SystemApi - // TODO alternatively require MODIFY_AUDIO_SYSTEM_SETTINGS when defined - @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + @RequiresPermission(anyOf = { + Manifest.permission.MODIFY_AUDIO_ROUTING, + Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS + }) public @NonNull VolumeInfo getDeviceVolume(@NonNull VolumeInfo vi, @NonNull AudioDeviceAttributes ada) { try { diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl index 5ee32d61e1c1b..c06352c21ee4f 100644 --- a/media/java/android/media/IAudioService.aidl +++ b/media/java/android/media/IAudioService.aidl @@ -106,9 +106,11 @@ interface IAudioService { void setStreamVolumeWithAttribution(int streamType, int index, int flags, in String callingPackage, in String attributionTag); + @EnforcePermission(anyOf = {"MODIFY_AUDIO_ROUTING", "MODIFY_AUDIO_SYSTEM_SETTINGS"}) void setDeviceVolume(in VolumeInfo vi, in AudioDeviceAttributes ada, in String callingPackage); + @EnforcePermission(anyOf = {"MODIFY_AUDIO_ROUTING", "MODIFY_AUDIO_SYSTEM_SETTINGS"}) VolumeInfo getDeviceVolume(in VolumeInfo vi, in AudioDeviceAttributes ada, in String callingPackage); diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 58ddd9c6a8b81..2b68afa60c887 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -3733,18 +3733,6 @@ public class AudioService extends IAudioService.Stub } } - // TODO enforce MODIFY_AUDIO_SYSTEM_SETTINGS when defined - private void enforceModifyAudioRoutingOrSystemSettingsPermission() { - if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) - != PackageManager.PERMISSION_GRANTED - /*&& mContext.checkCallingOrSelfPermission( - android.Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS) - != PackageManager.PERMISSION_DENIED*/) { - throw new SecurityException( - "Missing MODIFY_AUDIO_ROUTING or MODIFY_AUDIO_SYSTEM_SETTINGS permission"); - } - } - private void enforceAccessUltrasoundPermission() { if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.ACCESS_ULTRASOUND) != PackageManager.PERMISSION_GRANTED) { @@ -3856,13 +3844,16 @@ public class AudioService extends IAudioService.Stub return AudioSystem.getMinVolumeIndexForAttributes(attr); } + @Override + @android.annotation.EnforcePermission(anyOf = + {"MODIFY_AUDIO_ROUTING", "MODIFY_AUDIO_SYSTEM_SETTINGS"}) /** @see AudioDeviceVolumeManager#setDeviceVolume(VolumeInfo, AudioDeviceAttributes) * Part of service interface, check permissions and parameters here * Note calling package is for logging purposes only, not to be trusted */ public void setDeviceVolume(@NonNull VolumeInfo vi, @NonNull AudioDeviceAttributes ada, @NonNull String callingPackage) { - enforceModifyAudioRoutingOrSystemSettingsPermission(); + super.setDeviceVolume_enforcePermission(); Objects.requireNonNull(vi); Objects.requireNonNull(ada); Objects.requireNonNull(callingPackage); @@ -4828,12 +4819,15 @@ public class AudioService extends IAudioService.Stub } } + @Override + @android.annotation.EnforcePermission(anyOf = + {"MODIFY_AUDIO_ROUTING", "MODIFY_AUDIO_SYSTEM_SETTINGS"}) /** * @see AudioDeviceVolumeManager#getDeviceVolume(VolumeInfo, AudioDeviceAttributes) */ public @NonNull VolumeInfo getDeviceVolume(@NonNull VolumeInfo vi, @NonNull AudioDeviceAttributes ada, @NonNull String callingPackage) { - enforceModifyAudioRoutingOrSystemSettingsPermission(); + super.getDeviceVolume_enforcePermission(); Objects.requireNonNull(vi); Objects.requireNonNull(ada); Objects.requireNonNull(callingPackage);