From bb0a2a94ed711faa8d09c44144bf79ed1248d019 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Fri, 8 May 2020 21:42:06 +0200 Subject: [PATCH] Enable tracking service on main activity --- app/src/main/java/io/bartek/MainActivity.kt | 58 +++++++++---------- .../io/bartek/service/ForegroundService.kt | 9 +++ .../java/io/bartek/service/ServiceState.kt | 6 ++ app/src/main/java/io/bartek/web/WebServer.kt | 5 +- app/src/main/res/layout/activity_main.xml | 23 +------- app/src/main/res/values/strings.xml | 3 - 6 files changed, 46 insertions(+), 58 deletions(-) create mode 100644 app/src/main/java/io/bartek/service/ServiceState.kt 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"> - -