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>
107 lines
4.1 KiB
Bash
Executable File
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."
|