From 3d7ab61b028e7ccd2ad27175c67f95c6eacfc78a Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Mon, 17 Dec 2018 10:53:53 -0800 Subject: [PATCH] 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 --- .../VoiceInteractionManagerService.java | 31 ++++++++++++++----- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java index 99ad1f4d6b50b..bbf3d45d7c99b 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java @@ -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