package com.integralblue.callerid.inject;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;
import com.google.inject.Inject;
import android.app.Application;
import android.speech.tts.TextToSpeech;
public class TextToSpeechHelper {
@Inject Application application;
private class QueuedSpeak implements Runnable {
final String text;
final int queueMode;
final HashMap<String, String> params;
public QueuedSpeak(final String text, final int queueMode,
final HashMap<String, String> params) {
this.text = text;
this.queueMode = queueMode;
this.params = params;
}
public void run() {
textToSpeech.speak(text, queueMode, params);
}
}
TextToSpeech textToSpeech;
final Object startedLock = new Object();
boolean started = false;
final Queue<QueuedSpeak> queuedSpeaks = new LinkedList<TextToSpeechHelper.QueuedSpeak>();
public void speak(String text, int queueMode, HashMap<String, String> params){
synchronized (startedLock) {
if(started){
textToSpeech.speak(text, queueMode, params);
}else{
queuedSpeaks.add(new QueuedSpeak(text, queueMode, params));
if(textToSpeech==null){
textToSpeech = new TextToSpeech(application,new TextToSpeech.OnInitListener() {
public void onInit(int status) {
synchronized (startedLock) {
started = true;
for (QueuedSpeak queuedSpeak; (queuedSpeak = queuedSpeaks.poll()) != null;){
queuedSpeak.run();
}
}
}
});
}
}
}
}
public void stop(){
synchronized (startedLock) {
if(started){
textToSpeech.stop();
}
queuedSpeaks.clear();
}
}
public void shutdown(){
synchronized (startedLock) {
if(started){
started = false;
textToSpeech.shutdown();
}
textToSpeech = null;
queuedSpeaks.clear();
}
}
}