From 222fc3b882d83421dd17932b52d7942a479a961d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Sun, 10 May 2020 16:10:31 +0200 Subject: [PATCH] Extract constants --- app/src/main/java/io/bartek/MainActivity.kt | 8 +++-- .../java/io/bartek/preference/Preference.kt | 9 +++++ .../bartek/preference/PreferencesFragment.kt | 20 +++++++---- .../io/bartek/service/ForegroundService.kt | 12 +++---- app/src/main/java/io/bartek/web/WebServer.kt | 33 ++++++++++++------- 5 files changed, 55 insertions(+), 27 deletions(-) create mode 100644 app/src/main/java/io/bartek/preference/Preference.kt diff --git a/app/src/main/java/io/bartek/MainActivity.kt b/app/src/main/java/io/bartek/MainActivity.kt index 98ab65e..1d2535e 100644 --- a/app/src/main/java/io/bartek/MainActivity.kt +++ b/app/src/main/java/io/bartek/MainActivity.kt @@ -27,7 +27,9 @@ class MainActivity : AppCompatActivity() { override fun onReceive(context: Context?, intent: Intent?) { intent?.let { updateViewAccordingToServiceState( - ServiceState.valueOf(it.getStringExtra("STATE") ?: "STOPPED") + ServiceState.valueOf( + it.getStringExtra(ForegroundService.STATE) ?: ServiceState.STOPPED.name + ) ) } } @@ -39,7 +41,7 @@ class MainActivity : AppCompatActivity() { } override fun onOptionsItemSelected(item: MenuItem): Boolean { - when(item.itemId) { + when (item.itemId) { R.id.open_preferences -> startActivity(Intent(this, PreferencesActivity::class.java)) R.id.open_help -> startActivity(Intent(this, HelpActivity::class.java)) } @@ -72,7 +74,7 @@ class MainActivity : AppCompatActivity() { super.onResume() LocalBroadcastManager .getInstance(this) - .registerReceiver(receiver, IntentFilter("io.bartek.web.server.CHANGE_STATE")) + .registerReceiver(receiver, IntentFilter(ForegroundService.CHANGE_STATE)) updateViewAccordingToServiceState(ForegroundService.state) } diff --git a/app/src/main/java/io/bartek/preference/Preference.kt b/app/src/main/java/io/bartek/preference/Preference.kt new file mode 100644 index 0000000..6a22bd8 --- /dev/null +++ b/app/src/main/java/io/bartek/preference/Preference.kt @@ -0,0 +1,9 @@ +package io.bartek.preference + + +object PreferenceKey { + const val PORT = "preference_port" + const val ENABLE_SAY_ENDPOINT = "preference_enable_say_endpoint" + const val ENABLE_WAVE_ENDPOINT = "preference_enable_wave_endpoint" + const val TTS = "preference_tts" +} \ No newline at end of file diff --git a/app/src/main/java/io/bartek/preference/PreferencesFragment.kt b/app/src/main/java/io/bartek/preference/PreferencesFragment.kt index ab41cb2..6d6f9d1 100644 --- a/app/src/main/java/io/bartek/preference/PreferencesFragment.kt +++ b/app/src/main/java/io/bartek/preference/PreferencesFragment.kt @@ -24,7 +24,9 @@ class PreferencesFragment : PreferenceFragmentCompat() { override fun onReceive(context: Context?, intent: Intent?) { intent?.let { updateViewAccordingToServiceState( - ServiceState.valueOf(it.getStringExtra("STATE") ?: "STOPPED") + ServiceState.valueOf( + it.getStringExtra(ForegroundService.STATE) ?: ServiceState.STOPPED.name + ) ) } } @@ -38,7 +40,7 @@ class PreferencesFragment : PreferenceFragmentCompat() { super.onResume() LocalBroadcastManager .getInstance(context!!) - .registerReceiver(receiver, IntentFilter("io.bartek.web.server.CHANGE_STATE")) + .registerReceiver(receiver, IntentFilter(ForegroundService.CHANGE_STATE)) updateViewAccordingToServiceState(ForegroundService.state) } @@ -51,15 +53,19 @@ class PreferencesFragment : PreferenceFragmentCompat() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preferences, rootKey) - portPreference = findPreference("preference_port")!! + portPreference = findPreference(PreferenceKey.PORT)!! portPreference.setOnBindEditTextListener { it.inputType = InputType.TYPE_CLASS_NUMBER } - sayEndpointPreference = findPreference("preference_enable_say_endpoint")!! - waveEndpointPreference = findPreference("preference_enable_wave_endpoint")!! - ttsEnginePreference = findPreference("preference_tts")!! + sayEndpointPreference = findPreference(PreferenceKey.ENABLE_SAY_ENDPOINT)!! + waveEndpointPreference = findPreference(PreferenceKey.ENABLE_WAVE_ENDPOINT)!! + ttsEnginePreference = findPreference(PreferenceKey.TTS)!! ttsEnginePreference.setOnPreferenceClickListener { - startActivity(Intent("com.android.settings.TTS_SETTINGS")) + startActivity(Intent(ANDROID_TTS_SETTINGS)) true } updateViewAccordingToServiceState(ForegroundService.state) } + + companion object { + private const val ANDROID_TTS_SETTINGS = "com.android.settings.TTS_SETTINGS" + } } \ No newline at end of file diff --git a/app/src/main/java/io/bartek/service/ForegroundService.kt b/app/src/main/java/io/bartek/service/ForegroundService.kt index 9b61b1f..5437814 100644 --- a/app/src/main/java/io/bartek/service/ForegroundService.kt +++ b/app/src/main/java/io/bartek/service/ForegroundService.kt @@ -5,15 +5,13 @@ import android.content.Context import android.content.Intent import android.content.SharedPreferences import android.graphics.Color -import android.os.Binder import android.os.Build -import android.os.IBinder import android.os.PowerManager import androidx.preference.PreferenceManager import io.bartek.MainActivity import io.bartek.R +import io.bartek.preference.PreferenceKey import io.bartek.web.TTSServer -import java.lang.Integer.parseInt class ForegroundService : Service() { @@ -22,7 +20,7 @@ class ForegroundService : Service() { private var isServiceStarted = false private var ttsServer: TTSServer? = null private val port: Int - get() = preferences.getInt("preference_port", 8080) + get() = preferences.getInt(PreferenceKey.PORT, 8080) override fun onCreate() { super.onCreate() @@ -91,7 +89,7 @@ class ForegroundService : Service() { isServiceStarted = true wakeLock = (getSystemService(Context.POWER_SERVICE) as PowerManager).run { - newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "WebService::lock").apply { + newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKELOCK_TAG).apply { acquire() } } @@ -119,7 +117,9 @@ class ForegroundService : Service() { // than to place it as a static field var state = ServiceState.STOPPED private const val NOTIFICATION_CHANNEL_ID = "TTSService.NOTIFICATION_CHANNEL" - const val PORT = "TTSService.PORT" + private const val WAKELOCK_TAG = "ForegroundService::lock" + const val CHANGE_STATE = "io.bartek.service.CHANGE_STATE" + const val STATE = "STATE" const val START = "START" const val STOP = "STOP" } diff --git a/app/src/main/java/io/bartek/web/WebServer.kt b/app/src/main/java/io/bartek/web/WebServer.kt index 40f520b..bcfe868 100644 --- a/app/src/main/java/io/bartek/web/WebServer.kt +++ b/app/src/main/java/io/bartek/web/WebServer.kt @@ -7,6 +7,8 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager import androidx.preference.PreferenceManager import fi.iki.elonen.NanoHTTPD import fi.iki.elonen.NanoHTTPD.Response.Status.* +import io.bartek.preference.PreferenceKey +import io.bartek.service.ForegroundService import io.bartek.service.ServiceState import io.bartek.tts.TTS import org.json.JSONObject @@ -23,7 +25,7 @@ class TTSServer(port: Int, private val context: Context) : NanoHTTPD(port), override fun serve(session: IHTTPSession?): Response { try { session?.let { - return when(it.uri) { + return when (it.uri) { "/wave" -> wave(it) "/say" -> say(it) else -> throw ResponseException(NOT_FOUND, "") @@ -39,7 +41,7 @@ class TTSServer(port: Int, private val context: Context) : NanoHTTPD(port), } private fun wave(session: IHTTPSession): Response { - if(!preferences.getBoolean("preference_enable_wave_endpoint", true)) { + if (!preferences.getBoolean(PreferenceKey.ENABLE_WAVE_ENDPOINT, true)) { throw ResponseException(NOT_FOUND, "") } @@ -47,17 +49,17 @@ class TTSServer(port: Int, private val context: Context) : NanoHTTPD(port), throw ResponseException(METHOD_NOT_ALLOWED, "") } - if (session.headers["content-type"]?.let { it != "application/json" } != false) { + if (session.headers[CONTENT_TYPE]?.let { it != MIME_JSON } != false) { throw ResponseException(BAD_REQUEST, "") } val (text, language) = getRequestData(session) val (stream, size) = tts.fetchTTSStream(text, language) - return newFixedLengthResponse(OK, "audio/x-wav", stream, size) + return newFixedLengthResponse(OK, MIME_WAVE, stream, size) } private fun say(session: IHTTPSession): Response { - if(!preferences.getBoolean("preference_enable_say_endpoint", true)) { + if (!preferences.getBoolean(PreferenceKey.ENABLE_SAY_ENDPOINT, true)) { throw ResponseException(NOT_FOUND, "") } @@ -65,7 +67,7 @@ class TTSServer(port: Int, private val context: Context) : NanoHTTPD(port), throw ResponseException(METHOD_NOT_ALLOWED, "") } - if (session.headers["content-type"]?.let { it != "application/json" } != false) { + if (session.headers[CONTENT_TYPE]?.let { it != MIME_JSON } != false) { throw ResponseException(BAD_REQUEST, "") } @@ -78,7 +80,10 @@ class TTSServer(port: Int, private val context: Context) : NanoHTTPD(port), val map = mutableMapOf() session.parseBody(map) val json = JSONObject(map["postData"] ?: "{}") - val language = Locale(json.optString("language", "en_US")) + val language = json.optString("language") + .takeIf { it.isNotBlank() } + ?.let { Locale(it) } + ?: Locale.US val text = json.optString("text") ?: throw ResponseException(BAD_REQUEST, "") return TTSRequestData(text, language) } @@ -89,8 +94,8 @@ class TTSServer(port: Int, private val context: Context) : NanoHTTPD(port), super.start() LocalBroadcastManager .getInstance(context) - .sendBroadcast(Intent("io.bartek.web.server.CHANGE_STATE").also { - it.putExtra("STATE", ServiceState.RUNNING.name) + .sendBroadcast(Intent(ForegroundService.CHANGE_STATE).also { + it.putExtra(ForegroundService.STATE, ServiceState.RUNNING.name) }) } @@ -98,8 +103,14 @@ class TTSServer(port: Int, private val context: Context) : NanoHTTPD(port), super.stop() LocalBroadcastManager .getInstance(context) - .sendBroadcast(Intent("io.bartek.web.server.CHANGE_STATE").also { - it.putExtra("STATE", ServiceState.STOPPED.name) + .sendBroadcast(Intent(ForegroundService.CHANGE_STATE).also { + it.putExtra(ForegroundService.STATE, ServiceState.STOPPED.name) }) } + + companion object { + private const val MIME_JSON = "application/json" + private const val MIME_WAVE = "audio/x-wav" + private const val CONTENT_TYPE = "content-type" + } } \ No newline at end of file