summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Aleksandar Kiridzic <kiridza@google.com> 2023-05-22 16:51:25 +0100
committer Aleksandar Kiridžić <kiridza@google.com> 2023-08-17 11:01:09 +0000
commit37f847484eb603b72456cfe31c651c04c94c46c6 (patch)
tree0cecaa553bbc7c22627e73def59f7581540bb152
parente75a45ec5592cc0f3f774ae368bf7819f32c9521 (diff)
speech: Timely model download listening connection termination
Callbacks onSuccess, onSchedule and onError in ModelDownloadListener should be terminal ones, i.e., no callbacks should be called after one of these. Callback forwarding will be stopped inside the recognition service. Bug: 283102476 Test: test app, atest CtsVoiceRecognitionTestCases Change-Id: If1fdb09bd10ae36fe3eb02c562e6d2069745bb8e
-rw-r--r--core/java/android/speech/RecognitionService.java62
1 files changed, 46 insertions, 16 deletions
diff --git a/core/java/android/speech/RecognitionService.java b/core/java/android/speech/RecognitionService.java
index 9656f36d2c4d..7f313c177053 100644
--- a/core/java/android/speech/RecognitionService.java
+++ b/core/java/android/speech/RecognitionService.java
@@ -38,6 +38,7 @@ import android.os.Message;
import android.os.RemoteException;
import android.util.Log;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.function.pooled.PooledLambda;
import java.lang.ref.WeakReference;
@@ -232,39 +233,68 @@ public abstract class RecognitionService extends Service {
intent,
attributionSource,
new ModelDownloadListener() {
+
+ private final Object mLock = new Object();
+
+ @GuardedBy("mLock")
+ private boolean mIsTerminated = false;
+
@Override
public void onProgress(int completedPercent) {
- try {
- listener.onProgress(completedPercent);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
+ synchronized (mLock) {
+ if (mIsTerminated) {
+ return;
+ }
+ try {
+ listener.onProgress(completedPercent);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
}
}
@Override
public void onSuccess() {
- try {
- listener.onSuccess();
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
+ synchronized (mLock) {
+ if (mIsTerminated) {
+ return;
+ }
+ mIsTerminated = true;
+ try {
+ listener.onSuccess();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
}
}
@Override
public void onScheduled() {
- try {
- listener.onScheduled();
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
+ synchronized (mLock) {
+ if (mIsTerminated) {
+ return;
+ }
+ mIsTerminated = true;
+ try {
+ listener.onScheduled();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
}
}
@Override
public void onError(int error) {
- try {
- listener.onError(error);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
+ synchronized (mLock) {
+ if (mIsTerminated) {
+ return;
+ }
+ mIsTerminated = true;
+ try {
+ listener.onError(error);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
}
}
});