diff --git a/app/src/main/java/io/bartek/MainActivity.kt b/app/src/main/java/io/bartek/MainActivity.kt
index ee6d86c..5f319e9 100644
--- a/app/src/main/java/io/bartek/MainActivity.kt
+++ b/app/src/main/java/io/bartek/MainActivity.kt
@@ -1,50 +1,41 @@
package io.bartek
-import android.content.BroadcastReceiver
-import android.content.Context
-import android.content.Intent
-import android.content.IntentFilter
+import android.content.*
import android.os.Build
-import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
-import android.provider.Settings
-import android.provider.Settings.*
import android.view.View
-import android.widget.Toast
+import android.widget.Button
+import androidx.appcompat.app.AppCompatActivity
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import io.bartek.service.ForegroundService
+import io.bartek.service.ServiceState
+
class MainActivity : AppCompatActivity() {
+ private lateinit var controlServerButton: Button
+
private val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
intent?.let {
- when(intent.getStringExtra("STATE")) {
- "STARTED" -> notifyOnStart()
- "STOPPED" -> notifyOnStop()
- }
+ updateViewAccordingToServiceState(
+ ServiceState.valueOf(it.getStringExtra("STATE") ?: "STOPPED")
+ )
}
}
}
- private fun notifyOnStart() {
- Toast.makeText(
- this,
- resources.getString(R.string.server_toast_service_started),
- Toast.LENGTH_SHORT
- ).show()
- }
-
- private fun notifyOnStop() {
- Toast.makeText(
- this,
- resources.getString(R.string.server_toast_service_stopped),
- Toast.LENGTH_SHORT
- ).show()
+ private fun updateViewAccordingToServiceState(newState: ServiceState) {
+ controlServerButton.isEnabled = true
+ when (newState) {
+ ServiceState.STOPPED -> controlServerButton.text = getString(R.string.main_activity_run)
+ ServiceState.RUNNING -> controlServerButton.text = getString(R.string.main_activity_stop)
+ }
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
+ controlServerButton = findViewById(R.id.control_server_button)
}
override fun onResume() {
@@ -52,6 +43,7 @@ class MainActivity : AppCompatActivity() {
LocalBroadcastManager
.getInstance(this)
.registerReceiver(receiver, IntentFilter("io.bartek.web.server.CHANGE_STATE"))
+ updateViewAccordingToServiceState(ForegroundService.state)
}
override fun onPause() {
@@ -61,12 +53,16 @@ class MainActivity : AppCompatActivity() {
super.onPause()
}
- fun startServer(view: View) = actionOnService(ForegroundService.START)
-
- fun stopServer(view: View) = actionOnService(ForegroundService.STOP)
-
fun openTTSSettings(view: View) = startActivity(Intent("com.android.settings.TTS_SETTINGS"))
+ fun controlServer(view: View) {
+ controlServerButton.isEnabled = false
+ when (ForegroundService.state) {
+ ServiceState.STOPPED -> actionOnService(ForegroundService.START)
+ ServiceState.RUNNING -> actionOnService(ForegroundService.STOP)
+ }
+ }
+
private fun actionOnService(action: String) {
Intent(this, ForegroundService::class.java).also {
it.action = action
@@ -78,6 +74,4 @@ class MainActivity : AppCompatActivity() {
startService(it)
}
}
-
-
}
diff --git a/app/src/main/java/io/bartek/service/ForegroundService.kt b/app/src/main/java/io/bartek/service/ForegroundService.kt
index 6898717..b6dc70d 100644
--- a/app/src/main/java/io/bartek/service/ForegroundService.kt
+++ b/app/src/main/java/io/bartek/service/ForegroundService.kt
@@ -4,12 +4,15 @@ import android.app.*
import android.content.Context
import android.content.Intent
import android.graphics.Color
+import android.os.Binder
import android.os.Build
+import android.os.IBinder
import android.os.PowerManager
import io.bartek.MainActivity
import io.bartek.R
import io.bartek.web.TTSServer
+
class ForegroundService : Service() {
private var port: Int = 8080
private var wakeLock: PowerManager.WakeLock? = null
@@ -90,6 +93,7 @@ class ForegroundService : Service() {
}
}
ttsServer = TTSServer(port, this)
+ state = ServiceState.RUNNING
}
private fun stopService() {
@@ -103,9 +107,14 @@ class ForegroundService : Service() {
stopForeground(true)
stopSelf()
}
+ state = ServiceState.STOPPED
}
companion object {
+ // Disclaimer: I don't know the better way
+ // to check whether the service is already running
+ // 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"
const val START = "START"
diff --git a/app/src/main/java/io/bartek/service/ServiceState.kt b/app/src/main/java/io/bartek/service/ServiceState.kt
new file mode 100644
index 0000000..ad1f38d
--- /dev/null
+++ b/app/src/main/java/io/bartek/service/ServiceState.kt
@@ -0,0 +1,6 @@
+package io.bartek.service
+
+enum class ServiceState {
+ RUNNING,
+ STOPPED
+}
\ No newline at end of file
diff --git a/app/src/main/java/io/bartek/web/WebServer.kt b/app/src/main/java/io/bartek/web/WebServer.kt
index e5a87d7..980b78d 100644
--- a/app/src/main/java/io/bartek/web/WebServer.kt
+++ b/app/src/main/java/io/bartek/web/WebServer.kt
@@ -8,6 +8,7 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager
import fi.iki.elonen.NanoHTTPD
import fi.iki.elonen.NanoHTTPD.Response.Status.*
import io.bartek.R
+import io.bartek.service.ServiceState
import io.bartek.tts.TTS
import org.json.JSONObject
import java.util.*
@@ -72,7 +73,7 @@ class TTSServer(port: Int, private val context: Context) : NanoHTTPD(port),
LocalBroadcastManager
.getInstance(context)
.sendBroadcast(Intent("io.bartek.web.server.CHANGE_STATE").also {
- it.putExtra("STATE", "STARTED")
+ it.putExtra("STATE", ServiceState.RUNNING.name)
})
}
@@ -81,7 +82,7 @@ class TTSServer(port: Int, private val context: Context) : NanoHTTPD(port),
LocalBroadcastManager
.getInstance(context)
.sendBroadcast(Intent("io.bartek.web.server.CHANGE_STATE").also {
- it.putExtra("STATE", "STOPPED")
+ it.putExtra("STATE", ServiceState.STOPPED.name)
})
}
}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 8a7f297..f3b57b2 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -12,32 +12,13 @@
android:layout_height="wrap_content"
android:orientation="horizontal">
-
-
-
-
-