diff --git a/app/src/main/java/io/bartek/ttsserver/core/sonos/queue/SonosQueue.kt b/app/src/main/java/io/bartek/ttsserver/core/sonos/queue/SonosQueue.kt index 717f5e4..d1aa343 100644 --- a/app/src/main/java/io/bartek/ttsserver/core/sonos/queue/SonosQueue.kt +++ b/app/src/main/java/io/bartek/ttsserver/core/sonos/queue/SonosQueue.kt @@ -1,7 +1,5 @@ package io.bartek.ttsserver.core.sonos.queue -import android.content.SharedPreferences -import io.bartek.ttsserver.ui.preference.PreferenceKey import io.bartek.ttsserver.core.sonos.worker.SonosWorker import io.bartek.ttsserver.core.tts.engine.TTSEngine import io.bartek.ttsserver.core.util.NetworkUtil @@ -9,28 +7,14 @@ import io.bartek.ttsserver.core.web.dto.SonosDTO import java.util.concurrent.BlockingQueue import java.util.concurrent.LinkedBlockingQueue -class SonosQueue( - private val tts: TTSEngine, - private val networkUtil: NetworkUtil, - private val preferences: SharedPreferences -) { +class SonosQueue(private val tts: TTSEngine, private val networkUtil: NetworkUtil) { private val queue: BlockingQueue = LinkedBlockingQueue() private var consumer: Thread? = null - private val host: String - get() = networkUtil.getIpAddress() - private val port: Int - get() = preferences.getInt(PreferenceKey.PORT, 8080) fun run() { consumer?.interrupt() - consumer = Thread( - SonosWorker( - tts, - host, - port, - queue - ) - ).also { it.name = "SonosQueue" } + consumer = Thread(SonosWorker(tts, networkUtil.serverAddress, queue)) + .also { it.name = "SonosQueue" } consumer?.start() } diff --git a/app/src/main/java/io/bartek/ttsserver/core/sonos/worker/SonosWorker.kt b/app/src/main/java/io/bartek/ttsserver/core/sonos/worker/SonosWorker.kt index 8a808d2..b3f938d 100644 --- a/app/src/main/java/io/bartek/ttsserver/core/sonos/worker/SonosWorker.kt +++ b/app/src/main/java/io/bartek/ttsserver/core/sonos/worker/SonosWorker.kt @@ -9,8 +9,7 @@ import java.util.concurrent.BlockingQueue class SonosWorker( private val tts: TTSEngine, - private val host: String, - private val port: Int, + private val address: String, private val queue: BlockingQueue ) : Runnable { @@ -26,7 +25,7 @@ class SonosWorker( SonosDiscovery.discover().firstOrNull { it.zoneGroupState.name == data.zone }?.let { val file = tts.createTTSFile(data.text, data.language) val filename = file.name - val url = "http://$host:$port/sonos/$filename" + val url = "$address/sonos/$filename" it.clip(url, data.volume, "") } } \ No newline at end of file diff --git a/app/src/main/java/io/bartek/ttsserver/core/util/NetworkUtil.kt b/app/src/main/java/io/bartek/ttsserver/core/util/NetworkUtil.kt index c33c5c9..adced29 100644 --- a/app/src/main/java/io/bartek/ttsserver/core/util/NetworkUtil.kt +++ b/app/src/main/java/io/bartek/ttsserver/core/util/NetworkUtil.kt @@ -2,11 +2,16 @@ package io.bartek.ttsserver.core.util import android.content.Context import android.content.Context.WIFI_SERVICE +import android.content.SharedPreferences import android.net.wifi.WifiManager +import io.bartek.ttsserver.ui.preference.PreferenceKey import java.net.InetAddress -class NetworkUtil(private val context: Context) { +class NetworkUtil(private val context: Context, private val preferences: SharedPreferences) { + val serverAddress: String + get() = "http://${getIpAddress()}:${preferences.getInt(PreferenceKey.PORT, 8000)}" + fun getIpAddress(): String { return (context.getApplicationContext().getSystemService(WIFI_SERVICE) as WifiManager).let { inetAddress(it.dhcpInfo.ipAddress).toString().substring(1) diff --git a/app/src/main/java/io/bartek/ttsserver/di/module/TTSModule.kt b/app/src/main/java/io/bartek/ttsserver/di/module/TTSModule.kt index 80a636a..9afc5fd 100644 --- a/app/src/main/java/io/bartek/ttsserver/di/module/TTSModule.kt +++ b/app/src/main/java/io/bartek/ttsserver/di/module/TTSModule.kt @@ -6,12 +6,12 @@ import android.speech.tts.TextToSpeech import androidx.preference.PreferenceManager import dagger.Module import dagger.Provides -import io.bartek.ttsserver.service.notification.ForegroundNotificationFactory import io.bartek.ttsserver.core.sonos.queue.SonosQueue import io.bartek.ttsserver.core.tts.engine.TTSEngine import io.bartek.ttsserver.core.tts.status.TTSStatusHolder import io.bartek.ttsserver.core.util.NetworkUtil import io.bartek.ttsserver.core.web.server.WebServerFactory +import io.bartek.ttsserver.service.notification.ForegroundNotificationFactory import javax.inject.Singleton @Module @@ -38,13 +38,12 @@ class TTSModule { context: Context, tts: TTSEngine, sonos: SonosQueue - ) = - WebServerFactory( - preferences, - context, - tts, - sonos - ) + ) = WebServerFactory( + preferences, + context, + tts, + sonos + ) @Provides @Singleton @@ -52,17 +51,17 @@ class TTSModule { @Provides @Singleton - fun networkUtil(context: Context) = NetworkUtil(context) + fun networkUtil(context: Context, preferences: SharedPreferences) = + NetworkUtil(context, preferences) @Provides @Singleton - fun sonosQueue(tts: TTSEngine, networkUtil: NetworkUtil, preferences: SharedPreferences) = - SonosQueue(tts, networkUtil, preferences) + fun sonosQueue(tts: TTSEngine, networkUtil: NetworkUtil) = SonosQueue(tts, networkUtil) @Provides @Singleton - fun foregroundNotificationFactory(context: Context) = - ForegroundNotificationFactory( - context - ) + fun foregroundNotificationFactory( + context: Context, + networkUtil: NetworkUtil + ) = ForegroundNotificationFactory(context, networkUtil) } \ No newline at end of file diff --git a/app/src/main/java/io/bartek/ttsserver/service/foreground/ForegroundService.kt b/app/src/main/java/io/bartek/ttsserver/service/foreground/ForegroundService.kt index 9f7f5b0..e9ef0ba 100644 --- a/app/src/main/java/io/bartek/ttsserver/service/foreground/ForegroundService.kt +++ b/app/src/main/java/io/bartek/ttsserver/service/foreground/ForegroundService.kt @@ -3,10 +3,8 @@ package io.bartek.ttsserver.service.foreground import android.annotation.SuppressLint import android.content.Context import android.content.Intent -import android.content.SharedPreferences import android.os.PowerManager import dagger.android.DaggerService -import io.bartek.ttsserver.ui.preference.PreferenceKey import io.bartek.ttsserver.core.web.server.WebServer import io.bartek.ttsserver.core.web.server.WebServerFactory import io.bartek.ttsserver.service.notification.ForegroundNotificationFactory @@ -18,11 +16,6 @@ class ForegroundService : DaggerService() { private var wakeLock: PowerManager.WakeLock? = null private var isServiceStarted = false private var webServer: WebServer? = null - private val port: Int - get() = preferences.getInt(PreferenceKey.PORT, 8080) - - @Inject - lateinit var preferences: SharedPreferences @Inject lateinit var webServerFactory: WebServerFactory @@ -32,7 +25,7 @@ class ForegroundService : DaggerService() { override fun onCreate() { super.onCreate() - startForeground(1, notificationFactory.createForegroundNotification(port)) + startForeground(1, notificationFactory.createForegroundNotification()) } override fun onBind(intent: Intent) = null diff --git a/app/src/main/java/io/bartek/ttsserver/service/notification/ForegroundNotificationFactory.kt b/app/src/main/java/io/bartek/ttsserver/service/notification/ForegroundNotificationFactory.kt index db0d795..36be1fb 100644 --- a/app/src/main/java/io/bartek/ttsserver/service/notification/ForegroundNotificationFactory.kt +++ b/app/src/main/java/io/bartek/ttsserver/service/notification/ForegroundNotificationFactory.kt @@ -9,25 +9,32 @@ import android.content.Context import android.content.Intent import android.os.Build import io.bartek.R +import io.bartek.ttsserver.core.util.NetworkUtil import io.bartek.ttsserver.ui.main.MainActivity -class ForegroundNotificationFactory(private val context: Context) { +class ForegroundNotificationFactory( + private val context: Context, + private val networkUtil: NetworkUtil +) { private val oreo: Boolean get() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O - fun createForegroundNotification(port: Int): Notification { + private val notificationContent: String + get() = context.getString(R.string.service_notification_text, networkUtil.serverAddress) + + fun createForegroundNotification(): Notification { createNotificationChannel() - return buildNotification(port, createPendingIntent()) + return buildNotification(createPendingIntent()) } @Suppress("DEPRECATION") - private fun buildNotification(port: Int, pendingIntent: PendingIntent?) = + private fun buildNotification(pendingIntent: PendingIntent?) = provideNotificationBuilder() .setContentTitle(context.resources.getString(R.string.service_notification_title)) - .setContentText(context.resources.getString(R.string.service_notification_text, port)) + .setContentText(notificationContent) .setContentIntent(pendingIntent) .setSmallIcon(R.drawable.ic_foreground_service) - .setTicker(context.getString(R.string.service_notification_text, port)) + .setTicker(notificationContent) .setPriority(Notification.PRIORITY_HIGH) // for under android 26 compatibility .build() @@ -57,7 +64,8 @@ class ForegroundNotificationFactory(private val context: Context) { @Suppress("DEPRECATION") @SuppressLint("NewApi") private fun provideNotificationBuilder() = - if (oreo) Notification.Builder(context, + if (oreo) Notification.Builder( + context, NOTIFICATION_CHANNEL_ID ) else Notification.Builder(context) diff --git a/app/src/main/java/io/bartek/ttsserver/ui/main/MainActivity.kt b/app/src/main/java/io/bartek/ttsserver/ui/main/MainActivity.kt index 21f91c1..89bba0d 100644 --- a/app/src/main/java/io/bartek/ttsserver/ui/main/MainActivity.kt +++ b/app/src/main/java/io/bartek/ttsserver/ui/main/MainActivity.kt @@ -1,9 +1,6 @@ package io.bartek.ttsserver.ui.main -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import android.content.IntentFilter +import android.content.* import android.os.Build import android.os.Bundle import android.view.Menu @@ -14,20 +11,28 @@ import androidx.appcompat.widget.AppCompatImageButton import androidx.localbroadcastmanager.content.LocalBroadcastManager import dagger.android.support.DaggerAppCompatActivity import io.bartek.R -import io.bartek.ttsserver.ui.help.HelpActivity -import io.bartek.ttsserver.ui.preference.PreferencesActivity +import io.bartek.ttsserver.core.util.NetworkUtil import io.bartek.ttsserver.service.foreground.ForegroundService import io.bartek.ttsserver.service.state.ServiceState +import io.bartek.ttsserver.ui.help.HelpActivity +import io.bartek.ttsserver.ui.preference.PreferencesActivity import javax.inject.Inject class MainActivity : DaggerAppCompatActivity() { private lateinit var serverControlButton: AppCompatImageButton + private lateinit var serverStatus: TextView private lateinit var promptText: TextView @Inject lateinit var context: Context + @Inject + lateinit var preferences: SharedPreferences + + @Inject + lateinit var networkUtil: NetworkUtil + private val receiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { (intent?.getStringExtra(ForegroundService.STATE) ?: ServiceState.STOPPED.name) @@ -55,10 +60,13 @@ class MainActivity : DaggerAppCompatActivity() { when (newState) { ServiceState.STOPPED -> { serverControlButton.setImageResource(R.drawable.ic_power_off) + serverStatus.text = getString(R.string.main_activity_server_status_down) promptText.text = getString(R.string.main_activity_prompt_to_run) } ServiceState.RUNNING -> { serverControlButton.setImageResource(R.drawable.ic_power_on) + serverStatus.text = + getString(R.string.main_activity_server_status_up, networkUtil.serverAddress) promptText.text = getString(R.string.main_activity_prompt_to_stop) } } @@ -68,6 +76,7 @@ class MainActivity : DaggerAppCompatActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) serverControlButton = findViewById(R.id.server_control_button) + serverStatus = findViewById(R.id.server_status) promptText = findViewById(R.id.prompt_text) } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 75162a8..ee5b707 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -8,10 +8,17 @@ tools:context=".ttsserver.ui.main.MainActivity"> + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1ab4ee8..162f16b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -4,15 +4,15 @@ booting up TTS HTTP server Allows application to run HTTP server which provides a TTS services. - Run - Stop + The server is down + The server is up: %1$s Tap power on button to run the server Tap power off button to stop the server HTTP Server The fixed notification keeping the HTTP server alive Server is running - The HTTP server is listening on port %1$d + The HTTP server is listening on address %1$s Settings The desired port on which HTTP server is intended to listening