12 Commits

Author SHA1 Message Date
b325d2b653 Improve tests 2026-01-21 12:22:38 +01:00
841960ecc5 Add tests 2026-01-14 17:36:57 +01:00
b207754636 Reduce cyclomatic complexity 2026-01-12 06:10:58 +01:00
a8a07d9c8a Add tests 2026-01-12 06:00:57 +01:00
Christian Basler
b05099da46 Fix keyboard control
- restart has now focus after
  solving puzzle
- removed options can be added again
- removing a selection by keypress
  makes a rollback as well
2026-01-09 19:51:29 +01:00
c6f7cbae2b Add Keyboard Control (WIP) 2026-01-09 07:40:00 +01:00
3582196720 Refactor adaptive layout 2026-01-09 07:40:00 +01:00
Christian Basler
25d4da4582 Add keyboard control (WIP, broken) 2026-01-09 07:39:54 +01:00
Christian Basler
e80ae7f722 Add keyboard control (WIP, broken) 2026-01-09 07:37:51 +01:00
0eef2a65dc Add keyboard control (WIP, broken) 2026-01-09 07:37:51 +01:00
984160bb44 Add keyboard control (WIP) 2026-01-09 07:37:51 +01:00
aab1fbda65 Add keyboard control (WIP) 2026-01-09 07:37:51 +01:00
11 changed files with 90 additions and 99 deletions

18
.fleet/receipt.json Normal file
View File

@@ -0,0 +1,18 @@
{
"spec": {
"template_id": "kmt",
"targets": {
"android": {
"ui": [
"compose"
]
},
"desktop": {
"ui": [
"compose"
]
}
}
},
"timestamp": "2024-04-29T06:04:57.807358293Z"
}

View File

@@ -23,8 +23,6 @@ jobs:
distribution: 'temurin' distribution: 'temurin'
- name: Setup Android SDK - name: Setup Android SDK
uses: android-actions/setup-android@v3 uses: android-actions/setup-android@v3
- name: Install missing packages
run: apt-get update; apt-get install -y libglu1-mesa-dev
- name: Cache SonarQube packages - name: Cache SonarQube packages
uses: actions/cache@v4 uses: actions/cache@v4
with: with:

View File

