Skip to content

Upgrade to Kotlin 2.4.10 / AGP 9.1.1 and add on-screen keyboard UX#22

Merged
joreilly merged 2 commits into
mainfrom
agp9-upgrade-and-keyboard-ux
Jul 20, 2026
Merged

Upgrade to Kotlin 2.4.10 / AGP 9.1.1 and add on-screen keyboard UX#22
joreilly merged 2 commits into
mainfrom
agp9-upgrade-and-keyboard-ux

Conversation

@joreilly

Copy link
Copy Markdown
Owner

Summary

Two related pieces of work:

Dependency / toolchain upgrade (versions queried from live registries, not guessed)

  • Kotlin 2.2.02.4.10, KSP → 2.3.10, coroutines → 1.11.0
  • AGP 8.12.09.1.1; Gradle wrapper 9.0.09.6.1 (AGP 9.1.1 needs ≥9.3.1)
  • Compose Multiplatform 1.8.21.11.1, activity-compose 1.13.0, compose-bom 2026.06.01, lifecycle 2.11.0, okio 3.17.0, kmp-nativecoroutines 1.0.5
  • AGP 9 migration: shared moves to com.android.kotlin.multiplatform.library; androidApp drops kotlin("android") (built-in Kotlin). Config moved into kotlin { android { } }.
  • compileSdk/targetSdk 36 → 37 — forced by lifecycle 2.11.0.
  • iOS SwiftPM pin for KMP-NativeCoroutines aligned to 1.0.5 to match the Gradle plugin.
  • CI updated: :shared:testDebugUnitTest:shared:jvmTest (the former no longer exists under the new plugin).

On-screen keyboard UX overhaul

  • Replaced the editable-TextField-per-cell boards (and their brittle FocusRequester juggling) with read-only tiles driven by a shared on-screen QWERTY keyboard.
  • WordMasterService gains addLetter / removeLetter / submitGuess, word-list validation (isValidWord), a keyStatus flow that colours the keyboard by best-known letter status, and a guessError flow for feedback.
  • Rejected guesses now shake the active row + show a message ("Not enough letters" / "Not in word list") instead of failing silently.
  • Applied across Android (Material 3), Desktop (Material 2, also wired to the physical keyboard), and iOS (SwiftUI).

Test plan

  • ./gradlew :androidApp:assembleDebug
  • ./gradlew :compose-desktop:assemble
  • ./gradlew :shared:jvmTest (existing logic test still green)
  • ./gradlew :shared:compileKotlinIosArm64 + framework link
  • Full iOS app xcodebuild for the simulator → BUILD SUCCEEDED
  • Screenshot in README still shows the old UI — needs a fresh capture from a running client

Note: WordMasterServiceTest fails on iosSimulatorArm64Test due to a pre-existing relative-path bug (../words.txt doesn't resolve in the simulator sandbox); confirmed it fails identically on main before these changes, so it's out of scope here.

🤖 Generated with Claude Code

joreilly and others added 2 commits July 21, 2026 00:12
Toolchain: bump Kotlin, AGP (9.1.1 requires the KMP library plugin split
and built-in Kotlin, so shared moves to com.android.kotlin.multiplatform.library
and androidApp drops kotlin("android")), Gradle wrapper 9.6.1, Compose,
coroutines, AndroidX and okio to current stable. lifecycle 2.11.0 forces
compileSdk 37. iOS SwiftPM KMP-NativeCoroutines pinned to 1.0.5 to match the
Gradle plugin. CI runs :shared:jvmTest since testDebugUnitTest no longer exists
under the new plugin.

UX: replace the fragile editable-TextField-per-cell boards with read-only tiles
driven by a shared on-screen keyboard. WordMasterService gains addLetter/
removeLetter/submitGuess with word-list validation, a keyStatus flow that colours
the keyboard, and a guessError flow for feedback. Rejected guesses now shake the
row and show a message instead of failing silently. Applied across Android,
Desktop (also wired to the physical keyboard) and iOS.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Replace the single monolithic workflow with one per client. Android and
Desktop run on ubuntu-latest (they don't touch the iOS targets, so no need
for a macOS runner); iOS builds the app via xcodebuild on macos-latest.
Also modernise to checkout@v4 / setup-java@v4 (temurin).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@joreilly
joreilly merged commit a92a081 into main Jul 20, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant