#!/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 " >&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."