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

Commit 28cc6364 authored by Nicholas Ambur's avatar Nicholas Ambur
Browse files

add API for ST clients run in battery saver mode

New system API interface for both SoundTriggerManager and
AlwaysOnHotwordDetector to indicate if a recognition should run in
battery saver mode or not.

Clients supply this information through the existing startRecognition
calls, and the client must hold a new privledged permission,
SOUND_TRIGGER_RUN_IN_BATTERY_SAVER, to indicate this intention.

As a prerequisite, the device PowerManagerService must have the
SoundTrigger service enabled in the battery saver mode battery policy.
If not enabled, recognition will be paused as if the client did not
provide the indication to run in battery saver mode.

Bug: 172294448
Test: build with Google search apk using this feature and verify
recognition keeps running in battery saver mode

Change-Id: Ia43be99290e6fd7c50ff8e4908d6c60ea513b19a
parent 06c85480
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -5061,6 +5061,7 @@ package android.media.soundtrigger {
    field public static final int RECOGNITION_FLAG_CAPTURE_TRIGGER_AUDIO = 1; // 0x1
    field public static final int RECOGNITION_FLAG_ENABLE_AUDIO_ECHO_CANCELLATION = 4; // 0x4
    field public static final int RECOGNITION_FLAG_ENABLE_AUDIO_NOISE_SUPPRESSION = 8; // 0x8
    field public static final int RECOGNITION_FLAG_RUN_IN_BATTERY_SAVER = 16; // 0x10
  }
  public abstract static class SoundTriggerDetector.Callback {
@@ -10204,6 +10205,7 @@ package android.service.voice {
    field public static final int RECOGNITION_FLAG_CAPTURE_TRIGGER_AUDIO = 1; // 0x1
    field public static final int RECOGNITION_FLAG_ENABLE_AUDIO_ECHO_CANCELLATION = 4; // 0x4
    field public static final int RECOGNITION_FLAG_ENABLE_AUDIO_NOISE_SUPPRESSION = 8; // 0x8
    field public static final int RECOGNITION_FLAG_RUN_IN_BATTERY_SAVER = 16; // 0x10
    field public static final int RECOGNITION_MODE_USER_IDENTIFICATION = 2; // 0x2
    field public static final int RECOGNITION_MODE_VOICE_TRIGGER = 1; // 0x1
    field public static final int STATE_ERROR = 3; // 0x3
+12 −1
Original line number Diff line number Diff line
@@ -125,6 +125,7 @@ public class AlwaysOnHotwordDetector {
            RECOGNITION_FLAG_ALLOW_MULTIPLE_TRIGGERS,
            RECOGNITION_FLAG_ENABLE_AUDIO_ECHO_CANCELLATION,
            RECOGNITION_FLAG_ENABLE_AUDIO_NOISE_SUPPRESSION,
            RECOGNITION_FLAG_RUN_IN_BATTERY_SAVER,
    })
    public @interface RecognitionFlags {}

@@ -171,6 +172,14 @@ public class AlwaysOnHotwordDetector {
     */
    public static final int RECOGNITION_FLAG_ENABLE_AUDIO_NOISE_SUPPRESSION = 0x8;

    /**
     * Recognition flag for {@link #startRecognition(int)} that indicates whether the recognition
     * should continue after battery saver mode is enabled.
     * When this flag is specified, the caller will be checked for
     * {@link android.Manifest.permission#SOUND_TRIGGER_RUN_IN_BATTERY_SAVER} permission granted.
     */
    public static final int RECOGNITION_FLAG_RUN_IN_BATTERY_SAVER = 0x10;

    //---- Recognition mode flags. Return codes for getSupportedRecognitionModes() ----//
    // Must be kept in sync with the related attribute defined as searchKeyphraseRecognitionFlags.

@@ -860,6 +869,7 @@ public class AlwaysOnHotwordDetector {
                (recognitionFlags&RECOGNITION_FLAG_CAPTURE_TRIGGER_AUDIO) != 0;
        boolean allowMultipleTriggers =
                (recognitionFlags&RECOGNITION_FLAG_ALLOW_MULTIPLE_TRIGGERS) != 0;
        boolean runInBatterySaver = (recognitionFlags&RECOGNITION_FLAG_RUN_IN_BATTERY_SAVER) != 0;

        int audioCapabilities = 0;
        if ((recognitionFlags & RECOGNITION_FLAG_ENABLE_AUDIO_ECHO_CANCELLATION) != 0) {
@@ -874,7 +884,8 @@ public class AlwaysOnHotwordDetector {
            code = mSoundTriggerSession.startRecognition(
                    mKeyphraseMetadata.getId(), mLocale.toLanguageTag(), mInternalCallback,
                    new RecognitionConfig(captureTriggerAudio, allowMultipleTriggers,
                            recognitionExtra, null /* additional data */, audioCapabilities));
                            recognitionExtra, null /* additional data */, audioCapabilities),
                    runInBatterySaver);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
+1 −1
Original line number Diff line number Diff line
@@ -37,7 +37,7 @@ interface ISoundTriggerSession {
    void deleteSoundModel(in ParcelUuid soundModelId);

    int startRecognition(in ParcelUuid soundModelId, in IRecognitionStatusCallback callback,
         in SoundTrigger.RecognitionConfig config);
         in SoundTrigger.RecognitionConfig config, boolean runInBatterySaver);

    int stopRecognition(in ParcelUuid soundModelId, in IRecognitionStatusCallback callback);

+2 −1
Original line number Diff line number Diff line
@@ -41,7 +41,8 @@ interface IVoiceInteractionSoundTriggerSession {
     */
    int startRecognition(int keyphraseId, in String bcp47Locale,
            in IRecognitionStatusCallback callback,
            in SoundTrigger.RecognitionConfig recognitionConfig);
            in SoundTrigger.RecognitionConfig recognitionConfig,
            boolean runInBatterySaver);
    /**
     * Stops a recognition for the given keyphrase.
     * Caller must be the active voice interaction service via
+14 −2
Original line number Diff line number Diff line
@@ -80,6 +80,7 @@ public final class SoundTriggerDetector {
                RECOGNITION_FLAG_ALLOW_MULTIPLE_TRIGGERS,
                RECOGNITION_FLAG_ENABLE_AUDIO_ECHO_CANCELLATION,
                RECOGNITION_FLAG_ENABLE_AUDIO_NOISE_SUPPRESSION,
                RECOGNITION_FLAG_RUN_IN_BATTERY_SAVER,
            })
    public @interface RecognitionFlags {}

@@ -132,6 +133,14 @@ public final class SoundTriggerDetector {
     */
    public static final int RECOGNITION_FLAG_ENABLE_AUDIO_NOISE_SUPPRESSION = 0x8;

    /**
     * Recognition flag for {@link #startRecognition(int)} that indicates whether the recognition
     * should continue after battery saver mode is enabled.
     * When this flag is specified, the caller will be checked for
     * {@link android.Manifest.permission#SOUND_TRIGGER_RUN_IN_BATTERY_SAVER} permission granted.
     */
    public static final int RECOGNITION_FLAG_RUN_IN_BATTERY_SAVER = 0x10;

    /**
     * Additional payload for {@link Callback#onDetected}.
     */
@@ -296,6 +305,8 @@ public final class SoundTriggerDetector {
        boolean allowMultipleTriggers =
                (recognitionFlags & RECOGNITION_FLAG_ALLOW_MULTIPLE_TRIGGERS) != 0;

        boolean runInBatterySaver = (recognitionFlags & RECOGNITION_FLAG_RUN_IN_BATTERY_SAVER) != 0;

        int audioCapabilities = 0;
        if ((recognitionFlags & RECOGNITION_FLAG_ENABLE_AUDIO_ECHO_CANCELLATION) != 0) {
            audioCapabilities |= SoundTrigger.ModuleProperties.AUDIO_CAPABILITY_ECHO_CANCELLATION;
@@ -308,7 +319,8 @@ public final class SoundTriggerDetector {
        try {
            status = mSoundTriggerSession.startRecognition(new ParcelUuid(mSoundModelId),
                    mRecognitionCallback, new RecognitionConfig(captureTriggerAudio,
                        allowMultipleTriggers, null, null, audioCapabilities));
                            allowMultipleTriggers, null, null, audioCapabilities),
                    runInBatterySaver);
        } catch (RemoteException e) {
            return false;
        }
Loading