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

Commit 3ef3f58c authored by Oscar Azucena's avatar Oscar Azucena
Browse files

Added API to set active assistant UIDs

Added API to manage the currently active assistant. When an
assistant becomes active the API will set the assistant's
voice interaction service and its corresponding hotword detection
service to active. When the assistant becomes inactive the API will
be called to reset the assistants UIDs. For the latter the API will
be called with an empty list of UIDs.

After bootup, user switch, and audio server crash reset, the list of
active assistants will be set to an empty list (.i.e no assistant
UID's are currently active).

In the absense of active assistant list, the default behavior will
be that all assistants can listen to hotword as long it does not
conflict with privacy policy. When an assistant state changes
to top (UI present) that assistant will be able to listen to
audio via voice recognition source or hotword.

Bug: 189312611
Test: m -j, and run assistant
Test: atest CtsVoiceInteractionTestCases
Change-Id: I0bfe4c167f69a26293ae2f9f9d0898033f86db03
parent 69ddbe8d
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -5980,6 +5980,7 @@ package android.media {
  public class AudioManager {
    method @Deprecated public int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void addAssistantServicesUids(@NonNull java.util.List<java.lang.Integer>);
    method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void addOnPreferredDeviceForStrategyChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.OnPreferredDeviceForStrategyChangedListener) throws java.lang.SecurityException;
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void addOnPreferredDevicesForCapturePresetChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.OnPreferredDevicesForCapturePresetChangedListener) throws java.lang.SecurityException;
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void addOnPreferredDevicesForStrategyChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.OnPreferredDevicesForStrategyChangedListener) throws java.lang.SecurityException;
@@ -5987,7 +5988,9 @@ package android.media {
    method public void clearAudioServerStateCallback();
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean clearPreferredDevicesForCapturePreset(int);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int dispatchAudioFocusChange(@NonNull android.media.AudioFocusInfo, int, @NonNull android.media.audiopolicy.AudioPolicy);
    method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public java.util.List<java.lang.Integer> getActiveAssistantServicesUids();
    method @IntRange(from=0) public long getAdditionalOutputDeviceDelay(@NonNull android.media.AudioDeviceInfo);
    method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public java.util.List<java.lang.Integer> getAssistantServicesUids();
    method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static java.util.List<android.media.audiopolicy.AudioProductStrategy> getAudioProductStrategies();
    method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static java.util.List<android.media.audiopolicy.AudioVolumeGroup> getAudioVolumeGroups();
    method @NonNull @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION) public android.media.AudioRecord getCallDownlinkExtractionAudioRecord(@NonNull android.media.AudioFormat);
@@ -6012,6 +6015,7 @@ package android.media {
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int registerAudioPolicy(@NonNull android.media.audiopolicy.AudioPolicy);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void registerMuteAwaitConnectionCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.MuteAwaitConnectionCallback);
    method public void registerVolumeGroupCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.VolumeGroupCallback);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void removeAssistantServicesUids(@NonNull java.util.List<java.lang.Integer>);
    method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void removeOnPreferredDeviceForStrategyChangedListener(@NonNull android.media.AudioManager.OnPreferredDeviceForStrategyChangedListener);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void removeOnPreferredDevicesForCapturePresetChangedListener(@NonNull android.media.AudioManager.OnPreferredDevicesForCapturePresetChangedListener);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void removeOnPreferredDevicesForStrategyChangedListener(@NonNull android.media.AudioManager.OnPreferredDevicesForStrategyChangedListener);
@@ -6019,6 +6023,7 @@ package android.media {
    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, @NonNull android.media.AudioAttributes, int, int) throws java.lang.IllegalArgumentException;
    method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.MODIFY_AUDIO_ROUTING}) public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, @NonNull android.media.AudioAttributes, int, int, android.media.audiopolicy.AudioPolicy) throws java.lang.IllegalArgumentException;
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int requestAudioFocus(@NonNull android.media.AudioFocusRequest, @Nullable android.media.audiopolicy.AudioPolicy);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setActiveAssistantServiceUids(@NonNull java.util.List<java.lang.Integer>);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setAdditionalOutputDeviceDelay(@NonNull android.media.AudioDeviceInfo, @IntRange(from=0) long);
    method public void setAudioServerStateCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.AudioServerStateCallback);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setDeviceVolumeBehavior(@NonNull android.media.AudioDeviceAttributes, int);
+12 −0
Original line number Diff line number Diff line
@@ -2500,6 +2500,16 @@ static jint android_media_AudioSystem_setAssistantServicesUids(JNIEnv *env, jobj
    std::vector<uid_t> nativeUidsVector = convertJIntArrayToUidVector(env, uids);

    status_t status = AudioSystem::setAssistantServicesUids(nativeUidsVector);

    return (jint)nativeToJavaStatus(status);
}

