diff --git a/host-agent/android/app/src/main/AndroidManifest.xml b/host-agent/android/app/src/main/AndroidManifest.xml index a32d57c..16eed78 100644 --- a/host-agent/android/app/src/main/AndroidManifest.xml +++ b/host-agent/android/app/src/main/AndroidManifest.xml @@ -38,6 +38,7 @@ diff --git a/host-agent/android/app/src/main/java/de/hackersoft/ariaagent/MainActivity.kt b/host-agent/android/app/src/main/java/de/hackersoft/ariaagent/MainActivity.kt index 1fab72e..2562f5c 100644 --- a/host-agent/android/app/src/main/java/de/hackersoft/ariaagent/MainActivity.kt +++ b/host-agent/android/app/src/main/java/de/hackersoft/ariaagent/MainActivity.kt @@ -214,7 +214,9 @@ class MainActivity : AppCompatActivity() { override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) - if (intent != null && applyProvisioning(intent)) return + if (intent == null) return + setIntent(intent) + applyProvisioning(intent) } /** diff --git a/satellite/satellite.py b/satellite/satellite.py index 0d68a52..7d00624 100644 --- a/satellite/satellite.py +++ b/satellite/satellite.py @@ -1306,9 +1306,15 @@ def _do_adb_provision(params: dict) -> dict: # ("Wohnzimmer Fire TV") wuerden dabei abgeschnitten -> jeden Wert quoten. import shlex q = shlex.quote + # Der Intent MUSS eindeutig sein: Android vergleicht beim Start Komponente, + # Action und Daten — NICHT die Extras. Ohne eigene Daten-URI gilt ein zweites + # Provisioning als "gleicher Intent", die Activity wird nur nach vorn geholt + # und onCreate/onNewIntent laufen nie -> der alte Name bliebe stehen. + stamp = str(int(time.time() * 1000)) args = ["-s", target, "shell", "am", "start", "-n", f"{package}/.MainActivity", "-a", f"{package}.PROVISION", + "-d", q(f"aria://provision/{stamp}"), "-e", "host", q(rvs_host), "-e", "token", q(rvs_token), "--ei", "port", str(int(params.get("rvs_port") or 443)), @@ -1320,8 +1326,16 @@ def _do_adb_provision(params: dict) -> dict: args += ["-e", "reply_mode", q(str(params["reply_mode"]))] rc, out, err = _adb_run(args, timeout=60) - if rc != 0 or "Error" in f"{out} {err}": - return {"ok": False, "error": (f"{out} {err}".strip() or f"exit {rc}")[:400]} + txt = f"{out} {err}".strip() + if rc != 0 or "Error" in txt: + return {"ok": False, "error": (txt or f"exit {rc}")[:400]} + # Android meldet das, wenn es den Intent als "schon offen" abtut und die + # Activity nur nach vorn holt — dann kaeme die neue Konfiguration NICHT an. + if "brought to the front" in txt.lower() or "not started" in txt.lower(): + return {"ok": False, "error": + "Android hat den Einrichtungs-Intent nicht ausgeliefert (Activity " + "war schon offen). Auf dem Geraet die Agent-App einmal schliessen " + "und erneut 'Nur einrichten' druecken. Details: " + txt[:200]} return {"ok": True, "result": { "target": target, "package": package, "message": f"Agent eingerichtet (RVS {rvs_host}) und gestartet"}}