Skip to content

Commit b4e7d4c

Browse files
narayankAndroid (Google) Code Review
authored andcommitted
Merge "Allow listeners to be set before the service connects."
2 parents ea54b17 + a57f238 commit b4e7d4c

File tree

1 file changed

+21
-15
lines changed

1 file changed

+21
-15
lines changed

core/java/android/speech/tts/TextToSpeech.java

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,9 @@ public class Engine {
440440
private final Context mContext;
441441
private Connection mServiceConnection;
442442
private OnInitListener mInitListener;
443+
// Written from an unspecified application thread, read from
444+
// a binder thread.
445+
private volatile OnUtteranceCompletedListener mUtteranceCompletedListener;
443446
private final Object mStartLock = new Object();
444447

445448
private String mRequestedEngine;
@@ -1071,20 +1074,8 @@ private void copyFloatParam(Bundle bundle, HashMap<String, String> params, Strin
10711074
* @return {@link #ERROR} or {@link #SUCCESS}.
10721075
*/
10731076
public int setOnUtteranceCompletedListener(final OnUtteranceCompletedListener listener) {
1074-
return runAction(new Action<Integer>() {
1075-
@Override
1076-
public Integer run(ITextToSpeechService service) throws RemoteException {
1077-
ITextToSpeechCallback.Stub callback = new ITextToSpeechCallback.Stub() {
1078-
public void utteranceCompleted(String utteranceId) {
1079-
if (listener != null) {
1080-
listener.onUtteranceCompleted(utteranceId);
1081-
}
1082-
}
1083-
};
1084-
service.setCallback(getPackageName(), callback);
1085-
return SUCCESS;
1086-
}
1087-
}, ERROR, "setOnUtteranceCompletedListener");
1077+
mUtteranceCompletedListener = listener;
1078+
return TextToSpeech.SUCCESS;
10881079
}
10891080

10901081
/**
@@ -1137,6 +1128,15 @@ public List<EngineInfo> getEngines() {
11371128

11381129
private class Connection implements ServiceConnection {
11391130
private ITextToSpeechService mService;
1131+
private final ITextToSpeechCallback.Stub mCallback = new ITextToSpeechCallback.Stub() {
1132+
@Override
1133+
public void utteranceCompleted(String utteranceId) {
1134+
OnUtteranceCompletedListener listener = mUtteranceCompletedListener;
1135+
if (listener != null) {
1136+
listener.onUtteranceCompleted(utteranceId);
1137+
}
1138+
}
1139+
};
11401140

11411141
public void onServiceConnected(ComponentName name, IBinder service) {
11421142
Log.i(TAG, "Connected to " + name);
@@ -1147,7 +1147,13 @@ public void onServiceConnected(ComponentName name, IBinder service) {
11471147
}
11481148
mServiceConnection = this;
11491149
mService = ITextToSpeechService.Stub.asInterface(service);
1150-
dispatchOnInit(SUCCESS);
1150+
try {
1151+
mService.setCallback(getPackageName(), mCallback);
1152+
dispatchOnInit(SUCCESS);
1153+
} catch (RemoteException re) {
1154+
Log.e(TAG, "Error connecting to service, setCallback() failed");
1155+
dispatchOnInit(ERROR);
1156+
}
11511157
}
11521158
}
11531159

0 commit comments

Comments
 (0)