Files
linux-on-android-without-root/spike/inner/s4-handoff.sh
T
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

107 lines
4.1 KiB
Bash
Executable File

#!/bin/bash
# Läuft INNERHALB des Debian-Rootfs, aufgerufen von 04-s4-intent-handoff.sh.
#
# Richtet hpos-open als xdg-open-Handler für geo:, tel:, sms: und mailto: ein.
# Der Witz daran: nichts wird pro Anwendung gebaut. Adressbuch, Browser, Kalender
# und Dateimanager rufen alle xdg-open auf und landen dadurch automatisch hier.
set -uo pipefail
ZIEL="${HPOS_ZIEL:-Brandenburger Tor, Berlin}"
TOKEN_DATEI=/hpos/spike/out/bridge-token
echo "── Debian-Seite: Intent-Handoff ──"
export DEBIAN_FRONTEND=noninteractive
command -v xdg-open >/dev/null 2>&1 || apt-get install -y --no-install-recommends xdg-utils >/dev/null 2>&1
if [ ! -r "$TOKEN_DATEI" ]; then
echo " ✗ Token-Datei nicht lesbar: $TOKEN_DATEI"
echo " Läuft die Mini-Bridge? Sie erzeugt das Token beim ersten Start."
exit 1
fi
# ── hpos-open ────────────────────────────────────────────────────────────────
# Der Handler selbst: nimmt eine URI, schickt sie an die Bridge, fertig. Später
# ersetzt die Bridge-APK den Gegenpart, dieses Skript bleibt wie es ist.
install -d /usr/local/bin
cat >/usr/local/bin/hpos-open <<'HANDLER'
#!/bin/sh
# Reicht eine URI an die HPOS-Bridge auf der Android-Seite weiter.
# Aufruf: hpos-open "geo:0,0?q=Adresse"
set -eu
URI="${1:-}"
[ -n "$URI" ] || { echo "Aufruf: hpos-open <uri>" >&2; exit 2; }
TOKEN_DATEI="${HPOS_TOKEN_DATEI:-/hpos/spike/out/bridge-token}"
[ -r "$TOKEN_DATEI" ] || { echo "hpos-open: kein Token unter $TOKEN_DATEI" >&2; exit 1; }
TOKEN="$(cat "$TOKEN_DATEI")"
printf '%s\t%s\n' "$TOKEN" "$URI" | timeout 20 python3 -c '
import socket, sys
try:
s = socket.create_connection(("127.0.0.1", 8474), 10)
except OSError as e:
sys.exit(f"hpos-open: Bridge nicht erreichbar ({e})")
s.sendall(sys.stdin.buffer.read())
s.shutdown(socket.SHUT_WR)
antwort = s.recv(4096).decode().strip()
print(antwort)
sys.exit(0 if antwort.startswith("OK") else 1)
'
HANDLER
chmod 755 /usr/local/bin/hpos-open
echo " ✓ /usr/local/bin/hpos-open eingerichtet"
# ── Als Standardanwendung registrieren ───────────────────────────────────────
cat >/usr/share/applications/hpos-open.desktop <<'DESKTOP'
[Desktop Entry]
Type=Application
Name=Auf dem Telefon öffnen
Comment=Reicht Adressen, Rufnummern und Nachrichten an die Android-Seite weiter
Exec=hpos-open %u
Terminal=false
NoDisplay=true
MimeType=x-scheme-handler/geo;x-scheme-handler/tel;x-scheme-handler/sms;x-scheme-handler/smsto;x-scheme-handler/mailto;
DESKTOP
update-desktop-database /usr/share/applications >/dev/null 2>&1 || true
for schema in geo tel sms smsto; do
xdg-mime default hpos-open.desktop "x-scheme-handler/$schema" 2>/dev/null \
&& echo " ✓ $schema: → hpos-open" \
|| echo " ! $schema: Registrierung fehlgeschlagen"
done
echo " Zugeordnet laut System:"
for schema in geo tel sms; do
printf ' %-6s %s\n' "$schema:" "$(xdg-mime query default "x-scheme-handler/$schema" 2>/dev/null || echo '?')"
done
# ── Der Beweis ───────────────────────────────────────────────────────────────
echo ""
echo "── Test 1: hpos-open direkt ──"
KODIERT=$(python3 -c 'import urllib.parse,sys;print(urllib.parse.quote(sys.argv[1]))' "$ZIEL")
if hpos-open "geo:0,0?q=$KODIERT"; then
echo " ✓ Bridge hat angenommen"
else
echo " ✗ Bridge hat abgelehnt oder war nicht erreichbar"
fi
sleep 5
echo ""
echo "── Test 2: über xdg-open ──"
echo " Das ist der eigentliche Beweis: der Weg, den jede Linux-Anwendung nimmt."
if xdg-open "geo:0,0?q=$KODIERT" 2>&1; then
echo " ✓ xdg-open hat den Handler aufgerufen"
else
echo " ✗ xdg-open ist gescheitert"
fi
sleep 5
echo ""
echo "── Test 3: Rufnummer ──"
hpos-open "tel:+4930901820" || echo " ! tel: fehlgeschlagen"
echo ""
echo " Jetzt aufs Telefon schauen: läuft die Navigation, liegt das Overlay darüber?"
echo " Zurück ins Linux über den Android-Task-Manager."