Files
StefanandClaude Opus 5 ad2c98443b Phase 0: Repo-Gerüst, Dokumentation und Machbarkeits-Spike
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>
2026-08-09 17:25:36 +02:00

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?"