@@ -3,6 +3,7 @@ plugins {
alias(libs.plugins.android.application) alias(libs.plugins.android.application)
alias(libs.plugins.compose.compiler) alias(libs.plugins.compose.compiler)
alias(libs.plugins.compose) alias(libs.plugins.compose)
alias(libs.plugins.kotlin.android)
} }
android { android {
@@ -17,6 +18,23 @@ android {
versionName = libs.versions.app.version.name.get() versionName = libs.versions.app.version.name.get()
} }
dependencies {
implementation(compose.components.resources)
implementation(compose.runtime)
// implementation(compose.foundation)
implementation(compose.material3)
implementation(compose.ui)
implementation(compose.components.resources)
implementation(libs.androidx.activity.compose)
// implementation(libs.compose.ui.text.googlefonts)
implementation(projects.commonUI)
// implementation(compose.components.uiToolingPreview)
implementation(libs.androidx.tooling.preview)
testImplementation(libs.kotlin.test)
testImplementation(libs.atrium)
}
compileOptions { compileOptions {
sourceCompatibility = JavaVersion.toVersion(libs.versions.jdk.get()) sourceCompatibility = JavaVersion.toVersion(libs.versions.jdk.get())
targetCompatibility = JavaVersion.toVersion(libs.versions.jdk.get()) targetCompatibility = JavaVersion.toVersion(libs.versions.jdk.get())
@@ -24,11 +42,7 @@ android {
buildTypes { buildTypes {
release { release {
isMinifyEnabled = true isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
} }
debug { debug {
@@ -50,18 +64,6 @@ android {
} }
dependencies { dependencies {
implementation(projects.commonUI)
implementation(libs.compose.runtime)
implementation(libs.compose.ui)
implementation(libs.compose.material3)
implementation(libs.compose.components.resources)
implementation(libs.androidx.activity.compose)
implementation(libs.androidx.core.ktx) implementation(libs.androidx.core.ktx)
debugImplementation(libs.androidx.tooling)
implementation(libs.compose.ui.tooling.preview)
debugImplementation(libs.compose.ui.tooling)
testImplementation(libs.kotlin.test)
testImplementation(libs.atrium)
} }

View File

@@ -1,17 +0,0 @@
-dontwarn kotlinx.coroutines.debug.*
-dontwarn kotlinx.datetime.**
-keep class org.jetbrains.skia.** { *; }
-keep class org.jetbrains.skiko.** { *; }
-ignorewarnings
# Windows folders
-keep class com.sun.jna.* { *; }
-keepclassmembers class * extends com.sun.jna.* { public *; }
-assumenosideeffects public class androidx.compose.runtime.ComposerKt {
void sourceInformation(androidx.compose.runtime.Composer,java.lang.String);
void sourceInformationMarkerStart(androidx.compose.runtime.Composer,int,java.lang.String);
void sourceInformationMarkerEnd(androidx.compose.runtime.Composer);
}

View File

@@ -0,0 +1,12 @@
package ch.dissem.yaep.android
import ch.tutteli.atrium.api.fluent.en_GB.toEqual
import ch.tutteli.atrium.api.verbs.expect
import kotlin.test.Test
class DummyTest {
@Test
fun `ensure some test is run`() {
expect(true).toEqual(true)
}
}

View File

@@ -1,5 +1,5 @@
import com.android.build.gradle.internal.lint.AndroidLintTask import com.android.build.gradle.internal.lint.AndroidLintTask
import nl.littlerobots.vcu.plugin.resolver.VersionSelectors import com.github.benmanes.gradle.versions.updates.DependencyUpdatesTask
import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile
import org.sonarqube.gradle.SonarTask import org.sonarqube.gradle.SonarTask
@@ -8,14 +8,13 @@ plugins {
alias(libs.plugins.versions) alias(libs.plugins.versions)
alias(libs.plugins.sonarqube) alias(libs.plugins.sonarqube)
alias(libs.plugins.kotlin.kover) alias(libs.plugins.kotlin.kover)
alias(libs.plugins.spotless)
alias(libs.plugins.android.application) apply false alias(libs.plugins.android.application) apply false
alias(libs.plugins.android.library) apply false alias(libs.plugins.android.library) apply false
alias(libs.plugins.compose) apply false alias(libs.plugins.compose) apply false
alias(libs.plugins.compose.compiler) apply false alias(libs.plugins.compose.compiler) apply false
alias(libs.plugins.kotlin.multiplatform) apply false alias(libs.plugins.kotlin.multiplatform) apply false
alias(libs.plugins.kotlin.jvm) apply false alias(libs.plugins.kotlin.jvm) apply false
alias(libs.plugins.kotlin.android) apply false
} }
sonar { sonar {
@@ -46,26 +45,17 @@ tasks.withType<KotlinJvmCompile>().configureEach {
} }
} }
spotless { tasks.withType<DependencyUpdatesTask> {
kotlin { rejectVersionIf {
target("**/*.kt") isNonStable(candidate.version) && !isNonStable(currentVersion)
targetExclude("**/build/**", "**/.gradle/**")
// ktlint("1.5.0")
diktat("1.0.1")
}
kotlinGradle {
target("**/*.gradle.kts")
targetExclude("**/build/**", "**/.gradle/**")
ktlint("1.5.0")
} }
} }
versionCatalogUpdate { fun isNonStable(version: String): Boolean {
sortByKey = false return version.contains("dev", ignoreCase = true)
keep { || version.contains("alpha", ignoreCase = true)
keepUnusedVersions = true || version.contains("beta", ignoreCase = true)
} || version.contains("RC", ignoreCase = true)
versionSelector(VersionSelectors.STABLE)
} }
subprojects { subprojects {

View File

@@ -22,13 +22,13 @@ kotlin {
commonMain.dependencies { commonMain.dependencies {
api(projects.domain) api(projects.domain)
implementation(libs.compose.components.resources) implementation(compose.components.resources)
implementation(libs.compose.runtime) implementation(compose.runtime)
implementation(libs.compose.foundation) implementation(compose.foundation)
implementation(libs.compose.ui) implementation(compose.ui)
implementation(libs.compose.ui.tooling.preview) implementation(compose.components.uiToolingPreview)
implementation(libs.compose.material3) implementation(compose.material3)
implementation(libs.bundles.logging) implementation(libs.bundles.logging)
} }
@@ -37,7 +37,8 @@ kotlin {
implementation(libs.kotlin.test) implementation(libs.kotlin.test)
implementation(libs.atrium) implementation(libs.atrium)
implementation(libs.compose.ui.test) @OptIn(org.jetbrains.compose.ExperimentalComposeLibrary::class)
implementation(compose.uiTest)
} }
jvmTest.dependencies { jvmTest.dependencies {
@@ -45,7 +46,7 @@ kotlin {
} }
androidMain.dependencies { androidMain.dependencies {
implementation(libs.compose.foundation) implementation(libs.androidx.compose.foundation)
} }
} }
} }

View File

@@ -12,14 +12,14 @@ kotlin {
dependencies { dependencies {
implementation(compose.desktop.currentOs) implementation(compose.desktop.currentOs)
implementation(libs.compose.material3) implementation(compose.material3)
implementation(libs.compose.components.resources) implementation(compose.components.resources)
implementation(projects.commonUI) implementation(projects.commonUI)
implementation(libs.compose.ui.tooling.preview) implementation(compose.components.uiToolingPreview)
testImplementation(libs.kotlin.test) testImplementation(libs.kotlin.test)
testImplementation(libs.atrium) testImplementation(libs.atrium)
testImplementation(libs.compose.ui.test.desktop) testImplementation(compose.desktop.uiTestJUnit4)
testImplementation(compose.desktop.currentOs) testImplementation(compose.desktop.currentOs)
} }
} }

View File

@@ -9,12 +9,3 @@ android.useAndroidX=true
#MPP #MPP
kotlin.mpp.androidSourceSetLayoutVersion=2 kotlin.mpp.androidSourceSetLayoutVersion=2
#android.defaults.buildfeatures.resvalues=true
#android.enableAppCompileTimeRClass=false
#android.usesSdkInManifest.disallowed=false
#android.uniquePackageNames=false
#android.dependency.useConstraints=true
#android.r8.strictFullModeForKeepRules=false
#android.r8.optimizedResourceShrinking=false
#android.builtInKotlin=false
#android.newDsl=false

View File

@@ -1,28 +1,26 @@
[versions] [versions]
app-version-code = "1" app-version-code = "1"
app-version-name = "1.0.0" app-version-name = "1.0.0"
agp = "9.0.0" agp = "8.13.2"
jdk = "21" jdk = "21"
android-compileSdk = "36" android-compileSdk = "36"
android-minSdk = "26" android-minSdk = "26"
android-targetSdk = "36" android-targetSdk = "36"
androidx-activityCompose = "1.12.2"
androidx-compose = "1.10.0"
compose-plugin = "1.9.3"
kotlin = "2.3.0" kotlin = "2.3.0"
coreKtx = "1.17.0"
atrium = "1.2.0"
[libraries] [libraries]
androidx-activity-compose = { module = "androidx.activity:activity-compose", version = "1.12.2" } androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidx-activityCompose" }
androidx-core-ktx = { module = "androidx.core:core-ktx", version = "1.17.0" } androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "coreKtx" }
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" }
compose-runtime = { module = "org.jetbrains.compose.runtime:runtime", version = "1.10.0" } atrium = { module = "ch.tutteli.atrium:atrium-fluent", version.ref = "atrium" }
compose-foundation = { module = "org.jetbrains.compose.foundation:foundation", version = "1.10.0" }
compose-material3 = { module = "org.jetbrains.compose.material3:material3", version = "1.10.0-alpha05" }
compose-ui = { module = "org.jetbrains.compose.ui:ui", version = "1.10.0" }
compose-components-resources = { module = "org.jetbrains.compose.components:components-resources", version = "1.10.0" }
compose-ui-tooling = { module = "org.jetbrains.compose.ui:ui-tooling", version = "1.10.0" }
compose-ui-tooling-preview = { module = "org.jetbrains.compose.ui:ui-tooling-preview", version = "1.10.0" }
compose-ui-test = { module = "org.jetbrains.compose.ui:ui-test", version = "1.10.0" }
compose-ui-test-desktop = { module = "org.jetbrains.compose.ui:ui-test-desktop", version = "1.10.0" }
atrium = { module = "ch.tutteli.atrium:atrium-fluent", version = "1.2.0" }
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" }
@@ -33,15 +31,13 @@ logging-slf4j = { module = "org.slf4j:slf4j-simple", version = "2.0.17" }
logging = ["logging-jvm", "logging-slf4j"] logging = ["logging-jvm", "logging-slf4j"]
[plugins] [plugins]
versions = { id = "com.github.ben-manes.versions", version = "0.53.0" }
android-application = { id = "com.android.application", version.ref = "agp" } android-application = { id = "com.android.application", version.ref = "agp" }
android-library = { id = "com.android.kotlin.multiplatform.library", version.ref = "agp" } android-library = { id = "com.android.kotlin.multiplatform.library", version.ref = "agp" }
kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
compose = { id = "org.jetbrains.compose", version = "1.10.0" } compose = { id = "org.jetbrains.compose", version.ref = "compose-plugin" }
versions = { id = "nl.littlerobots.version-catalog-update", version = "1.0.1" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
# Code Analysis Tools and Linters
sonarqube = { id = "org.sonarqube", version = "7.2.2.6593" } sonarqube = { id = "org.sonarqube", version = "7.2.2.6593" }
spotless = { id = "com.diffplug.spotless", version = "8.2.0" }
kotlin-kover = { id = "org.jetbrains.kotlinx.kover", version = "0.9.4" } kotlin-kover = { id = "org.jetbrains.kotlinx.kover", version = "0.9.4" }

View File

@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
networkTimeout=10000 networkTimeout=10000
validateDistributionUrl=true validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME