diff --git a/app/src/main/java/com/bartlomiejpluta/ttsserver/di/module/LuaModule.kt b/app/src/main/java/com/bartlomiejpluta/ttsserver/di/module/LuaModule.kt index eed8eef..969b133 100644 --- a/app/src/main/java/com/bartlomiejpluta/ttsserver/di/module/LuaModule.kt +++ b/app/src/main/java/com/bartlomiejpluta/ttsserver/di/module/LuaModule.kt @@ -1,12 +1,14 @@ package com.bartlomiejpluta.ttsserver.di.module import android.content.Context +import android.content.SharedPreferences import com.bartlomiejpluta.ttsserver.core.lua.lib.* import com.bartlomiejpluta.ttsserver.core.lua.loader.ConfigLoader import com.bartlomiejpluta.ttsserver.core.lua.loader.EndpointLoader import com.bartlomiejpluta.ttsserver.core.lua.sandbox.SandboxFactory import com.bartlomiejpluta.ttsserver.core.tts.engine.TTSEngine import com.bartlomiejpluta.ttsserver.core.util.NetworkUtil +import com.bartlomiejpluta.ttsserver.initializer.ScriptsInitializer import dagger.Module import dagger.Provides import javax.inject.Singleton @@ -61,4 +63,9 @@ class LuaModule { @Provides @Singleton fun sonosLibrary() = SonosLibrary() + + @Provides + @Singleton + fun scriptsInitializer(context: Context, preferences: SharedPreferences) = + ScriptsInitializer(context, preferences) } \ No newline at end of file diff --git a/app/src/main/java/com/bartlomiejpluta/ttsserver/initializer/ScriptsInitializer.kt b/app/src/main/java/com/bartlomiejpluta/ttsserver/initializer/ScriptsInitializer.kt new file mode 100644 index 0000000..9323390 --- /dev/null +++ b/app/src/main/java/com/bartlomiejpluta/ttsserver/initializer/ScriptsInitializer.kt @@ -0,0 +1,55 @@ +package com.bartlomiejpluta.ttsserver.initializer + +import android.content.Context +import android.content.SharedPreferences +import com.bartlomiejpluta.R +import java.io.BufferedInputStream +import java.io.File +import java.io.FileOutputStream + +class ScriptsInitializer(private val context: Context, private val preferences: SharedPreferences) { + private val endpointsDirectory: File? + get() = context.getExternalFilesDir("endpoints") + + private val configDirectory: File? + get() = context.getExternalFilesDir("config") + + fun initializeOnce() { + if(!preferences.getBoolean(INITIALIZED_FLAG, false)) { + initialize() + + preferences.edit().apply { + putBoolean(INITIALIZED_FLAG, true) + apply() + } + } + } + + fun initialize() { + endpointsDirectory?.listFiles()?.forEach { it.delete() } + configDirectory?.listFiles()?.forEach { it.delete() } + initializeConfig() + initializeEndpoints() + } + + private fun initializeConfig() = + saveToFile("config.lua", configDirectory, R.raw.config) + + private fun initializeEndpoints() = + endpoints.forEach { saveToFile(it.key, endpointsDirectory, it.value) } + + private fun saveToFile(fileName: String, directory: File?, resourceId: Int) { + BufferedInputStream(context.resources.openRawResource(resourceId)).use { input -> + FileOutputStream(File(directory, fileName)).use { output -> + input.copyTo(output) + } + } + } + + companion object { + private const val INITIALIZED_FLAG = "flag_initialized" + private val endpoints = mapOf( + "say.lua" to R.raw.say + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/bartlomiejpluta/ttsserver/ui/main/MainActivity.kt b/app/src/main/java/com/bartlomiejpluta/ttsserver/ui/main/MainActivity.kt index d63bfdf..ce02116 100644 --- a/app/src/main/java/com/bartlomiejpluta/ttsserver/ui/main/MainActivity.kt +++ b/app/src/main/java/com/bartlomiejpluta/ttsserver/ui/main/MainActivity.kt @@ -12,6 +12,7 @@ import androidx.appcompat.widget.AppCompatImageButton import androidx.localbroadcastmanager.content.LocalBroadcastManager import com.bartlomiejpluta.R import com.bartlomiejpluta.ttsserver.core.util.NetworkUtil +import com.bartlomiejpluta.ttsserver.initializer.ScriptsInitializer import com.bartlomiejpluta.ttsserver.service.foreground.ForegroundService import com.bartlomiejpluta.ttsserver.service.state.ServiceState import com.bartlomiejpluta.ttsserver.ui.help.HelpActivity @@ -34,16 +35,19 @@ class MainActivity : DaggerAppCompatActivity() { @Inject lateinit var networkUtil: NetworkUtil + @Inject + lateinit var scriptsInitializer: ScriptsInitializer + private val receiver = object : BroadcastReceiver() { - override fun onReceive(context: Context?, intent: Intent?) = when(intent?.action) { - MainActivity.CHANGE_STATE -> dispatchChangeStateIntent(intent) + override fun onReceive(context: Context?, intent: Intent?) = when (intent?.action) { + CHANGE_STATE -> dispatchChangeStateIntent(intent) LUA_ERROR -> dispatchLuaErrorIntent(intent) else -> throw UnsupportedOperationException("This action is not supported") } } private fun dispatchChangeStateIntent(intent: Intent) { - (intent.getStringExtra(MainActivity.STATE) ?: ServiceState.STOPPED.name) + (intent.getStringExtra(STATE) ?: ServiceState.STOPPED.name) .let { ServiceState.valueOf(it) } .let { updateViewAccordingToServiceState(it) } } @@ -92,12 +96,13 @@ class MainActivity : DaggerAppCompatActivity() { serverControlButton = findViewById(R.id.server_control_button) serverStatus = findViewById(R.id.server_status) promptText = findViewById(R.id.prompt_text) + scriptsInitializer.initializeOnce() } override fun onResume() { super.onResume() val filter = IntentFilter().apply { - addAction(MainActivity.CHANGE_STATE) + addAction(CHANGE_STATE) addAction(LUA_ERROR) } diff --git a/app/src/main/res/raw/config.lua b/app/src/main/res/raw/config.lua new file mode 100644 index 0000000..9bf6c76 --- /dev/null +++ b/app/src/main/res/raw/config.lua @@ -0,0 +1,2 @@ +return { +} \ No newline at end of file diff --git a/app/src/main/res/raw/say.lua b/app/src/main/res/raw/say.lua new file mode 100644 index 0000000..0d5e1a2 --- /dev/null +++ b/app/src/main/res/raw/say.lua @@ -0,0 +1,9 @@ +return { + uri = "/say", + method = Method.POST, + queued = true, + accepts = "application/json", + consumer = function() + tts.say("Hello, world!", "en") + end +} \ No newline at end of file