diff --git a/app/src/main/java/com/bartlomiejpluta/ttsserver/core/tts/engine/TTSEngine.kt b/app/src/main/java/com/bartlomiejpluta/ttsserver/core/tts/engine/TTSEngine.kt index d7c3634..680f13c 100644 --- a/app/src/main/java/com/bartlomiejpluta/ttsserver/core/tts/engine/TTSEngine.kt +++ b/app/src/main/java/com/bartlomiejpluta/ttsserver/core/tts/engine/TTSEngine.kt @@ -3,17 +3,12 @@ package com.bartlomiejpluta.ttsserver.core.tts.engine import android.content.Context import android.content.SharedPreferences import android.media.AudioAttributes -import android.media.MediaPlayer -import android.net.Uri import android.speech.tts.TextToSpeech import cafe.adriel.androidaudioconverter.model.AudioFormat -import com.bartlomiejpluta.ttsserver.core.tts.exception.TTSException -import com.bartlomiejpluta.ttsserver.core.tts.listener.GongListener import com.bartlomiejpluta.ttsserver.core.tts.listener.TTSProcessListener import com.bartlomiejpluta.ttsserver.core.tts.status.TTSStatus import com.bartlomiejpluta.ttsserver.core.tts.status.TTSStatusHolder import com.bartlomiejpluta.ttsserver.core.util.AudioConverter -import com.bartlomiejpluta.ttsserver.ui.preference.key.PreferenceKey import java.io.File import java.security.MessageDigest import java.util.* @@ -75,29 +70,10 @@ class TTSEngine( tts.setOnUtteranceProgressListener(listener) tts.language = language - playGong() tts.speak(text, TextToSpeech.QUEUE_ADD, null, uuid) listener.await() } - private fun playGong() { - if (!preferences.getBoolean(PreferenceKey.ENABLE_GONG, false)) { - return - } - - val listener = GongListener() - val uri = preferences.getString(PreferenceKey.GONG, null) ?: throw TTSException() - - MediaPlayer().apply { - setOnCompletionListener(listener) - setAudioAttributes(gongAudioAttributes) - setDataSource(context, Uri.parse(uri)) - prepare() - start() - listener.await() - } - } - companion object { private val gongAudioAttributes = AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) diff --git a/app/src/main/java/com/bartlomiejpluta/ttsserver/ui/preference/component/PreferencesFragment.kt b/app/src/main/java/com/bartlomiejpluta/ttsserver/ui/preference/component/PreferencesFragment.kt index a0467de..aae94c5 100644 --- a/app/src/main/java/com/bartlomiejpluta/ttsserver/ui/preference/component/PreferencesFragment.kt +++ b/app/src/main/java/com/bartlomiejpluta/ttsserver/ui/preference/component/PreferencesFragment.kt @@ -1,6 +1,5 @@ package com.bartlomiejpluta.ttsserver.ui.preference.component -import android.app.TimePickerDialog import android.content.BroadcastReceiver import android.content.Context import android.content.Intent @@ -13,26 +12,18 @@ import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import androidx.preference.SwitchPreference import com.bartlomiejpluta.R -import com.bartlomiejpluta.ttsserver.core.web.mime.MimeType import com.bartlomiejpluta.ttsserver.service.foreground.ForegroundService import com.bartlomiejpluta.ttsserver.service.state.ServiceState import com.bartlomiejpluta.ttsserver.ui.main.MainActivity import com.bartlomiejpluta.ttsserver.ui.preference.custom.IntEditTextPreference import com.bartlomiejpluta.ttsserver.ui.preference.key.PreferenceKey -import com.bartlomiejpluta.ttsserver.ui.preference.model.TimeRange class PreferencesFragment : PreferenceFragmentCompat() { private lateinit var portPreference: IntEditTextPreference - private lateinit var sayEndpointPreference: SwitchPreference - private lateinit var fileEndpointPreference: SwitchPreference - private lateinit var sonosEndpointPreference: SwitchPreference private lateinit var httpDebugPreference: SwitchPreference - private lateinit var enableGongPreference: SwitchPreference + private lateinit var clearCachePreference: Preference private lateinit var ttsEnginePreference: Preference - private lateinit var enableSonosSilenceScheduler: SwitchPreference - private lateinit var enableSpeakersSilenceScheduler: SwitchPreference - private lateinit var clearSonosCachePreference: Preference private val receiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { @@ -44,8 +35,6 @@ class PreferencesFragment : PreferenceFragmentCompat() { private fun updateViewAccordingToServiceState(state: ServiceState) { portPreference.isEnabled = state == ServiceState.STOPPED - sonosEndpointPreference.isEnabled = state == ServiceState.STOPPED - enableGongPreference.isEnabled = state == ServiceState.STOPPED } override fun onResume() { @@ -68,102 +57,17 @@ class PreferencesFragment : PreferenceFragmentCompat() { portPreference = findPreference(PreferenceKey.PORT)!! portPreference.setOnBindEditTextListener { it.inputType = InputType.TYPE_CLASS_NUMBER } httpDebugPreference = findPreference(PreferenceKey.ENABLE_HTTP_DEBUG)!! - sayEndpointPreference = findPreference(PreferenceKey.ENABLE_SAY_ENDPOINT)!! - fileEndpointPreference = findPreference(PreferenceKey.ENABLE_FILE_ENDPOINTS)!! - sonosEndpointPreference = findPreference(PreferenceKey.ENABLE_SONOS_ENDPOINT)!! - enableGongPreference = findPreference(PreferenceKey.ENABLE_GONG)!! - enableGongPreference.setOnPreferenceClickListener { preference -> - openFilePicker(preference) - - true - } ttsEnginePreference = findPreference(PreferenceKey.TTS)!! ttsEnginePreference.setOnPreferenceClickListener { startActivity(Intent(ANDROID_TTS_SETTINGS)) true } - enableSpeakersSilenceScheduler = findPreference(PreferenceKey.ENABLE_SPEAKERS_SILENCE_SCHEDULER)!! - enableSpeakersSilenceScheduler.setOnPreferenceClickListener { preference -> - if(!enableSpeakersSilenceScheduler.isChecked) { - return@setOnPreferenceClickListener true - } - enableSpeakersSilenceScheduler.isChecked = false - - val schedule = preference - .sharedPreferences - .getString( - PreferenceKey.SPEAKERS_SILENCE_SCHEDULE, - DEFAULT_SCHEDULE - )!! - .let { - TimeRange.parse( - it - ) - } - - TimePickerDialog(context, { _, newBeginHour, newBeginMinute -> - TimePickerDialog(context, { _, newEndHour, newEndMinute -> - preference.sharedPreferences.edit()?.let { editor -> - val newSchedule = - TimeRange( - newBeginHour, - newBeginMinute, - newEndHour, - newEndMinute - ) - editor.putString(PreferenceKey.SPEAKERS_SILENCE_SCHEDULE, newSchedule.toString()) - editor.apply() - enableSpeakersSilenceScheduler.isChecked = true - } - }, schedule.endHour, schedule.endMinute, true).show() - }, schedule.beginHour, schedule.beginMinute, true).show() - - true - } - enableSonosSilenceScheduler = findPreference(PreferenceKey.ENABLE_SONOS_SILENCE_SCHEDULER)!! - enableSonosSilenceScheduler.setOnPreferenceClickListener { preference -> - if(!enableSonosSilenceScheduler.isChecked) { - return@setOnPreferenceClickListener true - } - enableSonosSilenceScheduler.isChecked = false - - val schedule = preference - .sharedPreferences - .getString( - PreferenceKey.SONOS_SILENCE_SCHEDULE, - DEFAULT_SCHEDULE - )!! - .let { - TimeRange.parse( - it - ) - } - - TimePickerDialog(context, { _, newBeginHour, newBeginMinute -> - TimePickerDialog(context, { _, newEndHour, newEndMinute -> - preference.sharedPreferences.edit()?.let { editor -> - val newSchedule = - TimeRange( - newBeginHour, - newBeginMinute, - newEndHour, - newEndMinute - ) - editor.putString(PreferenceKey.SONOS_SILENCE_SCHEDULE, newSchedule.toString()) - editor.apply() - enableSonosSilenceScheduler.isChecked = true - } - }, schedule.endHour, schedule.endMinute, true).show() - }, schedule.beginHour, schedule.beginMinute, true).show() - - true - } - clearSonosCachePreference = findPreference(PreferenceKey.INVALIDATE_SONOS_CACHE)!! - clearSonosCachePreference.setOnPreferenceClickListener { + clearCachePreference = findPreference(PreferenceKey.INVALIDATE_CACHE)!! + clearCachePreference.setOnPreferenceClickListener { context?.cacheDir?.listFiles()?.forEach { it.delete() } Toast.makeText( context, - getString(R.string.preference_invalidate_sonos_cache_toast), + getString(R.string.preference_invalidate_cache_toast), Toast.LENGTH_SHORT ).show() true @@ -171,38 +75,8 @@ class PreferencesFragment : PreferenceFragmentCompat() { updateViewAccordingToServiceState(ForegroundService.state) } - private fun openFilePicker(preference: Preference?) { - if ((preference as SwitchPreference).isChecked) { - val intent = Intent(Intent.ACTION_OPEN_DOCUMENT) - .apply { type = MimeType.WAV.mimeType } - .let { Intent.createChooser(it, getString(R.string.preference_gong_picker_prompt)) } - - startActivityForResult(intent, - PICKFILE_RESULT_CODE - ) - } - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - when (requestCode) { - PICKFILE_RESULT_CODE -> updateGongPathPreference(resultCode, data) - } - } - - private fun updateGongPathPreference(resultCode: Int, data: Intent?) { - enableGongPreference.isChecked = resultCode == -1 - - if (resultCode == -1) { - enableGongPreference.sharedPreferences?.edit()?.let { editor -> - editor.putString(PreferenceKey.GONG, data?.data?.toString()) - editor.commit() - } - } - } companion object { private const val ANDROID_TTS_SETTINGS = "com.android.settings.TTS_SETTINGS" - private const val PICKFILE_RESULT_CODE = 1 - private val DEFAULT_SCHEDULE = "22:00-07:00" } } \ No newline at end of file diff --git a/app/src/main/java/com/bartlomiejpluta/ttsserver/ui/preference/key/Preference.kt b/app/src/main/java/com/bartlomiejpluta/ttsserver/ui/preference/key/Preference.kt index d3c9b7e..96107b5 100644 --- a/app/src/main/java/com/bartlomiejpluta/ttsserver/ui/preference/key/Preference.kt +++ b/app/src/main/java/com/bartlomiejpluta/ttsserver/ui/preference/key/Preference.kt @@ -4,15 +4,6 @@ package com.bartlomiejpluta.ttsserver.ui.preference.key object PreferenceKey { const val PORT = "preference_port" const val ENABLE_HTTP_DEBUG = "preference_http_debug" - const val ENABLE_SAY_ENDPOINT = "preference_enable_say_endpoint" - const val ENABLE_FILE_ENDPOINTS = "preference_enable_file_endpoints" - const val ENABLE_SONOS_ENDPOINT = "preference_enable_sonos_endpoint" - const val ENABLE_GONG = "preference_enable_gong" - const val GONG = "preference_gong" + const val INVALIDATE_CACHE = "preference_invalidate_cache" const val TTS = "preference_tts" - const val ENABLE_SPEAKERS_SILENCE_SCHEDULER = "preference_enable_speakers_silence_scheduler" - const val SPEAKERS_SILENCE_SCHEDULE = "preference_speakers_silence_schedule" - const val ENABLE_SONOS_SILENCE_SCHEDULER = "preference_enable_sonos_silence_scheduler" - const val SONOS_SILENCE_SCHEDULE = "preference_sonos_silence_schedule" - const val INVALIDATE_SONOS_CACHE = "preference_invalidate_sonos_cache" } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c6032cb..bd1de1c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -17,31 +17,15 @@ Settings The desired port on which HTTP server is intended to listening Server port - Allow HTTP clients to use /say endpoint which enables them to say message using builtin speakers or external ones connected to the device - Enable /say endpoint - Allow HTTP clients to use file endpoints (/wav, /mp3, /flac etc.) which enables them to retrieve TTS message as audio file - Enable file endpoints - Allow HTTP clients to use /sonos endpoint which enables them to send TTS messages directly to Sonos devices - Enable /sonos endpoint Attach the stacktrace to each error HTTP response if available Enable HTTP debugging - Choose a gong file - Play a signal gong before the announcement - Enable gong Go to platform\'s TTS engine settings and adjust its parameters TTS engine settings - Determine a time range when /say endpoint should be disabled - Enable silence scheduler - Determine a time range when /sonos endpoint should be disabled - Enable silence scheduler - Clear application cache directory from already generated Sonos TTS data for given sentences. You typically want to do it when you change the TTS engine\'s voice settings. - Invalidate Sonos cache + Clear application cache directory from already generated TTS data for given sentences. You typically want to do it when you change the TTS engine\'s voice settings. + Invalidate cache Server - Features TTS engine - Speakers - Sonos - Sonos cache has been invalidated + Cache has been invalidated Settings Help diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 0fab131..f9765d6 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -15,38 +15,14 @@ android:summary="@string/preference_http_debug_summary" android:title="@string/preference_http_debug_title" app:iconSpaceReserved="false" /> - - - - - - - - - - - - - - - - - - - - \ No newline at end of file