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

Commit ab56696c authored by fayey's avatar fayey Committed by Faye Yan
Browse files

Ambient Activation p2.1

Using voice-activation ops OP_SANDBOX_TRIGGER_AUDIO for voice acitivation
of the assistant app.
1) This change is currently flag protected by a static boolean
   IS_VOICE_ACITVAITON_OP_ENABLED. Will be converted and conform to the
   trunk stable flag configuration in a follow-up change.
2) OP_RECORD_AUDIO_HOTWORD is replaced by
   OP_RECEIVE_SANDBOX_TRIGGER_AUDIO for noting the discrete event of voice activation of
   the assistant app.

Bug: 287264308
Test: presubmit
Change-Id: I09fb4e3bc0493571a9c7f15bc84c106a127c7588
parent f98963f3
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -2809,7 +2809,8 @@ public class AppOpsManager {
                "RECORD_AUDIO_SANDBOXED").setDefaultMode(AppOpsManager.MODE_ALLOWED).build(),
        new AppOpInfo.Builder(OP_RECEIVE_SANDBOX_TRIGGER_AUDIO,
                OPSTR_RECEIVE_SANDBOX_TRIGGER_AUDIO,
                "RECEIVE_SANDBOX_TRIGGER_AUDIO").build(),
                "RECEIVE_SANDBOX_TRIGGER_AUDIO")
                .setDefaultMode(AppOpsManager.MODE_ALLOWED).build(),
        new AppOpInfo.Builder(OP_RECEIVE_SANDBOX_NEGATIVE_DATA_AUDIO,
                OPSTR_RECEIVE_SANDBOX_NEGATIVE_DATA_AUDIO,
                "RECEIVE_SANDBOX_NEGATIVE_DATA_AUDIO").build()
+3 −1
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ import static android.app.AppOpsManager.OP_NONE;
import static android.app.AppOpsManager.OP_PHONE_CALL_CAMERA;
import static android.app.AppOpsManager.OP_PHONE_CALL_MICROPHONE;
import static android.app.AppOpsManager.OP_RECEIVE_AMBIENT_TRIGGER_AUDIO;
import static android.app.AppOpsManager.OP_RECEIVE_SANDBOX_TRIGGER_AUDIO;
import static android.app.AppOpsManager.OP_RECORD_AUDIO;
import static android.app.AppOpsManager.flagsToString;
import static android.app.AppOpsManager.getUidStateName;
@@ -134,7 +135,8 @@ final class DiscreteRegistry {
    private static final String PROPERTY_DISCRETE_OPS_LIST = "discrete_history_ops_cslist";
    private static final String DEFAULT_DISCRETE_OPS = OP_FINE_LOCATION + "," + OP_COARSE_LOCATION
            + "," + OP_CAMERA + "," + OP_RECORD_AUDIO + "," + OP_PHONE_CALL_MICROPHONE + ","
            + OP_PHONE_CALL_CAMERA + "," + OP_RECEIVE_AMBIENT_TRIGGER_AUDIO;
            + OP_PHONE_CALL_CAMERA + "," + OP_RECEIVE_AMBIENT_TRIGGER_AUDIO + ","
            + OP_RECEIVE_SANDBOX_TRIGGER_AUDIO;
    private static final long DEFAULT_DISCRETE_HISTORY_CUTOFF = Duration.ofDays(7).toMillis();
    private static final long MAXIMUM_DISCRETE_HISTORY_CUTOFF = Duration.ofDays(30).toMillis();
    private static final long DEFAULT_DISCRETE_HISTORY_QUANTIZATION =
+16 −1
Original line number Diff line number Diff line
@@ -16,6 +16,9 @@

package com.android.server.policy;

import static android.app.AppOpsManager.OP_RECEIVE_SANDBOX_TRIGGER_AUDIO;
import static android.app.AppOpsManager.OP_RECORD_AUDIO_HOTWORD;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.AppOpsManager;
@@ -72,6 +75,9 @@ public final class AppOpsPolicy implements AppOpsManagerInternal.CheckOpsDelegat
    private static final boolean SYSPROP_HOTWORD_DETECTION_SERVICE_REQUIRED =
            SystemProperties.getBoolean("ro.hotword.detection_service_required", false);

    //TODO(b/289087412): import this from the flag value in set up in device config.
    private static final boolean IS_VOICE_ACTIVATION_OP_ENABLED = false;

    @NonNull
    private final Object mLock = new Object();

@@ -202,6 +208,16 @@ public final class AppOpsPolicy implements AppOpsManagerInternal.CheckOpsDelegat
        }
    }

    /**
     * @return the op that should be noted for the voice activations of the app by detected hotword.
     */
    public static int getVoiceActivationOp() {
        if (IS_VOICE_ACTIVATION_OP_ENABLED) {
            return OP_RECEIVE_SANDBOX_TRIGGER_AUDIO;
        }
        return OP_RECORD_AUDIO_HOTWORD;
    }

    /**
     * @hide
     */
@@ -321,7 +337,6 @@ public final class AppOpsPolicy implements AppOpsManagerInternal.CheckOpsDelegat
        }
    }


    private int resolveDatasourceOp(int code, int uid, @NonNull String packageName,
            @Nullable String attributionTag) {
        code = resolveRecordAudioOp(code, uid);
+4 −4
Original line number Diff line number Diff line
@@ -753,11 +753,11 @@ abstract class DetectorSession {
                                "Failed to obtain permission RECORD_AUDIO for identity "
                                        + mVoiceInteractorIdentity);
                    }
                    int hotwordOp = AppOpsManager.strOpToOp(
                            AppOpsManager.OPSTR_RECORD_AUDIO_HOTWORD);
                    mAppOpsManager.noteOpNoThrow(hotwordOp,
                    mAppOpsManager.noteOpNoThrow(
                            AppOpsPolicy.getVoiceActivationOp(),
                            mVoiceInteractorIdentity.uid, mVoiceInteractorIdentity.packageName,
                            mVoiceInteractorIdentity.attributionTag, HOTWORD_DETECTION_OP_MESSAGE);
                            mVoiceInteractorIdentity.attributionTag,
                                    HOTWORD_DETECTION_OP_MESSAGE);
                } else {
                    enforcePermissionForDataDelivery(mContext, mVoiceInteractorIdentity,
                            RECORD_AUDIO, HOTWORD_DETECTION_OP_MESSAGE);