- Rust 81.9%
- Java 15.7%
- Python 1%
- Shell 0.8%
- Dockerfile 0.6%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .woodpecker | ||
| android | ||
| assets/fonts | ||
| ci | ||
| scripts | ||
| src | ||
| tests | ||
| .gitignore | ||
| build-android.sh | ||
| Cargo.lock | ||
| Cargo.toml | ||
| DELTAUI_LIMITS.md | ||
| PLAN.md | ||
| README.md | ||
| release.jks | ||
Cyberpunk Launcher
Ein Android-Launcher (Home-Screen) in Rust, gebaut mit deltaui
und dessen Cyberpunk-Theme Theme::cybercore() (Neon-Cyan, Magenta, "Void"-Flächen).
Aufbau
| Pfad | Inhalt |
|---|---|
src/ui.rs |
Wurzel, Seitenwechsel, Home (Uhr, HUD, Dock) |
src/drawer.rs, src/term_ui.rs, src/notif_ui.rs |
Drawer, Terminal, Benachrichtigungen + Now Playing |
src/term.rs |
Terminal-Befehle (reine Logik, getestet) |
src/apps.rs, src/sys.rs, src/notif.rs, src/ha.rs |
App-Liste, Systemstatus, Benachrichtigungen/Medien, Home Assistant. Android: JNI zur Activity, Desktop: Fake-Daten |
src/lib.rs |
android_main-Einstieg, Theme-Setup |
src/main.rs |
Desktop-Vorschau |
android/ |
Gradle-Projekt, Manifest (HOME-Intent), MainActivity.java (PackageManager-Brücke) |
build-android.sh |
Baut .so (cargo-ndk) und APK |
Desktop-Vorschau und Tests
cargo run # Fenster mit Fake-Apps
SHOT_DIR=/tmp cargo test # headless Tests, schreibt /tmp/launcher.png
Android-APK
Voraussetzungen: Android SDK + NDK (ANDROID_HOME, ANDROID_NDK_HOME), JDK 17, Gradle,
rustup target add aarch64-linux-android, cargo install cargo-ndk.
./build-android.sh # release (mit Debug-Key signiert)
adb install -r android/app/build/outputs/apk/release/*.apk
Danach in den Android-Einstellungen unter Standard-Apps → Home-App "Cyberpunk Launcher" wählen.
APK aus Woodpecker
Jeder Push baut die APK (.woodpecker/android.yaml): Tests, Build, JNI-Check. Die signierte APK
landet in der Paketregistry von Forgejo (generisches Paket cyberpunk-launcher, Version
0.1.<commits>-<kurzer Hash>, Datei cyberpunk-launcher-<version>.apk):
<forgejo>/<besitzer>/-/packages/generic/cyberpunk-launcher. Pull Requests werden nur gebaut
und getestet (Woodpecker gibt ihnen keine Secrets).
Der Build läuft in einem eigenen Image (ci/Dockerfile: Rust mit Android-Target, cargo-ndk,
JDK 17, Android SDK/NDK, Gradle), das .woodpecker/builder.yaml in die Container-Registry von
Forgejo schiebt (git.hibas.dev/hibas123/cyberlauncher-builder:ndk27-gradle8.14). Es wird gebaut,
wenn sich ci/ auf main ändert, und einmalig von Hand (Run pipeline). Ändert sich eine Version
im Dockerfile, den Tag in beiden Pipelines anpassen. Dafür die Secrets forgejo_user und
forgejo_token (Events push, manual) anlegen und das Paket öffentlich machen (oder die Registry
in Woodpecker unter Registries hinterlegen), damit der Build es ziehen kann.
Damit Updates über die vorige Version installieren, braucht es einen festen Schlüssel. Einmalig:
keytool -genkeypair -keystore release.jks -alias launcher -keyalg RSA -keysize 4096 -validity 10000
base64 -w0 release.jks # Ausgabe als Secret signing_keystore_base64
In Woodpecker unter Repo → Settings → Secrets anlegen (Events push, tag, manual):
signing_keystore_base64, signing_store_password, signing_key_alias (launcher),
signing_key_password und forgejo_token (Forgejo-Token mit write:package). Ohne die
Signing-Secrets wird mit einem Debug-Key signiert, der sich pro Lauf ändert (dann vor der
Installation deinstallieren); ohne forgejo_token wird nichts hochgeladen.
Versionsnummer, lokal und in CI gleich (build-android.sh): versionCode = Anzahl der Commits,
versionName = 0.1.<commits>-<kurzer Hash> (+dirty bei uncommitteten Änderungen). Ein neuerer
Commit hat also immer den höheren versionCode, egal wo gebaut. Im Launcher zeigt version die
installierte Version.
Eigene Icons: icons im Terminal schreibt für jede App <paket>.png (432 px, wie das System es
zeigt), bei Adaptive Icons auch .fg.png/.bg.png (Ebenen) und .mono.png (Themed Icon,
Android 13+) sowie apps.tsv (Paket, Name) nach
/sdcard/Android/data/dev.hibas.cyberpunklauncher/files/icon-export/ und öffnet das Teilen-Menü mit
allem als cyberpunk-launcher-icons.zip (z. B. an Drive, Quick Share oder Mail). Per adb:
adb pull /sdcard/Android/data/dev.hibas.cyberpunklauncher/files/icon-export/
glyphs im Terminal zeigt alle eingebauten Glyphen mit ihren Namen (Zurück oder [X] schließt).
Funktionen
- Home: Uhr (Tippen öffnet die Wecker), HUD (Akku, Speicher, RAM, Signalstärke von WLAN und SIMs, Netz,
VPN/NetBird, nächste 3 Termine), Now Playing (Titel, Interpret, Zurück/Play-Pause/Weiter),
MSG//nungelesene Benachrichtigungen, Dock mit 10 Favoriten in zwei Reihen (leere zweite Reihe bleibt ausgeblendet). Neben einem Kamera-Ausschnitt zeigt eine Leiste Uhrzeit, Akku und WLAN-/SIM-Balken (mit 5G/4G), mittig auf der Höhe der Kamera. Die SIM-Anzeige braucht einmalig die Berechtigung Telefon (Tippen aufSIMim HUD) - Drawer (Swipe hoch): Terminal-Liste nach Buchstaben, A-Z-Leiste, Suche; Long-Press-Menü (Dock-Slot, App-Info, Deinstallieren)
- Terminal (Swipe links):
help,launch <app>,apps,status,battery,mem,storage,signal,net,date,cal,torch on|off,wifi,bluetooth,vol [0-100],dnd [on|off],settings [bereich],theme [name],bg [grid|anim|void|image],fx [on|off],cutout [on|off](Kamera-Ausschnitt-Overlay zum Testen),font [neon|tech|plex],vpn [open],alarm,notif [clear],media [play|pause|next|prev](auchplay,next, ...),ha ...(siehe unten),clear,exit; Vorschlags-Chips, Verlauf (gespeichert), Ausgabelog - Benachrichtigungen (Swipe runter): eigene Liste, Tippen öffnet,
[X]entfernt, alles löschen, Knopf zum System-Feld. Braucht einmalig Benachrichtigungszugriff (der Launcher fragt danach); derselbe Zugriff liefert Now Playing - Home Assistant im Terminal: einmalig
ha url http://homeassistant.local:8123undha token <Long-Lived-Token>(HA-Profil → Sicherheit). Dannha on|off|toggle <entität>,ha scene <name>,ha state <entität>,ha list [filter]. Kurznamen gehen (ha on küche), die Chips vervollständigen Entitäten. Der Token wird maskiert und nie im Verlauf gespeichert - Vibration bei Long-Press, Seitenwechsel, Medien-Tasten und Wegwischen
- Optik: vier Farbschemata (Cyan, Magenta, Amber, Matrix), Neon-Grid (statisch oder animiert), eigenes Hintergrundbild, Glitch-Übergang, Neon-Glow an der Uhr; alle Icons monochrom (eigene Glyphen, sonst Themed Icon, sonst Buchstabe)
- Fonts (alle OFL,
assets/fonts/):neon= JetBrains Mono + Orbitron-Uhr (Standard),tech= Share Tech Mono + Chakra Petch,plex= IBM Plex Mono + Chakra Petch - Akku: keine Dauer-Redraws; Timer laufen nur, solange ihre Seite sichtbar ist; der animierte Hintergrund ist optional
Back schließt Drawer, Terminal und Benachrichtigungen. Gespeichert werden Favoriten, Schema, Hintergrund, FX, Font-Set, Verlauf und die HA-Verbindung (im privaten App-Speicher).
NetBird: Android verrät nicht, welcher App ein VPN gehört. Ist ein VPN aktiv und NetBird
installiert, zeigt das HUD NETBIRD, sonst VPN.
Stand
Die UI und die Befehlslogik sind per cargo test geprüft (Desktop, headless). Der Android-Teil
baut: Rust für aarch64-linux-android und eine signierte Release-APK (mit dem Debug-Key). Er ist
noch nicht auf einem Gerät oder Emulator gelaufen (in der Sandbox gibt es kein KVM). Alle
JNI-/Java-Aufrufe (App-Liste, HUD, Kalender, Terminal-Aktionen, Themed Icons) sind ungetestet.
python3 scripts/check_jni.py gleicht alle JNI-Aufrufe in Rust mit den kompilierten Java-Signaturen ab
(fängt Tippfehler, die sonst erst zur Laufzeit crashen).
Gebaut gegen deltaui 0.0.19. Was dort noch fehlt (Theme-Umfärbung),
steht mit Repro und Vorschlag in DELTAUI_LIMITS.md.
Beim Gradle-Build kann Maven Central über einen Proxy mit HTTP 429 drosseln: einfach wiederholen, bereits geladene Artefakte bleiben im Cache.