Skip to content

fix: android callingx calls should handle audio through through telecom#2324

Merged
santhoshvai merged 5 commits into
mainfrom
telecom-audio-routing
Jul 8, 2026
Merged

fix: android callingx calls should handle audio through through telecom#2324
santhoshvai merged 5 commits into
mainfrom
telecom-audio-routing

Conversation

@santhoshvai

@santhoshvai santhoshvai commented Jul 7, 2026

Copy link
Copy Markdown
Member

💡 Overview

Primarily this PR implements the advice below from Android core-telecom docs

image

Other changes:

  • Fix: incoming calls were always added as Audio type calls, now properly reads from push data
  • Feat: setPushConfig support for defaultAudioDeviceType like iOS for Android

Fixes #2320

📝 Implementation notes

Incallmanager delegates Audio routing to callingx. But still supports reading state through it and calling its methods.

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

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

Summary by CodeRabbit

  • New Features
    • Added Android Telecom-managed audio routing with endpoint snapshot updates via didChangeAudioEndpoints, including listing available endpoints and switching endpoints.
    • Introduced defaultDeviceEndpointType to set the starting/default audio endpoint for Telecom-managed calls; added native APIs to check Telecom mode, get registered call IDs, and manage endpoints.
  • Bug Fixes
    • Normalized endpoint event payloads for more reliable parsing, and reduced duplicate/conflicting notifications in Telecom-managed mode; cleared stored snapshots when calls end.
    • Removed iOS route-change notifications (no Telecom audio routing on iOS).
  • Tests
    • Added Jest coverage for Telecom-managed endpoint status and didChangeAudioEndpoints.

@coderabbitai

coderabbitai Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: b44420de-576a-47a8-acd2-502a62f1a657

📥 Commits

Reviewing files that changed from the base of the PR and between 8d31927 and df42708.

📒 Files selected for processing (9)
  • packages/react-native-callingx/README.md
  • packages/react-native-callingx/android/src/main/AndroidManifest.xml
  • packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/CallService.kt
  • packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/CallingxModuleImpl.kt
  • packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/repo/CallRepository.kt
  • packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/repo/TelecomCallRepository.kt
  • packages/react-native-callingx/ios/CallingxImpl.swift
  • packages/react-native-callingx/src/spec/NativeCallingx.ts
  • packages/react-native-callingx/src/types.ts
💤 Files with no reviewable changes (8)
  • packages/react-native-callingx/android/src/main/AndroidManifest.xml
  • packages/react-native-callingx/README.md
  • packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/repo/CallRepository.kt
  • packages/react-native-callingx/src/spec/NativeCallingx.ts
  • packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/CallService.kt
  • packages/react-native-callingx/src/types.ts
  • packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/CallingxModuleImpl.kt
  • packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/repo/TelecomCallRepository.kt

📝 Walkthrough

Walkthrough

Adds Telecom-backed audio endpoint support across react-native-callingx and react-native-sdk, including native snapshot storage, JS event/type plumbing, Telecom-managed routing, recovery handling, and sample call-creation updates.

Changes

Callingx Android/JS audio endpoint support

Layer / File(s) Summary
Audio endpoint storage and serialization
packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/AudioEndpointStore.kt, packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/utils/AudioEndpointUtils.kt, packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/utils/SettingsStore.kt, packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/CallRegistrationStore.kt, packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/utils/constants.kt
Adds per-call endpoint snapshot storage, endpoint JSON serialization, default endpoint preference persistence, tracked call ID listing, and omits the new Android option from required defaults.
Call registration and endpoint change flow
packages/react-native-callingx/android/src/main/AndroidManifest.xml, packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/repo/CallRepository.kt, packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/repo/TelecomCallRepository.kt, packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/model/CallAction.kt, packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/CallService.kt
Updates endpoint-change callbacks and call attributes, resolves a preferred starting endpoint before Telecom registration, clears stored snapshots on teardown, and switches the broadcast action and payload to an audio-endpoints snapshot.
Callingx native bridge and JS contract
packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/CallingxModuleImpl.kt, packages/react-native-callingx/android/src/newarch/java/io/getstream/rn/callingx/CallingxModule.kt, packages/react-native-callingx/android/src/oldarch/java/io/getstream/rn/callingx/CallingxModule.kt, packages/react-native-callingx/ios/Callingx.mm, packages/react-native-callingx/ios/CallingxImpl.swift, packages/react-native-callingx/src/CallingxModule.ts, packages/react-native-callingx/src/EventManager.ts, packages/react-native-callingx/src/spec/NativeCallingx.ts, packages/react-native-callingx/src/types.ts, packages/react-native-callingx/README.md
Adds Telecom audio-endpoint APIs and event constants to the native Android module, wires them through both Android bridges, exposes matching iOS stubs, removes the iOS route-change delegate path, and updates the JS module, event normalization, public TypeScript contracts, and event docs.

