diff options
6 files changed, 67 insertions, 46 deletions
diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 5e4485c33233..99ab10faf933 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -1889,8 +1889,7 @@ package android.hardware.soundtrigger { } @FlaggedApi("android.media.soundtrigger.manager_api") public static final class SoundTrigger.RecognitionConfig implements android.os.Parcelable { - ctor @Deprecated public SoundTrigger.RecognitionConfig(boolean, boolean, @Nullable android.hardware.soundtrigger.SoundTrigger.KeyphraseRecognitionExtra[], @Nullable byte[], int); - ctor public SoundTrigger.RecognitionConfig(boolean, boolean, @Nullable android.hardware.soundtrigger.SoundTrigger.KeyphraseRecognitionExtra[], @Nullable byte[]); + ctor @Deprecated public SoundTrigger.RecognitionConfig(boolean, boolean, @Nullable android.hardware.soundtrigger.SoundTrigger.KeyphraseRecognitionExtra[], @Nullable byte[]); } public static class SoundTrigger.RecognitionEvent { diff --git a/core/java/android/hardware/soundtrigger/ConversionUtil.java b/core/java/android/hardware/soundtrigger/ConversionUtil.java index 22ae67672950..2ba107805569 100644 --- a/core/java/android/hardware/soundtrigger/ConversionUtil.java +++ b/core/java/android/hardware/soundtrigger/ConversionUtil.java @@ -40,6 +40,7 @@ import android.os.SharedMemory; import android.system.ErrnoException; import java.nio.ByteBuffer; +import java.util.ArrayList; import java.util.Arrays; import java.util.Locale; import java.util.UUID; @@ -170,17 +171,18 @@ public class ConversionUtil { public static SoundTrigger.RecognitionConfig aidl2apiRecognitionConfig( RecognitionConfig aidlConfig) { - var keyphrases = - new SoundTrigger.KeyphraseRecognitionExtra[aidlConfig.phraseRecognitionExtras.length]; - int i = 0; + var keyphrases = new ArrayList<SoundTrigger.KeyphraseRecognitionExtra>( + aidlConfig.phraseRecognitionExtras.length); for (var extras : aidlConfig.phraseRecognitionExtras) { - keyphrases[i++] = aidl2apiPhraseRecognitionExtra(extras); + keyphrases.add(aidl2apiPhraseRecognitionExtra(extras)); } - return new SoundTrigger.RecognitionConfig(aidlConfig.captureRequested, - false /** allowMultipleTriggers **/, - keyphrases, - Arrays.copyOf(aidlConfig.data, aidlConfig.data.length), - aidl2apiAudioCapabilities(aidlConfig.audioCapabilities)); + return new SoundTrigger.RecognitionConfig.Builder() + .setCaptureRequested(aidlConfig.captureRequested) + .setAllowMultipleTriggers(false) + .setKeyphrases(keyphrases) + .setData(Arrays.copyOf(aidlConfig.data, aidlConfig.data.length)) + .setAudioCapabilities(aidl2apiAudioCapabilities(aidlConfig.audioCapabilities)) + .build(); } public static PhraseRecognitionExtra api2aidlPhraseRecognitionExtra( diff --git a/core/java/android/hardware/soundtrigger/SoundTrigger.java b/core/java/android/hardware/soundtrigger/SoundTrigger.java index 05e91e447a43..a1e7567faead 100644 --- a/core/java/android/hardware/soundtrigger/SoundTrigger.java +++ b/core/java/android/hardware/soundtrigger/SoundTrigger.java @@ -1529,8 +1529,6 @@ public class SoundTrigger { * config that can be used by * {@link SoundTriggerModule#startRecognition(int, RecognitionConfig)} * - * @deprecated should use builder-based constructor instead. - * TODO(b/368042125): remove this method. * @param captureRequested Whether the DSP should capture the trigger sound. * @param allowMultipleTriggers Whether the service should restart listening after the DSP * triggers. @@ -1538,15 +1536,10 @@ public class SoundTrigger { * @param data Opaque data for use by system applications who know about voice engine * internals, typically during enrollment. * @param audioCapabilities Bit field encoding of the AudioCapabilities. - * - * @hide */ - @Deprecated - @SuppressWarnings("Todo") - @TestApi - public RecognitionConfig(boolean captureRequested, boolean allowMultipleTriggers, - @SuppressLint("ArrayReturn") @Nullable KeyphraseRecognitionExtra[] keyphrases, - @Nullable byte[] data, int audioCapabilities) { + private RecognitionConfig(boolean captureRequested, boolean allowMultipleTriggers, + @Nullable KeyphraseRecognitionExtra[] keyphrases, @Nullable byte[] data, + int audioCapabilities) { this.mCaptureRequested = captureRequested; this.mAllowMultipleTriggers = allowMultipleTriggers; this.mKeyphrases = keyphrases != null ? keyphrases : new KeyphraseRecognitionExtra[0]; @@ -1558,6 +1551,7 @@ public class SoundTrigger { * Constructor for {@link RecognitionConfig} without audioCapabilities. The * audioCapabilities is set to 0. * + * @deprecated Use {@link Builder} instead. * @param captureRequested Whether the DSP should capture the trigger sound. * @param allowMultipleTriggers Whether the service should restart listening after the DSP * triggers. @@ -1567,10 +1561,10 @@ public class SoundTrigger { * @hide */ @UnsupportedAppUsage + @Deprecated @TestApi public RecognitionConfig(boolean captureRequested, boolean allowMultipleTriggers, - @SuppressLint("ArrayReturn") @Nullable KeyphraseRecognitionExtra[] keyphrases, - @Nullable byte[] data) { + @Nullable KeyphraseRecognitionExtra[] keyphrases, @Nullable byte[] data) { this(captureRequested, allowMultipleTriggers, keyphrases, data, 0); } @@ -1718,7 +1712,7 @@ public class SoundTrigger { /** * Sets capture requested state. - * @param captureRequested The new requested state. + * @param captureRequested Whether the DSP should capture the trigger sound. * @return the same Builder instance. */ public @NonNull Builder setCaptureRequested(boolean captureRequested) { @@ -1728,7 +1722,8 @@ public class SoundTrigger { /** * Sets allow multiple triggers state. - * @param allowMultipleTriggers The new allow multiple triggers state. + * @param allowMultipleTriggers Whether the service should restart listening after the + * DSP triggers. * @return the same Builder instance. */ public @NonNull Builder setAllowMultipleTriggers(boolean allowMultipleTriggers) { @@ -1738,7 +1733,8 @@ public class SoundTrigger { /** * Sets the keyphrases field. - * @param keyphrases The new keyphrases. + * @param keyphrases The list of keyphrase specific data associated with this + * recognition session. * @return the same Builder instance. */ public @NonNull Builder setKeyphrases( @@ -1749,7 +1745,9 @@ public class SoundTrigger { /** * Sets the data field. - * @param data The new data. + * @param data Opaque data provided to the DSP associated with this recognition session, + * which is used by system applications who know about voice engine + * internals, typically during enrollment. * @return the same Builder instance. */ public @NonNull Builder setData(@Nullable byte[] data) { @@ -1759,7 +1757,8 @@ public class SoundTrigger { /** * Sets the audio capabilities field. - * @param audioCapabilities The new audio capabilities. + * @param audioCapabilities The bit field encoding of the audio capabilities associated + * with this recognition session. * @return the same Builder instance. */ public @NonNull Builder setAudioCapabilities(int audioCapabilities) { diff --git a/core/java/android/service/voice/AlwaysOnHotwordDetector.java b/core/java/android/service/voice/AlwaysOnHotwordDetector.java index ccc17ecccbf9..2e660fc1f157 100644 --- a/core/java/android/service/voice/AlwaysOnHotwordDetector.java +++ b/core/java/android/service/voice/AlwaysOnHotwordDetector.java @@ -73,6 +73,7 @@ import com.android.internal.infra.AndroidFuture; import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; @@ -1513,10 +1514,11 @@ public class AlwaysOnHotwordDetector extends AbstractDetector { "Recognition for the given keyphrase is not supported"); } - KeyphraseRecognitionExtra[] recognitionExtra = new KeyphraseRecognitionExtra[1]; + List<KeyphraseRecognitionExtra> recognitionExtra = + new ArrayList<KeyphraseRecognitionExtra>(1); // TODO: Do we need to do something about the confidence level here? - recognitionExtra[0] = new KeyphraseRecognitionExtra(mKeyphraseMetadata.getId(), - mKeyphraseMetadata.getRecognitionModeFlags(), 0, new ConfidenceLevel[0]); + recognitionExtra.add(new KeyphraseRecognitionExtra(mKeyphraseMetadata.getId(), + mKeyphraseMetadata.getRecognitionModeFlags(), 0, new ConfidenceLevel[0])); boolean captureTriggerAudio = (recognitionFlags&RECOGNITION_FLAG_CAPTURE_TRIGGER_AUDIO) != 0; boolean allowMultipleTriggers = @@ -1534,10 +1536,17 @@ public class AlwaysOnHotwordDetector extends AbstractDetector { int code; try { code = mSoundTriggerSession.startRecognition( - mKeyphraseMetadata.getId(), mLocale.toLanguageTag(), mInternalCallback, - new RecognitionConfig(captureTriggerAudio, allowMultipleTriggers, - recognitionExtra, data, audioCapabilities), - runInBatterySaver); + mKeyphraseMetadata.getId(), + mLocale.toLanguageTag(), + mInternalCallback, + new RecognitionConfig.Builder() + .setCaptureRequested(captureTriggerAudio) + .setAllowMultipleTriggers(allowMultipleTriggers) + .setKeyphrases(recognitionExtra) + .setData(data) + .setAudioCapabilities(audioCapabilities) + .build(), + runInBatterySaver); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/media/java/android/media/soundtrigger/SoundTriggerDetector.java b/media/java/android/media/soundtrigger/SoundTriggerDetector.java index afa0a3271906..65e83b9bf204 100644 --- a/media/java/android/media/soundtrigger/SoundTriggerDetector.java +++ b/media/java/android/media/soundtrigger/SoundTriggerDetector.java @@ -323,10 +323,15 @@ public final class SoundTriggerDetector { int status; try { - status = mSoundTriggerSession.startRecognition(mSoundModel, - mRecognitionCallback, new RecognitionConfig(captureTriggerAudio, - allowMultipleTriggers, null, null, audioCapabilities), - runInBatterySaver); + status = mSoundTriggerSession.startRecognition( + mSoundModel, + mRecognitionCallback, + new RecognitionConfig.Builder() + .setCaptureRequested(captureTriggerAudio) + .setAllowMultipleTriggers(allowMultipleTriggers) + .setAudioCapabilities(audioCapabilities) + .build(), + runInBatterySaver); } catch (RemoteException e) { return false; } diff --git a/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger/ConversionUtilTest.java b/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger/ConversionUtilTest.java index ff2ce15a7946..6dba96766b48 100644 --- a/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger/ConversionUtilTest.java +++ b/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger/ConversionUtilTest.java @@ -41,6 +41,8 @@ import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Locale; @RunWith(AndroidJUnit4.class) @@ -62,18 +64,23 @@ public class ConversionUtilTest { final int flags = SoundTrigger.ModuleProperties.AUDIO_CAPABILITY_ECHO_CANCELLATION | SoundTrigger.ModuleProperties.AUDIO_CAPABILITY_NOISE_SUPPRESSION; final var data = new byte[] {0x11, 0x22}; - final var keyphrases = new SoundTrigger.KeyphraseRecognitionExtra[2]; - keyphrases[0] = new SoundTrigger.KeyphraseRecognitionExtra(99, + final var keyphrases = new ArrayList<SoundTrigger.KeyphraseRecognitionExtra>(2); + keyphrases.add(new SoundTrigger.KeyphraseRecognitionExtra(99, RECOGNITION_MODE_VOICE_TRIGGER | RECOGNITION_MODE_USER_IDENTIFICATION, 13, new ConfidenceLevel[] {new ConfidenceLevel(9999, 50), - new ConfidenceLevel(5000, 80)}); - keyphrases[1] = new SoundTrigger.KeyphraseRecognitionExtra(101, + new ConfidenceLevel(5000, 80)})); + keyphrases.add(new SoundTrigger.KeyphraseRecognitionExtra(101, RECOGNITION_MODE_GENERIC, 8, new ConfidenceLevel[] { new ConfidenceLevel(7777, 30), - new ConfidenceLevel(2222, 60)}); + new ConfidenceLevel(2222, 60)})); - var apiconfig = new SoundTrigger.RecognitionConfig(true, false /** must be false **/, - keyphrases, data, flags); + var apiconfig = new SoundTrigger.RecognitionConfig.Builder() + .setCaptureRequested(true) + .setAllowMultipleTriggers(false) // must be false + .setKeyphrases(keyphrases) + .setData(data) + .setAudioCapabilities(flags) + .build(); assertEquals(apiconfig, aidl2apiRecognitionConfig(api2aidlRecognitionConfig(apiconfig))); } |