Allow notifications to do TTS (#1011)

* Allow TTS for notifications

* Finalize approach, error and blank title handling

* Use utterance progress indicator to properly shut down TTS engine
This commit is contained in:
Daniel Shokouhi 2020-10-06 17:14:58 -07:00 committed by GitHub
parent f40c95adcd
commit a59ec710c6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 42 additions and 0 deletions

View file

@ -9,8 +9,11 @@ import android.graphics.BitmapFactory
import android.graphics.Color
import android.media.RingtoneManager
import android.os.Build
import android.speech.tts.TextToSpeech
import android.speech.tts.UtteranceProgressListener
import android.text.Spanned
import android.util.Log
import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
@ -59,6 +62,7 @@ class MessagingService : FirebaseMessagingService() {
const val REQUEST_LOCATION_UPDATE = "request_location_update"
const val CLEAR_NOTIFICATION = "clear_notification"
const val REMOVE_CHANNEL = "remove_channel"
const val TTS = "TTS"
}
@Inject
@ -100,6 +104,10 @@ class MessagingService : FirebaseMessagingService() {
Log.d(TAG, "Removing Notification channel ${it["tag"]}")
removeNotificationChannel(it["channel"]!!)
}
it[MESSAGE] == TTS -> {
Log.d(TAG, "Sending notification title to TTS")
speakNotification(it[TITLE])
}
else -> mainScope.launch {
Log.d(TAG, "Creating notification with following data: $it")
sendNotification(it)
@ -134,6 +142,38 @@ class MessagingService : FirebaseMessagingService() {
}
}
private fun speakNotification(title: String?) {
var textToSpeech: TextToSpeech? = null
var tts = title
if (tts.isNullOrEmpty())
tts = getString(R.string.tts_no_title)
textToSpeech = TextToSpeech(applicationContext
) {
if (it == TextToSpeech.SUCCESS) {
val listener = object : UtteranceProgressListener() {
override fun onStart(p0: String?) {
// No op
}
override fun onDone(p0: String?) {
textToSpeech?.stop()
textToSpeech?.shutdown()
}
override fun onError(p0: String?) {
textToSpeech?.stop()
textToSpeech?.shutdown()
}
}
textToSpeech?.setOnUtteranceProgressListener(listener)
textToSpeech?.speak(tts, TextToSpeech.QUEUE_ADD, null, "")
Log.d(TAG, "speaking notification")
} else {
Toast.makeText(applicationContext, getString(R.string.tts_error, tts), Toast.LENGTH_LONG).show()
}
}
}
/**
* Create and show a simple notification containing the received FCM message.
*

View file

@ -95,6 +95,8 @@ to your home internet.</string>
<string name="sensors_with_settings">The following sensors offer custom settings: %1$s</string>
<string name="enabled_summary">When enabled values will be sent to Home Assistant</string>
<string name="enabled_title">Enabled</string>
<string name="tts_error">Unable to process notification "%1$s" as text to speech.</string>
<string name="tts_no_title">Please set a title for text to speech to process</string>
<string name="entity_attribute_checkbox">Append Attribute Value</string>
<string name="error_auth_revoked">It appears that your authorization was revoked, please reconnect to Home Assistant.</string>
<string name="error_connection_failed">Unable to connect to Home Assistant.</string>