61 lines
3.1 KiB
Markdown
61 lines
3.1 KiB
Markdown
# android-webview-kiosk
|
|
|
|
Android TV app: fullscreen WebView kiosk.
|
|
Multiple APK flavors built from `webviews.yaml` (repo root) — one APK per entry.
|
|
Runs on the living-room Sony Bravia KD-65XE9305 (Android 8.0, API 26;
|
|
Android System WebView updates independently via Play Store — currently v138).
|
|
Launched remotely through the Bravia REST IP-control API by Control4
|
|
(driver lives in a separate project). See README.md for the API sequence.
|
|
|
|
## Lab project — with deviations
|
|
|
|
This is a lab project (`lab` skill conventions apply) EXCEPT:
|
|
|
|
- No container image, no helm chart, no /livez//readyz — artifact is an APK.
|
|
- No `nix build`: gradle needs network for Maven deps. The flake is a dev
|
|
shell only. All builds run as `nix develop --command gradle ...`.
|
|
- Agents cannot run nix/gradle/adb here — ask the user to run commands
|
|
and report output.
|
|
|
|
## NixOS aapt2 workaround
|
|
|
|
AGP cannot run the Maven-downloaded aapt2 on NixOS (dynamically linked
|
|
generic Linux binary). The flake's dev shell ships a wrapped `gradle` that
|
|
always passes `-Dorg.gradle.project.android.aapt2FromMavenOverride=<sdk
|
|
aapt2>` on the command line; Gradle turns `org.gradle.project.*` system
|
|
props into project properties, which is what AGP reads. It must be a CLI
|
|
arg: the nixpkgs-25.11 gradle wrapper ignores `GRADLE_OPTS` (fixed
|
|
post-25.11, nixpkgs PR #449037 — the flake wrapper can be dropped once
|
|
the pin moves past 25.11). No file rewriting; `gradle.properties` stays
|
|
untouched.
|
|
|
|
## Commands (user-run, from repo root)
|
|
|
|
- Tests: `nix develop --command gradle --no-daemon :app:testWeatherReleaseUnitTest`
|
|
- All APKs: `nix develop --command gradle --no-daemon :app:assembleRelease`
|
|
→ `app/build/outputs/apk/<flavor>/release/<flavor>-release.apk`
|
|
- Single APK: `nix develop --command gradle --no-daemon :app:assembleWeatherRelease`
|
|
- Sideload: `adb connect <tv-ip>:5555 && adb install -r <apk>`
|
|
(bump `versionCode` in app/build.gradle.kts first for upgrades)
|
|
- Fresh install: `adb uninstall cz.c3c.webviewkiosk && adb install <apk>`
|
|
|
|
## Key facts
|
|
|
|
- Package/applicationId: `cz.c3c.webviewkiosk`; repo name keeps the
|
|
`android-` prefix, the package can't (hyphens illegal).
|
|
- Webview URL + label configured in `webviews.yaml` (repo root). Each
|
|
entry becomes a product flavor with `applicationIdSuffix = ".<name>"`;
|
|
`BuildConfig.WEBVIEW_URL` is injected at build time. Changing a URL means
|
|
editing the YAML, rebuilding, resideloading. Intentional: keeps Control4
|
|
integration to a single parameterless launch call.
|
|
- `signing/release.keystore` is committed on purpose (private repo,
|
|
LAN-only kiosk) so every build is upgrade-compatible. Don't reuse the key.
|
|
- minSdk 26 is a hard floor — the TV never gets newer Android.
|
|
- `LEANBACK_LAUNCHER` category + `android:banner` are what make the app
|
|
visible to the Bravia API's `getApplicationList`/`setActiveApp`. Don't
|
|
remove either.
|
|
- App URIs (from `getApplicationList`) are per-flavor, e.g. weather:
|
|
`com.sony.dtv.cz.c3c.webviewkiosk.weather.cz.c3c.webviewkiosk.weather.MainActivity`
|
|
- `setActiveApp` alone wakes the TV from standby — no separate
|
|
`setPowerStatus` call needed. Control4 driver can skip the wake step.
|