Vier Beweise, die das Projekt tragen, als eigenständig lauffähige Skripte:
S1 Plasma Mobile in proot über genestetes kwin_wayland im X11-Backend.
Fällt selbsttätig auf startplasmamobile und dann auf XFCE zurück, damit
ein Fehlschlag eindeutig Plasma zuzuordnen ist und nicht der Umgebung.
S2 Mikrofon über PulseAudio mit OpenSL-Quelle. Misst den Pegel statt nur die
Dateigröße — der typische Fehlschlag ist eine formal korrekte WAV-Datei
voller Stille.
S3 Virtuelle PipeWire-Kamera per GStreamer-pipewiresink, ohne Kernel-Modul.
Setzt die Firefox-Einstellung vorab, damit der Test nicht an einem
vergessenen Häkchen scheitert.
S4 Intent-Handoff mit lauffähiger Mini-Bridge: xdg-open-Handler für geo:,
tel: und sms:, Token-Authentifizierung, feste Liste erlaubter Schemata.
provision/provision.sh setzt die Hintergrundbeschränkungen per ADB und benennt,
was ADB nicht kann und von Hand erledigt werden muss.
Dokumentiert sind auch die sieben verworfenen Wege — Waydroid, AVF, QEMU, SIP,
APK-Daten-Redirect, Fenster-Durchreichung und der Android-Server — mit Belegen,
damit sie nicht erneut durchdacht werden müssen.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
97 lines
4.2 KiB
Bash
Executable File
97 lines
4.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Phase 0 · Beweis S4 — Intent-Handoff vom Linux zur Android-App.
|
|
#
|
|
# Die Wette: statt Android-Apps ins Linux zu streamen, übergibt das Linux eine
|
|
# Absicht und die App öffnet nativ im Vollbild. Für Navigation ist das nicht der
|
|
# Kompromiss, sondern die bessere Lösung — volles GPU, volles GPS, und Overlay-Apps
|
|
# funktionieren, was über einem gestreamten Fenster gar nicht ginge.
|
|
#
|
|
# Gebaut wird das nicht pro App, sondern einmal als xdg-open-Handler. Damit löst
|
|
# jede Linux-Anwendung — Adressbuch, Browser, Kalender — die richtige Android-App aus,
|
|
# ohne selbst etwas von der Bridge zu wissen.
|
|
#
|
|
# Ausführen IN TERMUX: bash spike/04-s4-intent-handoff.sh
|
|
set -uo pipefail
|
|
source "$(dirname "$0")/lib.sh"
|
|
require_termux
|
|
|
|
DISTRO=debian
|
|
ZIEL="${HPOS_ZIEL:-Brandenburger Tor, Berlin}"
|
|
# Paketname einer Begleit-App mit Overlay, die vor der Navigation starten soll.
|
|
# Beispiel: HPOS_BEGLEIT_APP=de.blitzer bash spike/04-s4-intent-handoff.sh
|
|
BEGLEIT_APP="${HPOS_BEGLEIT_APP:-}"
|
|
|
|
log "HPOS Phase 0 · S4 — Intent-Handoff"
|
|
log "Navigationsziel: $ZIEL"
|
|
log "Begleit-App: ${BEGLEIT_APP:-(keine)}"
|
|
log "Protokoll: $LOG"
|
|
|
|
# ── Vorbedingungen ───────────────────────────────────────────────────────────
|
|
section "Vorbedingungen"
|
|
if have am; then
|
|
ok "am vorhanden"
|
|
else
|
|
fail "am fehlt (Paket termux-tools) — ohne das geht nichts"
|
|
exit 1
|
|
fi
|
|
have python && ok "python vorhanden" || { fail "python fehlt"; exit 1; }
|
|
|
|
if [ -n "$BEGLEIT_APP" ]; then
|
|
if pm list packages 2>/dev/null | grep -q "package:$BEGLEIT_APP"; then
|
|
ok "Begleit-App $BEGLEIT_APP ist installiert"
|
|
hint "Overlay-Berechtigung nötig: Einstellungen → Apps → $BEGLEIT_APP → über anderen Apps anzeigen"
|
|
else
|
|
warn "Begleit-App $BEGLEIT_APP nicht gefunden — Overlay-Teil des Beweises entfällt"
|
|
fi
|
|
fi
|
|
|
|
# ── Mini-Bridge starten ──────────────────────────────────────────────────────
|
|
section "Mini-Bridge"
|
|
pkill -f 'bridge-mini.py' 2>/dev/null && { hint "alte Instanz beendet"; sleep 1; } || true
|
|
|
|
HPOS_BEGLEIT_APP="$BEGLEIT_APP" python "$REPO_ROOT/spike/bridge-mini.py" \
|
|
>>"$OUT_DIR/bridge-mini.log" 2>&1 &
|
|
BRIDGE_PID=$!
|
|
sleep 2
|
|
|
|
if kill -0 "$BRIDGE_PID" 2>/dev/null; then
|
|
ok "Bridge läuft auf 127.0.0.1:8474 (PID $BRIDGE_PID)"
|
|
else
|
|
fail "Bridge startet nicht:"
|
|
tail -n 20 "$OUT_DIR/bridge-mini.log" | sed 's/^/ /' | tee -a "$LOG"
|
|
exit 1
|
|
fi
|
|
|
|
# ── Direkttest, bevor Linux ins Spiel kommt ──────────────────────────────────
|
|
# Erst beweisen, dass der Intent überhaupt zieht. Scheitert es hier, liegt es an
|
|
# Android und nicht an der Brücke ins Linux — ein wichtiger Unterschied.
|
|
section "Direkttest ohne Linux"
|
|
TOKEN="$(cat "$OUT_DIR/bridge-token")"
|
|
ANTWORT="$(printf '%s\t%s\n' "$TOKEN" "geo:0,0?q=$(python -c "import urllib.parse,sys;print(urllib.parse.quote(sys.argv[1]))" "$ZIEL")" \
|
|
| timeout 25 python -c '
|
|
import socket,sys
|
|
s=socket.create_connection(("127.0.0.1",8474),10)
|
|
s.sendall(sys.stdin.buffer.read())
|
|
s.shutdown(socket.SHUT_WR)
|
|
print(s.recv(4096).decode().strip())
|
|
' 2>&1)"
|
|
log " Antwort: $ANTWORT"
|
|
case "$ANTWORT" in
|
|
OK*) ok "Android hat den Intent angenommen — schau aufs Telefon" ;;
|
|
*) fail "Intent nicht angenommen"
|
|
hint "Ist eine Navigations-App installiert? Ohne Google Maps o. ä. gibt es keinen Empfänger." ;;
|
|
esac
|
|
sleep 6
|
|
|
|
# ── Der eigentliche Beweis: aus dem Linux heraus ─────────────────────────────
|
|
section "Aus dem Linux heraus"
|
|
HPOS_ZIEL="$ZIEL" proot-distro login "$DISTRO" --shared-tmp --bind "$REPO_ROOT:/hpos" -- \
|
|
bash /hpos/spike/inner/s4-handoff.sh 2>&1 | tee -a "$LOG"
|
|
|
|
log ""
|
|
log " Bridge-Protokoll: $OUT_DIR/bridge-mini.log"
|
|
log " Bridge beenden: kill $BRIDGE_PID"
|
|
|
|
verdict "S4" "Hat 'xdg-open geo:…' aus dem Debian heraus die Navigation auf dem Telefon gestartet?
|
|
Und lag — falls konfiguriert — das Overlay der Begleit-App darüber?"
|