static jint android_media_AudioSystem_setActiveAssistantServicesUids(JNIEnv *env, jobject thiz,
                                                                     jintArray activeUids) {
    std::vector<uid_t> nativeActiveUidsVector = convertJIntArrayToUidVector(env, activeUids);

    status_t status = AudioSystem::setActiveAssistantServicesUids(nativeActiveUidsVector);

    return (jint)nativeToJavaStatus(status);
}

@@ -3002,6 +3012,8 @@ static const JNINativeMethod gMethods[] =
          (void *)android_media_AudioSystem_setSurroundFormatEnabled},
         {"setAssistantServicesUids", "([I)I",
          (void *)android_media_AudioSystem_setAssistantServicesUids},
         {"setActiveAssistantServicesUids", "([I)I",
          (void *)android_media_AudioSystem_setActiveAssistantServicesUids},
         {"setA11yServicesUids", "([I)I", (void *)android_media_AudioSystem_setA11yServicesUids},
         {"isHapticPlaybackSupported", "()Z",
          (void *)android_media_AudioSystem_isHapticPlaybackSupported},
+101 −0
Original line number Diff line number Diff line
@@ -91,6 +91,7 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

/**
 * AudioManager provides access to volume and ringer mode control.
@@ -8342,6 +8343,106 @@ public class AudioManager {
        }
    }

    /**
     * Add UID's that can be considered as assistant.
     *
     * @param assistantUids UID's of the services that can be considered as assistant.
     *
     * @hide
     */
    @SystemApi
    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
    public void addAssistantServicesUids(@NonNull List<Integer> assistantUids) {
        try {
            getService().addAssistantServicesUids(assistantUids.stream()
                    .mapToInt(Integer::intValue).toArray());
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Remove UID's that can be considered as assistant.
     *
     * @param assistantUids UID'S of the services that should be remove.
     *
     * @hide
     */
    @SystemApi
    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
    public void removeAssistantServicesUids(@NonNull List<Integer> assistantUids) {
        try {
            getService().removeAssistantServicesUids(assistantUids.stream()
                    .mapToInt(Integer::intValue).toArray());
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Get the list of assistants UIDs that been added with the
     * {@link #addAssistantServicesUids(List)} (List)} and not yet removed with
     * {@link #removeAssistantServicesUids(List)}
     *
     * @return list of assistants UID's
     *
     * @hide
     */
    @SystemApi
    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
    public @NonNull List<Integer> getAssistantServicesUids() {
        try {
            int[] uids = getService().getAssistantServicesUids();
            return Arrays.stream(uids).boxed().collect(Collectors.toList());
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Sets UID's that can be considered as active assistant. Calling the API with a new list will
     * overwrite previous list. If the list of UIDs is empty then no UID will be considered active.
     * In this manner calling the API with an empty list will remove all UID's previously set.
     *
     * @param assistantUids UID'S of the services that can be considered active assistant. Can be
     * an empty list, for this no UID will be considered active.
     *
     * <p> Note that during audio service crash reset and after boot up the list of active assistant
     * UID's will be reset to an empty list (i.e. no UID will be considered as an active assistant).
     * Just after user switch the list of active assistant will also reset to empty.
     *
     * @hide
     */
    @SystemApi
    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
    public void setActiveAssistantServiceUids(@NonNull List<Integer>  assistantUids) {
        try {
            getService().setActiveAssistantServiceUids(assistantUids.stream()
                    .mapToInt(Integer::intValue).toArray());
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Get the list of active assistant UIDs last set with the
     * {@link #setActiveAssistantServiceUids(List)}
     *
     * @return list of active assistants UID's
     *
     * @hide
     */
    @SystemApi
    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
    public @NonNull List<Integer> getActiveAssistantServicesUids() {
        try {
            int[] uids = getService().getActiveAssistantServiceUids();
            return Arrays.stream(uids).boxed().collect(Collectors.toList());
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    private final Object mMuteAwaitConnectionListenerLock = new Object();

    @GuardedBy("mMuteAwaitConnectionListenerLock")
+6 −0
Original line number Diff line number Diff line
@@ -54,6 +54,12 @@ public abstract class AudioManagerInternal {
     */
    public abstract void removeAssistantServiceUid(int uid);

    /**
     * Set the currently active assistant service UIDs
     * @param activeUids active UIDs of the assistant service
     */
    public abstract void setActiveAssistantServicesUids(IntArray activeUids);

    /**
     * Called by {@link com.android.server.inputmethod.InputMethodManagerService} to notify the UID
     * of the currently used {@link android.inputmethodservice.InputMethodService}.
+6 −0
Original line number Diff line number Diff line
@@ -1854,6 +1854,12 @@ public class AudioSystem
    /** @hide */
    public static native int setSurroundFormatEnabled(int audioFormat, boolean enabled);

    /**
     * @hide
     * Communicate UIDs of the active assistant to audio policy service.
     */
    public static native int setActiveAssistantServicesUids(int[] uids);

    /**
     * @hide
     * Communicate UIDs of assistant to audio policy service.
Loading