From 7040c1291b8b6800b289d6e301b550ae8f90f9b4 Mon Sep 17 00:00:00 2001 From: Felix Oghina Date: Tue, 4 Apr 2023 15:43:00 +0000 Subject: [PATCH] [hotword] detach session when detector is destroyed Bug: 272147641 Bug: 274806716 Test: atest AlwaysOnHotwordDetectorTest Change-Id: I2297806b6d6161aa1bd88eaf780ae2266f4f8f7a --- .../voice/AlwaysOnHotwordDetector.java | 19 ++++++++++++------- .../IVoiceInteractionSoundTriggerSession.aidl | 5 +++++ .../android/server/SoundTriggerInternal.java | 6 ++++++ .../soundtrigger/SoundTriggerService.java | 5 +++++ .../SoundTriggerSessionBinderProxy.java | 5 +++++ ...undTriggerSessionPermissionsDecorator.java | 9 +++++++++ .../VoiceInteractionManagerService.java | 5 +++++ 7 files changed, 47 insertions(+), 7 deletions(-) diff --git a/core/java/android/service/voice/AlwaysOnHotwordDetector.java b/core/java/android/service/voice/AlwaysOnHotwordDetector.java index 24c96eae03cb5..91c350aa9abaa 100644 --- a/core/java/android/service/voice/AlwaysOnHotwordDetector.java +++ b/core/java/android/service/voice/AlwaysOnHotwordDetector.java @@ -1334,13 +1334,7 @@ public class AlwaysOnHotwordDetector extends AbstractDetector { @Override public void destroy() { synchronized (mLock) { - if (mAvailability == STATE_KEYPHRASE_ENROLLED) { - try { - stopRecognition(); - } catch (Exception e) { - Log.i(TAG, "failed to stopRecognition in destroy", e); - } - } + detachSessionLocked(); mAvailability = STATE_INVALID; mIsAvailabilityOverriddenByTestApi = false; @@ -1349,6 +1343,17 @@ public class AlwaysOnHotwordDetector extends AbstractDetector { super.destroy(); } + private void detachSessionLocked() { + try { + if (DBG) Slog.d(TAG, "detachSessionLocked() " + mSoundTriggerSession); + if (mSoundTriggerSession != null) { + mSoundTriggerSession.detach(); + } + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } + } + /** * @hide */ diff --git a/core/java/com/android/internal/app/IVoiceInteractionSoundTriggerSession.aidl b/core/java/com/android/internal/app/IVoiceInteractionSoundTriggerSession.aidl index 1ccc71a9e79cf..23de50c567a10 100644 --- a/core/java/com/android/internal/app/IVoiceInteractionSoundTriggerSession.aidl +++ b/core/java/com/android/internal/app/IVoiceInteractionSoundTriggerSession.aidl @@ -94,4 +94,9 @@ interface IVoiceInteractionSoundTriggerSession { */ @nullable SoundTrigger.ModelParamRange queryParameter(int keyphraseId, in ModelParams modelParam); + /** + * Invalidates the sound trigger session and clears any associated resources. Subsequent calls + * to this object will throw IllegalStateException. + */ + void detach(); } diff --git a/services/core/java/com/android/server/SoundTriggerInternal.java b/services/core/java/com/android/server/SoundTriggerInternal.java index e6c1750c4a1de..65294652b92de 100644 --- a/services/core/java/com/android/server/SoundTriggerInternal.java +++ b/services/core/java/com/android/server/SoundTriggerInternal.java @@ -141,6 +141,12 @@ public interface SoundTriggerInternal { ModelParamRange queryParameter(int keyphraseId, @ModelParams int modelParam); + /** + * Invalidates the sound trigger session and clears any associated resources. Subsequent + * calls to this object will throw IllegalStateException. + */ + void detach(); + /** * Unloads (and stops if running) the given keyphraseId */ diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java index 790be8dacd984..46e634fa72732 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java @@ -1662,6 +1662,11 @@ public class SoundTriggerService extends SystemService { return mSoundTriggerHelper.queryKeyphraseParameter(keyphraseId, modelParam); } + @Override + public void detach() { + mSoundTriggerHelper.detach(); + } + @Override public int unloadKeyphraseModel(int keyphraseId) { return mSoundTriggerHelper.unloadKeyphraseSoundModel(keyphraseId); diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerSessionBinderProxy.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerSessionBinderProxy.java index dd9fee3887cb3..0ef2f06b66845 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerSessionBinderProxy.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerSessionBinderProxy.java @@ -69,4 +69,9 @@ final class SoundTriggerSessionBinderProxy extends IVoiceInteractionSoundTrigger public SoundTrigger.ModelParamRange queryParameter(int i, int i1) throws RemoteException { return mDelegate.queryParameter(i, i1); } + + @Override + public void detach() throws RemoteException { + mDelegate.detach(); + } } diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerSessionPermissionsDecorator.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerSessionPermissionsDecorator.java index c0c3e6f530dbd..0f8a945ec4612 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerSessionPermissionsDecorator.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerSessionPermissionsDecorator.java @@ -113,6 +113,15 @@ final class SoundTriggerSessionPermissionsDecorator implements "This object isn't intended to be used as a Binder."); } + @Override + public void detach() { + try { + mDelegate.detach(); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } + } + // TODO: Share this code with SoundTriggerMiddlewarePermission. private boolean isHoldingPermissions() { try { diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java index 1d7b966bab516..bb50c792c4f8e 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java @@ -1856,6 +1856,11 @@ public class VoiceInteractionManagerService extends SystemService { "This object isn't intended to be used as a Binder."); } + @Override + public void detach() { + mSession.detach(); + } + private int unloadKeyphraseModel(int keyphraseId) { final long caller = Binder.clearCallingIdentity(); try {