AudioService: device vol behavior can use additional permission

Let the device volume behavior APIs also accept the
system MODIFY_AUDIO_SYSTEM_SETTINGS permission, as
MODIFY_AUDIO_ROUTING alone is too strong a permission
to expect to use this feature.

import Manifest class.

Bug: 265774737
Test: atest AudioServiceHostTest#testAudioVolumeBehavior
Change-Id: Ia3ea9b3a4e24bdcc64240875a7d1db33bc1b469b
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index d3775ad..56d67bf 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -6669,7 +6669,7 @@
     method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static java.util.List<android.media.audiopolicy.AudioVolumeGroup> getAudioVolumeGroups();
     method @NonNull @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION) public android.media.AudioRecord getCallDownlinkExtractionAudioRecord(@NonNull android.media.AudioFormat);
     method @NonNull @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION) public android.media.AudioTrack getCallUplinkInjectionAudioTrack(@NonNull android.media.AudioFormat);
-    method @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, "android.permission.QUERY_AUDIO_STATE"}) public int getDeviceVolumeBehavior(@NonNull android.media.AudioDeviceAttributes);
+    method @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, "android.permission.QUERY_AUDIO_STATE", android.Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS}) public int getDeviceVolumeBehavior(@NonNull android.media.AudioDeviceAttributes);
     method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, "android.permission.QUERY_AUDIO_STATE"}) public java.util.List<android.media.AudioDeviceAttributes> getDevicesForAttributes(@NonNull android.media.AudioAttributes);
     method @RequiresPermission("android.permission.QUERY_AUDIO_STATE") public int getLastAudibleStreamVolume(int);
     method @IntRange(from=0) public long getMaxAdditionalOutputDeviceDelay(@NonNull android.media.AudioDeviceInfo);
@@ -6708,7 +6708,7 @@
     method public void setAudioServerStateCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.AudioServerStateCallback);
     method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setBluetoothVariableLatencyEnabled(boolean);
     method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setDeviceAsNonDefaultForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy, @NonNull android.media.AudioDeviceAttributes);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setDeviceVolumeBehavior(@NonNull android.media.AudioDeviceAttributes, int);
+    method @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, android.Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS}) public void setDeviceVolumeBehavior(@NonNull android.media.AudioDeviceAttributes, int);
     method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setFocusRequestResult(@NonNull android.media.AudioFocusInfo, int, @NonNull android.media.audiopolicy.AudioPolicy);
     method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setPreferredDeviceForCapturePreset(int, @NonNull android.media.AudioDeviceAttributes);
     method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setPreferredDeviceForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy, @NonNull android.media.AudioDeviceAttributes);
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index 3a6173c..ddd7939 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -1644,7 +1644,7 @@
     method @NonNull public java.util.Map<java.lang.Integer,java.lang.Boolean> getSurroundFormats();
     method public boolean hasRegisteredDynamicPolicy();
     method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS) public boolean isCsdEnabled();
-    method @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, android.Manifest.permission.QUERY_AUDIO_STATE}) public boolean isFullVolumeDevice();
+    method @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, android.Manifest.permission.QUERY_AUDIO_STATE, android.Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS}) public boolean isFullVolumeDevice();
     method @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION) public boolean isPstnCallAudioInterceptable();
     method @RequiresPermission("android.permission.QUERY_AUDIO_STATE") public int requestAudioFocusForTest(@NonNull android.media.AudioFocusRequest, @NonNull String, int, int);
     method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS) public void setCsd(float);
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 813929e..af515c2 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -20,6 +20,7 @@
 import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_DEFAULT;
 import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_AUDIO;
 
+import android.Manifest;
 import android.annotation.CallbackExecutor;
 import android.annotation.IntDef;
 import android.annotation.IntRange;
@@ -407,7 +408,7 @@
     public static final int STREAM_ACCESSIBILITY = AudioSystem.STREAM_ACCESSIBILITY;
     /** @hide Used to identify the volume of audio streams for virtual assistant */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public static final int STREAM_ASSISTANT = AudioSystem.STREAM_ASSISTANT;
 
     /** Number of audio streams */
