From c800a04b350eaacc7f0ebed4de0161c7671f4b55 Mon Sep 17 00:00:00 2001 From: Atneya Nair Date: Fri, 27 Jan 2023 18:20:05 -0800 Subject: [PATCH] Remove STService dependency on model database The loaded model can mismatch the model in the database. Removing this dependency while preserving existing behavior for STDetector clients. These clients already must load the model to prevent state mismatch. Test: Compiles Bug: 266963008 Change-Id: I0c0ea9081e9507c2237796ac11a7585dec1c148d --- .../internal/app/ISoundTriggerSession.aidl | 3 +- .../soundtrigger/SoundTriggerDetector.java | 13 +++++--- .../soundtrigger/SoundTriggerManager.java | 15 ++++++--- .../soundtrigger/SoundTriggerService.java | 31 +++++++++---------- 4 files changed, 34 insertions(+), 28 deletions(-) diff --git a/core/java/com/android/internal/app/ISoundTriggerSession.aidl b/core/java/com/android/internal/app/ISoundTriggerSession.aidl index a1ba558a5e7fb..3269ffcc5240d 100644 --- a/core/java/com/android/internal/app/ISoundTriggerSession.aidl +++ b/core/java/com/android/internal/app/ISoundTriggerSession.aidl @@ -36,7 +36,8 @@ interface ISoundTriggerSession { void deleteSoundModel(in ParcelUuid soundModelId); - int startRecognition(in ParcelUuid soundModelId, in IRecognitionStatusCallback callback, + int startRecognition(in SoundTrigger.GenericSoundModel soundModel, + in IRecognitionStatusCallback callback, in SoundTrigger.RecognitionConfig config, boolean runInBatterySaver); int stopRecognition(in ParcelUuid soundModelId, in IRecognitionStatusCallback callback); diff --git a/media/java/android/media/soundtrigger/SoundTriggerDetector.java b/media/java/android/media/soundtrigger/SoundTriggerDetector.java index 59e19ede5b747..1a3e54d54ee7a 100644 --- a/media/java/android/media/soundtrigger/SoundTriggerDetector.java +++ b/media/java/android/media/soundtrigger/SoundTriggerDetector.java @@ -25,6 +25,7 @@ import android.annotation.SystemApi; import android.compat.annotation.UnsupportedAppUsage; import android.hardware.soundtrigger.IRecognitionStatusCallback; import android.hardware.soundtrigger.SoundTrigger; +import android.hardware.soundtrigger.SoundTrigger.GenericSoundModel; import android.hardware.soundtrigger.SoundTrigger.ModuleProperties; import android.hardware.soundtrigger.SoundTrigger.RecognitionConfig; import android.media.AudioFormat; @@ -50,6 +51,7 @@ import java.util.UUID; * VoiceInteractionService} instead. Access to this class is protected by a permission * granted only to system or privileged apps. * @deprecated use {@link SoundTriggerManager} directly + * * @hide */ @Deprecated @@ -67,7 +69,7 @@ public final class SoundTriggerDetector { private final Object mLock = new Object(); private final ISoundTriggerSession mSoundTriggerSession; - private final UUID mSoundModelId; + private final GenericSoundModel mSoundModel; private final Callback mCallback; private final Handler mHandler; private final RecognitionCallback mRecognitionCallback; @@ -277,10 +279,11 @@ public final class SoundTriggerDetector { * This class should be constructed by the {@link SoundTriggerManager}. * @hide */ - SoundTriggerDetector(ISoundTriggerSession soundTriggerSession, UUID soundModelId, + SoundTriggerDetector(ISoundTriggerSession soundTriggerSession, + @NonNull GenericSoundModel soundModel, @NonNull Callback callback, @Nullable Handler handler) { mSoundTriggerSession = soundTriggerSession; - mSoundModelId = soundModelId; + mSoundModel = soundModel; mCallback = callback; if (handler == null) { mHandler = new MyHandler(); @@ -320,7 +323,7 @@ public final class SoundTriggerDetector { int status; try { - status = mSoundTriggerSession.startRecognition(new ParcelUuid(mSoundModelId), + status = mSoundTriggerSession.startRecognition(mSoundModel, mRecognitionCallback, new RecognitionConfig(captureTriggerAudio, allowMultipleTriggers, null, null, audioCapabilities), runInBatterySaver); @@ -339,7 +342,7 @@ public final class SoundTriggerDetector { public boolean stopRecognition() { int status = STATUS_OK; try { - status = mSoundTriggerSession.stopRecognition(new ParcelUuid(mSoundModelId), + status = mSoundTriggerSession.stopRecognition(new ParcelUuid(mSoundModel.getUuid()), mRecognitionCallback); } catch (RemoteException e) { return false; diff --git a/media/java/android/media/soundtrigger/SoundTriggerManager.java b/media/java/android/media/soundtrigger/SoundTriggerManager.java index 8dc708a1b9460..c473a013d3b5f 100644 --- a/media/java/android/media/soundtrigger/SoundTriggerManager.java +++ b/media/java/android/media/soundtrigger/SoundTriggerManager.java @@ -184,11 +184,16 @@ public final class SoundTriggerManager { if (oldInstance != null) { // Shutdown old instance. } - SoundTriggerDetector newInstance = new SoundTriggerDetector(mSoundTriggerSession, - soundModelId, callback, handler); - mReceiverInstanceMap.put(soundModelId, newInstance); - return newInstance; - } + try { + SoundTriggerDetector newInstance = new SoundTriggerDetector(mSoundTriggerSession, + mSoundTriggerSession.getSoundModel(new ParcelUuid(soundModelId)), + callback, handler); + mReceiverInstanceMap.put(soundModelId, newInstance); + return newInstance; + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } /** * Class captures the data and fields that represent a non-keyphrase sound model. Use the diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java index 81717f449e03b..7824c69c0aa15 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java @@ -298,35 +298,33 @@ public class SoundTriggerService extends SystemService { } @Override - public int startRecognition(ParcelUuid parcelUuid, IRecognitionStatusCallback callback, + public int startRecognition(GenericSoundModel soundModel, + IRecognitionStatusCallback callback, RecognitionConfig config, boolean runInBatterySaverMode) { try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); + + if (soundModel == null) { + Slog.e(TAG, "Null model passed to startRecognition"); + return STATUS_ERROR; + } + if (runInBatterySaverMode) { enforceCallingPermission(Manifest.permission.SOUND_TRIGGER_RUN_IN_BATTERY_SAVER); } if (DEBUG) { - Slog.i(TAG, "startRecognition(): Uuid : " + parcelUuid); + Slog.i(TAG, "startRecognition(): Uuid : " + soundModel.toString()); } sEventLogger.enqueue(new EventLogger.StringEvent( - "startRecognition(): Uuid : " + parcelUuid)); + "startRecognition(): Uuid : " + soundModel.getUuid().toString())); - GenericSoundModel model = getSoundModel(parcelUuid); - if (model == null) { - Slog.w(TAG, "Null model in database for id: " + parcelUuid); - - sEventLogger.enqueue(new EventLogger.StringEvent( - "startRecognition(): Null model in database for id: " + parcelUuid)); - - return STATUS_ERROR; - } - - int ret = mSoundTriggerHelper.startGenericRecognition(parcelUuid.getUuid(), model, + int ret = mSoundTriggerHelper.startGenericRecognition(soundModel.getUuid(), + soundModel, callback, config, runInBatterySaverMode); if (ret == STATUS_OK) { - mSoundModelStatTracker.onStart(parcelUuid.getUuid()); + mSoundModelStatTracker.onStart(soundModel.getUuid()); } return ret; } @@ -379,8 +377,7 @@ public class SoundTriggerService extends SystemService { sEventLogger.enqueue(new EventLogger.StringEvent("updateSoundModel(): model = " + soundModel)); - - mDbHelper.updateGenericSoundModel(soundModel); + mDbHelper.updateGenericSoundModel(soundModel); } }