From 632d7c34ef8ce4983d7b320aa905469c4fce9421 Mon Sep 17 00:00:00 2001 From: Hartmut Bauer Date: Thu, 5 Feb 2026 18:41:38 +0100 Subject: [PATCH] settings wird so langsam (#1) --- .../keinekekse/app/config/configProperties.kt | 3 +++ .../app/config/configProperties.jvm.kt | 8 ++++++ .../jvmMain/kotlin/net/keinekekse/app/main.kt | 5 +++- books/src/jvmMain/resources/config.properties | 3 +++ shared/build.gradle.kts | 1 + .../keinekekse/app/config/ConfigProperties.kt | 5 ++++ .../net/keinekekse/app/config/Settings.kt | 8 ++++++ .../keinekekse/app/ui/ProgressIndicator.kt | 2 -- .../app/config/JvmConfigProperties.kt | 26 +++++++++++++++++++ .../net/keinekekse/app/config/JvmSettings.kt | 10 +++++++ 10 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 books/src/commonMain/kotlin/net/keinekekse/app/config/configProperties.kt create mode 100644 books/src/jvmMain/kotlin/net/keinekekse/app/config/configProperties.jvm.kt create mode 100644 shared/src/commonMain/kotlin/net/keinekekse/app/config/ConfigProperties.kt create mode 100644 shared/src/jvmMain/kotlin/net/keinekekse/app/config/JvmConfigProperties.kt diff --git a/books/src/commonMain/kotlin/net/keinekekse/app/config/configProperties.kt b/books/src/commonMain/kotlin/net/keinekekse/app/config/configProperties.kt new file mode 100644 index 0000000..5b50634 --- /dev/null +++ b/books/src/commonMain/kotlin/net/keinekekse/app/config/configProperties.kt @@ -0,0 +1,3 @@ +package net.keinekekse.app.config + +expect fun configProperties(): ConfigProperties diff --git a/books/src/jvmMain/kotlin/net/keinekekse/app/config/configProperties.jvm.kt b/books/src/jvmMain/kotlin/net/keinekekse/app/config/configProperties.jvm.kt new file mode 100644 index 0000000..d2c086a --- /dev/null +++ b/books/src/jvmMain/kotlin/net/keinekekse/app/config/configProperties.jvm.kt @@ -0,0 +1,8 @@ +package net.keinekekse.app.config + +import org.koin.core.annotation.Singleton + +@Singleton +actual fun configProperties(): ConfigProperties { + return JvmConfigProperties("config.properties") +} diff --git a/books/src/jvmMain/kotlin/net/keinekekse/app/main.kt b/books/src/jvmMain/kotlin/net/keinekekse/app/main.kt index a4729c7..9594205 100644 --- a/books/src/jvmMain/kotlin/net/keinekekse/app/main.kt +++ b/books/src/jvmMain/kotlin/net/keinekekse/app/main.kt @@ -19,6 +19,7 @@ import kotlinx.coroutines.withContext import net.keinekekse.app.auth.AuthResult import net.keinekekse.app.auth.Authenticator import net.keinekekse.app.books.di.KoinApp +import net.keinekekse.app.config.ConfigProperties import net.keinekekse.app.config.Settings import net.keinekekse.app.ui.ProgressIndicator import org.koin.compose.koinInject @@ -37,12 +38,14 @@ fun main() = application { startKoin() + val config: ConfigProperties = koinInject() val settings: Settings = koinInject() // val settings: Settings = PreferencesSettings(delegate) // // settings.put("kc_server", "kec.keinekekse.net") - println(settings.get("kc_server", "default")) + println("Properties: ${config["keycloakServer"]}") + println("Settings: ${settings.get("kc_server", "default")}") // println(Preferences.userRoot()) // println("System properties:") diff --git a/books/src/jvmMain/resources/config.properties b/books/src/jvmMain/resources/config.properties index e69de29..ef1e3a9 100644 --- a/books/src/jvmMain/resources/config.properties +++ b/books/src/jvmMain/resources/config.properties @@ -0,0 +1,3 @@ +keycloakServer=kec.keinekekse.net +keycloakRealm=app-server-realm +keycloakClient=pkce-book-app diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index f1e3665..c2fe2cd 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -24,6 +24,7 @@ kotlin { sourceSets { commonMain.dependencies { implementation(libs.bundles.kotlin.compose) + implementation(libs.ktor.serializationJson) } jvmMain.dependencies { diff --git a/shared/src/commonMain/kotlin/net/keinekekse/app/config/ConfigProperties.kt b/shared/src/commonMain/kotlin/net/keinekekse/app/config/ConfigProperties.kt new file mode 100644 index 0000000..825801d --- /dev/null +++ b/shared/src/commonMain/kotlin/net/keinekekse/app/config/ConfigProperties.kt @@ -0,0 +1,5 @@ +package net.keinekekse.app.config + +interface ConfigProperties { + operator fun get(key: String): String? +} diff --git a/shared/src/commonMain/kotlin/net/keinekekse/app/config/Settings.kt b/shared/src/commonMain/kotlin/net/keinekekse/app/config/Settings.kt index 0450c10..c9d6d55 100644 --- a/shared/src/commonMain/kotlin/net/keinekekse/app/config/Settings.kt +++ b/shared/src/commonMain/kotlin/net/keinekekse/app/config/Settings.kt @@ -1,5 +1,10 @@ package net.keinekekse.app.config +import kotlinx.serialization.Serializable + +@Serializable +data class SettingsEntry(val key: String, val value: String) + interface Settings { fun get(key: String): String? fun get(key: String, default: String): String = get(key) ?: default @@ -24,4 +29,7 @@ interface Settings { fun size(): Int fun keys(): Set + + fun export(): String + fun import(data: String) } diff --git a/shared/src/commonMain/kotlin/net/keinekekse/app/ui/ProgressIndicator.kt b/shared/src/commonMain/kotlin/net/keinekekse/app/ui/ProgressIndicator.kt index 7d7d6f4..0cec99a 100644 --- a/shared/src/commonMain/kotlin/net/keinekekse/app/ui/ProgressIndicator.kt +++ b/shared/src/commonMain/kotlin/net/keinekekse/app/ui/ProgressIndicator.kt @@ -10,8 +10,6 @@ import androidx.compose.ui.draw.drawBehind import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.unit.dp -// TODO (ProgressIndicator.() -> Unit) --> { animationSize = .... - @Composable fun ProgressIndicator(animationSize: Int = 48, paddingTop: Int = 16, strokeWidth: Int = 5) { val primaryColor = MaterialTheme.colorScheme.primary diff --git a/shared/src/jvmMain/kotlin/net/keinekekse/app/config/JvmConfigProperties.kt b/shared/src/jvmMain/kotlin/net/keinekekse/app/config/JvmConfigProperties.kt new file mode 100644 index 0000000..59c97c9 --- /dev/null +++ b/shared/src/jvmMain/kotlin/net/keinekekse/app/config/JvmConfigProperties.kt @@ -0,0 +1,26 @@ +package net.keinekekse.app.config + +import java.io.InputStream +import java.util.* + +class JvmConfigProperties(val configFileName: String = "config.properties") : ConfigProperties { + + private var properties = Properties() + + override operator fun get(key: String): String? = properties.getProperty(key) + + init { + loadConfigFile() + } + + private fun loadConfigFile() { + getConfigStream().use { stream -> + properties.load(stream) + } + } + + private fun getConfigStream(): InputStream { + return javaClass.classLoader.getResourceAsStream(configFileName) + ?: throw IllegalStateException("Could not load configuration from $configFileName") + } +} diff --git a/shared/src/jvmMain/kotlin/net/keinekekse/app/config/JvmSettings.kt b/shared/src/jvmMain/kotlin/net/keinekekse/app/config/JvmSettings.kt index a3404c0..d74dde3 100644 --- a/shared/src/jvmMain/kotlin/net/keinekekse/app/config/JvmSettings.kt +++ b/shared/src/jvmMain/kotlin/net/keinekekse/app/config/JvmSettings.kt @@ -1,5 +1,6 @@ package net.keinekekse.app.config +import kotlinx.serialization.json.Json import java.util.prefs.Preferences class JvmSettings(clazz: Class<*>? = null) : Settings { @@ -52,4 +53,13 @@ class JvmSettings(clazz: Class<*>? = null) : Settings { override fun keys(): Set { return preferences.keys().toSet() } + + override fun export(): String { + val prefList = keys().filter { get(it) != null }.map { SettingsEntry(it, get(it)!!) } + return Json {}.encodeToString(prefList) + } + + override fun import(data: String) { + Json { }.decodeFromString>(data).forEach { put(it.key, it.value) } + } }