From 71485cafedca15e5ae943153ae5daed17ab06702 Mon Sep 17 00:00:00 2001 From: rosenberg_ptr Date: Wed, 2 Jul 2025 13:22:42 +0200 Subject: [PATCH] Fix tts ANR --- .../tundralabs/fluttertts/FlutterTtsPlugin.kt | 55 +++++++++---------- 1 file changed, 25 insertions(+), 30 deletions(-) diff --git a/android/src/main/kotlin/com/tundralabs/fluttertts/FlutterTtsPlugin.kt b/android/src/main/kotlin/com/tundralabs/fluttertts/FlutterTtsPlugin.kt index 36fd142..bc63103 100644 --- a/android/src/main/kotlin/com/tundralabs/fluttertts/FlutterTtsPlugin.kt +++ b/android/src/main/kotlin/com/tundralabs/fluttertts/FlutterTtsPlugin.kt @@ -217,28 +217,25 @@ class FlutterTtsPlugin : MethodCallHandler, FlutterPlugin { private val onInitListenerWithCallback: TextToSpeech.OnInitListener = TextToSpeech.OnInitListener { status -> // Handle pending method calls (sent while TTS was initializing) - synchronized(this@FlutterTtsPlugin) { + val toRun = synchronized(this@FlutterTtsPlugin) { ttsStatus = status - for (call in pendingMethodCalls) { - call.run() - } - pendingMethodCalls.clear() + ArrayList(pendingMethodCalls).also { pendingMethodCalls.clear() } } + toRun.forEach { it.run() } if (status == TextToSpeech.SUCCESS) { tts!!.setOnUtteranceProgressListener(utteranceProgressListener) - try { - val locale: Locale = tts!!.defaultVoice.locale - if (isLanguageAvailable(locale)) { - tts!!.language = locale - } - } catch (e: NullPointerException) { - Log.e(tag, "getDefaultLocale: " + e.message) - } catch (e: IllegalArgumentException) { - Log.e(tag, "getDefaultLocale: " + e.message) - } - engineResult!!.success(1) + Thread { + try { + val locale = tts!!.defaultVoice.locale + if (isLanguageAvailable(locale)) { + tts!!.setLanguage(locale) + } + } catch (e: Exception) { + Log.e(tag, "getDefaultLocale: " + e.message) + } + }.start() } else { engineResult!!.error("TtsError","Failed to initialize TextToSpeech with status: $status", null) } @@ -248,26 +245,24 @@ class FlutterTtsPlugin : MethodCallHandler, FlutterPlugin { private val onInitListenerWithoutCallback: TextToSpeech.OnInitListener = TextToSpeech.OnInitListener { status -> // Handle pending method calls (sent while TTS was initializing) - synchronized(this@FlutterTtsPlugin) { + val toRun = synchronized(this@FlutterTtsPlugin) { ttsStatus = status - for (call in pendingMethodCalls) { - call.run() - } - pendingMethodCalls.clear() + ArrayList(pendingMethodCalls).also { pendingMethodCalls.clear() } } + toRun.forEach { it.run() } if (status == TextToSpeech.SUCCESS) { tts!!.setOnUtteranceProgressListener(utteranceProgressListener) - try { - val locale: Locale = tts!!.defaultVoice.locale - if (isLanguageAvailable(locale)) { - tts!!.language = locale + Thread { + try { + val locale = tts!!.defaultVoice.locale + if (isLanguageAvailable(locale)) { + tts!!.setLanguage(locale) + } + } catch (e: Exception) { + Log.e(tag, "getDefaultLocale: " + e.message) } - } catch (e: NullPointerException) { - Log.e(tag, "getDefaultLocale: " + e.message) - } catch (e: IllegalArgumentException) { - Log.e(tag, "getDefaultLocale: " + e.message) - } + }.start() } else { Log.e(tag, "Failed to initialize TextToSpeech with status: $status") }