One Android app now holds two Telecom phone accounts, chosen per call by hasVideo:
- Voice / PSTN calls → the system-managed account: native OS call UI for ring and in-call. This account is never cycled (cycling destroys its user enablement — the 4.4.0 incident stays fixed).
- Video / team calls → a new self-managed
<appName>_teamaccount: the SDK's custom call screens, including over the lock screen. Only this account is cycled for zombie-call sweeps.
This replaces 4.4.3's systemManagedPinned compromise (which forced video calls onto the OS UI whenever a voice SDK was present).
Cold-start / answer fixes (production-validated in the Connle app):
setActive()inside the native answer — Telecom's audio route activates without waiting for JS (killed-state answers had connected silently)- The React host is resumed before the answer broadcast, so a foreground-paused host runs the JS answer immediately instead of parking it
- Already answered/active uuids are never re-rung; every disconnect path force-closes the call screen and cancels the notification
- Ring activity:
onNewIntentre-entry, re-front while answering, hardware back blocked during a live call, keyguard flags re-asserted on window attach - Lock-screen ring: screen wake + direct activity launch only when actually locked; DND bypass; MAX priority
- In-call React surface: host claimed only when not already RESUMED (no more 800 ms heuristic) and the claim is released on detach
New JS API: showInCallScreen(uuid, name) (now also with the app foregrounded), closeInCallScreen(), setActivityShowWhenLocked(show).
Consumers: @telecmi/piopiy-native ≥ 0.26.4 and @telecmi/connle-video-native ≥ 1.2.0 pin ^4.5.0. Apps install nothing and change nothing.