diff options
3 files changed, 23 insertions, 16 deletions
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index c7ddccc2964e..5dd1480c2052 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -10331,7 +10331,7 @@ public class AudioService extends IAudioService.Stub try { if (!permissionOverridesCheck && mHardeningEnforcer.blockFocusMethod(uid, HardeningEnforcer.METHOD_AUDIO_MANAGER_REQUEST_AUDIO_FOCUS, - clientId, durationHint, callingPackageName)) { + clientId, durationHint, callingPackageName, attributionTag, sdk)) { final String reason = "Audio focus request blocked by hardening"; Log.w(TAG, reason); mmi.set(MediaMetrics.Property.EARLY_RETURN, reason).record(); @@ -10343,7 +10343,7 @@ public class AudioService extends IAudioService.Stub mmi.record(); return mMediaFocusControl.requestAudioFocus(aa, durationHint, cb, fd, - clientId, callingPackageName, attributionTag, flags, sdk, + clientId, callingPackageName, flags, sdk, forceFocusDuckingForAccessibility(aa, durationHint, uid), -1 /*testUid, ignored*/, permissionOverridesCheck); } @@ -10361,7 +10361,7 @@ public class AudioService extends IAudioService.Stub return AudioManager.AUDIOFOCUS_REQUEST_FAILED; } return mMediaFocusControl.requestAudioFocus(aa, durationHint, cb, fd, - clientId, callingPackageName, null, flags, + clientId, callingPackageName, flags, sdk, false /*forceDuck*/, fakeUid, true /*permissionOverridesCheck*/); } diff --git a/services/core/java/com/android/server/audio/HardeningEnforcer.java b/services/core/java/com/android/server/audio/HardeningEnforcer.java index 409ed17001b7..8ae04accb62f 100644 --- a/services/core/java/com/android/server/audio/HardeningEnforcer.java +++ b/services/core/java/com/android/server/audio/HardeningEnforcer.java @@ -19,6 +19,7 @@ import static android.media.audio.Flags.autoPublicVolumeApiHardening; import android.Manifest; import android.annotation.NonNull; +import android.annotation.Nullable; import android.app.ActivityManager; import android.app.AppOpsManager; import android.content.Context; @@ -26,6 +27,7 @@ import android.content.pm.PackageManager; import android.media.AudioFocusRequest; import android.media.AudioManager; import android.os.Binder; +import android.os.Build; import android.os.UserHandle; import android.text.TextUtils; import android.util.Slog; @@ -128,19 +130,28 @@ public class HardeningEnforcer { * @param focusMethod name of the method to check, for logging purposes * @param clientId id of the requester * @param durationHint 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) { + int durationHint, @NonNull String packageName, String attributionTag, int targetSdk) { if (packageName.isEmpty()) { packageName = getPackNameForUid(callingUid); } - if (checkAppOp(AppOpsManager.OP_TAKE_AUDIO_FOCUS, callingUid, packageName)) { + if (noteOp(AppOpsManager.OP_TAKE_AUDIO_FOCUS, callingUid, packageName, attributionTag)) { if (DEBUG) { Slog.i(TAG, "blockFocusMethod pack:" + packageName + " NOT blocking"); } return false; + } else if (targetSdk < Build.VERSION_CODES.VANILLA_ICE_CREAM) { + if (DEBUG) { + Slog.i(TAG, "blockFocusMethod pack:" + packageName + " NOT blocking due to sdk=" + + targetSdk); + } + return false; } String errorMssg = "Focus request DENIED for uid:" + callingUid @@ -169,14 +180,17 @@ public class HardeningEnforcer { } /** - * Checks the given op without throwing + * Notes the given op without throwing * @param op the appOp code * @param uid the calling uid * @param packageName the package name of the caller + * @param attributionTag attribution of the caller * @return return false if the operation is not allowed */ - private boolean checkAppOp(int op, int uid, @NonNull String packageName) { - if (mAppOps.checkOpNoThrow(op, uid, packageName) != AppOpsManager.MODE_ALLOWED) { + private boolean noteOp(int op, int uid, @NonNull String packageName, + @Nullable String attributionTag) { + if (mAppOps.noteOpNoThrow(op, uid, packageName, attributionTag, null) + != AppOpsManager.MODE_ALLOWED) { return false; } return true; diff --git a/services/core/java/com/android/server/audio/MediaFocusControl.java b/services/core/java/com/android/server/audio/MediaFocusControl.java index 35d38e2373f5..70f319321d30 100644 --- a/services/core/java/com/android/server/audio/MediaFocusControl.java +++ b/services/core/java/com/android/server/audio/MediaFocusControl.java @@ -1082,7 +1082,6 @@ public class MediaFocusControl implements PlayerFocusEnforcer { * @param fd * @param clientId * @param callingPackageName - * @param attributionTag * @param flags * @param sdk * @param forceDuck only true if @@ -1096,7 +1095,7 @@ public class MediaFocusControl implements PlayerFocusEnforcer { */ protected int requestAudioFocus(@NonNull AudioAttributes aa, int focusChangeHint, IBinder cb, IAudioFocusDispatcher fd, @NonNull String clientId, @NonNull String callingPackageName, - String attributionTag, int flags, int sdk, boolean forceDuck, int testUid, + int flags, int sdk, boolean forceDuck, int testUid, boolean permissionOverridesCheck) { new MediaMetrics.Item(mMetricsId) .setUid(Binder.getCallingUid()) @@ -1129,12 +1128,6 @@ public class MediaFocusControl implements PlayerFocusEnforcer { return AudioManager.AUDIOFOCUS_REQUEST_FAILED; } - final int res = mAppOps.noteOp(AppOpsManager.OP_TAKE_AUDIO_FOCUS, Binder.getCallingUid(), - callingPackageName, attributionTag, null); - if (!permissionOverridesCheck && res != AppOpsManager.MODE_ALLOWED) { - return AudioManager.AUDIOFOCUS_REQUEST_FAILED; - } - synchronized(mAudioFocusLock) { // check whether a focus freeze is in place and filter if (isFocusFrozenForTest()) { |