Merge "Introduce MODIFY_AUDIO_SYSTEM_SETTINGS permission"

This commit is contained in:
Eric Laurent
2023-01-17 08:31:06 +00:00
committed by Android (Google) Code Review
6 changed files with 31 additions and 20 deletions

View File

@@ -209,6 +209,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";
@@ -6609,8 +6610,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 {

View File

@@ -5335,6 +5335,14 @@
<permission android:name="android.permission.MODIFY_AUDIO_ROUTING"
android:protectionLevel="signature|privileged|role" />
<!--@SystemApi Allows an application to modify system audio settings that shouldn't be
controllable by external apps, such as volume settings or volume behaviors for audio
devices, regardless of their connection status.
<p>Not for use by third-party applications.
@hide -->
<permission android:name="android.permission.MODIFY_AUDIO_SYSTEM_SETTINGS"
android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to access the uplink and downlink audio of an ongoing
call.
<p>Not for use by third-party applications.</p>

View File

@@ -465,6 +465,7 @@ applications that come with the platform
<!-- Permission required for CTS test - SystemMediaRouter2Test -->
<permission name="android.permission.MEDIA_CONTENT_CONTROL"/>
<permission name="android.permission.MODIFY_AUDIO_ROUTING"/>
<permission name="android.permission.MODIFY_AUDIO_SYSTEM_SETTINGS"/>
<!-- Permission required for CTS test - CallAudioInterceptionTest -->
<permission name="android.permission.CALL_AUDIO_INTERCEPTION"/>
<!-- Permission required for CTS test - CtsPermission5TestCases -->

View File

@@ -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 {

View File

@@ -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);

View File

@@ -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) {
@@ -3859,13 +3847,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);
@@ -4805,12 +4796,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);