Add a standalone Android app with the same daily reading and config page
build / build (push) Successful in 4m8s

android/ links engine/src/ and interpreter/src/ via JNI/CMake (real
astronomy.c, not the watch's size-constrained substitute), rendering
through Jetpack Compose with a burger-menu config page mirroring
WatchConfig and a WorkManager-driven daily notification. Independent
of the watch app - neither requires the other.

build-image now bundles the Android SDK/NDK alongside the Pebble SDK
(VERSION bumped to 2), and .gitea/workflows/build.yml/Makefile/
run-image.sh build and publish the APK the same way as the CLI
tarball and .pbw.
This commit is contained in:
ml
2026-07-18 22:41:51 +02:00
parent a3e437277f
commit 3bc1263294
49 changed files with 2530 additions and 43 deletions
+43
View File
@@ -0,0 +1,43 @@
# Deck in a Dash — Android app
A standalone Android app showing the same daily tarot (Celtic Cross) +
astrology reading as the Pebble watch app (`../watch/`), with a burger
menu leading to a config page. Independent of the watch app - neither
requires the other to be installed. See the root
[`CLAUDE.md`](../CLAUDE.md)'s "Android app" section for the full
architecture (JNI-linked engine/interpreter, JSON bridge schema,
WorkManager notification, card art pipeline).
## Building
Requires:
- A JDK (17+; the project's own `compileOptions`/toolchain target Java
17). `JAVA_HOME` should point at it, or a `java` matching that version
must be first on `PATH`.
- The Android SDK, with `ANDROID_HOME` (or `ANDROID_SDK_ROOT`) set -
needs at minimum `platforms;android-36`, `build-tools;36.0.0`,
`ndk;30.0.14904198`, and `cmake;3.22.1` installed (see
`app/build.gradle.kts`'s `compileSdk`/`ndkVersion` and
`app/src/main/jni/CMakeLists.txt`'s `cmake_minimum_required` for the
exact versions this project pins - `../build-image/Dockerfile`
installs the same ones for CI).
- `ANDROID_NDK_HOME` set to that installed NDK's directory.
- Python 3 + Pillow (`pip install Pillow`) - needed by
`scripts/gen_card_images.py`/`gen_launcher_icon.py`, which Gradle's
`preBuild` task runs automatically (see `app/build.gradle.kts`).
```bash
./gradlew assembleDebug # -> app/build/outputs/apk/debug/app-debug.apk
```
Or, from the repo root: `make android`, which wraps the above and
copies the APK into `dist/deck-in-a-dash-<version>.pbw`'s sibling,
`dist/deck-in-a-dash-<version>.apk` (same version resolution as `make
package`/`make watchapp` - see the root `Makefile`).
The Gradle wrapper (`./gradlew`) resolves its own pinned Gradle version
on first run - no separate Gradle install is needed.
Ships the Android auto-generated debug keystore, not a release-signed
build - see the root `CLAUDE.md`'s Android section for why.