Skip to content

feat: callkit/telecom integration#2028

Open
greenfrvr wants to merge 169 commits intomainfrom
feat/callkit-telecom-integration
Open

feat: callkit/telecom integration#2028
greenfrvr wants to merge 169 commits intomainfrom
feat/callkit-telecom-integration

Conversation

@greenfrvr
Copy link
Contributor

@greenfrvr greenfrvr commented Dec 2, 2025

💡 Overview

Current pull request provides implementation of CallKit/Android Telecom functionality which includes the following:

  • Improved integration allows to register both incoming and regular ongoing calls in CallKit/Telecom
  • Unified system notification in calling style for Android
  • Synchronization of stream call mute state and corresponding registered call in CallKit/Telecom
  • Android keep call alive functionality within internal background task implementation, instead of using notifee implementation
  • Improved reject call when busy implementation

As part of the PR following dependencies became redundant:

  • react-native-voip-push-notification
  • react-native-callkeep

Now neither ringing flow nor call alive functionality don't depend on @notifee/react-native which will allow to get rid of that dependency in near future.

📝 Implementation notes

🎫 Ticket: https://linear.app/stream/issue/RN-17/android-support-for-telecom-manager

📑 Docs: https://github.com/GetStream/docs-content/pull/881

Summary by CodeRabbit

  • New Features

    • New native calling package with CallKit/Telecom integration, VoIP support, and background/headless task handling.
    • Android keep-alive foreground service to maintain calls.
    • Runtime audio-state introspection for easier debugging.
  • Improvements

    • Simplified push/ringing configuration and unified VOIP event flow.
    • Better audio session handling with optional CallKit bypass on iOS.
    • Streamlined notification/channel management and resources.
  • Chores

    • Replaced legacy callkeep/voip integrations with the new calling package.

greenfrvr and others added 30 commits December 2, 2025 20:23
…lkit-telecom-integration

# Conflicts:
#	sample-apps/react-native/dogfood/ios/Podfile.lock
#	yarn.lock
greenfrvr and others added 5 commits February 9, 2026 12:04
### 💡 Overview

Add proper reasoning for callingx endCall methods

This is important for callkit especially.. paraphrasing callkit doc

```
[Respond to Call Hang Ups and Failures](https://developer.apple.com/documentation/pushkit/responding-to-voip-notifications-from-pushkit#Respond-to-Call-Hang-Ups-and-Failures)
Many things can go wrong when connecting a VoIP call, and CallKit makes it easy to handle problems when they occur.

If the person who initiated the call hangs up, use the network connection between your app and server to notify the app. In your app, call the [reportCall(with:endedAt:reason:)](https://developer.apple.com/documentation/CallKit/CXProvider/reportCall(with:endedAt:reason:)) method of its [CXProvider](https://developer.apple.com/documentation/CallKit/CXProvider) object, specifying [CXCallEndedReason.remoteEnded](https://developer.apple.com/documentation/CallKit/CXCallEndedReason/remoteEnded) as the reason for the end of the call. If the incoming call interface is onscreen, CallKit updates the interface to reflect the end of the call, and dismisses the interface.

If the recipient of a call answers before the app establishes a connection to your server, don’t fulfill the [CXAnswerCallAction](https://developer.apple.com/documentation/CallKit/CXAnswerCallAction) object sent to the [provider(_:perform:)](https://developer.apple.com/documentation/CallKit/CXProviderDelegate/provider(_:perform:)-h4in) method of your delegate immediately. Instead, wait until you establish a connection and then fulfill the object. While it waits for your app to fulfill the request, the incoming call interface lets the user know that the call is connecting, but not yet ready.

If your app fails to establish a connection to your server, call the [reportCall(with:endedAt:reason:)](https://developer.apple.com/documentation/CallKit/CXProvider/reportCall(with:endedAt:reason:)) method with the [CXCallEndedReason.failed](https://developer.apple.com/documentation/CallKit/CXCallEndedReason/failed) option. If the incoming call interface is currently onscreen, the system updates it to indicate a failed call.

After sending the initial push notification, don’t send additional push notifications to cancel the call or communicate new details to your app. Instead, communicate with the app directly over the network connection you established between it and your server. Using an existing network connection is generally faster than sending a push notification, and if network conditions are poor, APNs may be unable to deliver push notifications to the device anyway.
```
### 📝 Implementation notes

🎫 Ticket: https://linear.app/stream/issue/XYZ-123

📑 Docs: https://github.com/GetStream/docs-content/pull/<id>
greenfrvr and others added 24 commits February 9, 2026 17:24
### 💡 Overview
When CallKit deactivates the audio session after a call ends, it fires
didDeactivateAudioSession. Currently that callback only tells
RTCAudioSession the session is deactivated — but the ADM is not touched.
After telling WebRTC the session is deactivated, we will reset the ADM
so it's in a clean state, with no stale references from the previous
call.

---------

Co-authored-by: Santhosh Vaiyapuri <santhoshvai@gmail.com>
…all (#2122)

### 💡 Overview

displayIncomingCall resolved its JS promise immediately before the call
was actually registered

### 📝 Implementation notes

Make the promise resolve only after native registration confirms
success/failure

🎫 Ticket: https://linear.app/stream/issue/XYZ-123

📑 Docs: https://github.com/GetStream/docs-content/pull/<id>

---------

Co-authored-by: Artem Grintsevich <greenfrvr@gmail.com>
### 💡 Overview

* isCallRegistered mixed two concepts: app-level “we started tracking
this call” vs Telecom/CallKit registration completion.
This change makes intent explicit (isCallTracked) and ensures Android
behavior matches iOS by returning true immediately when tracking starts.

* removed pushTappedIncomingCallCId$, it was unnecessary anymore
* ignore duplicate invocations on ios

---------

Co-authored-by: Artem Grintsevich <greenfrvr@gmail.com>
Co-authored-by: Artem Grintsevich <greenfrvr@gmail.com>
### 💡 Overview

Added legacy arch support for callingx package.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…integration

# Conflicts:
#	packages/client/src/Call.ts
#	sample-apps/react-native/dogfood/ios/Podfile.lock
#	yarn.lock
### 💡 Overview

Sending proper reasons to callkit/telecom would show the appropriate
states in the native view

For example, in callkit.. "call failed" - "call ended" - "call missed"
are appropirately shown based on what we pass
# Conflicts:
#	packages/client/src/types.ts
#	sample-apps/react-native/dogfood/ios/Podfile.lock
#	sample-apps/react-native/dogfood/package.json
#	yarn.lock
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Adds a new calling experience package with native iOS CallKit and
Android call UI, incoming/outgoing call handling, notifications,
ringtones, background/headless tasks, and a keep-alive foreground
service.
  * Exposes a debug audio-state log for troubleshooting.

* **Documentation**
* Ship comprehensive README and usage docs for the new calling package.

* **Chores**
* Add build/release scripts and workspace packaging; update dependencies
and sample apps to opt into the new calling package.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
### 💡 Overview

This PR solves an issue with quickly answered CallKit call. The problem
was that CXProvider delegate was not set by the moment CallKit answer
event was omitted and was not added to delayed events store. Current
implementation ensures that delegate will be set up before we report the
call, so that all consequent events will be handled.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants