From f69933c74d590e9c220549cc7888a11932933d21 Mon Sep 17 00:00:00 2001 From: Christian Basler Date: Mon, 2 Jun 2025 20:56:12 +0200 Subject: [PATCH] Android UI (WIP) --- android/build.gradle.kts | 5 +- .../kotlin/ch/dissem/android/MainActivity.kt | 59 ++++++++++++++++++- commonUI/build.gradle.kts | 4 ++ desktop/build.gradle.kts | 2 +- domain/build.gradle.kts | 10 ++++ .../ch/dissem/yaep/domain/GameSolverTest.kt | 2 +- gradle/libs.versions.toml | 5 +- 7 files changed, 79 insertions(+), 8 deletions(-) diff --git a/android/build.gradle.kts b/android/build.gradle.kts index 2d8da57..44d234d 100644 --- a/android/build.gradle.kts +++ b/android/build.gradle.kts @@ -13,8 +13,8 @@ android { applicationId = "ch.dissem.yaep" minSdk = libs.versions.android.minSdk.get().toInt() targetSdk = libs.versions.android.targetSdk.get().toInt() - versionCode = 1 - versionName = "1.0" + versionCode = libs.versions.app.version.code.get().toInt() + versionName = libs.versions.app.version.name.get() } dependencies { @@ -56,4 +56,5 @@ android { } dependencies { implementation(libs.androidx.core.ktx) + debugImplementation(libs.androidx.tooling) } diff --git a/android/src/main/kotlin/ch/dissem/android/MainActivity.kt b/android/src/main/kotlin/ch/dissem/android/MainActivity.kt index 1ffdd89..14c24bb 100644 --- a/android/src/main/kotlin/ch/dissem/android/MainActivity.kt +++ b/android/src/main/kotlin/ch/dissem/android/MainActivity.kt @@ -4,23 +4,69 @@ import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.layout.padding +import androidx.compose.material3.CenterAlignedTopAppBar +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview +import ch.dissem.yaep.domain.Game +import ch.dissem.yaep.domain.generateGame import ch.dissem.yaep.ui.common.App +import org.jetbrains.compose.resources.painterResource +import org.jetbrains.compose.resources.stringResource +import yaep.commonui.generated.resources.action_restart +import yaep.commonui.generated.resources.app_name +import yaep.commonui.generated.resources.restart +import yaep.commonui.generated.resources.Res as CRes class MainActivity : ComponentActivity() { + @OptIn(ExperimentalMaterial3Api::class) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { + var game by remember { mutableStateOf(generateGame()) } + var resetCluesBeacon by remember { mutableStateOf(Any()) } + Scaffold( topBar = { - + CenterAlignedTopAppBar( + title = { + Text(text = stringResource(CRes.string.app_name)) + }, + navigationIcon = { }, + actions = { + IconButton( + onClick = { + do { + // continue + } while (game.grid.undo()) + resetCluesBeacon = Any() + } + ) { + Icon( + painter = painterResource(CRes.drawable.action_restart), + contentDescription = stringResource(CRes.string.restart) + ) + } + }, + ) } ) { insets -> - App(modifier = Modifier.padding(insets)) + App( + modifier = Modifier.padding(insets), + game = game, + onNewGame = { game = generateGame() }, + resetCluesBeacon = resetCluesBeacon + ) } } } @@ -29,5 +75,12 @@ class MainActivity : ComponentActivity() { @Preview @Composable fun AppAndroidPreview() { - App() + var game by remember { mutableStateOf(generateGame()) } + var resetCluesBeacon by remember { mutableStateOf(Any()) } + + App( + game = game, + onNewGame = { game = generateGame() }, + resetCluesBeacon = resetCluesBeacon + ) } diff --git a/commonUI/build.gradle.kts b/commonUI/build.gradle.kts index c676de0..79ef380 100644 --- a/commonUI/build.gradle.kts +++ b/commonUI/build.gradle.kts @@ -54,6 +54,10 @@ android { compileSdk = libs.versions.android.compileSdk.get().toInt() namespace = "ch.dissem.yaep.common.ui" + defaultConfig { + minSdk = libs.versions.android.minSdk.get().toInt() + } + buildFeatures { compose = true } diff --git a/desktop/build.gradle.kts b/desktop/build.gradle.kts index 645fc16..0ca2bd2 100644 --- a/desktop/build.gradle.kts +++ b/desktop/build.gradle.kts @@ -30,7 +30,7 @@ compose.desktop { nativeDistributions { targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) packageName = "YAEP" - packageVersion = "1.0.0" + packageVersion = libs.versions.app.version.name.get() macOS { iconFile.set(project.file("icon.icns")) } diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts index ef4bf13..395ac53 100644 --- a/domain/build.gradle.kts +++ b/domain/build.gradle.kts @@ -37,4 +37,14 @@ kotlin { android { compileSdk = libs.versions.android.compileSdk.get().toInt() namespace = "ch.dissem.yaep.domain" + + defaultConfig { + minSdk = libs.versions.android.minSdk.get().toInt() + } + + sourceSets { + getByName("test") { + resources.srcDirs("src/commonTest/resources") + } + } } \ No newline at end of file diff --git a/domain/src/commonTest/kotlin/ch/dissem/yaep/domain/GameSolverTest.kt b/domain/src/commonTest/kotlin/ch/dissem/yaep/domain/GameSolverTest.kt index 66ee851..3adf179 100644 --- a/domain/src/commonTest/kotlin/ch/dissem/yaep/domain/GameSolverTest.kt +++ b/domain/src/commonTest/kotlin/ch/dissem/yaep/domain/GameSolverTest.kt @@ -34,7 +34,7 @@ class GameSolverTest { @Test fun `ensure game can be solved`() { - val gameString = this.javaClass.classLoader.getResourceAsStream("games/001.yaep")!! + val gameString = this::class.java.getResourceAsStream("/games/001.yaep")!! .bufferedReader() .readText() val game = Game.parse(gameString) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e784824..27f483b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,4 +1,6 @@ [versions] +app-version-code = "1" +app-version-name = "1.0.0" agp = "8.10.1" jdk = "21" android-compileSdk = "35" @@ -13,6 +15,7 @@ atrium = "1.2.0" [libraries] androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidx-activityCompose" } +androidx-tooling = { module = "androidx.compose.ui:ui-tooling", version.ref = "androidx-compose" } androidx-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview", version.ref = "androidx-compose" } androidx-compose-foundation = { module = "androidx.compose.foundation:foundation", version.ref = "androidx-compose" } kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } @@ -23,7 +26,7 @@ logging-jvm = { module = "io.github.oshai:kotlin-logging-jvm", version = "7.0.7" logging-slf4j = { module = "org.slf4j:slf4j-simple", version = "2.0.17" } [bundles] -logging = [ "logging-jvm", "logging-slf4j" ] +logging = ["logging-jvm", "logging-slf4j"] [plugins] versions = { id = "com.github.ben-manes.versions", version = "0.51.0" }