@@ -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