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

* commit 'ae309489c2b22c6cfcc6701b5dea13c652239ecd':
  Fix race in RecognizerService teardown.
This commit is contained in:
Jeff Brown
2014-10-02 22:09:08 +00:00
committed by Android Git Automerger

View File

@@ -28,6 +28,8 @@ import android.os.Message;
import android.os.RemoteException; import android.os.RemoteException;
import android.util.Log; import android.util.Log;
import java.lang.ref.WeakReference;
/** /**
* This class provides a base class for recognition service implementations. This class should be * 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 * 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 */ /** Binder of the recognition service */
private static class RecognitionServiceBinder extends IRecognitionService.Stub { private static final class RecognitionServiceBinder extends IRecognitionService.Stub {
private RecognitionService mInternalService; private final WeakReference<RecognitionService> mServiceRef;
public RecognitionServiceBinder(RecognitionService service) { public RecognitionServiceBinder(RecognitionService service) {
mInternalService = service; mServiceRef = new WeakReference<RecognitionService>(service);
} }
@Override
public void startListening(Intent recognizerIntent, IRecognitionListener listener) { public void startListening(Intent recognizerIntent, IRecognitionListener listener) {
if (DBG) Log.d(TAG, "startListening called by:" + listener.asBinder()); if (DBG) Log.d(TAG, "startListening called by:" + listener.asBinder());
if (mInternalService != null && mInternalService.checkPermissions(listener)) { final RecognitionService service = mServiceRef.get();
mInternalService.mHandler.sendMessage(Message.obtain(mInternalService.mHandler, if (service != null && service.checkPermissions(listener)) {
MSG_START_LISTENING, mInternalService.new StartListeningArgs( service.mHandler.sendMessage(Message.obtain(service.mHandler,
MSG_START_LISTENING, service.new StartListeningArgs(
recognizerIntent, listener))); recognizerIntent, listener)));
} }
} }
@Override
public void stopListening(IRecognitionListener listener) { public void stopListening(IRecognitionListener listener) {
if (DBG) Log.d(TAG, "stopListening called by:" + listener.asBinder()); if (DBG) Log.d(TAG, "stopListening called by:" + listener.asBinder());
if (mInternalService != null && mInternalService.checkPermissions(listener)) { final RecognitionService service = mServiceRef.get();
mInternalService.mHandler.sendMessage(Message.obtain(mInternalService.mHandler, if (service != null && service.checkPermissions(listener)) {
service.mHandler.sendMessage(Message.obtain(service.mHandler,
MSG_STOP_LISTENING, listener)); MSG_STOP_LISTENING, listener));
} }
} }
@Override
public void cancel(IRecognitionListener listener) { public void cancel(IRecognitionListener listener) {
if (DBG) Log.d(TAG, "cancel called by:" + listener.asBinder()); if (DBG) Log.d(TAG, "cancel called by:" + listener.asBinder());
if (mInternalService != null && mInternalService.checkPermissions(listener)) { final RecognitionService service = mServiceRef.get();
mInternalService.mHandler.sendMessage(Message.obtain(mInternalService.mHandler, if (service != null && service.checkPermissions(listener)) {
service.mHandler.sendMessage(Message.obtain(service.mHandler,
MSG_CANCEL, listener)); MSG_CANCEL, listener));
} }
} }
public void clearReference() { public void clearReference() {
mInternalService = null; mServiceRef.clear();
} }
} }
} }