feat: texture view renderer - #70
Closed
arekkubaczkowski wants to merge 7 commits into
Closed
Conversation
gabrieldonadel
pushed a commit
to gabrieldonadel/GetStream-react-native-webrtc
that referenced
this pull request
Sep 5, 2026
* [FCE-3434] Android telecom integration (GetStream#63) * Hook up kotlin * Kotling CallManager impl * Minor fixes + Java bridge methods * Make telecom manage audio endpoints while in call * Cleanup coroutines when call ends * Hook up CallManager with WebRTCModule * Add CallNotificationManager * Make CallManager work with Notification manager * Add getter for display name * Add broadcast intent receiver for hangup/decline * Add a incoming call activity (WIP) * Add some methods to test the behavior without firebase * Add permissions + application tags to androidmanifest in webrtc fork (WIP) * Create hooks for telecom * Add pixel inspired full screen activity when someone is calling * De-singleton CallNotificationManager * Add dev logging * Add ongoing CallState notification to FGS * Add common notification id * Make the hangup button work correctly * Integrate with FCM * Fetch FCM token on app start * Refactor the listeners into their own classes * Add android to useVoIPEvents * Fix ObjectAlreadyConsumedException * OPA * Add react warm-up when receiving call when the app is closed * Remove testing only functions * Allow the call to happen on lock screen * Further improvements to swtiching from audiomanager to telecom while in call * Revert "OPA" This reverts commit 0fd97f2. * Allow launching the main activity from remote devices (headphones) * Do not immediately clear pending requests (user can close the app during ringing) * Remove tags * Add vibrator * Format * Make errors less generic * Do not call to get voipToken on every app launch * Prevent race condition * Bring back registration token on app launch (ios) * Get FID only once at start up * Fix only emit telecomActionPerformed on Android * Fix formatting in EventEmitter.ts Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * Address PR review: volatile telecom audio fields, foreground service without React Make AudioOutputManager's telecom-routing fields volatile, since they're written from CallManager's coroutine and read from the RN bridge thread. Also let ForegroundServiceController post the call notification using the application context instead of only reactContext, so a call started from a push before React attaches still gets its foreground service. Co-authored-by: Cursor <cursoragent@cursor.com> * Tidying up after cursor --------- Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com> Co-authored-by: Cursor <cursoragent@cursor.com> * [FCE-3435] Handle common VoIP patterns (GetStream#67) * Hook up kotlin * Kotling CallManager impl * Minor fixes + Java bridge methods * Make telecom manage audio endpoints while in call * Cleanup coroutines when call ends * Hook up CallManager with WebRTCModule * Add CallNotificationManager * Make CallManager work with Notification manager * Add getter for display name * Add broadcast intent receiver for hangup/decline * Add a incoming call activity (WIP) * Add some methods to test the behavior without firebase * Add permissions + application tags to androidmanifest in webrtc fork (WIP) * Create hooks for telecom * Add pixel inspired full screen activity when someone is calling * De-singleton CallNotificationManager * Add dev logging * Add ongoing CallState notification to FGS * Add common notification id * Make the hangup button work correctly * Integrate with FCM * Fetch FCM token on app start * Refactor the listeners into their own classes * Add android to useVoIPEvents * Fix ObjectAlreadyConsumedException * OPA * Add react warm-up when receiving call when the app is closed * Remove testing only functions * Allow the call to happen on lock screen * Further improvements to swtiching from audiomanager to telecom while in call * Revert "OPA" This reverts commit 0fd97f2. * Allow launching the main activity from remote devices (headphones) * Do not immediately clear pending requests (user can close the app during ringing) * Remove tags * Add vibrator * Format * Make errors less generic * Do not call to get voipToken on every app launch * Prevent race condition * Bring back registration token on app launch (ios) * Get FID only once at start up * Add better android endCall events * Add better iOS endCall events * Fix only emit telecomActionPerformed on Android * Fix only emit telecomActionPerformed on Android * Add voip answer to connect handshake (iOS) * Add voip answer to connect hadnshake (android) * Fix formatting in EventEmitter.ts Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * Remove unused endpointJob/availableJob/muteJob in CallManager They were assigned but never read or cancelled — structured concurrency already tears them down with the parent addCall scope, so launching without storing a reference is equivalent. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * Add configurable timeouts for Incoming/Outgoing/Fulfill actions * Add connecting state before streaming media is connected * refactor: drop redundant Platform.select in useTelecom Telecom.ts already guards every function body with an Android check, so useTelecom's own Platform.select + emptyResult was defense duplicated on top of defense already in place. useCallKit keeps its split since CallKit has no Android native module to fall back to. * Add iOS Recents and call-intent redial support * Fix Recents redial by handling deprecated call intents INStartAudioCallIntent/INStartVideoCallIntent are deprecated in favour of INStartCallIntent, but the Phone app's Recents redial still delivers them. Matching only INStartCallIntent made handleContinueUserActivity return NO for those, silently dropping the intent so tapping a Recents entry never started a call. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * Add call hold and resume support * Fix held call notification duration resetting on Android Co-authored-by: Cursor <cursoragent@cursor.com> * Address PR review: volatile telecom audio fields, foreground service without React Make AudioOutputManager's telecom-routing fields volatile, since they're written from CallManager's coroutine and read from the RN bridge thread. Also let ForegroundServiceController post the call notification using the application context instead of only reactContext, so a call started from a push before React attaches still gets its foreground service. Co-authored-by: Cursor <cursoragent@cursor.com> * Android native implementaiton for incoming call while ongoig is active * Add iOS native implementation for incoming call while ongoing is active * Add ringback tone * Add avatar/app icon capabilities * Surface mute to JS * Tidying up after cursor * Format + Lint * Fix minor issues from merge * Fix * Fix clang-format in CallKitManager.m Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * Set callkit mute status from JS * Fix pointed out issues * Generate clang module map (livekit#71) --------- Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com> Co-authored-by: Cursor <cursoragent@cursor.com> * [FCE-3599] Allow for FCM services coexistance (livekit#70) * Hook up kotlin * Kotling CallManager impl * Minor fixes + Java bridge methods * Make telecom manage audio endpoints while in call * Cleanup coroutines when call ends * Hook up CallManager with WebRTCModule * Add CallNotificationManager * Make CallManager work with Notification manager * Add getter for display name * Add broadcast intent receiver for hangup/decline * Add a incoming call activity (WIP) * Add some methods to test the behavior without firebase * Add permissions + application tags to androidmanifest in webrtc fork (WIP) * Create hooks for telecom * Add pixel inspired full screen activity when someone is calling * De-singleton CallNotificationManager * Add dev logging * Add ongoing CallState notification to FGS * Add common notification id * Make the hangup button work correctly * Integrate with FCM * Fetch FCM token on app start * Refactor the listeners into their own classes * Add android to useVoIPEvents * Fix ObjectAlreadyConsumedException * OPA * Add react warm-up when receiving call when the app is closed * Remove testing only functions * Allow the call to happen on lock screen * Further improvements to swtiching from audiomanager to telecom while in call * Revert "OPA" This reverts commit 0fd97f2. * Allow launching the main activity from remote devices (headphones) * Do not immediately clear pending requests (user can close the app during ringing) * Remove tags * Add vibrator * Format * Make errors less generic * Do not call to get voipToken on every app launch * Prevent race condition * Bring back registration token on app launch (ios) * Get FID only once at start up * Add better android endCall events * Add better iOS endCall events * Fix only emit telecomActionPerformed on Android * Fix only emit telecomActionPerformed on Android * Add voip answer to connect handshake (iOS) * Add voip answer to connect hadnshake (android) * Fix formatting in EventEmitter.ts Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * Remove unused endpointJob/availableJob/muteJob in CallManager They were assigned but never read or cancelled — structured concurrency already tears them down with the parent addCall scope, so launching without storing a reference is equivalent. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * Add configurable timeouts for Incoming/Outgoing/Fulfill actions * Add connecting state before streaming media is connected * refactor: drop redundant Platform.select in useTelecom Telecom.ts already guards every function body with an Android check, so useTelecom's own Platform.select + emptyResult was defense duplicated on top of defense already in place. useCallKit keeps its split since CallKit has no Android native module to fall back to. * Add iOS Recents and call-intent redial support * Fix Recents redial by handling deprecated call intents INStartAudioCallIntent/INStartVideoCallIntent are deprecated in favour of INStartCallIntent, but the Phone app's Recents redial still delivers them. Matching only INStartCallIntent made handleContinueUserActivity return NO for those, silently dropping the intent so tapping a Recents entry never started a call. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * Add call hold and resume support * Fix held call notification duration resetting on Android Co-authored-by: Cursor <cursoragent@cursor.com> * Address PR review: volatile telecom audio fields, foreground service without React Make AudioOutputManager's telecom-routing fields volatile, since they're written from CallManager's coroutine and read from the RN bridge thread. Also let ForegroundServiceController post the call notification using the application context instead of only reactContext, so a call started from a push before React attaches still gets its foreground service. Co-authored-by: Cursor <cursoragent@cursor.com> * Android native implementaiton for incoming call while ongoig is active * Add iOS native implementation for incoming call while ongoing is active * Add ringback tone * Add avatar/app icon capabilities * Surface mute to JS * Tidying up after cursor * Format + Lint * Fix minor issues from merge * Fix * Fix clang-format in CallKitManager.m Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * Set callkit mute status from JS * Add fallback FCM message forwarding * Fix pointed out issues * Fix waiting call declining * Add handle to callkit sessions * Omit handle + make callInRecents optional --------- Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com> Co-authored-by: Cursor <cursoragent@cursor.com> * Use only transactional-valid DisconnectCause codes (livekit#75) * Tear down the JS call on iOS answer-fulfill timeout and restore honest disconnect reasons (livekit#76) On iOS the fulfill-answer watchdog only reported the failure to CallKit and wiped native state - onCallEnded never fired, so the JS side kept the call (room, camera, mic) alive indefinitely. Notify JS with "failed" before cleanup, mirroring Android. Also fix timedOutPerformingAction comparing the action UUID instead of the call UUID, which made that handler a no-op. On Android, restore ERROR causes (reverted to LOCAL in livekit#75 because CallControl.disconnect rejects them) so JS receives "failed" instead of "local", and sanitize causes at the single Telecom disconnect call site instead - transactional Telecom only accepts LOCAL, REMOTE, MISSED and REJECTED. * Avoid NPE * Do not re-emit native events when mounted (they are already read on mount) * Fix cross-thread races in CallKitManager (iOS) and CallManager (Android) (livekit#77) * Fix cross-thread races in CallKitManager and CallManager iOS: confine all CallKitManager state mutation to the main queue (where CXProvider delegate callbacks, CXCallController completions and ring timers already run) by funneling the RN-bridge and PushKit entry points onto it; make properties atomic for the off-main sync getters; reject an incoming call when a waiting slot is taken or the current call is still ringing; clean up the ghost pending call when reportNewIncomingCall fails. Android: run the addCall finally-teardown under the CallManager monitor so it cannot interleave with register(); always tear down on Disconnect even when the telecom action returns an error; guard handleAnswered against duplicate/stale answers and reset pendingAnswerRequestId on register. Claude-Session: https://claude.ai/code/session_01CxbgHoCG7oX3EYVJfkWGbs * Handle the incoming-push payload on the main queue The slot switch (pendingIncomingCall writes and callbacks) ran on the PushKit queue after the main-thread report returned, so a main-thread cleanup could be overwritten by the late write and resurrect a ghost pending call. The whole report-and-record step now runs in one main-queue block; only the push completion stays on the PushKit queue. Claude-Session: https://claude.ai/code/session_01CxbgHoCG7oX3EYVJfkWGbs * Make VoipManager state properties atomic token is written on the PushKit registry queue and read by a blocking-synchronous getter on the JS thread; pendingIncomingCall is written on main and the module worker queue and read on the JS thread. A nonatomic copy setter can release the old value in the window between another thread's getter loading the ivar and retaining it, which is a use-after-free. Same fix CallKitManager already received. Claude-Session: https://claude.ai/code/session_01CxbgHoCG7oX3EYVJfkWGbs * Make VoIP naming consistent * Fix --------- Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com> Co-authored-by: Cursor <cursoragent@cursor.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.