Skip to content
Snippets Groups Projects
Commit 99fa73c0 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Revert "[hotword] fix race condition in destroy()"" into main

parents ccb49a09 9aa1db74
No related branches found
No related tags found
No related merge requests found
...@@ -960,8 +960,8 @@ public class AlwaysOnHotwordDetector extends AbstractDetector { ...@@ -960,8 +960,8 @@ public class AlwaysOnHotwordDetector extends AbstractDetector {
mKeyphraseMetadata = new KeyphraseMetadata(1, mText, fakeSupportedLocales, mKeyphraseMetadata = new KeyphraseMetadata(1, mText, fakeSupportedLocales,
AlwaysOnHotwordDetector.RECOGNITION_MODE_VOICE_TRIGGER); AlwaysOnHotwordDetector.RECOGNITION_MODE_VOICE_TRIGGER);
} }
notifyStateChangedLocked();
} }
notifyStateChanged(availability);
} }
/** /**
...@@ -1371,8 +1371,8 @@ public class AlwaysOnHotwordDetector extends AbstractDetector { ...@@ -1371,8 +1371,8 @@ public class AlwaysOnHotwordDetector extends AbstractDetector {
mAvailability = STATE_INVALID; mAvailability = STATE_INVALID;
mIsAvailabilityOverriddenByTestApi = false; mIsAvailabilityOverriddenByTestApi = false;
notifyStateChangedLocked();
} }
notifyStateChanged(STATE_INVALID);
super.destroy(); super.destroy();
} }
...@@ -1402,8 +1402,6 @@ public class AlwaysOnHotwordDetector extends AbstractDetector { ...@@ -1402,8 +1402,6 @@ public class AlwaysOnHotwordDetector extends AbstractDetector {
*/ */
// TODO(b/281608561): remove the enrollment flow from AlwaysOnHotwordDetector // TODO(b/281608561): remove the enrollment flow from AlwaysOnHotwordDetector
void onSoundModelsChanged() { void onSoundModelsChanged() {
boolean notifyError = false;
synchronized (mLock) { synchronized (mLock) {
if (mAvailability == STATE_INVALID if (mAvailability == STATE_INVALID
|| mAvailability == STATE_HARDWARE_UNAVAILABLE || mAvailability == STATE_HARDWARE_UNAVAILABLE
...@@ -1444,9 +1442,6 @@ public class AlwaysOnHotwordDetector extends AbstractDetector { ...@@ -1444,9 +1442,6 @@ public class AlwaysOnHotwordDetector extends AbstractDetector {
// calling stopRecognition where there is no started session. // calling stopRecognition where there is no started session.
Log.w(TAG, "Failed to stop recognition after enrollment update: code=" Log.w(TAG, "Failed to stop recognition after enrollment update: code="
+ result); + result);
// Execute a refresh availability task - which should then notify of a change.
new RefreshAvailabilityTask().execute();
} catch (Exception e) { } catch (Exception e) {
Slog.w(TAG, "Failed to stop recognition after enrollment update", e); Slog.w(TAG, "Failed to stop recognition after enrollment update", e);
if (CompatChanges.isChangeEnabled(SEND_ON_FAILURE_FOR_ASYNC_EXCEPTIONS)) { if (CompatChanges.isChangeEnabled(SEND_ON_FAILURE_FOR_ASYNC_EXCEPTIONS)) {
...@@ -1455,14 +1450,14 @@ public class AlwaysOnHotwordDetector extends AbstractDetector { ...@@ -1455,14 +1450,14 @@ public class AlwaysOnHotwordDetector extends AbstractDetector {
+ Log.getStackTraceString(e), + Log.getStackTraceString(e),
FailureSuggestedAction.RECREATE_DETECTOR)); FailureSuggestedAction.RECREATE_DETECTOR));
} else { } else {
notifyError = true; updateAndNotifyStateChangedLocked(STATE_ERROR);
} }
return;
} }
} }
}
if (notifyError) { // Execute a refresh availability task - which should then notify of a change.
updateAndNotifyStateChanged(STATE_ERROR); new RefreshAvailabilityTask().execute();
} }
} }
...@@ -1578,11 +1573,10 @@ public class AlwaysOnHotwordDetector extends AbstractDetector { ...@@ -1578,11 +1573,10 @@ public class AlwaysOnHotwordDetector extends AbstractDetector {
} }
} }
private void updateAndNotifyStateChanged(int availability) { @GuardedBy("mLock")
synchronized (mLock) { private void updateAndNotifyStateChangedLocked(int availability) {
updateAvailabilityLocked(availability); updateAvailabilityLocked(availability);
} notifyStateChangedLocked();
notifyStateChanged(availability);
} }
@GuardedBy("mLock") @GuardedBy("mLock")
...@@ -1596,17 +1590,17 @@ public class AlwaysOnHotwordDetector extends AbstractDetector { ...@@ -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 message = Message.obtain(mHandler, MSG_AVAILABILITY_CHANGED);
message.arg1 = newAvailability; message.arg1 = mAvailability;
message.sendToTarget(); message.sendToTarget();
} }
@GuardedBy("mLock")
private void sendUnknownFailure(String failureMessage) { private void sendUnknownFailure(String failureMessage) {
synchronized (mLock) { // update but do not call onAvailabilityChanged callback for STATE_ERROR
// update but do not call onAvailabilityChanged callback for STATE_ERROR updateAvailabilityLocked(STATE_ERROR);
updateAvailabilityLocked(STATE_ERROR);
}
Message.obtain(mHandler, MSG_DETECTION_UNKNOWN_FAILURE, failureMessage).sendToTarget(); Message.obtain(mHandler, MSG_DETECTION_UNKNOWN_FAILURE, failureMessage).sendToTarget();
} }
...@@ -1822,17 +1816,19 @@ public class AlwaysOnHotwordDetector extends AbstractDetector { ...@@ -1822,17 +1816,19 @@ public class AlwaysOnHotwordDetector extends AbstractDetector {
availability = STATE_KEYPHRASE_UNENROLLED; availability = STATE_KEYPHRASE_UNENROLLED;
} }
} }
updateAndNotifyStateChangedLocked(availability);
} }
updateAndNotifyStateChanged(availability);
} catch (Exception e) { } catch (Exception e) {
// Any exception here not caught will crash the process because AsyncTask does not // 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. // bubble up the exceptions to the client app, so we must propagate it to the app.
Slog.w(TAG, "Failed to refresh availability", e); Slog.w(TAG, "Failed to refresh availability", e);
if (CompatChanges.isChangeEnabled(SEND_ON_FAILURE_FOR_ASYNC_EXCEPTIONS)) { synchronized (mLock) {
sendUnknownFailure( if (CompatChanges.isChangeEnabled(SEND_ON_FAILURE_FOR_ASYNC_EXCEPTIONS)) {
"Failed to refresh availability: " + Log.getStackTraceString(e)); sendUnknownFailure(
} else { "Failed to refresh availability: " + Log.getStackTraceString(e));
updateAndNotifyStateChanged(STATE_ERROR); } else {
updateAndNotifyStateChangedLocked(STATE_ERROR);
}
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment