Merge "Add attribution tag to AudioService"

This commit is contained in:
John Wu
2021-06-29 15:25:41 +00:00
committed by Android (Google) Code Review
6 changed files with 80 additions and 62 deletions

View File

@@ -930,8 +930,8 @@ public class AudioManager {
public void adjustStreamVolume(int streamType, int direction, int flags) {
final IAudioService service = getService();
try {
service.adjustStreamVolume(streamType, direction, flags,
getContext().getOpPackageName());
service.adjustStreamVolumeWithAttribution(streamType, direction, flags,
getContext().getOpPackageName(), getContext().getAttributionTag());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -1001,7 +1001,7 @@ public class AudioManager {
final IAudioService service = getService();
try {
service.setMasterMute(mute, flags, getContext().getOpPackageName(),
UserHandle.getCallingUserId());
UserHandle.getCallingUserId(), getContext().getAttributionTag());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -1254,7 +1254,8 @@ public class AudioManager {
public void setStreamVolume(int streamType, int index, int flags) {
final IAudioService service = getService();
try {
service.setStreamVolume(streamType, index, flags, getContext().getOpPackageName());
service.setStreamVolumeWithAttribution(streamType, index, flags,
getContext().getOpPackageName(), getContext().getAttributionTag());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -1279,7 +1280,7 @@ public class AudioManager {
final IAudioService service = getService();
try {
service.setVolumeIndexForAttributes(attr, index, flags,
getContext().getOpPackageName());
getContext().getOpPackageName(), getContext().getAttributionTag());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -2739,7 +2740,7 @@ public class AudioManager {
final IAudioService service = getService();
try {
service.setMicrophoneMute(on, getContext().getOpPackageName(),
UserHandle.getCallingUserId());
UserHandle.getCallingUserId(), getContext().getAttributionTag());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -4266,7 +4267,9 @@ public class AudioManager {
afr.getFocusGain(), mICallBack,
mAudioFocusDispatcher,
clientId,
getContext().getOpPackageName() /* package name */, afr.getFlags(),
getContext().getOpPackageName() /* package name */,
getContext().getAttributionTag(),
afr.getFlags(),
ap != null ? ap.cb() : null,
sdk);
} catch (RemoteException e) {
@@ -4371,6 +4374,7 @@ public class AudioManager {
durationHint, mICallBack, null,
AudioSystem.IN_VOICE_COMM_FOCUS_ID,
getContext().getOpPackageName(),
getContext().getAttributionTag(),
AUDIOFOCUS_FLAG_LOCK,
null /* policy token */, 0 /* sdk n/a here*/);
} catch (RemoteException e) {

View File

@@ -77,15 +77,17 @@ interface IAudioService {
oneway void playerSessionId(in int piid, in int sessionId);
// Java-only methods below.
oneway void adjustSuggestedStreamVolume(int direction, int suggestedStreamType, int flags,
String callingPackage, String caller);
void adjustStreamVolume(int streamType, int direction, int flags, String callingPackage);
void adjustStreamVolumeWithAttribution(int streamType, int direction, int flags,
in String callingPackage, in String attributionTag);
@UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553)
void setStreamVolume(int streamType, int index, int flags, String callingPackage);
void setStreamVolumeWithAttribution(int streamType, int index, int flags,
in String callingPackage, in String attributionTag);
oneway void handleVolumeKey(in KeyEvent event, boolean isOnTv,
String callingPackage, String caller);
@@ -95,7 +97,8 @@ interface IAudioService {
boolean isMasterMute();
void setMasterMute(boolean mute, int flags, String callingPackage, int userId);
void setMasterMute(boolean mute, int flags, String callingPackage, int userId,
in String attributionTag);
@UnsupportedAppUsage
int getStreamVolume(int streamType);
@@ -107,7 +110,8 @@ interface IAudioService {
List<AudioVolumeGroup> getAudioVolumeGroups();
void setVolumeIndexForAttributes(in AudioAttributes aa, int index, int flags, String callingPackage);
void setVolumeIndexForAttributes(in AudioAttributes aa, int index, int flags,
String callingPackage, in String attributionTag);
int getVolumeIndexForAttributes(in AudioAttributes aa);
@@ -125,7 +129,7 @@ interface IAudioService {
boolean isMicrophoneMuted();
void setMicrophoneMute(boolean on, String callingPackage, int userId);
void setMicrophoneMute(boolean on, String callingPackage, int userId, in String attributionTag);
oneway void setMicrophoneMuteFromSwitch(boolean on);
@@ -182,8 +186,8 @@ interface IAudioService {
boolean isBluetoothA2dpOn();
int requestAudioFocus(in AudioAttributes aa, int durationHint, IBinder cb,
IAudioFocusDispatcher fd, String clientId, String callingPackageName, int flags,
IAudioPolicyCallback pcb, int sdk);
IAudioFocusDispatcher fd, in String clientId, in String callingPackageName,
in String attributionTag, int flags, IAudioPolicyCallback pcb, int sdk);
int abandonAudioFocus(IAudioFocusDispatcher fd, String clientId, in AudioAttributes aa,
in String callingPackageName);

View File

@@ -2034,8 +2034,8 @@ public class MediaRouter {
public void requestSetVolume(int volume) {
if (mPlaybackType == PLAYBACK_TYPE_LOCAL) {
try {
sStatic.mAudioService.setStreamVolume(mPlaybackStream, volume, 0,
ActivityThread.currentPackageName());
sStatic.mAudioService.setStreamVolumeWithAttribution(mPlaybackStream, volume, 0,
ActivityThread.currentPackageName(), null);
} catch (RemoteException e) {
Log.e(TAG, "Error setting local stream volume", e);
}
@@ -2053,8 +2053,8 @@ public class MediaRouter {
try {
final int volume =
Math.max(0, Math.min(getVolume() + direction, getVolumeMax()));
sStatic.mAudioService.setStreamVolume(mPlaybackStream, volume, 0,
ActivityThread.currentPackageName());
sStatic.mAudioService.setStreamVolumeWithAttribution(mPlaybackStream, volume, 0,
ActivityThread.currentPackageName(), null);
} catch (RemoteException e) {
Log.e(TAG, "Error setting local stream volume", e);
}

View File

@@ -2585,14 +2585,6 @@ public class AudioService extends IAudioService.Stub
}
}
/** @see AudioManager#adjustVolume(int, int) */
public void adjustSuggestedStreamVolume(int direction, int suggestedStreamType, int flags,
String callingPackage, String caller) {
adjustSuggestedStreamVolume(direction, suggestedStreamType, flags, callingPackage,
caller, Binder.getCallingUid(), callingHasAudioSettingsPermission(),
VOL_ADJUST_NORMAL);
}
public void setNavigationRepeatSoundEffectsEnabled(boolean enabled) {
mNavigationRepeatSoundEffectsEnabled = enabled;
}
@@ -2615,6 +2607,7 @@ public class AudioService extends IAudioService.Stub
return mHomeSoundEffectEnabled;
}
/** All callers come from platform apps/system server, so no attribution tag is needed */
private void adjustSuggestedStreamVolume(int direction, int suggestedStreamType, int flags,
String callingPackage, String caller, int uid, boolean hasModifyAudioSettings,
int keyEventMode) {
@@ -2690,7 +2683,7 @@ public class AudioService extends IAudioService.Stub
}
adjustStreamVolume(streamType, direction, flags, callingPackage, caller, uid,
hasModifyAudioSettings, keyEventMode);
null, hasModifyAudioSettings, keyEventMode);
}
private boolean notifyExternalVolumeController(int direction) {
@@ -2708,10 +2701,16 @@ public class AudioService extends IAudioService.Stub
return true;
}
/** @see AudioManager#adjustStreamVolume(int, int, int)
* Part of service interface, check permissions here */
/** Retain API for unsupported app usage */
public void adjustStreamVolume(int streamType, int direction, int flags,
String callingPackage) {
adjustStreamVolumeWithAttribution(streamType, direction, flags, callingPackage, null);
}
/** @see AudioManager#adjustStreamVolume(int, int, int)
* Part of service interface, check permissions here */
public void adjustStreamVolumeWithAttribution(int streamType, int direction, int flags,
String callingPackage, String attributionTag) {
if ((streamType == AudioManager.STREAM_ACCESSIBILITY) && !canChangeAccessibilityVolume()) {
Log.w(TAG, "Trying to call adjustStreamVolume() for a11y without"
+ "CHANGE_ACCESSIBILITY_VOLUME / callingPackage=" + callingPackage);
@@ -2721,13 +2720,13 @@ public class AudioService extends IAudioService.Stub
sVolumeLogger.log(new VolumeEvent(VolumeEvent.VOL_ADJUST_STREAM_VOL, streamType,
direction/*val1*/, flags/*val2*/, callingPackage));
adjustStreamVolume(streamType, direction, flags, callingPackage, callingPackage,
Binder.getCallingUid(), callingHasAudioSettingsPermission(),
Binder.getCallingUid(), attributionTag, callingHasAudioSettingsPermission(),
VOL_ADJUST_NORMAL);
}
protected void adjustStreamVolume(int streamType, int direction, int flags,
String callingPackage, String caller, int uid, boolean hasModifyAudioSettings,
int keyEventMode) {
String callingPackage, String caller, int uid, String attributionTag,
boolean hasModifyAudioSettings, int keyEventMode) {
if (mUseFixedVolume) {
return;
}
@@ -2792,8 +2791,8 @@ public class AudioService extends IAudioService.Stub
if (uid == android.os.Process.SYSTEM_UID) {
uid = UserHandle.getUid(getCurrentUserId(), UserHandle.getAppId(uid));
}
if (mAppOps.noteOp(STREAM_VOLUME_OPS[streamTypeAlias], uid, callingPackage)
!= AppOpsManager.MODE_ALLOWED) {
if (mAppOps.noteOp(STREAM_VOLUME_OPS[streamTypeAlias], uid,
callingPackage, attributionTag, null) != AppOpsManager.MODE_ALLOWED) {
return;
}
@@ -3159,7 +3158,7 @@ public class AudioService extends IAudioService.Stub
/** @see AudioManager#setVolumeIndexForAttributes(attr, int, int) */
public void setVolumeIndexForAttributes(@NonNull AudioAttributes attr, int index, int flags,
String callingPackage) {
String callingPackage, String attributionTag) {
enforceModifyAudioRoutingPermission();
Objects.requireNonNull(attr, "attr must not be null");
final int volumeGroup = getVolumeGroupIdForAttributes(attr);
@@ -3184,7 +3183,7 @@ public class AudioService extends IAudioService.Stub
continue;
}
setStreamVolume(groupedStream, index, flags, callingPackage, callingPackage,
Binder.getCallingUid(), true /*hasModifyAudioSettings*/);
attributionTag, Binder.getCallingUid(), true /*hasModifyAudioSettings*/);
}
}
@@ -3226,9 +3225,15 @@ public class AudioService extends IAudioService.Stub
return AudioSystem.getMinVolumeIndexForAttributes(attr);
}
/** Retain API for unsupported app usage */
public void setStreamVolume(int streamType, int index, int flags, String callingPackage) {
setStreamVolumeWithAttribution(streamType, index, flags, callingPackage, null);
}
/** @see AudioManager#setStreamVolume(int, int, int)
* Part of service interface, check permissions here */
public void setStreamVolume(int streamType, int index, int flags, String callingPackage) {
public void setStreamVolumeWithAttribution(int streamType, int index, int flags,
String callingPackage, String attributionTag) {
if ((streamType == AudioManager.STREAM_ACCESSIBILITY) && !canChangeAccessibilityVolume()) {
Log.w(TAG, "Trying to call setStreamVolume() for a11y without"
+ " CHANGE_ACCESSIBILITY_VOLUME callingPackage=" + callingPackage);
@@ -3254,7 +3259,7 @@ public class AudioService extends IAudioService.Stub
sVolumeLogger.log(new VolumeEvent(VolumeEvent.VOL_SET_STREAM_VOL, streamType,
index/*val1*/, flags/*val2*/, callingPackage));
setStreamVolume(streamType, index, flags, callingPackage, callingPackage,
Binder.getCallingUid(), callingOrSelfHasAudioSettingsPermission());
attributionTag, Binder.getCallingUid(), callingOrSelfHasAudioSettingsPermission());
}
private boolean canChangeAccessibilityVolume() {
@@ -3489,7 +3494,8 @@ public class AudioService extends IAudioService.Stub
}
private void setStreamVolume(int streamType, int index, int flags, String callingPackage,
String caller, int uid, boolean hasModifyAudioSettings) {
String caller, String attributionTag, int uid,
boolean hasModifyAudioSettings) {
if (DEBUG_VOL) {
Log.d(TAG, "setStreamVolume(stream=" + streamType+", index=" + index
+ ", calling=" + callingPackage + ")");
@@ -3516,8 +3522,8 @@ public class AudioService extends IAudioService.Stub
if (uid == android.os.Process.SYSTEM_UID) {
uid = UserHandle.getUid(getCurrentUserId(), UserHandle.getAppId(uid));
}
if (mAppOps.noteOp(STREAM_VOLUME_OPS[streamTypeAlias], uid, callingPackage)
!= AppOpsManager.MODE_ALLOWED) {
if (mAppOps.noteOp(STREAM_VOLUME_OPS[streamTypeAlias], uid,
callingPackage, attributionTag, null) != AppOpsManager.MODE_ALLOWED) {
return;
}
@@ -3945,15 +3951,15 @@ public class AudioService extends IAudioService.Stub
}
private void setMasterMuteInternal(boolean mute, int flags, String callingPackage, int uid,
int userId) {
int userId, String attributionTag) {
// If we are being called by the system check for user we are going to change
// so we handle user restrictions correctly.
if (uid == android.os.Process.SYSTEM_UID) {
uid = UserHandle.getUid(userId, UserHandle.getAppId(uid));
}
// If OP_AUDIO_MASTER_VOLUME is set, disallow unmuting.
if (!mute && mAppOps.noteOp(AppOpsManager.OP_AUDIO_MASTER_VOLUME, uid, callingPackage)
!= AppOpsManager.MODE_ALLOWED) {
if (!mute && mAppOps.noteOp(AppOpsManager.OP_AUDIO_MASTER_VOLUME, uid,
callingPackage, attributionTag, null) != AppOpsManager.MODE_ALLOWED) {
return;
}
if (userId != UserHandle.getCallingUserId() &&
@@ -3995,10 +4001,12 @@ public class AudioService extends IAudioService.Stub
return AudioSystem.getMasterMute();
}
public void setMasterMute(boolean mute, int flags, String callingPackage, int userId) {
/** @see AudioManager#setMasterMute(boolean, int) */
public void setMasterMute(boolean mute, int flags, String callingPackage, int userId,
String attributionTag) {
enforceModifyAudioRoutingPermission();
setMasterMuteInternal(mute, flags, callingPackage, Binder.getCallingUid(),
userId);
setMasterMuteInternal(mute, flags, callingPackage,
Binder.getCallingUid(), userId, attributionTag);
}
/** @see AudioManager#getStreamVolume(int) */
@@ -4069,7 +4077,8 @@ public class AudioService extends IAudioService.Stub
/** @see AudioManager#setMicrophoneMute(boolean) */
@Override
public void setMicrophoneMute(boolean on, String callingPackage, int userId) {
public void setMicrophoneMute(boolean on, String callingPackage, int userId,
String attributionTag) {
// If we are being called by the system check for user we are going to change
// so we handle user restrictions correctly.
int uid = Binder.getCallingUid();
@@ -4084,8 +4093,8 @@ public class AudioService extends IAudioService.Stub
? MediaMetrics.Value.MUTE : MediaMetrics.Value.UNMUTE);
// If OP_MUTE_MICROPHONE is set, disallow unmuting.
if (!on && mAppOps.noteOp(AppOpsManager.OP_MUTE_MICROPHONE, uid, callingPackage)
!= AppOpsManager.MODE_ALLOWED) {
if (!on && mAppOps.noteOp(AppOpsManager.OP_MUTE_MICROPHONE, uid,
callingPackage, attributionTag, null) != AppOpsManager.MODE_ALLOWED) {
mmi.set(MediaMetrics.Property.EARLY_RETURN, "disallow unmuting").record();
return;
}
@@ -4921,7 +4930,7 @@ public class AudioService extends IAudioService.Stub
}
adjustStreamVolume(streamType, direction, flags, packageName, packageName, uid,
hasAudioSettingsPermission(uid, pid), VOL_ADJUST_NORMAL);
null, hasAudioSettingsPermission(uid, pid), VOL_ADJUST_NORMAL);
}
/** @see AudioManager#setStreamVolumeForUid(int, int, int, String, int, int, int) */
@@ -4933,7 +4942,7 @@ public class AudioService extends IAudioService.Stub
throw new SecurityException("Should only be called from system process");
}
setStreamVolume(streamType, index, flags, packageName, packageName, uid,
setStreamVolume(streamType, index, flags, packageName, packageName, null, uid,
hasAudioSettingsPermission(uid, pid));
}
@@ -8069,8 +8078,8 @@ public class AudioService extends IAudioService.Stub
}
public int requestAudioFocus(AudioAttributes aa, int durationHint, IBinder cb,
IAudioFocusDispatcher fd, String clientId, String callingPackageName, int flags,
IAudioPolicyCallback pcb, int sdk) {
IAudioFocusDispatcher fd, String clientId, String callingPackageName,
String attributionTag, int flags, IAudioPolicyCallback pcb, int sdk) {
final int uid = Binder.getCallingUid();
MediaMetrics.Item mmi = new MediaMetrics.Item(mMetricsId + "focus")
.setUid(uid)
@@ -8122,7 +8131,7 @@ public class AudioService extends IAudioService.Stub
}
mmi.record();
return mMediaFocusControl.requestAudioFocus(aa, durationHint, cb, fd,
clientId, callingPackageName, flags, sdk,
clientId, callingPackageName, attributionTag, flags, sdk,
forceFocusDuckingForAccessibility(aa, durationHint, uid), -1 /*testUid, ignored*/);
}
@@ -8139,7 +8148,7 @@ public class AudioService extends IAudioService.Stub
return AudioManager.AUDIOFOCUS_REQUEST_FAILED;
}
return mMediaFocusControl.requestAudioFocus(aa, durationHint, cb, fd,
clientId, callingPackageName, AudioManager.AUDIOFOCUS_FLAG_TEST,
clientId, callingPackageName, null, AudioManager.AUDIOFOCUS_FLAG_TEST,
sdk, false /*forceDuck*/, fakeUid);
}

View File

@@ -857,6 +857,7 @@ public class MediaFocusControl implements PlayerFocusEnforcer {
* @param fd
* @param clientId
* @param callingPackageName
* @param attributionTag
* @param flags
* @param sdk
* @param forceDuck only true if
@@ -868,7 +869,7 @@ public class MediaFocusControl implements PlayerFocusEnforcer {
*/
protected int requestAudioFocus(@NonNull AudioAttributes aa, int focusChangeHint, IBinder cb,
IAudioFocusDispatcher fd, @NonNull String clientId, @NonNull String callingPackageName,
int flags, int sdk, boolean forceDuck, int testUid) {
String attributionTag, int flags, int sdk, boolean forceDuck, int testUid) {
new MediaMetrics.Item(mMetricsId)
.setUid(Binder.getCallingUid())
.set(MediaMetrics.Property.CALLING_PACKAGE, callingPackageName)
@@ -903,7 +904,7 @@ public class MediaFocusControl implements PlayerFocusEnforcer {
if ((flags != AudioManager.AUDIOFOCUS_FLAG_TEST)
// note we're using the real uid for appOp evaluation
&& (mAppOps.noteOp(AppOpsManager.OP_TAKE_AUDIO_FOCUS, Binder.getCallingUid(),
callingPackageName) != AppOpsManager.MODE_ALLOWED)) {
callingPackageName, attributionTag, null) != AppOpsManager.MODE_ALLOWED)) {
return AudioManager.AUDIOFOCUS_REQUEST_FAILED;
}

View File

@@ -75,7 +75,7 @@ public class AudioServiceTest {
for (boolean muted : new boolean[] { true, false}) {
testAudioSystem.configureIsMicrophoneMuted(!muted);
mAudioService.setMicrophoneMute(muted, mContext.getOpPackageName(),
UserHandle.getCallingUserId());
UserHandle.getCallingUserId(), null);
Assert.assertEquals("mic mute reporting wrong value",
muted, mAudioService.isMicrophoneMuted());
// verify the intent for mic mute changed is supposed to be fired
@@ -100,7 +100,7 @@ public class AudioServiceTest {
for (boolean muted : new boolean[] { true, false}) {
testAudioSystem.configureIsMicrophoneMuted(!muted);
mAudioService.setMicrophoneMute(muted, mContext.getOpPackageName(),
UserHandle.getCallingUserId());
UserHandle.getCallingUserId(), null);
Assert.assertEquals("mic mute reporting wrong value",
!muted, mAudioService.isMicrophoneMuted());
// verify the intent for mic mute changed is supposed to be fired