Estimated code review effort: 4 (Complex) | ~60 minutes

react-native-sdk Telecom-managed CallManager integration

Layer / File(s) Summary
Android telecomManagedMode toggle
packages/react-native-sdk/android/src/main/java/com/streamvideo/reactnative/audio/AudioDeviceManager.kt, packages/react-native-sdk/android/src/main/java/com/streamvideo/reactnative/callmanager/StreamInCallManagerModule.kt, packages/react-native-sdk/src/modules/call-manager/native-module.d.ts
Adds a telecomManagedMode flag that gates SDK-driven audio mode, focus, routing, and event emission, exposed via a new native bridge method.
CallManager Telecom routing and tests
packages/react-native-sdk/src/modules/call-manager/CallManager.ts, packages/react-native-sdk/__tests__/call-manager/CallManager.test.ts
Adds Telecom-managed detection and endpoint mapping helpers, routes status and selection through Callingx, subscribes to endpoint-change events, updates speakerphone behavior and start flow, and adds test coverage for the new routing paths.
SDK setup branching and Callingx recovery
packages/react-native-sdk/src/utils/internal/registerSDKGlobals.ts, packages/react-native-sdk/src/utils/internal/callingx/callingx.ts, packages/react-native-sdk/src/utils/push/libs/callingx.ts, packages/react-native-sdk/src/utils/StreamVideoRN/types.ts
Adds Android Telecom-managed setup detection and branching, classic-audio recovery on Callingx failures, and default endpoint configuration plumbing through push config and SDK types.

Estimated code review effort: 4 (Complex) | ~55 minutes

Sample app call creation tweaks

Layer / File(s) Summary
Sample app getOrCreate video flag
sample-apps/react-native/dogfood/src/screens/Call/JoinCallScreen.tsx, sample-apps/react-native/expo-video-sample/components/CreateRingingCall.tsx
Adds video: true to call creation options alongside ring: true.

Estimated code review effort: 1 (Trivial) | ~3 minutes

Sequence Diagram(s)

sequenceDiagram
  participant TelecomCallRepository
  participant CallService
  participant AudioEndpointStore
  participant CallingxModuleImpl
  participant JSLayer as JS Layer

  TelecomCallRepository->>CallService: onCallAudioEndpointsChanged(callId)
  CallService->>CallService: build snapshot JSON
  CallService->>AudioEndpointStore: setSnapshot(callId, snapshotJson)
  CallService->>CallingxModuleImpl: broadcast CALL_AUDIO_ENDPOINTS_CHANGED_ACTION
  CallingxModuleImpl->>JSLayer: emit didChangeAudioEndpoints(snapshot)
  JSLayer->>JSLayer: normalizeEventParams(snapshot)
Loading
sequenceDiagram
  participant CallManager
  participant CallingxModule
  participant StreamInCallManagerModule
  participant AudioDeviceManager

  CallManager->>CallManager: check Telecom-managed state
  alt Telecom-managed
    CallManager->>CallingxModule: getAvailableAudioEndpoints(callId)
    CallingxModule-->>CallManager: AudioEndpointsSnapshot
    CallManager->>CallingxModule: setDefaultAudioDeviceEndpointType(type)
    CallManager->>StreamInCallManagerModule: setTelecomManagedMode(true)
    CallManager->>AudioDeviceManager: start() with routing disabled
  else Classic mode
    CallManager->>StreamInCallManagerModule: setTelecomManagedMode(false)
    CallManager->>AudioDeviceManager: setup()/start()
  end
