Files
loto/android/app/proguard-rules.pro
T
miti99 90a9dd1d1a feat: initial Android port of tiennm99/loto
Native Android port of the SvelteKit Lô tô hội chợ Tân Tân web app.

Stack:
- Kotlin 2.1 + Jetpack Compose + Material 3
- Single Activity, single Gradle module (:app)
- Audio: AndroidX Media3 ExoPlayer with bundled MP3 voice clips
- Settings: DataStore Preferences with legacy masterMode migration
- minSdk 24, targetSdk 35, JDK 17

Game logic:
- 9x9 player card with exactly 5 numbers per row AND per column
- Soft constraint: no 3 consecutive filled columns (rejection-sampled)
- 11x9 ones-digit-aligned master tracking board
- Bingo / Cho ("waiting") state machine ported from PlayerBoard.svelte
- Forward-only auto-tick from MasterPanel via app-scoped CallBus

Audio:
- 184 MP3s pre-generated with Microsoft Edge TTS (Hoai My, Nam Minh)
- ExoPlayer playlist for cho + N gapless sequence
- Token-based cancellation matching the web voice.js semantics

CI:
- build-debug.yml: lint + test + assembleDebug on push/PR
- release.yml: signed AAB+APK on v* tag, env-driven keystore
2026-04-27 19:33:16 +07:00

25 lines
842 B
Prolog

# Android ProGuard / R8 rules
# Default mode (not fullMode) keeps reflection-heavy Kotlin/AndroidX intact.
# kotlinx.serialization keep companion @Serializer references R8 can't infer
-keep,includedescriptorclasses class com.miti99.loto.**$$serializer { *; }
-keepclassmembers class com.miti99.loto.** {
*** Companion;
}
-keepclasseswithmembers class com.miti99.loto.** {
kotlinx.serialization.KSerializer serializer(...);
}
# Keep Kotlin metadata for runtime reflection
-keep class kotlin.Metadata { *; }
# Media3 / ExoPlayer internals prevent stripping of codec/extractor classes
-keep class androidx.media3.** { *; }
-dontwarn androidx.media3.**
# DataStore
-keep class androidx.datastore.** { *; }
# Compose tooling only exists in debug; suppress release warnings
-dontwarn androidx.compose.ui.tooling.**