Refactor unused preferences

This commit is contained in:
2020-07-03 11:31:03 +02:00
parent cf4467e437
commit 864dd3bf00
5 changed files with 12 additions and 234 deletions

View File

@@ -3,17 +3,12 @@ package com.bartlomiejpluta.ttsserver.core.tts.engine
import android.content.Context import android.content.Context
import android.content.SharedPreferences import android.content.SharedPreferences
import android.media.AudioAttributes import android.media.AudioAttributes
import android.media.MediaPlayer
import android.net.Uri
import android.speech.tts.TextToSpeech import android.speech.tts.TextToSpeech
import cafe.adriel.androidaudioconverter.model.AudioFormat 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.listener.TTSProcessListener
import com.bartlomiejpluta.ttsserver.core.tts.status.TTSStatus import com.bartlomiejpluta.ttsserver.core.tts.status.TTSStatus
import com.bartlomiejpluta.ttsserver.core.tts.status.TTSStatusHolder import com.bartlomiejpluta.ttsserver.core.tts.status.TTSStatusHolder
import com.bartlomiejpluta.ttsserver.core.util.AudioConverter import com.bartlomiejpluta.ttsserver.core.util.AudioConverter
import com.bartlomiejpluta.ttsserver.ui.preference.key.PreferenceKey
import java.io.File import java.io.File
import java.security.MessageDigest import java.security.MessageDigest
import java.util.* import java.util.*
@@ -75,29 +70,10 @@ class TTSEngine(
tts.setOnUtteranceProgressListener(listener) tts.setOnUtteranceProgressListener(listener)
tts.language = language tts.language = language
playGong()
tts.speak(text, TextToSpeech.QUEUE_ADD, null, uuid) tts.speak(text, TextToSpeech.QUEUE_ADD, null, uuid)
listener.await() 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 { companion object {
private val gongAudioAttributes = AudioAttributes.Builder() private val gongAudioAttributes = AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)

View File

@@ -1,6 +1,5 @@
package com.bartlomiejpluta.ttsserver.ui.preference.component package com.bartlomiejpluta.ttsserver.ui.preference.component
import android.app.TimePickerDialog
import android.content.BroadcastReceiver import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
@@ -13,26 +12,18 @@ import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import androidx.preference.SwitchPreference import androidx.preference.SwitchPreference
import com.bartlomiejpluta.R import com.bartlomiejpluta.R
import com.bartlomiejpluta.ttsserver.core.web.mime.MimeType
import com.bartlomiejpluta.ttsserver.service.foreground.ForegroundService import com.bartlomiejpluta.ttsserver.service.foreground.ForegroundService
import com.bartlomiejpluta.ttsserver.service.state.ServiceState import com.bartlomiejpluta.ttsserver.service.state.ServiceState
import com.bartlomiejpluta.ttsserver.ui.main.MainActivity import com.bartlomiejpluta.ttsserver.ui.main.MainActivity
import com.bartlomiejpluta.ttsserver.ui.preference.custom.IntEditTextPreference import com.bartlomiejpluta.ttsserver.ui.preference.custom.IntEditTextPreference
import com.bartlomiejpluta.ttsserver.ui.preference.key.PreferenceKey import com.bartlomiejpluta.ttsserver.ui.preference.key.PreferenceKey
import com.bartlomiejpluta.ttsserver.ui.preference.model.TimeRange
class PreferencesFragment : PreferenceFragmentCompat() { class PreferencesFragment : PreferenceFragmentCompat() {
private lateinit var portPreference: IntEditTextPreference 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 httpDebugPreference: SwitchPreference
private lateinit var enableGongPreference: SwitchPreference private lateinit var clearCachePreference: Preference
private lateinit var ttsEnginePreference: 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() { private val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) { override fun onReceive(context: Context?, intent: Intent?) {
@@ -44,8 +35,6 @@ class PreferencesFragment : PreferenceFragmentCompat() {
private fun updateViewAccordingToServiceState(state: ServiceState) { private fun updateViewAccordingToServiceState(state: ServiceState) {
portPreference.isEnabled = state == ServiceState.STOPPED portPreference.isEnabled = state == ServiceState.STOPPED
sonosEndpointPreference.isEnabled = state == ServiceState.STOPPED
enableGongPreference.isEnabled = state == ServiceState.STOPPED
} }
override fun onResume() { override fun onResume() {
@@ -68,102 +57,17 @@ class PreferencesFragment : PreferenceFragmentCompat() {
portPreference = findPreference(PreferenceKey.PORT)!! portPreference = findPreference(PreferenceKey.PORT)!!
portPreference.setOnBindEditTextListener { it.inputType = InputType.TYPE_CLASS_NUMBER } portPreference.setOnBindEditTextListener { it.inputType = InputType.TYPE_CLASS_NUMBER }
httpDebugPreference = findPreference(PreferenceKey.ENABLE_HTTP_DEBUG)!! 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 = findPreference(PreferenceKey.TTS)!!
ttsEnginePreference.setOnPreferenceClickListener { ttsEnginePreference.setOnPreferenceClickListener {
startActivity(Intent(ANDROID_TTS_SETTINGS)) startActivity(Intent(ANDROID_TTS_SETTINGS))
true true
} }
enableSpeakersSilenceScheduler = findPreference(PreferenceKey.ENABLE_SPEAKERS_SILENCE_SCHEDULER)!! clearCachePreference = findPreference(PreferenceKey.INVALIDATE_CACHE)!!
enableSpeakersSilenceScheduler.setOnPreferenceClickListener { preference -> clearCachePreference.setOnPreferenceClickListener {
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 {
context?.cacheDir?.listFiles()?.forEach { it.delete() } context?.cacheDir?.listFiles()?.forEach { it.delete() }
Toast.makeText( Toast.makeText(
context, context,
getString(R.string.preference_invalidate_sonos_cache_toast), getString(R.string.preference_invalidate_cache_toast),
Toast.LENGTH_SHORT Toast.LENGTH_SHORT
).show() ).show()
true true
@@ -171,38 +75,8 @@ class PreferencesFragment : PreferenceFragmentCompat() {
updateViewAccordingToServiceState(ForegroundService.state) 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 { companion object {
private const val ANDROID_TTS_SETTINGS = "com.android.settings.TTS_SETTINGS" 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"
} }
} }

View File

@@ -4,15 +4,6 @@ package com.bartlomiejpluta.ttsserver.ui.preference.key
object PreferenceKey { object PreferenceKey {
const val PORT = "preference_port" const val PORT = "preference_port"
const val ENABLE_HTTP_DEBUG = "preference_http_debug" const val ENABLE_HTTP_DEBUG = "preference_http_debug"
const val ENABLE_SAY_ENDPOINT = "preference_enable_say_endpoint" const val INVALIDATE_CACHE = "preference_invalidate_cache"
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 TTS = "preference_tts" 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"
} }

View File

@@ -17,31 +17,15 @@
<string name="title_activity_preferences">Settings</string> <string name="title_activity_preferences">Settings</string>
<string name="preference_port_summary">The desired port on which HTTP server is intended to listening</string> <string name="preference_port_summary">The desired port on which HTTP server is intended to listening</string>
<string name="preference_port_title">Server port</string> <string name="preference_port_title">Server port</string>
<string name="preference_enable_say_endpoint_summary">Allow HTTP clients to use /say endpoint which enables them to say message using builtin speakers or external ones connected to the device</string>
<string name="preference_enable_say_endpoint_title">Enable /say endpoint</string>
<string name="preference_enable_file_endpoints_summary">Allow HTTP clients to use file endpoints (/wav, /mp3, /flac etc.) which enables them to retrieve TTS message as audio file</string>
<string name="preference_enable_file_endpoints_title">Enable file endpoints</string>
<string name="preference_enable_sonos_endpoint_summary">Allow HTTP clients to use /sonos endpoint which enables them to send TTS messages directly to Sonos devices</string>
<string name="preference_enable_sonos_endpoint_title">Enable /sonos endpoint</string>
<string name="preference_http_debug_summary">Attach the stacktrace to each error HTTP response if available</string> <string name="preference_http_debug_summary">Attach the stacktrace to each error HTTP response if available</string>
<string name="preference_http_debug_title">Enable HTTP debugging</string> <string name="preference_http_debug_title">Enable HTTP debugging</string>
<string name="preference_gong_picker_prompt">Choose a gong file</string>
<string name="preference_enable_gong_summary">Play a signal gong before the announcement</string>
<string name="preference_enable_gong_title">Enable gong</string>
<string name="preference_tts_summary">Go to platform\'s TTS engine settings and adjust its parameters</string> <string name="preference_tts_summary">Go to platform\'s TTS engine settings and adjust its parameters</string>
<string name="preference_tts_title">TTS engine settings</string> <string name="preference_tts_title">TTS engine settings</string>
<string name="preference_enable_speakers_silence_scheduler_summary">Determine a time range when /say endpoint should be disabled</string> <string name="preference_invalidate_cache_summary">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.</string>
<string name="preference_enable_speakers_silence_scheduler_title">Enable silence scheduler</string> <string name="preference_invalidate_cache_title">Invalidate cache</string>
<string name="preference_enable_sonos_silence_scheduler_summary">Determine a time range when /sonos endpoint should be disabled</string>
<string name="preference_enable_sonos_silence_scheduler_title">Enable silence scheduler</string>
<string name="preference_invalidate_sonos_cache_summary">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.</string>
<string name="preference_invalidate_sonos_cache_title">Invalidate Sonos cache</string>
<string name="preference_category_server">Server</string> <string name="preference_category_server">Server</string>
<string name="preference_category_features">Features</string>
<string name="preference_category_tts">TTS engine</string> <string name="preference_category_tts">TTS engine</string>
<string name="preference_category_speakers">Speakers</string> <string name="preference_invalidate_cache_toast">Cache has been invalidated</string>
<string name="preference_category_sonos">Sonos</string>
<string name="preference_invalidate_sonos_cache_toast">Sonos cache has been invalidated</string>
<string name="menu_settings">Settings</string> <string name="menu_settings">Settings</string>
<string name="menu_help">Help</string> <string name="menu_help">Help</string>

View File

@@ -15,38 +15,14 @@
android:summary="@string/preference_http_debug_summary" android:summary="@string/preference_http_debug_summary"
android:title="@string/preference_http_debug_title" android:title="@string/preference_http_debug_title"
app:iconSpaceReserved="false" /> app:iconSpaceReserved="false" />
</PreferenceCategory> <Preference
android:key="preference_invalidate_cache"
<PreferenceCategory android:title="@string/preference_category_features" app:iconSpaceReserved="false"> android:summary="@string/preference_invalidate_cache_summary"
<SwitchPreference app:title="@string/preference_invalidate_cache_title"
android:defaultValue="true"
android:key="preference_enable_say_endpoint"
android:summary="@string/preference_enable_say_endpoint_summary"
android:title="@string/preference_enable_say_endpoint_title"
app:iconSpaceReserved="false" />
<SwitchPreference
android:defaultValue="true"
android:key="preference_enable_file_endpoints"
android:summary="@string/preference_enable_file_endpoints_summary"
android:title="@string/preference_enable_file_endpoints_title"
app:iconSpaceReserved="false" />
<SwitchPreference
android:defaultValue="true"
android:key="preference_enable_sonos_endpoint"
android:summary="@string/preference_enable_sonos_endpoint_summary"
android:title="@string/preference_enable_sonos_endpoint_title"
app:iconSpaceReserved="false" /> app:iconSpaceReserved="false" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory android:title="@string/preference_category_tts" app:iconSpaceReserved="false"> <PreferenceCategory android:title="@string/preference_category_tts" app:iconSpaceReserved="false">
<SwitchPreference
android:defaultValue="false"
android:key="preference_enable_gong"
android:summary="@string/preference_enable_gong_summary"
android:title="@string/preference_enable_gong_title"
app:iconSpaceReserved="false" />
<Preference <Preference
android:key="preference_tts" android:key="preference_tts"
android:summary="@string/preference_tts_summary" android:summary="@string/preference_tts_summary"
@@ -54,27 +30,4 @@
app:iconSpaceReserved="false" /> app:iconSpaceReserved="false" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory android:title="@string/preference_category_speakers" app:iconSpaceReserved="false">
<SwitchPreference
android:key="preference_enable_speakers_silence_scheduler"
android:summary="@string/preference_enable_speakers_silence_scheduler_summary"
app:title="@string/preference_enable_speakers_silence_scheduler_title"
app:iconSpaceReserved="false" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/preference_category_sonos" app:iconSpaceReserved="false">
<SwitchPreference
android:key="preference_enable_sonos_silence_scheduler"
android:summary="@string/preference_enable_sonos_silence_scheduler_summary"
app:title="@string/preference_enable_sonos_silence_scheduler_title"
app:iconSpaceReserved="false" />
<Preference
android:key="preference_invalidate_sonos_cache"
android:summary="@string/preference_invalidate_sonos_cache_summary"
app:title="@string/preference_invalidate_sonos_cache_title"
app:iconSpaceReserved="false" />
</PreferenceCategory>
</androidx.preference.PreferenceScreen> </androidx.preference.PreferenceScreen>