diff options
| -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(); + } } } }); |