From 10eba427740652393e0311e7465ab25a491a4ea2 Mon Sep 17 00:00:00 2001 From: M66B Date: Wed, 28 Aug 2024 09:25:06 +0200 Subject: [PATCH] Handle TTS completed --- .../java/eu/faircode/email/EntityRule.java | 2 +- .../eu/faircode/email/FragmentMessages.java | 10 ++++- .../java/eu/faircode/email/TTSHelper.java | 39 ++++++++++++++++++- 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/EntityRule.java b/app/src/main/java/eu/faircode/email/EntityRule.java index 4c2bc50091..0772c91f83 100644 --- a/app/src/main/java/eu/faircode/email/EntityRule.java +++ b/app/src/main/java/eu/faircode/email/EntityRule.java @@ -1313,7 +1313,7 @@ public class EntityRule { sb.append(context.getString(R.string.title_rule_tts_content)) .append(' ').append(preview); - TTSHelper.speak(context, "rule:" + message.id, sb.toString(), message.language, false); + TTSHelper.speak(context, "rule:" + message.id, sb.toString(), message.language, false, null); } private boolean onActionSnooze(Context context, EntityMessage message, JSONObject jargs) throws JSONException { diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 97d522da84..ae874ab425 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -3639,7 +3639,7 @@ public class FragmentMessages extends FragmentBase iProperties.setValue("tts", message.id, !tts); if (tts) { - TTSHelper.speak(getContext(), "tts:" + message.id, "", message.language, true); + TTSHelper.speak(getContext(), "tts:" + message.id, "", message.language, true, null); return; } @@ -3684,7 +3684,13 @@ public class FragmentMessages extends FragmentBase @Override protected void onExecuted(Bundle args, String text) { if (text != null) - TTSHelper.speak(getContext(), "tts:" + message.id, text, message.language, true); + TTSHelper.speak(getContext(), "tts:" + message.id, text, message.language, true, + new Runnable() { + @Override + public void run() { + iProperties.setValue("tts", message.id, false); + } + }); } @Override diff --git a/app/src/main/java/eu/faircode/email/TTSHelper.java b/app/src/main/java/eu/faircode/email/TTSHelper.java index c4c59bb9bf..1011fc5647 100644 --- a/app/src/main/java/eu/faircode/email/TTSHelper.java +++ b/app/src/main/java/eu/faircode/email/TTSHelper.java @@ -21,17 +21,21 @@ package eu.faircode.email; import android.content.Context; import android.speech.tts.TextToSpeech; +import android.speech.tts.UtteranceProgressListener; import androidx.annotation.NonNull; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Locale; +import java.util.Map; public class TTSHelper { private static Integer status = null; private static TextToSpeech instance = null; - private static List queue = new ArrayList<>(); + private static final List queue = new ArrayList<>(); + private static final Map listeners = new HashMap<>(); private static final Object lock = new Object(); // https://developer.android.com/reference/android/speech/tts/TextToSpeech @@ -42,7 +46,8 @@ public class TTSHelper { @NonNull final String utteranceId, @NonNull final String text, final String language, - final boolean flush) { + final boolean flush, + final Runnable listener) { Locale locale = (language == null ? Locale.getDefault() : new Locale(language)); @@ -64,6 +69,9 @@ public class TTSHelper { }; synchronized (lock) { + if (listener != null) + listeners.put(utteranceId, listener); + if (status == null) { queue.add(speak); if (instance == null) @@ -72,6 +80,33 @@ public class TTSHelper { instance = new TextToSpeech(context, new TextToSpeech.OnInitListener() { @Override public void onInit(int initStatus) { + instance.setOnUtteranceProgressListener(new UtteranceProgressListener() { + @Override + public void onStart(String utteranceId) { + Log.i("TTS start=" + utteranceId); + } + + @Override + public void onDone(String utteranceId) { + Log.i("TTS done=" + utteranceId); + report(utteranceId); + } + + @Override + public void onError(String utteranceId) { + Log.i("TTS error=" + utteranceId); + report(utteranceId); + } + + private void report(String utteranceId) { + synchronized (lock) { + Runnable listener = listeners.remove(utteranceId); + if (listener != null) + ApplicationEx.getMainHandler().post(listener); + } + } + }); + synchronized (lock) { status = initStatus; boolean ok = (status == TextToSpeech.SUCCESS);