Fix issue #121104681: Force stopping AGSA causes system to revert to its default impl
If you have a legacy assist app (launched through ACTION_ASSIST, not implementing a VoiceInteractionService) then we kept the Google app as the current speech recognizer. Thus if you force stopped the Google app, we saw that as one of the active parts of the interactor or recognizer and reset all of the state. Now we handle the "only recognizer" case separately, only resettting the recognizer state in that case. Bug: 121104681 Test: manual Change-Id: Icc007bdf2352548d58be997fae77d9e5aba842f3
This commit is contained in:
@@ -356,7 +356,12 @@ public class VoiceInteractionManagerService extends SystemService {
|
||||
}
|
||||
|
||||
// No voice interactor, we'll just set up a simple recognizer.
|
||||
curRecognizer = findAvailRecognizer(null, userHandle);
|
||||
initSimpleRecognizer(curInteractorInfo, userHandle);
|
||||
}
|
||||
|
||||
public void initSimpleRecognizer(VoiceInteractionServiceInfo curInteractorInfo,
|
||||
int userHandle) {
|
||||
ComponentName curRecognizer = findAvailRecognizer(null, userHandle);
|
||||
if (curRecognizer != null) {
|
||||
if (curInteractorInfo == null) {
|
||||
setCurInteractor(null, userHandle);
|
||||
@@ -1236,34 +1241,46 @@ public class VoiceInteractionManagerService extends SystemService {
|
||||
int userHandle = UserHandle.getUserId(uid);
|
||||
ComponentName curInteractor = getCurInteractor(userHandle);
|
||||
ComponentName curRecognizer = getCurRecognizer(userHandle);
|
||||
boolean hit = false;
|
||||
boolean hitInt = false;
|
||||
boolean hitRec = false;
|
||||
for (String pkg : packages) {
|
||||
if (curInteractor != null && pkg.equals(curInteractor.getPackageName())) {
|
||||
hit = true;
|
||||
hitInt = true;
|
||||
break;
|
||||
} else if (curRecognizer != null
|
||||
&& pkg.equals(curRecognizer.getPackageName())) {
|
||||
hit = true;
|
||||
hitRec = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (hit && doit) {
|
||||
// The user is force stopping our current interactor/recognizer.
|
||||
if (hitInt && doit) {
|
||||
// The user is force stopping our current interactor.
|
||||
// Clear the current settings and restore default state.
|
||||
synchronized (VoiceInteractionManagerServiceStub.this) {
|
||||
Slog.i(TAG, "Force stopping current voice interactor: "
|
||||
+ getCurInteractor(userHandle));
|
||||
unloadAllKeyphraseModels();
|
||||
if (mImpl != null) {
|
||||
mImpl.shutdownLocked();
|
||||
setImplLocked(null);
|
||||
}
|
||||
|
||||
setCurInteractor(null, userHandle);
|
||||
setCurRecognizer(null, userHandle);
|
||||
resetCurAssistant(userHandle);
|
||||
initForUser(userHandle);
|
||||
switchImplementationIfNeededLocked(true);
|
||||
}
|
||||
} else if (hitRec && doit) {
|
||||
// We are just force-stopping the current recognizer, which is not
|
||||
// also the current interactor.
|
||||
synchronized (VoiceInteractionManagerServiceStub.this) {
|
||||
Slog.i(TAG, "Force stopping current voice recognizer: "
|
||||
+ getCurRecognizer(userHandle));
|
||||
initSimpleRecognizer(null, userHandle);
|
||||
}
|
||||
}
|
||||
return hit;
|
||||
return hitInt || hitRec;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user