Loading

Possibly related PRs

  • GetStream/stream-video-js#2260: Implements and delegates setDefaultAudioDeviceEndpointType(...) on the Android Callingx bridge, which is directly related to the same native API surface.

Suggested reviewers: greenfrvr

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title matches the main change: Android CallingX audio routing through Telecom.
Description check ✅ Passed The description includes the required Overview, Implementation notes, Ticket, and Docs sections and covers the main changes.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch telecom-audio-routing

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Jul 7, 2026

Copy link
Copy Markdown

Bundle size

Built package output. Sizes in KB; delta vs main@acde928.

Package Unminified Minified Δ min vs main
@stream-io/video-react-native-sdk 399.9 KB 191.5 KB +2.6 KB (+1.4%)
↳ install total (+ client + react-bindings) 1171.9 KB 463.7 KB +2.6 KB (+0.6%)
@stream-io/react-native-callingx 14.0 KB 6.7 KB +717 B (+11.6%)

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (4)
packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/utils/AudioEndpointUtils.kt (1)

21-27: 🎯 Functional Correctness | 🔵 Trivial | 💤 Low value

Future Telecom endpoint types collapse into "unknown".

androidx.core.telecom.CallEndpointCompat may expose additional types beyond earpiece/speaker/wired_headset/bluetooth (e.g. TYPE_STREAMING on newer platform versions). The else -> TYPE_UNKNOWN branch silently maps any such type to the same generic "unknown" string the JS layer would use for a genuinely unrecognized type, losing information. This is a safe fallback today, so low priority.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/utils/AudioEndpointUtils.kt`
around lines 21 - 27, The endpointTypeToString mapping in AudioEndpointUtils.kt
collapses any future CallEndpointCompat types into TYPE_UNKNOWN, which loses
information for newer supported endpoint values. Update endpointTypeToString to
explicitly handle the known telecom constants in this class and preserve
additional recognized types with distinct string values instead of falling
through to the generic unknown case. Keep TYPE_UNKNOWN only for truly
unrecognized values so the JS layer can distinguish future endpoint types.
packages/react-native-callingx/src/CallingxModule.ts (2)

158-174: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Duplicate JSON-parse-with-fallback logic.

getAvailableAudioEndpoints here duplicates the same "parse snapshot JSON with try/catch fallback to empty snapshot" logic present in EventManager.ts's normalizeEventParams. Consider extracting a shared parseAudioEndpointsSnapshot(json: string | undefined) helper to keep both call sites in sync if the snapshot shape changes.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/react-native-callingx/src/CallingxModule.ts` around lines 158 - 174,
The JSON parsing and empty-snapshot fallback in getAvailableAudioEndpoints
duplicates the same logic used by normalizeEventParams in EventManager.ts.
Extract a shared helper such as parseAudioEndpointsSnapshot(json: string |
undefined) that returns an AudioEndpointsSnapshot with the current fallback
shape, and update both getAvailableAudioEndpoints and normalizeEventParams to
call it so future snapshot shape changes stay consistent.

151-185: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

New methods use method syntax, not arrow-function class fields.

getRegisteredCallIds, getAvailableAudioEndpoints, and requestAudioEndpointChange are added as class methods rather than arrow-function class fields. This matches the file's pre-existing (non-compliant) pattern used throughout the class, so fixing only the new methods would create inconsistency without meaningfully improving this-binding safety here (all calls are via this.method() / a module instance).

