diff options
| author | 2023-05-22 16:51:25 +0100 | |
|---|---|---|
| committer | 2023-08-17 11:01:09 +0000 | |
| commit | 37f847484eb603b72456cfe31c651c04c94c46c6 (patch) | |
| tree | 0cecaa553bbc7c22627e73def59f7581540bb152 | |
| parent | e75a45ec5592cc0f3f774ae368bf7819f32c9521 (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.java | 62 |
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(); + } } } }); |