Releases: telecmi/react-native-callkeep
Release list
4.5.0 — two phone accounts: voice on the OS call UI, video on SDK call screens
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.
4.4.3 — voice + video SDKs coexisting in one app
Builds on 4.4.2 (which fixed broken incoming calls for system-managed apps).
Coexistence: setup() overwrites settings and re-registers the phone account, so an app running a voice SDK (system-managed) and a video SDK (self-managed) had its account kind decided by whichever initialized last — non-deterministic, and in the self-managed direction the voice SDK's calls ring invisibly (Android shows no system UI for self-managed accounts).
- Any consumer that does not request
selfManagedpins the app to a system-managed account, so every SDK's calls ring on the OS call UI. Video-only apps are unaffected and keep the custom call surfaces. - Self-managed voice calls now get the CallStyle ring notification without the full-screen call surface — never invisible, never dressed in the video UI.
Note for apps installing two TeleCMI SDKs: they pin different callkeep versions, so npm installs two copies and only one is compiled. Force a single copy in your app's package.json:
"overrides": { "@telecmi/react-native-callkeep": "4.4.3" }(yarn: resolutions)
4.4.2 — URGENT: fixes broken incoming calls for system-managed (voice) apps
Upgrade immediately if your app resolved ^4.3.17 to 4.4.0/4.4.1 and uses a system-managed (non-selfManaged) phone account — e.g. voice apps on @telecmi/piopiy-native.
4.4.0's zombie-call sweep cycled (unregister + re-register) the Telecom phone account at app start and before incoming calls. For self-managed accounts that is harmless — but cycling a CALL_PROVIDER (system-managed) account destroys its user enablement, after which Android refuses the app's incoming calls until the user manually re-enables the account in phone settings.
4.4.2 gates every account-cycling site to self-managed accounts only. After upgrading, affected users may need to re-enable the calling account once (Settings → Apps/Calls → Calling accounts) — the enablement destroyed by 4.4.0 does not restore itself.
Upgrade note (Android): if your app's own AndroidManifest.xml re-declares io.wazo.callkeep.VoiceConnectionService (older piopiy setup guides had this), the build now fails with a manifest-merger conflict on foregroundServiceType. Remove the app-level <service> declaration — the library manifest provides it with the full type set.
4.4.1 — custom call surfaces are video-only
The custom Android ring/in-call surfaces (CallStyle notification, full-screen incoming activity, React in-call screen) now trigger only for calls displayed with hasVideo=true. Voice calls keep upstream self-managed behavior (the RNCallKeepShowIncomingCallUi JS event). Fixes voice calls being dressed in the video call screens when a voice SDK and @telecmi/connle-video-native share this module in one app.
4.4.0 — SDK call screen host & call hardening
Android
- Hosts the SDK's React-rendered in-call screen over the keyguard (Bridgeless ReactSurface, legacy fallback, native shell as last resort)
- Process-start zombie-call purge; stale ring UIs closed on replacement; call UI survives system relaunches
- Answer/cancel hardening: answered calls immune to dismissal races; in-call screen re-entry from the ongoing-call notification
- backToForeground respects the in-call screen; onHostDestroy no longer kills the process
- Caller names title-cased on ring UI and CallStyle notification
iOS
- audioSession.autoConfigure option — the media engine owns AVAudioSession (LiveKit pattern)
- wasCallAnswered tracking: cancel handling can no longer end an answered-but-connecting call
- Video-call answers fulfill immediately; video call uuids tracked for correct answer semantics
v4.3.17 — ConnectionService merges into apps automatically
The library manifest now declares VoiceConnectionService (with BIND_TELECOM_CONNECTION_SERVICE, foreground-service types, and the telephony permissions). Android's manifest merger injects it into every app — integrators no longer hand-copy the service block whose absence crashed apps at startup with:
java.lang.SecurityException: Registering a PhoneAccount requires either:
(1) ... BIND_TELECOM_CONNECTION_SERVICE ...
Apps that already declare the block keep building (identical values merge cleanly); tools:node overrides remain available. Ships as a dependency of @telecmi/piopiy-native ≥ 0.25.0.
v4.3.16 — upstream 4.3.16 + RN 0.76 New Architecture fix
react-native-callkeep 4.3.16, byte-for-byte, with one fix: the Android module's 3-argument displayIncomingCall/startCall overloads no longer carry @ReactMethod — React Native 0.76+'s New Architecture rejects duplicate exported names and crashed at startup with "Module exports two methods to JavaScript with the same name".
Ships as a dependency of @telecmi/piopiy-native so PIOPIY SDK apps install and patch nothing. Not intended for standalone use — prefer upstream once it carries the equivalent fix. Upstream ISC license unchanged; see FORK.md.