No description
  • Rust 81.9%
  • Java 15.7%
  • Python 1%
  • Shell 0.8%
  • Dockerfile 0.6%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Fabian Stamm 9c56b20ab8
All checks were successful
ci/woodpecker/tag/android Pipeline was successful
ci/woodpecker/push/android Pipeline was successful
Page transitions: terminal and app list also slide out when leaving (shown page follows the target after the slide); tests run with transitions off
2026-11-08 20:02:40 +01:00
.woodpecker CI: create a Forgejo release with the APK for tags (for Obtainium) 2026-11-05 14:55:17 +01:00
android No flicker when returning: keep the live surface invisible until the cover goes (stale-inset first frame and translucent overlap); document in DELTAUI_LIMITS (L45) 2026-11-07 01:50:19 +01:00
assets/fonts Bundle fonts, font sets with neon clock; fix crash when launching from drawer 2026-11-04 19:42:39 +00:00
ci CI: build image with the Android toolchain, pushed to the Forgejo registry 2026-11-05 14:06:44 +01:00
scripts Fix native crash on start: games-activity 4.4.0 2026-11-04 21:52:04 +00:00
src Page transitions: terminal and app list also slide out when leaving (shown page follows the target after the slide); tests run with transitions off 2026-11-08 20:02:40 +01:00
tests Page transitions: terminal and app list also slide out when leaving (shown page follows the target after the slide); tests run with transitions off 2026-11-08 20:02:40 +01:00
.gitignore Add Cyberpunk launcher built on deltaui with the cybercore theme 2026-11-04 17:20:21 +00:00
build-android.sh SIM rows: Wi-Fi calling (IWLAN) no longer hides the generation and name; add a dev build variant 2026-11-05 23:01:16 +01:00
Cargo.lock Update deltaui to 0.0.25 (first frame about 145 ms: Vulkan first, small GPU memory blocks, 2048 image atlas) 2026-11-07 11:40:15 +01:00
Cargo.toml Update deltaui to 0.0.25 (first frame about 145 ms: Vulkan first, small GPU memory blocks, 2048 image atlas) 2026-11-07 11:40:15 +01:00
DELTAUI_LIMITS.md No flicker when returning: keep the live surface invisible until the cover goes (stale-inset first frame and translucent overlap); document in DELTAUI_LIMITS (L45) 2026-11-07 01:50:19 +01:00
PLAN.md Upgrade to deltaui 0.0.16 and use its new APIs 2026-11-04 20:08:53 +00:00
README.md Top bar centers on the camera lens; 'cutout' terminal command toggles a debug overlay 2026-11-05 16:09:34 +01:00
release.jks Terminal: icons exports every app's icon and its layers as PNG 2026-11-05 14:33:16 +01:00

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//n ungelesene 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 auf SIM im 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] (auch play, 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:8123 und ha token <Long-Lived-Token> (HA-Profil → Sicherheit). Dann ha 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.