@@ -1038,7 +1039,7 @@
 
     /** @hide */
     @UnsupportedAppUsage
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public void setMasterMute(boolean mute, int flags) {
         final IAudioService service = getService();
         try {
@@ -1346,7 +1347,7 @@
      * @hide
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public void setVolumeIndexForAttributes(@NonNull AudioAttributes attr, int index, int flags) {
         Preconditions.checkNotNull(attr, "attr must not be null");
         final IAudioService service = getService();
@@ -1370,7 +1371,7 @@
      */
     @SystemApi
     @IntRange(from = 0)
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public int getVolumeIndexForAttributes(@NonNull AudioAttributes attr) {
         Preconditions.checkNotNull(attr, "attr must not be null");
         final IAudioService service = getService();
@@ -1391,7 +1392,7 @@
      */
     @SystemApi
     @IntRange(from = 0)
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public int getMaxVolumeIndexForAttributes(@NonNull AudioAttributes attr) {
         Preconditions.checkNotNull(attr, "attr must not be null");
         final IAudioService service = getService();
@@ -1412,7 +1413,7 @@
      */
     @SystemApi
     @IntRange(from = 0)
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public int getMinVolumeIndexForAttributes(@NonNull AudioAttributes attr) {
         Preconditions.checkNotNull(attr, "attr must not be null");
         final IAudioService service = getService();
@@ -1429,7 +1430,7 @@
      * @hide
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public void setSupportedSystemUsages(@NonNull @AttributeSystemUsage int[] systemUsages) {
         Objects.requireNonNull(systemUsages, "systemUsages must not be null");
         final IAudioService service = getService();
@@ -1446,7 +1447,7 @@
      * @hide
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public @NonNull @AttributeSystemUsage int[] getSupportedSystemUsages() {
         final IAudioService service = getService();
         try {
@@ -1555,7 +1556,7 @@
      *
      * @hide
      */
-    @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
+    @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
     @UnsupportedAppUsage
     public void forceVolumeControlStream(int streamType) {
         final IAudioService service = getService();
@@ -1752,7 +1753,7 @@
      * @return true if the operation was successful, false otherwise
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public boolean setPreferredDeviceForStrategy(@NonNull AudioProductStrategy strategy,
             @NonNull AudioDeviceAttributes device) {
         return setPreferredDevicesForStrategy(strategy, Arrays.asList(device));
@@ -1768,7 +1769,7 @@
      *     device set for example)
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public boolean removePreferredDeviceForStrategy(@NonNull AudioProductStrategy strategy) {
         Objects.requireNonNull(strategy);
         try {
@@ -1791,7 +1792,7 @@
      *    ever set or if the strategy is invalid
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     @Nullable
     public AudioDeviceAttributes getPreferredDeviceForStrategy(
             @NonNull AudioProductStrategy strategy) {
@@ -1813,7 +1814,7 @@
      * @return true if the operation was successful, false otherwise
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public boolean setPreferredDevicesForStrategy(@NonNull AudioProductStrategy strategy,
                                                   @NonNull List<AudioDeviceAttributes> devices) {
         Objects.requireNonNull(strategy);
@@ -1843,7 +1844,7 @@
      * @return list of the preferred devices for that strategy
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     @NonNull
     public List<AudioDeviceAttributes> getPreferredDevicesForStrategy(
             @NonNull AudioProductStrategy strategy) {
@@ -1867,7 +1868,7 @@
      * @return true if the operation was successful, false otherwise
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public boolean setDeviceAsNonDefaultForStrategy(@NonNull AudioProductStrategy strategy,
                                                     @NonNull AudioDeviceAttributes device) {
         Objects.requireNonNull(strategy);
@@ -1891,7 +1892,7 @@
      *     device set for example)
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public boolean removeDeviceAsNonDefaultForStrategy(@NonNull AudioProductStrategy strategy,
                                                        @NonNull AudioDeviceAttributes device) {
         Objects.requireNonNull(strategy);
@@ -1913,7 +1914,7 @@
      * @return list of non-default devices for the strategy
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     @NonNull
     public List<AudioDeviceAttributes> getNonDefaultDevicesForStrategy(
             @NonNull AudioProductStrategy strategy) {
@@ -1996,7 +1997,7 @@
      *             Executor, AudioManager.OnPreferredDevicesForStrategyChangedListener)} instead
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     @Deprecated
     public void addOnPreferredDeviceForStrategyChangedListener(
             @NonNull @CallbackExecutor Executor executor,
@@ -2013,7 +2014,7 @@
      *             AudioManager.OnPreferredDevicesForStrategyChangedListener)} instead
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     @Deprecated
     public void removeOnPreferredDeviceForStrategyChangedListener(
             @NonNull OnPreferredDeviceForStrategyChangedListener listener) {
@@ -2028,7 +2029,7 @@
      * @throws SecurityException if the caller doesn't hold the required permission
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public void addOnPreferredDevicesForStrategyChangedListener(
             @NonNull @CallbackExecutor Executor executor,
             @NonNull OnPreferredDevicesForStrategyChangedListener listener)
@@ -2046,7 +2047,7 @@
      * @param listener
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public void removeOnPreferredDevicesForStrategyChangedListener(
             @NonNull OnPreferredDevicesForStrategyChangedListener listener) {
         Objects.requireNonNull(listener);
@@ -2092,7 +2093,7 @@
      * @throws SecurityException if the caller doesn't hold the required permission
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public void addOnNonDefaultDevicesForStrategyChangedListener(
             @NonNull @CallbackExecutor Executor executor,
             @NonNull OnNonDefaultDevicesForStrategyChangedListener listener)
@@ -2112,7 +2113,7 @@
      * @param listener
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public void removeOnNonDefaultDevicesForStrategyChangedListener(
             @NonNull OnNonDefaultDevicesForStrategyChangedListener listener) {
         Objects.requireNonNull(listener);
@@ -2206,7 +2207,7 @@
      * @return true if the operation was successful, false otherwise
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public boolean setPreferredDeviceForCapturePreset(@MediaRecorder.SystemSource int capturePreset,
                                                       @NonNull AudioDeviceAttributes device) {
         return setPreferredDevicesForCapturePreset(capturePreset, Arrays.asList(device));
@@ -2220,7 +2221,7 @@
      *     device set for example)
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public boolean clearPreferredDevicesForCapturePreset(
             @MediaRecorder.SystemSource int capturePreset) {
         if (!MediaRecorder.isValidAudioSource(capturePreset)) {
@@ -2243,7 +2244,7 @@
      */
     @NonNull
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public List<AudioDeviceAttributes> getPreferredDevicesForCapturePreset(
             @MediaRecorder.SystemSource int capturePreset) {
         if (!MediaRecorder.isValidAudioSource(capturePreset)) {
@@ -2315,7 +2316,7 @@
      * @throws SecurityException if the caller doesn't hold the required permission
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public void addOnPreferredDevicesForCapturePresetChangedListener(
             @NonNull @CallbackExecutor Executor executor,
             @NonNull OnPreferredDevicesForCapturePresetChangedListener listener)
@@ -2341,7 +2342,7 @@
      * @param listener
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public void removeOnPreferredDevicesForCapturePresetChangedListener(
             @NonNull OnPreferredDevicesForCapturePresetChangedListener listener) {
         Objects.requireNonNull(listener);
@@ -2785,7 +2786,7 @@
     /**
      * Start bluetooth SCO audio connection.
      * <p>Requires Permission:
-     *   {@link android.Manifest.permission#MODIFY_AUDIO_SETTINGS}.
+     *   {@link Manifest.permission#MODIFY_AUDIO_SETTINGS}.
      * <p>This method can be used by applications wanting to send and received audio
      * to/from a bluetooth SCO headset while the phone is not in call.
      * <p>As the SCO connection establishment can take several seconds,
@@ -2842,7 +2843,7 @@
      * @hide
      * Start bluetooth SCO audio connection in virtual call mode.
      * <p>Requires Permission:
-     *   {@link android.Manifest.permission#MODIFY_AUDIO_SETTINGS}.
+     *   {@link Manifest.permission#MODIFY_AUDIO_SETTINGS}.
      * <p>Similar to {@link #startBluetoothSco()} with explicit selection of virtual call mode.
      * Telephony and communication applications (VoIP, Video Chat) should preferably select
      * virtual call mode.
@@ -2866,7 +2867,7 @@
     /**
      * Stop bluetooth SCO audio connection.
      * <p>Requires Permission:
-     *   {@link android.Manifest.permission#MODIFY_AUDIO_SETTINGS}.
+     *   {@link Manifest.permission#MODIFY_AUDIO_SETTINGS}.
      * <p>This method must be called by applications having requested the use of
      * bluetooth SCO audio with {@link #startBluetoothSco()} when finished with the SCO
      * connection or if connection fails.
@@ -3454,7 +3455,7 @@
      * @hide
      */
     @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
-    @RequiresPermission(android.Manifest.permission.BLUETOOTH_STACK)
+    @RequiresPermission(Manifest.permission.BLUETOOTH_STACK)
     public void setHfpEnabled(boolean enable) {
         AudioSystem.setParameters("hfp_enable=" + enable);
     }
@@ -3463,7 +3464,7 @@
      * @hide
      */
     @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
-    @RequiresPermission(android.Manifest.permission.BLUETOOTH_STACK)
+    @RequiresPermission(Manifest.permission.BLUETOOTH_STACK)
     public void setHfpVolume(int volume) {
         AudioSystem.setParameters("hfp_volume=" + volume);
     }
@@ -3472,7 +3473,7 @@
      * @hide
      */
     @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
-    @RequiresPermission(android.Manifest.permission.BLUETOOTH_STACK)
+    @RequiresPermission(Manifest.permission.BLUETOOTH_STACK)
     public void setHfpSamplingRate(int rate) {
         AudioSystem.setParameters("hfp_set_sampling_rate=" + rate);
     }
@@ -3481,7 +3482,7 @@
      * @hide
      */
     @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
-    @RequiresPermission(android.Manifest.permission.BLUETOOTH_STACK)
+    @RequiresPermission(Manifest.permission.BLUETOOTH_STACK)
     public void setBluetoothHeadsetProperties(@NonNull String name, boolean hasNrecEnabled,
             boolean hasWbsEnabled) {
         AudioSystem.setParameters("bt_headset_name=" + name
@@ -3493,7 +3494,7 @@
      * @hide
      */
     @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
-    @RequiresPermission(android.Manifest.permission.BLUETOOTH_STACK)
+    @RequiresPermission(Manifest.permission.BLUETOOTH_STACK)
     public void setA2dpSuspended(boolean enable) {
         AudioSystem.setParameters("A2dpSuspended=" + enable);
     }
@@ -3506,7 +3507,7 @@
      * @hide
      */
     @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
-    @RequiresPermission(android.Manifest.permission.BLUETOOTH_STACK)
+    @RequiresPermission(Manifest.permission.BLUETOOTH_STACK)
     public void setLeAudioSuspended(boolean enable) {
         AudioSystem.setParameters("LeAudioSuspended=" + enable);
     }
@@ -4316,7 +4317,7 @@
      * @throws IllegalArgumentException
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
+    @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
     public int requestAudioFocus(OnAudioFocusChangeListener l,
             @NonNull AudioAttributes requestAttributes,
             int durationHint,
@@ -4357,8 +4358,8 @@
      */
     @SystemApi
     @RequiresPermission(anyOf= {
-            android.Manifest.permission.MODIFY_PHONE_STATE,
-            android.Manifest.permission.MODIFY_AUDIO_ROUTING
+            Manifest.permission.MODIFY_PHONE_STATE,
+            Manifest.permission.MODIFY_AUDIO_ROUTING
     })
     public int requestAudioFocus(OnAudioFocusChangeListener l,
             @NonNull AudioAttributes requestAttributes,
@@ -4502,7 +4503,7 @@
      * @throws IllegalArgumentException when trying to lock focus without an AudioPolicy
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public int requestAudioFocus(@NonNull AudioFocusRequest afr, @Nullable AudioPolicy ap) {
         if (afr == null) {
             throw new NullPointerException("Illegal null AudioFocusRequest");
@@ -4689,7 +4690,7 @@
      * @param ap a valid registered {@link AudioPolicy} configured as a focus policy.
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public void setFocusRequestResult(@NonNull AudioFocusInfo afi,
             @FocusRequestResult int requestResult, @NonNull AudioPolicy ap) {
         if (afi == null) {
@@ -4728,7 +4729,7 @@
      * @throws NullPointerException if the {@link AudioFocusInfo} or {@link AudioPolicy} are null.
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public int dispatchAudioFocusChange(@NonNull AudioFocusInfo afi, int focusChange,
             @NonNull AudioPolicy ap) {
         if (afi == null) {
@@ -4988,11 +4989,11 @@
      * @param policy the non-null {@link AudioPolicy} to register.
      * @return {@link #ERROR} if there was an error communicating with the registration service
      *    or if the user doesn't have the required
-     *    {@link android.Manifest.permission#MODIFY_AUDIO_ROUTING} permission,
+     *    {@link Manifest.permission#MODIFY_AUDIO_ROUTING} permission,
      *    {@link #SUCCESS} otherwise.
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public int registerAudioPolicy(@NonNull AudioPolicy policy) {
         return registerAudioPolicyStatic(policy);
     }
@@ -5026,7 +5027,7 @@
      * @param policy the non-null {@link AudioPolicy} to unregister.
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public void unregisterAudioPolicyAsync(@NonNull AudioPolicy policy) {
         unregisterAudioPolicyAsyncStatic(policy);
     }
@@ -5052,7 +5053,7 @@
      * @param policy the non-null {@link AudioPolicy} to unregister.
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public void unregisterAudioPolicy(@NonNull AudioPolicy policy) {
         Preconditions.checkNotNull(policy, "Illegal null AudioPolicy argument");
         final IAudioService service = getService();
@@ -5853,8 +5854,8 @@
      */
     @SystemApi
     @RequiresPermission(anyOf = {
-            android.Manifest.permission.MODIFY_AUDIO_ROUTING,
-            android.Manifest.permission.QUERY_AUDIO_STATE
+            Manifest.permission.MODIFY_AUDIO_ROUTING,
+            Manifest.permission.QUERY_AUDIO_STATE
     })
     public @NonNull List<AudioDeviceAttributes> getDevicesForAttributes(
             @NonNull AudioAttributes attributes) {
@@ -5929,8 +5930,8 @@
      */
     @SystemApi
     @RequiresPermission(anyOf = {
-            android.Manifest.permission.MODIFY_AUDIO_ROUTING,
-            android.Manifest.permission.QUERY_AUDIO_STATE
+            Manifest.permission.MODIFY_AUDIO_ROUTING,
+            Manifest.permission.QUERY_AUDIO_STATE
     })
     public void addOnDevicesForAttributesChangedListener(@NonNull AudioAttributes attributes,
             @NonNull @CallbackExecutor Executor executor,
@@ -5960,8 +5961,8 @@
      */
     @SystemApi
     @RequiresPermission(anyOf = {
-            android.Manifest.permission.MODIFY_AUDIO_ROUTING,
-            android.Manifest.permission.QUERY_AUDIO_STATE
+            Manifest.permission.MODIFY_AUDIO_ROUTING,
+            Manifest.permission.QUERY_AUDIO_STATE
     })
     public void removeOnDevicesForAttributesChangedListener(
             @NonNull OnDevicesForAttributesChangedListener listener) {
@@ -6119,7 +6120,10 @@
      * @param deviceVolumeBehavior one of the device behaviors
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(anyOf = {
+            Manifest.permission.MODIFY_AUDIO_ROUTING,
+            Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS
+    })
     public void setDeviceVolumeBehavior(@NonNull AudioDeviceAttributes device,
             @DeviceVolumeBehavior int deviceVolumeBehavior) {
         // verify arguments (validity of device type is enforced in server)
@@ -6143,8 +6147,9 @@
      */
     @SystemApi
     @RequiresPermission(anyOf = {
-            android.Manifest.permission.MODIFY_AUDIO_ROUTING,
-            android.Manifest.permission.QUERY_AUDIO_STATE
+            Manifest.permission.MODIFY_AUDIO_ROUTING,
+            Manifest.permission.QUERY_AUDIO_STATE,
+            Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS
     })
     public @DeviceVolumeBehavior
     int getDeviceVolumeBehavior(@NonNull AudioDeviceAttributes device) {
@@ -6165,8 +6170,9 @@
      */
     @TestApi
     @RequiresPermission(anyOf = {
-            android.Manifest.permission.MODIFY_AUDIO_ROUTING,
-            android.Manifest.permission.QUERY_AUDIO_STATE
+            Manifest.permission.MODIFY_AUDIO_ROUTING,
+            Manifest.permission.QUERY_AUDIO_STATE,
+            Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS
     })
     public boolean isFullVolumeDevice() {
         final AudioAttributes attributes = new AudioAttributes.Builder()
@@ -6189,7 +6195,7 @@
      * {@hide}
      */
     @UnsupportedAppUsage
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public void setWiredDeviceConnectionState(int device, int state, String address, String name) {
         AudioDeviceAttributes attributes = new AudioDeviceAttributes(device, address, name);
         setWiredDeviceConnectionState(attributes, state);
@@ -6202,7 +6208,7 @@
      * {@hide}
      */
     @UnsupportedAppUsage
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public void setWiredDeviceConnectionState(AudioDeviceAttributes attributes, int state) {
         final IAudioService service = getService();
         try {
@@ -6220,7 +6226,7 @@
      * {@hide}
      */
     @TestApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public void setTestDeviceConnectionState(@NonNull AudioDeviceAttributes device,
             boolean connected) {
         try {
@@ -6243,7 +6249,7 @@
      * {@hide}
      */
     @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
-    @RequiresPermission(android.Manifest.permission.BLUETOOTH_STACK)
+    @RequiresPermission(Manifest.permission.BLUETOOTH_STACK)
     public void handleBluetoothActiveDeviceChanged(@Nullable BluetoothDevice newDevice,
             @Nullable BluetoothDevice previousDevice,
             @NonNull BluetoothProfileConnectionInfo info) {
@@ -6363,7 +6369,7 @@
      *     or the delay is not in range of {@link #getMaxAdditionalOutputDeviceDelay()}.
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public boolean setAdditionalOutputDeviceDelay(
             @NonNull AudioDeviceInfo device, @IntRange(from = 0) long delayMillis) {
         Objects.requireNonNull(device);
@@ -6522,7 +6528,7 @@
      * @return the RS2 value used for momentary exposure warnings
      */
     @TestApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS)
     public float getRs2Value() {
         try {
             return getService().getRs2Value();
@@ -6536,7 +6542,7 @@
      * Sets the RS2 value used for momentary exposure warnings
      */
     @TestApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS)
     public void setRs2Value(float rs2Value) {
         try {
             getService().setRs2Value(rs2Value);
@@ -6550,7 +6556,7 @@
      * @return the current computed sound dose value
      */
     @TestApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS)
     public float getCsd() {
         try {
             return getService().getCsd();
@@ -6564,7 +6570,7 @@
      * Sets the computed sound dose value to {@code csd}
      */
     @TestApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS)
     public void setCsd(float csd) {
         try {
             getService().setCsd(csd);
@@ -6580,7 +6586,7 @@
      * since this can affect the certification of a device with EN50332-3 regulation.
      */
     @TestApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS)
     public void forceUseFrameworkMel(boolean useFrameworkMel) {
         try {
             getService().forceUseFrameworkMel(useFrameworkMel);
@@ -6594,7 +6600,7 @@
      * Forces the computation of CSD on all output devices.
      */
     @TestApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS)
     public void forceComputeCsdOnAllDevices(boolean computeCsdOnAllDevices) {
         try {
             getService().forceComputeCsdOnAllDevices(computeCsdOnAllDevices);
@@ -6608,7 +6614,7 @@
      * Returns whether CSD is enabled on this device.
      */
     @TestApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_SYSTEM_SETTINGS)
     public boolean isCsdEnabled() {
         try {
             return getService().isCsdEnabled();
@@ -7642,7 +7648,7 @@
      *
      * @return true if successful, otherwise false
      */
-    @RequiresPermission(android.Manifest.permission.WRITE_SETTINGS)
+    @RequiresPermission(Manifest.permission.WRITE_SETTINGS)
     public boolean setEncodedSurroundMode(@EncodedSurroundOutputMode int mode) {
         try {
             return getService().setEncodedSurroundMode(mode);
@@ -7694,7 +7700,7 @@
      * @param enabled the required surround format state, true for enabled, false for disabled
      * @return true if successful, otherwise false
      */
-    @RequiresPermission(android.Manifest.permission.WRITE_SETTINGS)
+    @RequiresPermission(Manifest.permission.WRITE_SETTINGS)
     public boolean setSurroundFormatEnabled(
             @AudioFormat.SurroundSoundEncoding int audioFormat, boolean enabled) {
         try {
@@ -7758,7 +7764,7 @@
      * Ultrasound playback and capture, false otherwise.
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.ACCESS_ULTRASOUND)
+    @RequiresPermission(Manifest.permission.ACCESS_ULTRASOUND)
     public boolean isUltrasoundSupported() {
         try {
             return getService().isUltrasoundSupported();
@@ -7779,7 +7785,7 @@
      * open. False otherwise.
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.CAPTURE_AUDIO_HOTWORD)
+    @RequiresPermission(Manifest.permission.CAPTURE_AUDIO_HOTWORD)
     public boolean isHotwordStreamSupported(boolean lookbackAudio) {
         try {
             return getService().isHotwordStreamSupported(lookbackAudio);
@@ -7803,7 +7809,7 @@
      */
     @SystemApi
     @NonNull
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public static List<AudioProductStrategy> getAudioProductStrategies() {
         final IAudioService service = getService();
         try {
@@ -7823,7 +7829,7 @@
      */
     @SystemApi
     @NonNull
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public static List<AudioVolumeGroup> getAudioVolumeGroups() {
         final IAudioService service = getService();
         try {
@@ -8075,7 +8081,7 @@
 
     /** @hide
      * TODO: make this a @SystemApi */
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public void setMultiAudioFocusEnabled(boolean enabled) {
         try {
             getService().setMultiAudioFocusEnabled(enabled);
@@ -8119,7 +8125,7 @@
      * latest application having selected mode {@link #MODE_IN_COMMUNICATION} or mode
      * {@link #MODE_IN_CALL}. Note that <code>MODE_IN_CALL</code> can only be selected by the main
      * telephony application with permission
-     * {@link android.Manifest.permission#MODIFY_PHONE_STATE}.
+     * {@link Manifest.permission#MODIFY_PHONE_STATE}.
      * <p> If the requested devices is not currently available, the request will be rejected and
      * the method will return false.
      * <p>This API replaces the following deprecated APIs:
@@ -8386,7 +8392,7 @@
      */
     @TestApi
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION)
+    @RequiresPermission(Manifest.permission.CALL_AUDIO_INTERCEPTION)
     public boolean isPstnCallAudioInterceptable() {
         final IAudioService service = getService();
         try {
@@ -8487,7 +8493,7 @@
      */
     @TestApi
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION)
+    @RequiresPermission(Manifest.permission.CALL_AUDIO_INTERCEPTION)
     public @NonNull AudioTrack getCallUplinkInjectionAudioTrack(@NonNull AudioFormat format) {
         Objects.requireNonNull(format);
         checkCallRedirectionFormat(format, true /* isOutput */);
@@ -8559,7 +8565,7 @@
      */
     @TestApi
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION)
+    @RequiresPermission(Manifest.permission.CALL_AUDIO_INTERCEPTION)
     public @NonNull AudioRecord getCallDownlinkExtractionAudioRecord(@NonNull AudioFormat format) {
         Objects.requireNonNull(format);
         checkCallRedirectionFormat(format, false /* isOutput */);
@@ -8668,7 +8674,7 @@
      * @see #registerMuteAwaitConnectionCallback(Executor, AudioManager.MuteAwaitConnectionCallback)
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public void muteAwaitConnection(@NonNull int[] usagesToMute,
             @NonNull AudioDeviceAttributes device,
             long timeout, @NonNull TimeUnit timeUnit) throws IllegalStateException {
@@ -8698,7 +8704,7 @@
      *        or because it timed out)
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public @Nullable AudioDeviceAttributes getMutingExpectedDevice() {
         try {
             return getService().getMutingExpectedDevice();
@@ -8718,7 +8724,7 @@
      *         {@link #muteAwaitConnection(int[], AudioDeviceAttributes, long, TimeUnit)}
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public void cancelMuteAwaitConnection(@NonNull AudioDeviceAttributes device)
             throws IllegalStateException {
         Objects.requireNonNull(device);
@@ -8797,7 +8803,7 @@
      * @param callback the callback to register
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public void registerMuteAwaitConnectionCallback(
             @NonNull @CallbackExecutor Executor executor,
             @NonNull MuteAwaitConnectionCallback callback) {
@@ -8821,7 +8827,7 @@
      * @param callback the callback to unregister
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public void unregisterMuteAwaitConnectionCallback(
             @NonNull MuteAwaitConnectionCallback callback) {
         synchronized (mMuteAwaitConnectionListenerLock) {
@@ -8843,7 +8849,7 @@
      * @hide
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public void addAssistantServicesUids(@NonNull int[] assistantUids) {
         try {
             getService().addAssistantServicesUids(assistantUids);
@@ -8860,7 +8866,7 @@
      * @hide
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public void removeAssistantServicesUids(@NonNull int[] assistantUids) {
         try {
             getService().removeAssistantServicesUids(assistantUids);
@@ -8885,7 +8891,7 @@
      * @hide
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public @NonNull int[] getAssistantServicesUids() {
         try {
             int[] uids = getService().getAssistantServicesUids();
@@ -8910,7 +8916,7 @@
      * @hide
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public void setActiveAssistantServiceUids(@NonNull int[]  assistantUids) {
         try {
             getService().setActiveAssistantServiceUids(assistantUids);
@@ -8928,7 +8934,7 @@
      * @hide
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public @NonNull int[] getActiveAssistantServicesUids() {
         try {
             int[] uids = getService().getActiveAssistantServiceUids();
@@ -9002,7 +9008,7 @@
      * @see #getPreferredMixerAttributes(AudioAttributes, AudioDeviceInfo)
      * @see #clearPreferredMixerAttributes(AudioAttributes, AudioDeviceInfo)
      */
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_SETTINGS)
     public boolean setPreferredMixerAttributes(@NonNull AudioAttributes attributes,
             @NonNull AudioDeviceInfo device,
             @NonNull AudioMixerAttributes mixerAttributes) {
@@ -9056,7 +9062,7 @@
      * @see #setPreferredMixerAttributes(AudioAttributes, AudioDeviceInfo, AudioMixerAttributes)
      * @see #getPreferredMixerAttributes(AudioAttributes, AudioDeviceInfo)
      */
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_SETTINGS)
     public boolean clearPreferredMixerAttributes(
             @NonNull AudioAttributes attributes,
             @NonNull AudioDeviceInfo device) {
@@ -9176,7 +9182,7 @@
      * @hide
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public boolean supportsBluetoothVariableLatency() {
         try {
             return getService().supportsBluetoothVariableLatency();
@@ -9193,7 +9199,7 @@
      * @hide
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public void setBluetoothVariableLatencyEnabled(boolean enabled) {
         try {
             getService().setBluetoothVariableLatencyEnabled(enabled);
@@ -9207,7 +9213,7 @@
      * @hide
      */
     @SystemApi
-    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @RequiresPermission(Manifest.permission.MODIFY_AUDIO_ROUTING)
     public boolean isBluetoothVariableLatencyEnabled() {
         try {
             return getService().isBluetoothVariableLatencyEnabled();
diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl
index 5ba7891..4983789 100644
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -405,10 +405,11 @@
 
     oneway void setRttEnabled(in boolean rttEnabled);
 
-    @EnforcePermission("MODIFY_AUDIO_ROUTING")
+    @EnforcePermission(anyOf = {"MODIFY_AUDIO_ROUTING", "MODIFY_AUDIO_SYSTEM_SETTINGS"})
     void setDeviceVolumeBehavior(in AudioDeviceAttributes device,
              in int deviceVolumeBehavior, in String pkgName);
 
+    @EnforcePermission(anyOf = {"MODIFY_AUDIO_ROUTING", "QUERY_AUDIO_STATE", "MODIFY_AUDIO_SYSTEM_SETTINGS"})
     int getDeviceVolumeBehavior(in AudioDeviceAttributes device);
 
     // WARNING: read warning at top of file, new methods that need to be used by native
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 92a9f46..9a07bb9 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -7006,20 +7006,21 @@
         }
     }
 
-    @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
     /**
      * @see AudioManager#setDeviceVolumeBehavior(AudioDeviceAttributes, int)
      * @param device the audio device to be affected
      * @param deviceVolumeBehavior one of the device behaviors
      */
+    @android.annotation.EnforcePermission(anyOf =
+            {"MODIFY_AUDIO_ROUTING", "MODIFY_AUDIO_SYSTEM_SETTINGS"})
     public void setDeviceVolumeBehavior(@NonNull AudioDeviceAttributes device,
             @AudioManager.DeviceVolumeBehavior int deviceVolumeBehavior, @Nullable String pkgName) {
         // verify permissions
-        // verify arguments
         super.setDeviceVolumeBehavior_enforcePermission();
-
+        // verify arguments
         Objects.requireNonNull(device);
         AudioManager.enforceValidVolumeBehavior(deviceVolumeBehavior);
+
         sVolumeLogger.enqueue(new EventLogger.StringEvent("setDeviceVolumeBehavior: dev:"
                 + AudioSystem.getOutputDeviceName(device.getInternalType()) + " addr:"
                 + device.getAddress() + " behavior:"
@@ -7090,11 +7091,14 @@
      * @param device the audio output device type
      * @return the volume behavior for the device
      */
+    @android.annotation.EnforcePermission(anyOf =
+            {"MODIFY_AUDIO_ROUTING", "QUERY_AUDIO_STATE", "MODIFY_AUDIO_SYSTEM_SETTINGS"})
     public @AudioManager.DeviceVolumeBehavior
     int getDeviceVolumeBehavior(@NonNull AudioDeviceAttributes device) {
-        Objects.requireNonNull(device);
         // verify permissions
-        enforceQueryStateOrModifyRoutingPermission();
+        super.getDeviceVolumeBehavior_enforcePermission();
+        // verify parameters
+        Objects.requireNonNull(device);
 
         return getDeviceVolumeBehaviorInt(device);
     }