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>
This commit is contained in:
Executable
+106
@@ -0,0 +1,106 @@
|
||||
#!/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."
|
||||
Reference in New Issue
Block a user