As per coding guidelines, "All class methods must be arrow-function class fields, not method syntax — including private/protected methods."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/react-native-callingx/src/CallingxModule.ts` around lines 151 - 185,
The new CallingxModule APIs are currently declared with method syntax instead of
the required arrow-function class field style. Update getRegisteredCallIds,
getAvailableAudioEndpoints, and requestAudioEndpointChange in CallingxModule to
match the class’s arrow-function field convention so they are consistent with
the coding guidelines and the rest of the class structure.

Source: Coding guidelines

packages/react-native-sdk/src/modules/call-manager/CallManager.ts (1)

55-59: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Use the exported Callingx endpoint types here
packages/react-native-callingx/src/types.ts already exports AudioEndpoint and AudioEndpointsSnapshot; reusing them avoids a duplicated shape that can drift from the native payload.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/react-native-sdk/src/modules/call-manager/CallManager.ts` around
lines 55 - 59, The CallManager module currently defines duplicate Callingx audio
endpoint snapshot types instead of reusing the exported types from the Callingx
package. Update the type aliases in CallManager.ts to import and use
AudioEndpoint and AudioEndpointsSnapshot from
packages/react-native-callingx/src/types so the shape stays aligned with the
native payload and avoids drift.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/CallingxModuleImpl.kt`:
- Around line 319-321: The tracked call IDs cleanup in CallingxModuleImpl is
incomplete because removeTrackedCall() only runs for source == "app", leaving
system or remote-ended calls in CallRegistrationStore. Update the call-end flow
so every terminal call path removes the call from the tracked set, and use
getRegisteredCallIds()/CallRegistrationStore consistently to verify no ended
call remains registered; if app-only cleanup is intentional, add a separate
cleanup path for non-app ends.

In `@packages/react-native-sdk/src/modules/call-manager/CallManager.ts`:
- Around line 108-118: The routing flow in CallManager is swallowing native
failures by using an empty catch after
getAvailableAudioEndpoints/requestAudioEndpointChange, which hides rejected
Telecom routing requests. Update the promise chain in CallManager to handle
rejections explicitly by logging the error (with enough context like callId and
endpointName) and, if appropriate, rethrowing or propagating it instead of
ignoring it; apply the same fix to the other similar routing block referenced by
the review.

In `@packages/react-native-sdk/src/utils/internal/callingx/callingx.ts`:
- Around line 27-42: The fallback in callingx() should not switch back to
classic StreamInCallManager audio when Telecom has already registered or owns a
call. Add a guard in the callingx.ts recovery path, using the existing
CallingxModule and StreamInCallManagerNativeModule checks, so the classic
recovery block only runs when Telecom is not already managing an active call. If
a Telecom registration/start sequence has partially succeeded, skip the
stop/setTelecomManagedMode/setup/start fallback and leave Telecom ownership
intact.

In `@packages/react-native-sdk/src/utils/internal/registerSDKGlobals.ts`:
- Line 94: `registerSDKGlobals` is calling
`StreamInCallManagerNativeModule.setTelecomManagedMode(false)` unconditionally,
which can crash on iOS because that native method is Android-only. Add the same
platform check used in `CallManager.start` around this call so it only runs on
Android, and keep the `StreamInCallManagerNativeModule` reference confined to
the guarded path.

---

Nitpick comments:
In
`@packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/utils/AudioEndpointUtils.kt`:
- Around line 21-27: The endpointTypeToString mapping in AudioEndpointUtils.kt
collapses any future CallEndpointCompat types into TYPE_UNKNOWN, which loses
information for newer supported endpoint values. Update endpointTypeToString to
explicitly handle the known telecom constants in this class and preserve
additional recognized types with distinct string values instead of falling
through to the generic unknown case. Keep TYPE_UNKNOWN only for truly
unrecognized values so the JS layer can distinguish future endpoint types.

In `@packages/react-native-callingx/src/CallingxModule.ts`:
- Around line 158-174: The JSON parsing and empty-snapshot fallback in
getAvailableAudioEndpoints duplicates the same logic used by
normalizeEventParams in EventManager.ts. Extract a shared helper such as
parseAudioEndpointsSnapshot(json: string | undefined) that returns an
AudioEndpointsSnapshot with the current fallback shape, and update both
getAvailableAudioEndpoints and normalizeEventParams to call it so future
snapshot shape changes stay consistent.
- Around line 151-185: The new CallingxModule APIs are currently declared with
method syntax instead of the required arrow-function class field style. Update
getRegisteredCallIds, getAvailableAudioEndpoints, and requestAudioEndpointChange
in CallingxModule to match the class’s arrow-function field convention so they
are consistent with the coding guidelines and the rest of the class structure.

In `@packages/react-native-sdk/src/modules/call-manager/CallManager.ts`:
- Around line 55-59: The CallManager module currently defines duplicate Callingx
audio endpoint snapshot types instead of reusing the exported types from the
Callingx package. Update the type aliases in CallManager.ts to import and use
AudioEndpoint and AudioEndpointsSnapshot from
packages/react-native-callingx/src/types so the shape stays aligned with the
native payload and avoids drift.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c25b2857-fb3d-4e30-a764-a07122358c48

📥 Commits

Reviewing files that changed from the base of the PR and between acde928 and d5be1eb.

📒 Files selected for processing (29)
  • packages/react-native-callingx/android/src/main/AndroidManifest.xml
  • packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/AudioEndpointStore.kt
  • packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/CallRegistrationStore.kt
  • packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/CallService.kt
  • packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/CallingxModuleImpl.kt
  • packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/model/CallAction.kt
  • packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/repo/CallRepository.kt
  • packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/repo/TelecomCallRepository.kt
  • packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/utils/AudioEndpointUtils.kt
  • packages/react-native-callingx/android/src/main/java/io/getstream/rn/callingx/utils/SettingsStore.kt
  • packages/react-native-callingx/android/src/newarch/java/io/getstream/rn/callingx/CallingxModule.kt
  • packages/react-native-callingx/android/src/oldarch/java/io/getstream/rn/callingx/CallingxModule.kt
  • packages/react-native-callingx/ios/Callingx.mm
  • packages/react-native-callingx/src/CallingxModule.ts
  • packages/react-native-callingx/src/EventManager.ts
  • packages/react-native-callingx/src/spec/NativeCallingx.ts
  • packages/react-native-callingx/src/types.ts
  • packages/react-native-callingx/src/utils/constants.ts
  • packages/react-native-sdk/__tests__/call-manager/CallManager.test.ts
  • packages/react-native-sdk/android/src/main/java/com/streamvideo/reactnative/audio/AudioDeviceManager.kt
  • packages/react-native-sdk/android/src/main/java/com/streamvideo/reactnative/callmanager/StreamInCallManagerModule.kt
  • packages/react-native-sdk/src/modules/call-manager/CallManager.ts
  • packages/react-native-sdk/src/modules/call-manager/native-module.d.ts
  • packages/react-native-sdk/src/utils/StreamVideoRN/types.ts
  • packages/react-native-sdk/src/utils/internal/callingx/callingx.ts
  • packages/react-native-sdk/src/utils/internal/registerSDKGlobals.ts
  • packages/react-native-sdk/src/utils/push/libs/callingx.ts
  • sample-apps/react-native/dogfood/src/screens/Call/JoinCallScreen.tsx
  • sample-apps/react-native/expo-video-sample/components/CreateRingingCall.tsx

Comment thread packages/react-native-sdk/src/modules/call-manager/CallManager.ts Outdated
Comment thread packages/react-native-sdk/src/utils/internal/callingx/callingx.ts
Comment thread packages/react-native-sdk/src/utils/internal/registerSDKGlobals.ts Outdated
Comment thread packages/react-native-sdk/src/modules/call-manager/CallManager.ts Outdated
Comment thread packages/react-native-sdk/src/utils/internal/callingx/callingx.ts Outdated
@santhoshvai santhoshvai merged commit 95bcc2a into main Jul 8, 2026
11 checks passed
@santhoshvai santhoshvai deleted the telecom-audio-routing branch July 8, 2026 10:44
@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown

🎉 The changes from this pull request have been released.

Shipped with:

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.

Ringing audio call always uses speakerphone and audio route can't be changed

2 participants