diff --git a/core/java/android/service/voice/AlwaysOnHotwordDetector.java b/core/java/android/service/voice/AlwaysOnHotwordDetector.java index 875031fb0cb3bcffeb777cc4d0298a3218a4d70b..23c8393dadc3948d248e8c93be09e1eeb642b626 100644 --- a/core/java/android/service/voice/AlwaysOnHotwordDetector.java +++ b/core/java/android/service/voice/AlwaysOnHotwordDetector.java @@ -960,8 +960,8 @@ public class AlwaysOnHotwordDetector extends AbstractDetector { mKeyphraseMetadata = new KeyphraseMetadata(1, mText, fakeSupportedLocales, AlwaysOnHotwordDetector.RECOGNITION_MODE_VOICE_TRIGGER); } + notifyStateChangedLocked(); } - notifyStateChanged(availability); } /** @@ -1371,8 +1371,8 @@ public class AlwaysOnHotwordDetector extends AbstractDetector { mAvailability = STATE_INVALID; mIsAvailabilityOverriddenByTestApi = false; + notifyStateChangedLocked(); } - notifyStateChanged(STATE_INVALID); super.destroy(); } @@ -1402,8 +1402,6 @@ public class AlwaysOnHotwordDetector extends AbstractDetector { */ // TODO(b/281608561): remove the enrollment flow from AlwaysOnHotwordDetector void onSoundModelsChanged() { - boolean notifyError = false; - synchronized (mLock) { if (mAvailability == STATE_INVALID || mAvailability == STATE_HARDWARE_UNAVAILABLE @@ -1444,9 +1442,6 @@ public class AlwaysOnHotwordDetector extends AbstractDetector { // calling stopRecognition where there is no started session. Log.w(TAG, "Failed to stop recognition after enrollment update: code=" + result); - - // Execute a refresh availability task - which should then notify of a change. - new RefreshAvailabilityTask().execute(); } catch (Exception e) { Slog.w(TAG, "Failed to stop recognition after enrollment update", e); if (CompatChanges.isChangeEnabled(SEND_ON_FAILURE_FOR_ASYNC_EXCEPTIONS)) { @@ -1455,14 +1450,14 @@ public class AlwaysOnHotwordDetector extends AbstractDetector { + Log.getStackTraceString(e), FailureSuggestedAction.RECREATE_DETECTOR)); } else { - notifyError = true; + updateAndNotifyStateChangedLocked(STATE_ERROR); } + return; } } - } - if (notifyError) { - updateAndNotifyStateChanged(STATE_ERROR); + // Execute a refresh availability task - which should then notify of a change. + new RefreshAvailabilityTask().execute(); } } @@ -1578,11 +1573,10 @@ public class AlwaysOnHotwordDetector extends AbstractDetector { } } - private void updateAndNotifyStateChanged(int availability) { - synchronized (mLock) { - updateAvailabilityLocked(availability); - } - notifyStateChanged(availability); + @GuardedBy("mLock") + private void updateAndNotifyStateChangedLocked(int availability) { + updateAvailabilityLocked(availability); + notifyStateChangedLocked(); } @GuardedBy("mLock") @@ -1596,17 +1590,17 @@ public class AlwaysOnHotwordDetector extends AbstractDetector { } } - private void notifyStateChanged(int newAvailability) { + @GuardedBy("mLock") + private void notifyStateChangedLocked() { Message message = Message.obtain(mHandler, MSG_AVAILABILITY_CHANGED); - message.arg1 = newAvailability; + message.arg1 = mAvailability; message.sendToTarget(); } + @GuardedBy("mLock") private void sendUnknownFailure(String failureMessage) { - synchronized (mLock) { - // update but do not call onAvailabilityChanged callback for STATE_ERROR - updateAvailabilityLocked(STATE_ERROR); - } + // update but do not call onAvailabilityChanged callback for STATE_ERROR + updateAvailabilityLocked(STATE_ERROR); Message.obtain(mHandler, MSG_DETECTION_UNKNOWN_FAILURE, failureMessage).sendToTarget(); } @@ -1822,17 +1816,19 @@ public class AlwaysOnHotwordDetector extends AbstractDetector { availability = STATE_KEYPHRASE_UNENROLLED; } } + updateAndNotifyStateChangedLocked(availability); } - updateAndNotifyStateChanged(availability); } catch (Exception e) { // Any exception here not caught will crash the process because AsyncTask does not // bubble up the exceptions to the client app, so we must propagate it to the app. Slog.w(TAG, "Failed to refresh availability", e); - if (CompatChanges.isChangeEnabled(SEND_ON_FAILURE_FOR_ASYNC_EXCEPTIONS)) { - sendUnknownFailure( - "Failed to refresh availability: " + Log.getStackTraceString(e)); - } else { - updateAndNotifyStateChanged(STATE_ERROR); + synchronized (mLock) { + if (CompatChanges.isChangeEnabled(SEND_ON_FAILURE_FOR_ASYNC_EXCEPTIONS)) { + sendUnknownFailure( + "Failed to refresh availability: " + Log.getStackTraceString(e)); + } else { + updateAndNotifyStateChangedLocked(STATE_ERROR); + } } }