Loading media/java/android/media/AudioManager.java +11 −11 Original line number Diff line number Diff line Loading @@ -4567,8 +4567,8 @@ public class AudioManager { * when the request is flagged with {@link #AUDIOFOCUS_FLAG_DELAY_OK}. * @param requestAttributes non null {@link AudioAttributes} describing the main reason for * requesting audio focus. * @param durationHint use {@link #AUDIOFOCUS_GAIN_TRANSIENT} to indicate this focus request * is temporary, and focus will be abandonned shortly. Examples of transient requests are * @param focusReqType use {@link #AUDIOFOCUS_GAIN_TRANSIENT} to indicate this focus request * is temporary, and focus will be abandoned shortly. Examples of transient requests are * for the playback of driving directions, or notifications sounds. * Use {@link #AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK} to indicate also that it's ok for * the previous focus owner to keep playing if it ducks its audio output. Loading @@ -4593,13 +4593,13 @@ public class AudioManager { @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public int requestAudioFocus(OnAudioFocusChangeListener l, @NonNull AudioAttributes requestAttributes, int durationHint, int focusReqType, int flags) throws IllegalArgumentException { if (flags != (flags & AUDIOFOCUS_FLAGS_APPS)) { throw new IllegalArgumentException("Invalid flags 0x" + Integer.toHexString(flags).toUpperCase()); } return requestAudioFocus(l, requestAttributes, durationHint, return requestAudioFocus(l, requestAttributes, focusReqType, flags & AUDIOFOCUS_FLAGS_APPS, null /* no AudioPolicy*/); } Loading @@ -4614,7 +4614,7 @@ public class AudioManager { * {@link #requestAudioFocus(OnAudioFocusChangeListener, AudioAttributes, int, int)} * @param requestAttributes non null {@link AudioAttributes} describing the main reason for * requesting audio focus. * @param durationHint see the description of the same parameter in * @param focusReqType see the description of the same parameter in * {@link #requestAudioFocus(OnAudioFocusChangeListener, AudioAttributes, int, int)} * @param flags 0 or a combination of {link #AUDIOFOCUS_FLAG_DELAY_OK}, * {@link #AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS}, and {@link #AUDIOFOCUS_FLAG_LOCK}. Loading @@ -4636,14 +4636,14 @@ public class AudioManager { }) public int requestAudioFocus(OnAudioFocusChangeListener l, @NonNull AudioAttributes requestAttributes, int durationHint, int focusReqType, int flags, AudioPolicy ap) throws IllegalArgumentException { // parameter checking if (requestAttributes == null) { throw new IllegalArgumentException("Illegal null AudioAttributes argument"); } if (!AudioFocusRequest.isValidFocusGain(durationHint)) { if (!AudioFocusRequest.isValidFocusGain(focusReqType)) { throw new IllegalArgumentException("Invalid duration hint"); } if (flags != (flags & AUDIOFOCUS_FLAGS_SYSTEM)) { Loading @@ -4664,7 +4664,7 @@ public class AudioManager { "Illegal null audio policy when locking audio focus"); } final AudioFocusRequest afr = new AudioFocusRequest.Builder(durationHint) final AudioFocusRequest afr = new AudioFocusRequest.Builder(focusReqType) .setOnAudioFocusChangeListenerInt(l, null /* no Handler for this legacy API */) .setAudioAttributes(requestAttributes) .setAcceptsDelayedFocusGain((flags & AUDIOFOCUS_FLAG_DELAY_OK) Loading Loading @@ -5025,16 +5025,16 @@ public class AudioManager { * to identify this use case. * @param streamType use STREAM_RING for focus requests when ringing, VOICE_CALL for * the establishment of the call * @param durationHint the type of focus request. AUDIOFOCUS_GAIN_TRANSIENT is recommended so * @param focusReqType the type of focus request. AUDIOFOCUS_GAIN_TRANSIENT is recommended so * media applications resume after a call */ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) public void requestAudioFocusForCall(int streamType, int durationHint) { public void requestAudioFocusForCall(int streamType, int focusReqType) { final IAudioService service = getService(); try { service.requestAudioFocus(new AudioAttributes.Builder() .setInternalLegacyStreamType(streamType).build(), durationHint, mICallBack, null, focusReqType, mICallBack, null, AudioSystem.IN_VOICE_COMM_FOCUS_ID, getContext().getOpPackageName(), getContext().getAttributionTag(), Loading media/java/android/media/IAudioService.aidl +2 −2 Original line number Diff line number Diff line Loading @@ -252,7 +252,7 @@ interface IAudioService { boolean isBluetoothA2dpOn(); int requestAudioFocus(in AudioAttributes aa, int durationHint, IBinder cb, int requestAudioFocus(in AudioAttributes aa, int focusReqType, IBinder cb, IAudioFocusDispatcher fd, in String clientId, in String callingPackageName, in String attributionTag, int flags, IAudioPolicyCallback pcb, int sdk); Loading Loading @@ -562,7 +562,7 @@ interface IAudioService { long getMaxAdditionalOutputDeviceDelay(in AudioDeviceAttributes device); int requestAudioFocusForTest(in AudioAttributes aa, int durationHint, IBinder cb, int requestAudioFocusForTest(in AudioAttributes aa, int focusReqType, IBinder cb, in IAudioFocusDispatcher fd, in String clientId, in String callingPackageName, int flags, int uid, int sdk); Loading services/core/java/com/android/server/audio/AudioService.java +8 −8 Original line number Diff line number Diff line Loading @@ -10730,7 +10730,7 @@ public class AudioService extends IAudioService.Stub return true; } public int requestAudioFocus(AudioAttributes aa, int durationHint, IBinder cb, public int requestAudioFocus(AudioAttributes aa, int focusReqType, IBinder cb, IAudioFocusDispatcher fd, String clientId, String callingPackageName, String attributionTag, int flags, IAudioPolicyCallback pcb, int sdk) { if ((flags & AudioManager.AUDIOFOCUS_FLAG_TEST) != 0) { Loading @@ -10739,7 +10739,7 @@ public class AudioService extends IAudioService.Stub final int uid = Binder.getCallingUid(); MediaMetrics.Item mmi = new MediaMetrics.Item(mMetricsId + "focus") .setUid(uid) //.putInt("durationHint", durationHint) //.putInt("focusReqType", focusReqType) .set(MediaMetrics.Property.CALLING_PACKAGE, callingPackageName) .set(MediaMetrics.Property.CLIENT_NAME, clientId) .set(MediaMetrics.Property.EVENT, "requestAudioFocus") Loading Loading @@ -10802,11 +10802,11 @@ public class AudioService extends IAudioService.Stub //TODO move inside HardeningEnforcer after refactor that moves permission checks // in the blockFocusMethod if (permissionOverridesCheck) { mHardeningEnforcer.metricsLogFocusReq(/*blocked*/false, durationHint, uid); mHardeningEnforcer.metricsLogFocusReq(/*blocked*/false, focusReqType, uid); } if (!permissionOverridesCheck && mHardeningEnforcer.blockFocusMethod(uid, HardeningEnforcer.METHOD_AUDIO_MANAGER_REQUEST_AUDIO_FOCUS, clientId, durationHint, callingPackageName, attributionTag, sdk)) { clientId, focusReqType, callingPackageName, attributionTag, sdk)) { final String reason = "Audio focus request blocked by hardening"; Log.w(TAG, reason); mmi.set(MediaMetrics.Property.EARLY_RETURN, reason).record(); Loading @@ -10817,14 +10817,14 @@ public class AudioService extends IAudioService.Stub } mmi.record(); return mMediaFocusControl.requestAudioFocus(aa, durationHint, cb, fd, return mMediaFocusControl.requestAudioFocus(aa, focusReqType, cb, fd, clientId, callingPackageName, flags, sdk, forceFocusDuckingForAccessibility(aa, durationHint, uid), -1 /*testUid, ignored*/, forceFocusDuckingForAccessibility(aa, focusReqType, uid), -1 /*testUid, ignored*/, permissionOverridesCheck); } /** see {@link AudioManager#requestAudioFocusForTest(AudioFocusRequest, String, int, int)} */ public int requestAudioFocusForTest(AudioAttributes aa, int durationHint, IBinder cb, public int requestAudioFocusForTest(AudioAttributes aa, int focusReqType, IBinder cb, IAudioFocusDispatcher fd, String clientId, String callingPackageName, int flags, int fakeUid, int sdk) { if (!enforceQueryAudioStateForTest("focus request")) { Loading @@ -10835,7 +10835,7 @@ public class AudioService extends IAudioService.Stub Log.e(TAG, reason); return AudioManager.AUDIOFOCUS_REQUEST_FAILED; } return mMediaFocusControl.requestAudioFocus(aa, durationHint, cb, fd, return mMediaFocusControl.requestAudioFocus(aa, focusReqType, cb, fd, clientId, callingPackageName, flags, sdk, false /*forceDuck*/, fakeUid, true /*permissionOverridesCheck*/); } Loading services/core/java/com/android/server/audio/HardeningEnforcer.java +4 −4 Original line number Diff line number Diff line Loading @@ -155,14 +155,14 @@ public class HardeningEnforcer { * Checks whether the call in the current thread should be allowed or blocked * @param focusMethod name of the method to check, for logging purposes * @param clientId id of the requester * @param durationHint focus type being requested * @param focusReqType focus type being requested * @param attributionTag attribution of the caller * @param targetSdk target SDK of the caller * @return false if the method call is allowed, true if it should be a no-op */ @SuppressWarnings("AndroidFrameworkCompatChange") protected boolean blockFocusMethod(int callingUid, int focusMethod, @NonNull String clientId, int durationHint, @NonNull String packageName, String attributionTag, int targetSdk) { int focusReqType, @NonNull String packageName, String attributionTag, int targetSdk) { if (packageName.isEmpty()) { packageName = getPackNameForUid(callingUid); } Loading @@ -181,14 +181,14 @@ public class HardeningEnforcer { blocked = false; } metricsLogFocusReq(blocked, durationHint, callingUid); metricsLogFocusReq(blocked, focusReqType, callingUid); if (!blocked) { return false; } String errorMssg = "Focus request DENIED for uid:" + callingUid + " clientId:" + clientId + " req:" + durationHint + " clientId:" + clientId + " req:" + focusReqType + " procState:" + mActivityManager.getUidProcessState(callingUid); mEventLogger.enqueueAndSlog(errorMssg, EventLogger.Event.ALOGI, TAG); Loading Loading
media/java/android/media/AudioManager.java +11 −11 Original line number Diff line number Diff line Loading @@ -4567,8 +4567,8 @@ public class AudioManager { * when the request is flagged with {@link #AUDIOFOCUS_FLAG_DELAY_OK}. * @param requestAttributes non null {@link AudioAttributes} describing the main reason for * requesting audio focus. * @param durationHint use {@link #AUDIOFOCUS_GAIN_TRANSIENT} to indicate this focus request * is temporary, and focus will be abandonned shortly. Examples of transient requests are * @param focusReqType use {@link #AUDIOFOCUS_GAIN_TRANSIENT} to indicate this focus request * is temporary, and focus will be abandoned shortly. Examples of transient requests are * for the playback of driving directions, or notifications sounds. * Use {@link #AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK} to indicate also that it's ok for * the previous focus owner to keep playing if it ducks its audio output. Loading @@ -4593,13 +4593,13 @@ public class AudioManager { @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public int requestAudioFocus(OnAudioFocusChangeListener l, @NonNull AudioAttributes requestAttributes, int durationHint, int focusReqType, int flags) throws IllegalArgumentException { if (flags != (flags & AUDIOFOCUS_FLAGS_APPS)) { throw new IllegalArgumentException("Invalid flags 0x" + Integer.toHexString(flags).toUpperCase()); } return requestAudioFocus(l, requestAttributes, durationHint, return requestAudioFocus(l, requestAttributes, focusReqType, flags & AUDIOFOCUS_FLAGS_APPS, null /* no AudioPolicy*/); } Loading @@ -4614,7 +4614,7 @@ public class AudioManager { * {@link #requestAudioFocus(OnAudioFocusChangeListener, AudioAttributes, int, int)} * @param requestAttributes non null {@link AudioAttributes} describing the main reason for * requesting audio focus. * @param durationHint see the description of the same parameter in * @param focusReqType see the description of the same parameter in * {@link #requestAudioFocus(OnAudioFocusChangeListener, AudioAttributes, int, int)} * @param flags 0 or a combination of {link #AUDIOFOCUS_FLAG_DELAY_OK}, * {@link #AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS}, and {@link #AUDIOFOCUS_FLAG_LOCK}. Loading @@ -4636,14 +4636,14 @@ public class AudioManager { }) public int requestAudioFocus(OnAudioFocusChangeListener l, @NonNull AudioAttributes requestAttributes, int durationHint, int focusReqType, int flags, AudioPolicy ap) throws IllegalArgumentException { // parameter checking if (requestAttributes == null) { throw new IllegalArgumentException("Illegal null AudioAttributes argument"); } if (!AudioFocusRequest.isValidFocusGain(durationHint)) { if (!AudioFocusRequest.isValidFocusGain(focusReqType)) { throw new IllegalArgumentException("Invalid duration hint"); } if (flags != (flags & AUDIOFOCUS_FLAGS_SYSTEM)) { Loading @@ -4664,7 +4664,7 @@ public class AudioManager { "Illegal null audio policy when locking audio focus"); } final AudioFocusRequest afr = new AudioFocusRequest.Builder(durationHint) final AudioFocusRequest afr = new AudioFocusRequest.Builder(focusReqType) .setOnAudioFocusChangeListenerInt(l, null /* no Handler for this legacy API */) .setAudioAttributes(requestAttributes) .setAcceptsDelayedFocusGain((flags & AUDIOFOCUS_FLAG_DELAY_OK) Loading Loading @@ -5025,16 +5025,16 @@ public class AudioManager { * to identify this use case. * @param streamType use STREAM_RING for focus requests when ringing, VOICE_CALL for * the establishment of the call * @param durationHint the type of focus request. AUDIOFOCUS_GAIN_TRANSIENT is recommended so * @param focusReqType the type of focus request. AUDIOFOCUS_GAIN_TRANSIENT is recommended so * media applications resume after a call */ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) public void requestAudioFocusForCall(int streamType, int durationHint) { public void requestAudioFocusForCall(int streamType, int focusReqType) { final IAudioService service = getService(); try { service.requestAudioFocus(new AudioAttributes.Builder() .setInternalLegacyStreamType(streamType).build(), durationHint, mICallBack, null, focusReqType, mICallBack, null, AudioSystem.IN_VOICE_COMM_FOCUS_ID, getContext().getOpPackageName(), getContext().getAttributionTag(), Loading
media/java/android/media/IAudioService.aidl +2 −2 Original line number Diff line number Diff line Loading @@ -252,7 +252,7 @@ interface IAudioService { boolean isBluetoothA2dpOn(); int requestAudioFocus(in AudioAttributes aa, int durationHint, IBinder cb, int requestAudioFocus(in AudioAttributes aa, int focusReqType, IBinder cb, IAudioFocusDispatcher fd, in String clientId, in String callingPackageName, in String attributionTag, int flags, IAudioPolicyCallback pcb, int sdk); Loading Loading @@ -562,7 +562,7 @@ interface IAudioService { long getMaxAdditionalOutputDeviceDelay(in AudioDeviceAttributes device); int requestAudioFocusForTest(in AudioAttributes aa, int durationHint, IBinder cb, int requestAudioFocusForTest(in AudioAttributes aa, int focusReqType, IBinder cb, in IAudioFocusDispatcher fd, in String clientId, in String callingPackageName, int flags, int uid, int sdk); Loading
services/core/java/com/android/server/audio/AudioService.java +8 −8 Original line number Diff line number Diff line Loading @@ -10730,7 +10730,7 @@ public class AudioService extends IAudioService.Stub return true; } public int requestAudioFocus(AudioAttributes aa, int durationHint, IBinder cb, public int requestAudioFocus(AudioAttributes aa, int focusReqType, IBinder cb, IAudioFocusDispatcher fd, String clientId, String callingPackageName, String attributionTag, int flags, IAudioPolicyCallback pcb, int sdk) { if ((flags & AudioManager.AUDIOFOCUS_FLAG_TEST) != 0) { Loading @@ -10739,7 +10739,7 @@ public class AudioService extends IAudioService.Stub final int uid = Binder.getCallingUid(); MediaMetrics.Item mmi = new MediaMetrics.Item(mMetricsId + "focus") .setUid(uid) //.putInt("durationHint", durationHint) //.putInt("focusReqType", focusReqType) .set(MediaMetrics.Property.CALLING_PACKAGE, callingPackageName) .set(MediaMetrics.Property.CLIENT_NAME, clientId) .set(MediaMetrics.Property.EVENT, "requestAudioFocus") Loading Loading @@ -10802,11 +10802,11 @@ public class AudioService extends IAudioService.Stub //TODO move inside HardeningEnforcer after refactor that moves permission checks // in the blockFocusMethod if (permissionOverridesCheck) { mHardeningEnforcer.metricsLogFocusReq(/*blocked*/false, durationHint, uid); mHardeningEnforcer.metricsLogFocusReq(/*blocked*/false, focusReqType, uid); } if (!permissionOverridesCheck && mHardeningEnforcer.blockFocusMethod(uid, HardeningEnforcer.METHOD_AUDIO_MANAGER_REQUEST_AUDIO_FOCUS, clientId, durationHint, callingPackageName, attributionTag, sdk)) { clientId, focusReqType, callingPackageName, attributionTag, sdk)) { final String reason = "Audio focus request blocked by hardening"; Log.w(TAG, reason); mmi.set(MediaMetrics.Property.EARLY_RETURN, reason).record(); Loading @@ -10817,14 +10817,14 @@ public class AudioService extends IAudioService.Stub } mmi.record(); return mMediaFocusControl.requestAudioFocus(aa, durationHint, cb, fd, return mMediaFocusControl.requestAudioFocus(aa, focusReqType, cb, fd, clientId, callingPackageName, flags, sdk, forceFocusDuckingForAccessibility(aa, durationHint, uid), -1 /*testUid, ignored*/, forceFocusDuckingForAccessibility(aa, focusReqType, uid), -1 /*testUid, ignored*/, permissionOverridesCheck); } /** see {@link AudioManager#requestAudioFocusForTest(AudioFocusRequest, String, int, int)} */ public int requestAudioFocusForTest(AudioAttributes aa, int durationHint, IBinder cb, public int requestAudioFocusForTest(AudioAttributes aa, int focusReqType, IBinder cb, IAudioFocusDispatcher fd, String clientId, String callingPackageName, int flags, int fakeUid, int sdk) { if (!enforceQueryAudioStateForTest("focus request")) { Loading @@ -10835,7 +10835,7 @@ public class AudioService extends IAudioService.Stub Log.e(TAG, reason); return AudioManager.AUDIOFOCUS_REQUEST_FAILED; } return mMediaFocusControl.requestAudioFocus(aa, durationHint, cb, fd, return mMediaFocusControl.requestAudioFocus(aa, focusReqType, cb, fd, clientId, callingPackageName, flags, sdk, false /*forceDuck*/, fakeUid, true /*permissionOverridesCheck*/); } Loading
services/core/java/com/android/server/audio/HardeningEnforcer.java +4 −4 Original line number Diff line number Diff line Loading @@ -155,14 +155,14 @@ public class HardeningEnforcer { * Checks whether the call in the current thread should be allowed or blocked * @param focusMethod name of the method to check, for logging purposes * @param clientId id of the requester * @param durationHint focus type being requested * @param focusReqType focus type being requested * @param attributionTag attribution of the caller * @param targetSdk target SDK of the caller * @return false if the method call is allowed, true if it should be a no-op */ @SuppressWarnings("AndroidFrameworkCompatChange") protected boolean blockFocusMethod(int callingUid, int focusMethod, @NonNull String clientId, int durationHint, @NonNull String packageName, String attributionTag, int targetSdk) { int focusReqType, @NonNull String packageName, String attributionTag, int targetSdk) { if (packageName.isEmpty()) { packageName = getPackNameForUid(callingUid); } Loading @@ -181,14 +181,14 @@ public class HardeningEnforcer { blocked = false; } metricsLogFocusReq(blocked, durationHint, callingUid); metricsLogFocusReq(blocked, focusReqType, callingUid); if (!blocked) { return false; } String errorMssg = "Focus request DENIED for uid:" + callingUid + " clientId:" + clientId + " req:" + durationHint + " clientId:" + clientId + " req:" + focusReqType + " procState:" + mActivityManager.getUidProcessState(callingUid); mEventLogger.enqueueAndSlog(errorMssg, EventLogger.Event.ALOGI, TAG); Loading