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

Commit bd934eba authored by Nate Myren's avatar Nate Myren
Browse files

Note RECEIVE_AMBIENT_TRIGGER_AUDIO in the SoundTrigger

This op gets around the background restrictions on RECORD_AUDIO, when
used for SoundTrigger detection
In addition, moves the precise logic for soundtrigger RECORD_AUDIO
checks out of the soundtrigger system

Fixes: 230430779
Test: manual
Change-Id: I6d63c99e2d31e3f668070ac82afed71ff6672c9e
Merged-In: I6d63c99e2d31e3f668070ac82afed71ff6672c9e
parent 827c5557
Loading
Loading
Loading
Loading
+29 −4
Original line number Diff line number Diff line
@@ -1335,9 +1335,17 @@ public class AppOpsManager {
    public static final int OP_ACCESS_RESTRICTED_SETTINGS =
            AppProtoEnums.APP_OP_ACCESS_RESTRICTED_SETTINGS;

    /**
     * Receive microphone audio from an ambient sound detection event
     *
     * @hide
     */
    public static final int OP_RECEIVE_AMBIENT_TRIGGER_AUDIO =
            AppProtoEnums.APP_OP_RECEIVE_AMBIENT_TRIGGER_AUDIO;

    /** @hide */
    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
    public static final int _NUM_OP = 120;
    public static final int _NUM_OP = 121;

    /** Access to coarse location information. */
    public static final String OPSTR_COARSE_LOCATION = "android:coarse_location";
@@ -1800,6 +1808,14 @@ public class AppOpsManager {
    public static final String OPSTR_ACCESS_RESTRICTED_SETTINGS =
            "android:access_restricted_settings";

    /**
     * Receive microphone audio from an ambient sound detection event
     *
     * @hide
     */
    public static final String OPSTR_RECEIVE_AMBIENT_TRIGGER_AUDIO =
            "android:receive_ambient_trigger_audio";

    /** {@link #sAppOpsToNote} not initialized yet for this op */
    private static final byte SHOULD_COLLECT_NOTE_OP_NOT_INITIALIZED = 0;
    /** Should not collect noting of this app-op in {@link #sAppOpsToNote} */
@@ -2021,6 +2037,7 @@ public class AppOpsManager {
            OP_ESTABLISH_VPN_SERVICE,           // OP_ESTABLISH_VPN_SERVICE
            OP_ESTABLISH_VPN_MANAGER,           // OP_ESTABLISH_VPN_MANAGER
            OP_ACCESS_RESTRICTED_SETTINGS,      // OP_ACCESS_RESTRICTED_SETTINGS
            OP_RECEIVE_AMBIENT_TRIGGER_AUDIO,      // RECEIVE_SOUNDTRIGGER_AUDIO
    };

    /**
@@ -2147,6 +2164,7 @@ public class AppOpsManager {
            OPSTR_ESTABLISH_VPN_SERVICE,
            OPSTR_ESTABLISH_VPN_MANAGER,
            OPSTR_ACCESS_RESTRICTED_SETTINGS,
            OPSTR_RECEIVE_AMBIENT_TRIGGER_AUDIO,
    };

    /**
@@ -2274,6 +2292,7 @@ public class AppOpsManager {
            "ESTABLISH_VPN_SERVICE",
            "ESTABLISH_VPN_MANAGER",
            "ACCESS_RESTRICTED_SETTINGS",
            "RECEIVE_SOUNDTRIGGER_AUDIO",
    };

    /**
@@ -2402,6 +2421,7 @@ public class AppOpsManager {
            null, // no permission for OP_ESTABLISH_VPN_SERVICE
            null, // no permission for OP_ESTABLISH_VPN_MANAGER
            null, // no permission for OP_ACCESS_RESTRICTED_SETTINGS,
            null, // no permission for OP_RECEIVE_SOUNDTRIGGER_AUDIO
    };

    /**
@@ -2529,7 +2549,8 @@ public class AppOpsManager {
            null, // NEARBY_WIFI_DEVICES
            null, // ESTABLISH_VPN_SERVICE
            null, // ESTABLISH_VPN_MANAGER
            null, // ACCESS_RESTRICTED_SETTINGS,
            null, // ACCESS_RESTRICTED_SETTINGS
            null, // RECEIVE_SOUNDTRIGGER_AUDIO
    };

    /**
@@ -2656,7 +2677,8 @@ public class AppOpsManager {
            null, // NEARBY_WIFI_DEVICES
            null, // ESTABLISH_VPN_SERVICE
            null, // ESTABLISH_VPN_MANAGER
            null, // ACCESS_RESTRICTED_SETTINGS,
            null, // ACCESS_RESTRICTED_SETTINGS
            null, // RECEIVE_SOUNDTRIGGER_AUDIO
    };

    /**
@@ -2765,7 +2787,7 @@ public class AppOpsManager {
            AppOpsManager.MODE_ERRORED, // OP_NO_ISOLATED_STORAGE
            AppOpsManager.MODE_ALLOWED, // PHONE_CALL_MICROPHONE
            AppOpsManager.MODE_ALLOWED, // PHONE_CALL_CAMERA
            AppOpsManager.MODE_ALLOWED, // OP_RECORD_AUDIO_HOTWORD
            AppOpsManager.MODE_ALLOWED, // RECORD_AUDIO_HOTWORD
            AppOpsManager.MODE_DEFAULT, // MANAGE_ONGOING_CALLS
            AppOpsManager.MODE_DEFAULT, // MANAGE_CREDENTIALS
            AppOpsManager.MODE_DEFAULT, // USE_ICC_AUTH_WITH_DEVICE_IDENTIFIER
@@ -2783,6 +2805,7 @@ public class AppOpsManager {
            AppOpsManager.MODE_ALLOWED, // ESTABLISH_VPN_SERVICE
            AppOpsManager.MODE_ALLOWED, // ESTABLISH_VPN_MANAGER
            AppOpsManager.MODE_ALLOWED, // ACCESS_RESTRICTED_SETTINGS,
            AppOpsManager.MODE_ALLOWED, // RECEIVE_SOUNDTRIGGER_AUDIO
    };

    /**
@@ -2913,6 +2936,7 @@ public class AppOpsManager {
            false, // OP_ESTABLISH_VPN_SERVICE
            false, // OP_ESTABLISH_VPN_MANAGER
            true, // ACCESS_RESTRICTED_SETTINGS
            false, // RECEIVE_SOUNDTRIGGER_AUDIO
    };

    /**
@@ -3040,6 +3064,7 @@ public class AppOpsManager {
            false, // OP_ESTABLISH_VPN_SERVICE
            false, // OP_ESTABLISH_VPN_MANAGER
            true, // ACCESS_RESTRICTED_SETTINGS
            false, // RECEIVE_SOUNDTRIGGER_AUDIO
    };

    /**
+3 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import static android.app.AppOpsManager.OPSTR_COARSE_LOCATION;
import static android.app.AppOpsManager.OPSTR_FINE_LOCATION;
import static android.app.AppOpsManager.OPSTR_PHONE_CALL_CAMERA;
import static android.app.AppOpsManager.OPSTR_PHONE_CALL_MICROPHONE;
import static android.app.AppOpsManager.OPSTR_RECEIVE_AMBIENT_TRIGGER_AUDIO;
import static android.app.AppOpsManager.OPSTR_RECORD_AUDIO;
import static android.app.AppOpsManager.OP_CAMERA;
import static android.app.AppOpsManager.OP_FLAGS_ALL_TRUSTED;
@@ -137,6 +138,7 @@ public class PermissionUsageHelper implements AppOpsManager.OnOpActiveChangedLis

    private static final List<String> MIC_OPS = List.of(
            OPSTR_PHONE_CALL_MICROPHONE,
            OPSTR_RECEIVE_AMBIENT_TRIGGER_AUDIO,
            OPSTR_RECORD_AUDIO
    );

@@ -147,6 +149,7 @@ public class PermissionUsageHelper implements AppOpsManager.OnOpActiveChangedLis

    private static @NonNull String getGroupForOp(String op) {
        switch (op) {
            case OPSTR_RECEIVE_AMBIENT_TRIGGER_AUDIO:
            case OPSTR_RECORD_AUDIO:
                return MICROPHONE;
            case OPSTR_CAMERA:
+3 −1
Original line number Diff line number Diff line
@@ -102,6 +102,7 @@ public class AppOpsControllerImpl extends BroadcastReceiver implements AppOpsCon
            AppOpsManager.OP_PHONE_CALL_CAMERA,
            AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
            AppOpsManager.OP_RECORD_AUDIO,
            AppOpsManager.OP_RECEIVE_AMBIENT_TRIGGER_AUDIO,
            AppOpsManager.OP_PHONE_CALL_MICROPHONE,
            AppOpsManager.OP_COARSE_LOCATION,
            AppOpsManager.OP_FINE_LOCATION
@@ -535,7 +536,8 @@ public class AppOpsControllerImpl extends BroadcastReceiver implements AppOpsCon
    }

    private boolean isOpMicrophone(int op) {
        return op == AppOpsManager.OP_RECORD_AUDIO || op == AppOpsManager.OP_PHONE_CALL_MICROPHONE;
        return op == AppOpsManager.OP_RECORD_AUDIO || op == AppOpsManager.OP_PHONE_CALL_MICROPHONE
                || op == AppOpsManager.OP_RECEIVE_AMBIENT_TRIGGER_AUDIO;
    }

    protected class H extends Handler {
+3 −1
Original line number Diff line number Diff line
@@ -58,7 +58,8 @@ class PrivacyItemController @Inject constructor(
    internal companion object {
        val OPS_MIC_CAMERA = intArrayOf(AppOpsManager.OP_CAMERA,
                AppOpsManager.OP_PHONE_CALL_CAMERA, AppOpsManager.OP_RECORD_AUDIO,
                AppOpsManager.OP_PHONE_CALL_MICROPHONE)
                AppOpsManager.OP_PHONE_CALL_MICROPHONE,
                AppOpsManager.OP_RECEIVE_AMBIENT_TRIGGER_AUDIO)
        val OPS_LOCATION = intArrayOf(
                AppOpsManager.OP_COARSE_LOCATION,
                AppOpsManager.OP_FINE_LOCATION)
@@ -315,6 +316,7 @@ class PrivacyItemController @Inject constructor(
            AppOpsManager.OP_COARSE_LOCATION,
            AppOpsManager.OP_FINE_LOCATION -> PrivacyType.TYPE_LOCATION
            AppOpsManager.OP_PHONE_CALL_MICROPHONE,
            AppOpsManager.OP_RECEIVE_AMBIENT_TRIGGER_AUDIO,
            AppOpsManager.OP_RECORD_AUDIO -> PrivacyType.TYPE_MICROPHONE
            else -> return null
        }
+2 −1
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ import static android.app.AppOpsManager.OP_FLAG_SELF;
import static android.app.AppOpsManager.OP_FLAG_TRUSTED_PROXIED;
import static android.app.AppOpsManager.OP_NONE;
import static android.app.AppOpsManager.OP_PLAY_AUDIO;
import static android.app.AppOpsManager.OP_RECEIVE_AMBIENT_TRIGGER_AUDIO;
import static android.app.AppOpsManager.OP_RECORD_AUDIO;
import static android.app.AppOpsManager.OP_RECORD_AUDIO_HOTWORD;
import static android.app.AppOpsManager.OnOpStartedListener.START_TYPE_FAILED;
@@ -3848,7 +3849,7 @@ public class AppOpsService extends IAppOpsService.Stub {
        // the data gated by OP_RECORD_AUDIO.
        //
        // TODO: Revert this change before Android 12.
        if (code == OP_RECORD_AUDIO_HOTWORD) {
        if (code == OP_RECORD_AUDIO_HOTWORD || code == OP_RECEIVE_AMBIENT_TRIGGER_AUDIO) {
            int result = checkOperation(OP_RECORD_AUDIO, uid, packageName);
            if (result != AppOpsManager.MODE_ALLOWED) {
                return new SyncNotedAppOp(result, code, attributionTag, packageName);
Loading