Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 95a27a11 authored by Jean-Michel Trivi's avatar Jean-Michel Trivi Committed by Android (Google) Code Review
Browse files

Merge "AudioService: focus hardening is SDK-gated" into main

parents ddd2c166 09eeb28d
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -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*/);
    }
+19 −5
Original line number Diff line number Diff line
@@ -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;
+1 −8
Original line number Diff line number Diff line
@@ -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()) {