[hotword] detach session when detector is destroyed

Bug: 272147641
Bug: 274806716

Test: atest AlwaysOnHotwordDetectorTest

Change-Id: I2297806b6d6161aa1bd88eaf780ae2266f4f8f7a
This commit is contained in:
Felix Oghina
2023-04-04 15:43:00 +00:00
committed by Atneya Nair
parent 14de650038
commit 7040c1291b
7 changed files with 47 additions and 7 deletions

View File

@@ -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
*/

View File

@@ -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();
}

View File

@@ -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
*/

View File

@@ -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);

View File

@@ -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();
}
}

View File

@@ -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 {

View File

@@ -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 {