Merge "Fix race in RecognizerService teardown." into lmp-dev

This commit is contained in:
Jeff Brown
2014-10-02 22:04:08 +00:00
committed by Android (Google) Code Review

View File

@@ -28,6 +28,8 @@ import android.os.Message;
import android.os.RemoteException;
import android.util.Log;
import java.lang.ref.WeakReference;
/**
* This class provides a base class for recognition service implementations. This class should be
* extended only in case you wish to implement a new speech recognizer. Please note that the
@@ -315,40 +317,46 @@ public abstract class RecognitionService extends Service {
}
/** Binder of the recognition service */
private static class RecognitionServiceBinder extends IRecognitionService.Stub {
private RecognitionService mInternalService;
private static final class RecognitionServiceBinder extends IRecognitionService.Stub {
private final WeakReference<RecognitionService> mServiceRef;
public RecognitionServiceBinder(RecognitionService service) {
mInternalService = service;
mServiceRef = new WeakReference<RecognitionService>(service);
}
@Override
public void startListening(Intent recognizerIntent, IRecognitionListener listener) {
if (DBG) Log.d(TAG, "startListening called by:" + listener.asBinder());
if (mInternalService != null && mInternalService.checkPermissions(listener)) {
mInternalService.mHandler.sendMessage(Message.obtain(mInternalService.mHandler,
MSG_START_LISTENING, mInternalService.new StartListeningArgs(
final RecognitionService service = mServiceRef.get();
if (service != null && service.checkPermissions(listener)) {
service.mHandler.sendMessage(Message.obtain(service.mHandler,
MSG_START_LISTENING, service.new StartListeningArgs(
recognizerIntent, listener)));
}
}
@Override
public void stopListening(IRecognitionListener listener) {
if (DBG) Log.d(TAG, "stopListening called by:" + listener.asBinder());
if (mInternalService != null && mInternalService.checkPermissions(listener)) {
mInternalService.mHandler.sendMessage(Message.obtain(mInternalService.mHandler,
final RecognitionService service = mServiceRef.get();
if (service != null && service.checkPermissions(listener)) {
service.mHandler.sendMessage(Message.obtain(service.mHandler,
MSG_STOP_LISTENING, listener));
}
}
@Override
public void cancel(IRecognitionListener listener) {
if (DBG) Log.d(TAG, "cancel called by:" + listener.asBinder());
if (mInternalService != null && mInternalService.checkPermissions(listener)) {
mInternalService.mHandler.sendMessage(Message.obtain(mInternalService.mHandler,
final RecognitionService service = mServiceRef.get();
if (service != null && service.checkPermissions(listener)) {
service.mHandler.sendMessage(Message.obtain(service.mHandler,
MSG_CANCEL, listener));
}
}
public void clearReference() {
mInternalService = null;
mServiceRef.clear();
}
}
}