From 231132dd9e01c5009e0f251dd736cf472d468278 Mon Sep 17 00:00:00 2001 From: Hartmut Bauer Date: Thu, 5 Feb 2026 13:53:49 +0100 Subject: [PATCH] zwischenstand --- books/buildnumber.properties | 4 +- .../net/keinekekse/app/books/Version.kt | 6 +- .../keinekekse/app/config/settingsFactory.kt | 5 ++ .../app/config/settingsFactory.jvm.kt | 9 +++ .../jvmMain/kotlin/net/keinekekse/app/main.kt | 73 +++++++++++++++++++ books/src/jvmMain/resources/config.properties | 0 gradle/libs.versions.toml | 11 ++- server/buildnumber.properties | 4 +- .../net/keinekekse/app/server/Version.kt | 8 +- .../net/keinekekse/app/config/Settings.kt | 27 +++++++ .../keinekekse/app/ui/ProgressIndicator.kt | 2 + .../net/keinekekse/app/config/JvmSettings.kt | 55 ++++++++++++++ 12 files changed, 191 insertions(+), 13 deletions(-) create mode 100644 books/src/commonMain/kotlin/net/keinekekse/app/config/settingsFactory.kt create mode 100644 books/src/jvmMain/kotlin/net/keinekekse/app/config/settingsFactory.jvm.kt create mode 100644 books/src/jvmMain/resources/config.properties create mode 100644 shared/src/commonMain/kotlin/net/keinekekse/app/config/Settings.kt create mode 100644 shared/src/jvmMain/kotlin/net/keinekekse/app/config/JvmSettings.kt diff --git a/books/buildnumber.properties b/books/buildnumber.properties index 5e09134..9da6d61 100644 --- a/books/buildnumber.properties +++ b/books/buildnumber.properties @@ -1,3 +1,3 @@ #auto generated -#Tue Feb 03 00:28:14 CET 2026 -build.number=174 +#Thu Feb 05 01:16:28 CET 2026 +build.number=190 diff --git a/books/src/commonMain/kotlin/net/keinekekse/app/books/Version.kt b/books/src/commonMain/kotlin/net/keinekekse/app/books/Version.kt index 6a7ad44..c972816 100644 --- a/books/src/commonMain/kotlin/net/keinekekse/app/books/Version.kt +++ b/books/src/commonMain/kotlin/net/keinekekse/app/books/Version.kt @@ -4,13 +4,13 @@ import net.keinekekse.version.Version object VERSION: Version { override val version = "1.0.0" - override val fullVersion = "1.0.0+build.174" + override val fullVersion = "1.0.0+build.190" override val major = 1 override val minor = 0 override val patch = 0 override val preRelease = "" - override val buildMetadata = "build.174" - override val buildDate = "2026-02-02T23:28:14.786916Z" + override val buildMetadata = "build.190" + override val buildDate = "2026-02-05T00:16:28.206204Z" override val displayName = "Books App" override val copyright = "Copyright (c) 2026 Hartmut Bauer" override val name = "books" diff --git a/books/src/commonMain/kotlin/net/keinekekse/app/config/settingsFactory.kt b/books/src/commonMain/kotlin/net/keinekekse/app/config/settingsFactory.kt new file mode 100644 index 0000000..70225c8 --- /dev/null +++ b/books/src/commonMain/kotlin/net/keinekekse/app/config/settingsFactory.kt @@ -0,0 +1,5 @@ +package net.keinekekse.app.config + +// das interface kann in shared, aber der expect/actual-Teil muss in die Anwendung +// damit konkrete Werte, z.B. für die Preferences gesetzt werden können. +expect fun settingsFactory(): Settings diff --git a/books/src/jvmMain/kotlin/net/keinekekse/app/config/settingsFactory.jvm.kt b/books/src/jvmMain/kotlin/net/keinekekse/app/config/settingsFactory.jvm.kt new file mode 100644 index 0000000..a33e4df --- /dev/null +++ b/books/src/jvmMain/kotlin/net/keinekekse/app/config/settingsFactory.jvm.kt @@ -0,0 +1,9 @@ +package net.keinekekse.app.config + +import net.keinekekse.app.books.VERSION +import org.koin.core.annotation.Singleton + +@Singleton +actual fun settingsFactory(): Settings { + return JvmSettings(VERSION::class.java) +} diff --git a/books/src/jvmMain/kotlin/net/keinekekse/app/main.kt b/books/src/jvmMain/kotlin/net/keinekekse/app/main.kt index 2169232..a4729c7 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.Settings import net.keinekekse.app.ui.ProgressIndicator import org.koin.compose.koinInject import org.koin.plugin.module.dsl.startKoin @@ -36,6 +37,18 @@ fun main() = application { startKoin() + val settings: Settings = koinInject() + +// val settings: Settings = PreferencesSettings(delegate) +// +// settings.put("kc_server", "kec.keinekekse.net") + println(settings.get("kc_server", "default")) +// println(Preferences.userRoot()) + +// println("System properties:") +// System.getProperties().forEach { println("${it.key}=${it.value}") } +// println("") + // keycloakServer = "kec.keinekekse.net" // keycloakRealm = "app-server-realm" // keycloakClient = "pkce-book-app" @@ -164,3 +177,63 @@ fun main() = application { // strokeWidth = strokewidth // ) //} + +/* +System properties: +------------------ +java.specification.version=21 +sun.jnu.encoding=UTF-8 +java.class.path=/Users/hb/Workspaces/Kotlin/app/books/build/classes/kotlin/jvm/main:/Users/hb/Workspaces/Kotlin/app/books/build/classes/java/jvmMain:/Users/hb/Workspaces/Kotlin/app/books/build/processedResources/jvm/main:/Users/hb/Workspaces/Kotlin/app/shared/build/libs/shared-jvm.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-client-cio-jvm/3.4.0/84786f75d08fe5042f17c246380eb8381d125a6b/ktor-client-cio-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-client-auth-jvm/3.4.0/14d75d5e7552a8e26a2ad4dd511a76d4a0c5502f/ktor-client-auth-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-client-logging-jvm/3.4.0/278d41697d9194d36290842bfdae03d674b3f365/ktor-client-logging-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-client-content-negotiation-jvm/3.4.0/266c1aef9d340c22cd859dd5c9174c2e1d86489f/ktor-client-content-negotiation-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-client-java-jvm/3.4.0/4fcb8ec3488c8529773562d45e475533ab46f8ee/ktor-client-java-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-server-auth-jwt-jvm/3.4.0/f9c667cf2b122debb0081d0d69edb4caaa047d09/ktor-server-auth-jwt-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-server-auth-jvm/3.4.0/6c5fd0cb490bc7efabda621873c07b30b2e7f686/ktor-server-auth-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-client-core-jvm/3.4.0/1f017fc4dcf7e3ff5152a28923b7639a9ba82123/ktor-client-core-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-coroutines-slf4j/1.10.2/1271f9d4a929150bb87ab8d1dc1e86d4bcf039f3/kotlinx-coroutines-slf4j-1.10.2.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.components/components-resources-desktop/1.10.0/c6115b607f77e9d033de360f989850d3824bf112/library-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.material3/material3-desktop/1.10.0-alpha05/ebcf3065e9f7d408f8be2854b6542fb1dd51356f/material3-desktop-1.10.0-alpha05.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.insert-koin/koin-compose-viewmodel-jvm/4.2.0-RC1/635720e57068e85996de14fe99262210bd373bf9/koin-compose-viewmodel-jvm-4.2.0-RC1.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.insert-koin/koin-compose-jvm/4.2.0-RC1/f8d7e9c3bc6ab356961774f56a9e844158b1de42/koin-compose-jvm-4.2.0-RC1.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.desktop/desktop-jvm/1.10.0/42facd9840309ac4eb841a986c5d1b97d2780471/desktop-jvm-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.material/material-desktop/1.10.0/63e1c3c6705d111bf84e41110e7729df5b85163e/material-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.material/material-ripple-desktop/1.10.0/74a14824f086339703264689c5a7cf4ceb39ed40/material-ripple-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.foundation/foundation-desktop/1.10.0/439630673394b12a406fe398faaca548a13fdb72/foundation-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.material/material-icons-extended-desktop/1.7.0/c7c5465dd754043076875b32bce0dd7f5a354fe8/material-icons-extended-desktop-1.7.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.androidx.lifecycle/lifecycle-viewmodel-compose-desktop/2.9.6/5cf03bfbc0f7139a4d7081d5da78c97287f3c65f/lifecycle-viewmodel-compose-desktop-2.9.6.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.animation/animation-desktop/1.10.0/17f777e04f7fe5dff2fe7992d0c0bda81c3a3897/animation-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.foundation/foundation-layout-desktop/1.10.0/263364f922ef14fb64f1313a384a0c31cd6f3fa5/foundation-layout-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.material/material-icons-core-desktop/1.7.0/414b3096050fe647b0638832eace80f22c06b85c/material-icons-core-desktop-1.7.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.animation/animation-core-desktop/1.10.0/5dd98c5745e548644b7657901bbcc4c2c8f9ec59/animation-core-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.ui/ui-desktop/1.10.0/361220f423057a8dae48d6ba8a0294f0948caf8a/ui-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-serialization-kotlinx-json-jvm/3.4.0/2a09f17d70b6e61623fd8aff9bdce6d7877892/ktor-serialization-kotlinx-json-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-server-cio-jvm/3.4.0/16a50d239963841ae64e8e207f93ae7a5fdd7062/ktor-server-cio-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-server-sessions-jvm/3.4.0/35d3bb0535b2a6429b1eb73390cd4de9c541e654/ktor-server-sessions-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-server-core-jvm/3.4.0/97aba0f5e3cd539679907382a3f5783b9a563165/ktor-server-core-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.datastore/datastore-preferences-external-protobuf/1.2.0/200a891fd29602b4bcff8e197d243a372fb026d5/datastore-preferences-external-protobuf-1.2.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.datastore/datastore-preferences-proto/1.2.0/5d062b556fb45141138c3d86284bbdcbe07cc770/datastore-preferences-proto-1.2.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.datastore/datastore-preferences-core-jvm/1.2.0/94895322815c85066329ef177d5ff9ef5790cd45/datastore-preferences-core-jvm-1.2.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.datastore/datastore-core-okio-jvm/1.2.0/16e01a0603ce8cf206b21a304ff1ded7a9bff1da/datastore-core-okio-jvm-1.2.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.datastore/datastore-core-jvm/1.2.0/f7598a3f1657299cbff7b2bb4c421785765255df/datastore-core-jvm-1.2.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.datastore/datastore-preferences-jvm/1.2.0/c8587c46d39af5cd10a413007b233b56ac468756/datastore-preferences-jvm-1.2.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.datastore/datastore-jvm/1.2.0/81090c9ee3c129bb55eadbb4c16918e461c3dc2f/datastore-jvm-1.2.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.skiko/skiko-awt-runtime-macos-arm64/0.9.37.3/471d5afdecd5011d7c883edd77e01a47cbf2e02d/skiko-awt-runtime-macos-arm64-0.9.37.3.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.ui/ui-text-desktop/1.10.0/611728d97ab985b99c5d1d4709faeadfceac14bd/ui-text-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.ui/ui-graphics-desktop/1.10.0/c0b9e89e8f5ac5b0253d32d8da2758643ca1e19b/ui-graphics-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.skiko/skiko-awt/0.9.37.3/60077d9cd37ed4acf98f7833bab211981576ab4d/skiko-awt-0.9.37.3.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-coroutines-jdk8/1.10.2/809f71bf722bad7e78ebe8ec710c0327c23b7a31/kotlinx-coroutines-jdk8-1.10.2.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.ui/ui-tooling-preview-desktop/1.10.0/6d464d6c6d654d45aecdfaff7a08d64af62217e2/ui-tooling-preview-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.ui/ui-backhandler-desktop/1.10.0/ed725f86a0fdff73fb37561ffb606166725e4b6f/ui-backhandler-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.navigationevent/navigationevent-desktop/1.0.1/ddb1e7fe97ed51c3d35bba493f97fcf12398719/navigationevent-desktop-1.0.1.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.compose.runtime/runtime-annotation-jvm/1.10.0/ea491da34ba40ae9bd340c393566753ddfd95a76/runtime-annotation-jvm-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.compose.runtime/runtime-saveable-desktop/1.10.0/f6903c683c07ba479659ba4eb55bc7c80a7c433e/runtime-saveable-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.runtime/runtime-saveable-desktop/1.10.0/9b0e2a8ce3ae7d2b1a40307bc9271933b238cfd4/runtime-saveable-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.androidx.lifecycle/lifecycle-runtime-compose-desktop/2.9.6/7b6b6793f3c4c5996b20d1d99cf728e5fac00364/lifecycle-runtime-compose-desktop-2.9.6.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.ui/ui-unit-desktop/1.10.0/aeeb2f31358ab5abf0bafa0828de2faba7189db5/ui-unit-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.ui/ui-geometry-desktop/1.10.0/779ddaadbc03720f7bb2507f6ed6dc4ffc9e7f3e/ui-geometry-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.androidx.savedstate/savedstate-compose-desktop/1.3.6/63692375ffe667f12cb3ea8aa1e605d659ed2add/savedstate-compose-desktop-1.3.6.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.runtime/runtime-desktop/1.10.0/edbd39fc9691f4ba1e29c6690341148db4272752/runtime-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.insert-koin/koin-core-viewmodel-jvm/4.2.0-RC1/d86bef157979fd8a01d7ebe40bb7cae64a7e3130/koin-core-viewmodel-jvm-4.2.0-RC1.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-viewmodel-savedstate-desktop/2.9.4/72a1919b08c5a4da224d8a65ce1589aa69934e8a/lifecycle-viewmodel-savedstate-desktop-2.9.4.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-viewmodel-desktop/2.9.4/93fee6d78f0df0e38f36e0fa2eff74f8da6d5481/lifecycle-viewmodel-desktop-2.9.4.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-runtime-desktop/2.9.4/1cc820319ec0139e76b8a2fe4be0b356b4e624c4/lifecycle-runtime-desktop-2.9.4.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.savedstate/savedstate-compose-desktop/1.3.3/cd60b543d5722a8b5e6cea1e4ccdec8b4375a22b/savedstate-compose-desktop-1.3.3.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.savedstate/savedstate-desktop/1.3.3/1c5bfc3fb56614538528060a06f2c03e34fa5188/savedstate-desktop-1.3.3.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-common-jvm/2.9.4/ab739bccdb3541983385af169565c7c035d897e7/lifecycle-common-jvm-2.9.4.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-runtime-compose-desktop/2.9.4/86a4ffec845d4e488078118a0b5095bd1fabcafe/lifecycle-runtime-compose-desktop-2.9.4.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.compose.runtime/runtime-desktop/1.10.0/b1705e2087f06395622b784aa88e2e738043459/runtime-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.compose.runtime/runtime-retain-desktop/1.10.0/879812e3cd2c6151f5d91f515a35952b1be07a76/runtime-retain-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-http-cio-jvm/3.4.0/2c1f50d77b7d825175acf56f6cb494fc1145e23e/ktor-http-cio-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-websocket-serialization-jvm/3.4.0/20093fc55064238930e96c8dd12a2d96af6ff81d/ktor-websocket-serialization-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-serialization-kotlinx-jvm/3.4.0/d001db47b2ebe8ad8b2cb1bb2a687688840f5887/ktor-serialization-kotlinx-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-serialization-jvm/3.4.0/406af3e14bc41086ac933c02c67bd7ee762cfb4b/ktor-serialization-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-websockets-jvm/3.4.0/5c8a9438372c7de912cf6da0e275ec17056d6451/ktor-websockets-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-network-tls-jvm/3.4.0/10bb3d46d3fba6ccfc27f03fbeec029a756358b1/ktor-network-tls-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-http-jvm/3.4.0/81e4323a06aa6751f59ffe6e35e61277af17fdb5/ktor-http-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-events-jvm/3.4.0/d6e6800119bf169c0559eeaf49477757e50a736/ktor-events-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-sse-jvm/3.4.0/3b4493bfb71b536fc0c055d645ceb1a44b318637/ktor-sse-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-network-jvm/3.4.0/8d6179be0155e1d34f844a8317b7f1950772a372/ktor-network-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-utils-jvm/3.4.0/ce54b074feee2cc3cdac2ba93420f18adc71061d/ktor-utils-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-io-jvm/3.4.0/16e3233d00797f77f2b918a65d40479c28dc2bde/ktor-io-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-coroutines-core-jvm/1.10.2/4a9f78ef49483748e2c129f3d124b8fa249dafbf/kotlinx-coroutines-core-jvm-1.10.2.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-coroutines-swing/1.10.2/ccb5a2e7c83fa76da0ba4677f05678d3bd3eed57/kotlinx-coroutines-swing-1.10.2.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/net.keinekekse/util-jvm/0.3.0/34d1d3351568366f988f4a9e5e593801300ba2ea/util-jvm-0.3.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-reflect/2.3.0/a723c4fbeeb7b48910a0f82b8ea826da1b17dd0b/kotlin-reflect-2.3.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jdk8/2.2.20/57c4d839a6e5ad105d61ffc5cc0bf4de649c1714/kotlin-stdlib-jdk8-2.2.20.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.insert-koin/koin-annotations-jvm/4.2.0-RC1/881a2e7fe719af2cba0eba0ebdd7f1c386faad71/koin-annotations-jvm-4.2.0-RC1.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.insert-koin/koin-core-jvm/4.2.0-RC1/2f33e0b8ad4eca34f0af8b10756edbe00e392cf6/koin-core-jvm-4.2.0-RC1.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-serialization-core-jvm/1.9.0/91448df39c558f7c6147b8bd8db01debe16e0cc1/kotlinx-serialization-core-jvm-1.9.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-serialization-json-io-jvm/1.9.0/3a371942a591532d0d9245ca6787ee677853bebd/kotlinx-serialization-json-io-jvm-1.9.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-serialization-json-jvm/1.9.0/aea6f7d49fe5c458f8963ee6d4bdaf4a459ab3e7/kotlinx-serialization-json-jvm-1.9.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.ui/ui-util-desktop/1.10.0/fe41825dccacb792ded7df579736a0ed919ee270/ui-util-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/atomicfu-jvm/0.23.2/a4601dc42dceb031a586058e8356ff778a57dea0/atomicfu-jvm-0.23.2.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.graphics/graphics-shapes-desktop/1.1.0/a5d2198960bdc0915f74c6b2954d3323f35f40ea/graphics-shapes-desktop-1.1.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.collection/collection-jvm/1.5.0/7ba2c69414d46ebc2dd76598bdd0a75c54281a57/collection-jvm-1.5.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.arch.core/core-common/2.2.0/5e1b8b81dfd5f52c56a8d53b18ca759c19a301f3/core-common-2.2.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/androidx.annotation/annotation-jvm/1.9.1/b17951747e38bf3986a24431b9ba0d039958aa5f/annotation-jvm-1.9.1.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-datetime-jvm/0.7.1/81c2e0246bd28cc2dcbdf0ab53628322e66a9de9/kotlinx-datetime-jvm-0.7.1.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jdk7/2.2.20/bdbe3b5d872fa3b74d8fcd4e7ca3193f4abc9cc8/kotlin-stdlib-jdk7-2.2.20.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.insert-koin/koin-core-annotations-jvm/4.2.0-RC1/3288fc54a9fcf84283054319faf13ab35ecf25f2/koin-core-annotations-jvm-4.2.0-RC1.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/co.touchlab/stately-concurrent-collections-jvm/2.1.0/5c03b644537d7926a8f77e5735a8bebb55dafdcd/stately-concurrent-collections-jvm-2.1.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/co.touchlab/stately-concurrency-jvm/2.1.0/6285428408c4d7e4a6d9a09511de877103effd81/stately-concurrency-jvm-2.1.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/com.squareup.okio/okio-jvm/3.9.1/79696e3f4ff05d41ba2b3dc68adb5808a2e5dc53/okio-jvm-3.9.1.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/co.touchlab/stately-strict-jvm/2.1.0/3ae8369209065455f4630793bf6aca0fb88c8b6b/stately-strict-jvm-2.1.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-io-core-jvm/0.8.2/358a9f2ba2dc81c5dc84c3d1853f6e5efba63be1/kotlinx-io-core-jvm-0.8.2.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-io-bytestring-jvm/0.8.2/89c5399596250e71f2bba6d2415972a078a525c7/kotlinx-io-bytestring-jvm-0.8.2.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/2.3.20-Beta1/4747390fd8d9de1b004654c60ab80ddff4cc7da1/kotlin-stdlib-2.3.20-Beta1.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/23.0.0/8cc20c07506ec18e0834947b84a864bfc094484e/annotations-23.0.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/2.0.17/d9e58ac9c7779ba3bf8142aff6c830617a7fe60f/slf4j-api-2.0.17.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/com.typesafe/config/1.4.5/cc25b497ded7068a861517a815546fb472f9e58/config-1.4.5.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.fusesource.jansi/jansi/2.4.2/ba7387c31622c6650b83edba1bbb115f1fe462ba/jansi-2.4.2.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/com.auth0/java-jwt/4.5.0/d7004155fe57a107cc40fb6be0132d8ad2530613/java-jwt-4.5.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/com.auth0/jwks-rsa/0.23.0/76b14c3f09a1edea16856ec500a18030fa192065/jwks-rsa-0.23.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.runtime/jbr-api/1.5.0/4158e485a7a4ecfd521e03095d81e0225529e8d2/jbr-api-1.5.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-annotations/2.15.4/5223ea5a9bf52cdc9c5e537a0e52f2432eaf208b/jackson-annotations-2.15.4.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-databind/2.15.4/560309fc381f77d4d15c4a4cdaa0db5025c4fd13/jackson-databind-2.15.4.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-core/2.15.4/aebe84b45360debad94f692a4074c6aceb535fa0/jackson-core-2.15.4.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/32.1.2-jre/5e64ec7e056456bef3a4bc4c6fdaef71e8ab6318/guava-32.1.2-jre.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/com.google.guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/b421526c5f297295adef1c886e5246c39d4ac629/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/com.google.code.findbugs/jsr305/3.0.2/25ea2e8b0c338a877313bd4672d3fe056ea78f0d/jsr305-3.0.2.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.checkerframework/checker-qual/3.33.0/de2b60b62da487644fc11f734e73c8b0b431238f/checker-qual-3.33.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/com.google.errorprone/error_prone_annotations/2.18.0/89b684257096f548fa39a7df9fdaa409d4d4df91/error_prone_annotations-2.18.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jspecify/jspecify/1.0.0/7425a601c1c7ec76645a78d22b8c6a627edee507/jspecify-1.0.0.jar +sun.awt.enableExtraMouseButtons=true +java.vm.vendor=Eclipse Adoptium +sun.arch.data.model=64 +user.variant= +java.vendor.url=https://adoptium.net/ +java.vm.specification.version=21 +os.name=Mac OS X +user.country=DE +sun.java.launcher=SUN_STANDARD +sun.boot.library.path=/Library/Java/JavaVirtualMachines/temurin-21.jdk/Contents/Home/lib +sun.java.command=net.keinekekse.app.MainKt +http.nonProxyHosts=local|*.local|169.254/16|*.169.254/16 +jdk.debug=release +sun.cpu.endian=little +user.home=/Users/hb +user.language=de +java.specification.vendor=Oracle Corporation +java.version.date=2025-10-21 +java.home=/Library/Java/JavaVirtualMachines/temurin-21.jdk/Contents/Home +file.separator=/ +java.vm.compressedOopsMode=Non-zero disjoint base +line.separator= + +java.vm.specification.vendor=Oracle Corporation +java.specification.name=Java Platform API Specification +apple.awt.application.name=MainKt +sun.management.compiler=HotSpot 64-Bit Tiered Compilers +ftp.nonProxyHosts=local|*.local|169.254/16|*.169.254/16 +java.runtime.version=21.0.9+10-LTS +user.name=hb +stdout.encoding=UTF-8 +path.separator=: +os.version=26.2 +java.runtime.name=OpenJDK Runtime Environment +file.encoding=UTF-8 +java.vm.name=OpenJDK 64-Bit Server VM +java.vendor.version=Temurin-21.0.9+10 +java.vendor.url.bug=https://github.com/adoptium/adoptium-support/issues +java.io.tmpdir=/var/folders/tb/nj4p1kpn1fn__rhr8k1gvfhw0000gn/T/ +java.version=21.0.9 +user.dir=/Users/hb/Workspaces/Kotlin/app/books +os.arch=aarch64 +java.vm.specification.name=Java Virtual Machine Specification +native.encoding=UTF-8 +java.library.path=/Users/hb/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:. +java.vm.info=mixed mode, sharing +stderr.encoding=UTF-8 +java.vendor=Eclipse Adoptium +java.vm.version=21.0.9+10-LTS +sun.io.unicode.encoding=UnicodeBig +socksNonProxyHosts=local|*.local|169.254/16|*.169.254/16 +java.class.version=65.0 + */ diff --git a/books/src/jvmMain/resources/config.properties b/books/src/jvmMain/resources/config.properties new file mode 100644 index 0000000..e69de29 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 83262a8..2dea32f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -18,6 +18,8 @@ koin-plugin = "0.3.0" ktor = "3.4.0" logback = "1.5.26" material3 = "1.10.0-alpha05" +settings = "1.3.0" +dataStore = "1.2.0" uiDesktop = "1.7.0" [libraries] @@ -34,7 +36,7 @@ compose-materialIcons = { module = "org.jetbrains.compose.material:material-icon compose-ui = { module = "org.jetbrains.compose.ui:ui", version.ref = "composeMultiplatform" } compose-components-resources = { module = "org.jetbrains.compose.components:components-resources", version.ref = "composeMultiplatform" } compose-uiToolingPreview = { module = "org.jetbrains.compose.ui:ui-tooling-preview", version.ref = "composeMultiplatform" } -# -- +# ---- kotlinx-coroutinesSwing = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref = "kotlinx-coroutines" } kotlinx-html = { module = "org.jetbrains.kotlinx:kotlinx-html", version.ref = "kotlinx-html" } kotlin-wrappersCss = { module = "org.jetbrains.kotlin-wrappers:kotlin-css-jvm", version.ref = "kotlin-wrappers-css" } @@ -77,7 +79,12 @@ koin-compose-viewmodel-navigation = { module = "io.insert-koin:koin-compose-view #koin-compose-viewmodel-navigation3 = { module = "io.insert-koin:koin-compose-viewmodel-navigation3" } koin-ktor = { module = "io.insert-koin:koin-ktor" } koin-test = { module = "io.insert-koin:koin-test" } -# -- +# ---- + +# Settings vorerst ohne externe Hilfe +#multiplatformSettings = { module = "com.russhwolf:multiplatform-settings", version.ref = "settings" } +#androidx-datastore = { module = "androidx.datastore:datastore", version.ref = "dataStore" } +#androidx-datastore-preferences = { module = "androidx.datastore:datastore-preferences", version.ref = "dataStore" } [bundles] kotlin-compose = [ diff --git a/server/buildnumber.properties b/server/buildnumber.properties index 39c073d..f0f645b 100644 --- a/server/buildnumber.properties +++ b/server/buildnumber.properties @@ -1,3 +1,3 @@ #auto generated -#Tue Feb 03 00:47:38 CET 2026 -build.number=19 +#Wed Feb 04 23:56:00 CET 2026 +build.number=20 diff --git a/server/src/main/kotlin/net/keinekekse/app/server/Version.kt b/server/src/main/kotlin/net/keinekekse/app/server/Version.kt index f72f97e..68c17c5 100644 --- a/server/src/main/kotlin/net/keinekekse/app/server/Version.kt +++ b/server/src/main/kotlin/net/keinekekse/app/server/Version.kt @@ -3,14 +3,14 @@ package net.keinekekse.app.server import net.keinekekse.version.Version object VERSION: Version { - override val version = "0.1.0-beta.1+build.19" - override val fullVersion = "0.1.0-beta.1+build.19" + override val version = "0.1.0-beta.1+build.20" + override val fullVersion = "0.1.0-beta.1+build.20" override val major = 0 override val minor = 1 override val patch = 0 override val preRelease = "beta.1" - override val buildMetadata = "build.19" - override val buildDate = "2026-02-02T23:47:38.629893Z" + override val buildMetadata = "build.20" + override val buildDate = "2026-02-04T22:56:00.753833Z" override val displayName = "kAS" override val copyright = "Copyright (c) 2026 Hartmut Bauer" override val name = "server" diff --git a/shared/src/commonMain/kotlin/net/keinekekse/app/config/Settings.kt b/shared/src/commonMain/kotlin/net/keinekekse/app/config/Settings.kt new file mode 100644 index 0000000..0450c10 --- /dev/null +++ b/shared/src/commonMain/kotlin/net/keinekekse/app/config/Settings.kt @@ -0,0 +1,27 @@ +package net.keinekekse.app.config + +interface Settings { + fun get(key: String): String? + fun get(key: String, default: String): String = get(key) ?: default + fun getInt(key: String): Int? = get(key)?.toIntOrNull() + fun getInt(key: String, default: Int): Int = getInt(key) ?: default + fun getLong(key: String): Long? = get(key)?.toLongOrNull() + fun getLong(key: String, default: Long): Long = getLong(key) ?: default + fun getFloat(key: String): Float? = get(key)?.toFloatOrNull() + fun getFloat(key: String, default: Float): Float = getFloat(key) ?: default + fun getBoolean(key: String): Boolean? = get(key)?.toBooleanStrictOrNull() + fun getBoolean(key: String, default: Boolean): Boolean = getBoolean(key) ?: default + + fun put(key: String, value: String) + fun putInt(key: String, value: Int) + fun putLong(key: String, value: Long) + fun putFloat(key: String, value: Float) + fun putBoolean(key: String, value: Boolean) + + fun hasKey(key: String): Boolean = get(key) != null + fun remove(key: String) + fun clear() + + fun size(): Int + fun keys(): Set +} 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 0cec99a..7d7d6f4 100644 --- a/shared/src/commonMain/kotlin/net/keinekekse/app/ui/ProgressIndicator.kt +++ b/shared/src/commonMain/kotlin/net/keinekekse/app/ui/ProgressIndicator.kt @@ -10,6 +10,8 @@ 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/JvmSettings.kt b/shared/src/jvmMain/kotlin/net/keinekekse/app/config/JvmSettings.kt new file mode 100644 index 0000000..a3404c0 --- /dev/null +++ b/shared/src/jvmMain/kotlin/net/keinekekse/app/config/JvmSettings.kt @@ -0,0 +1,55 @@ +package net.keinekekse.app.config + +import java.util.prefs.Preferences + +class JvmSettings(clazz: Class<*>? = null) : Settings { + private val preferences: Preferences + + init { + if (clazz != null) { + preferences = Preferences.userNodeForPackage(clazz) + } else { + preferences = Preferences.userRoot() + } + } + + override fun get(key: String): String? { + return preferences.get(key, null) + } + + override fun put(key: String, value: String) { + preferences.put(key, value) + } + + override fun putInt(key: String, value: Int) { + preferences.putInt(key, value) + } + + override fun putLong(key: String, value: Long) { + preferences.putLong(key, value) + } + + override fun putFloat(key: String, value: Float) { + preferences.putFloat(key, value) + } + + override fun putBoolean(key: String, value: Boolean) { + preferences.putBoolean(key, value) + } + + override fun remove(key: String) { + preferences.remove(key) + } + + override fun clear() { + preferences.clear() + } + + override fun size(): Int { + return preferences.keys().size + } + + override fun keys(): Set { + return preferences.keys().toSet() + } +}