Skip to content

Support for Voice Call only (no video), parity with web#5995

Merged
BillCarsonFr merged 21 commits intodevelopfrom
valere/rtc/voice_call
Mar 9, 2026
Merged

Support for Voice Call only (no video), parity with web#5995
BillCarsonFr merged 21 commits intodevelopfrom
valere/rtc/voice_call

Conversation

@BillCarsonFr
Copy link
Member

@BillCarsonFr BillCarsonFr commented Jan 12, 2026

Changes

Depends on rust SDK matrix-org/matrix-rust-sdk#6003

  • Add a voice call only button in DMs and pass the correct intent to EC
  • Only show voice call option in DMs, not in groups or rooms
  • Read incoming call intent and display accurate accept call intent
    • Missing ruma udpate for m.call.intent in notification event MSC4075

Content

Use the new intent system to signal the intention to make an audio only call.

Motivation and context

Screenshots / GIFs

Before after

New notification UI

Voice Video
image image

Tests

  • Step 1
  • Step 2
  • Step ...

Tested devices

  • Physical
  • Emulator
  • OS version(s):

Checklist

  • Changes have been tested on an Android device or Android emulator with API 24
  • UI change has been tested on both light and dark themes
  • Accessibility has been taken into account. See https://github.com/element-hq/element-x-android/blob/develop/CONTRIBUTING.md#accessibility
  • Pull request is based on the develop branch
  • Pull request title will be used in the release note, it clearly define what will change for the user
  • Pull request includes screenshots or videos if containing UI changes
  • You've made a self review of your PR

@sonarqubecloud
Copy link

@github-actions
Copy link
Contributor

github-actions bot commented Jan 12, 2026

📱 Scan the QR code below to install the build (arm64 only) for this PR.
QR code
If you can't scan the QR code you can install the build via this link:

@ChronosXYZ
Copy link

What is the status of this PR?

@frebib
Copy link
Contributor

frebib commented Feb 2, 2026

@BillCarsonFr bump- I've tried this and it works fine. What's left to do before this can be merged?

@BillCarsonFr
Copy link
Member Author

@BillCarsonFr bump- I've tried this and it works fine. What's left to do before this can be merged?

What is missing is mainly the incoming part of the functionality (so a ruma PR).
The caller now send an intent (audio or video), so we can display the correct "Incoming call" notification. If we do nothing the incoming audio call will appear as an incoming video call

@osousa
Copy link

osousa commented Feb 11, 2026

@BillCarsonFr this feature is so underrated and indispensable to have this app look more familiar to those newcomers that aren't especially tech-saavy...

Thank you very much for the effort. Will gladly pay for a few ko-fis

@ToddCrimson
Copy link

Thank you, really looking forward to this one.

@osousa
Copy link

osousa commented Feb 22, 2026

@BillCarsonFr is there any issue opened on Ruma's repo as blocker for this one?

@BillCarsonFr
Copy link
Member Author

Some progress on the ruma side ruma/ruma#2383
Now needs the bindings on the rust-sdk side

@BillCarsonFr
Copy link
Member Author

The rust sdk bindings are on their way matrix-org/matrix-rust-sdk#6207

@osousa
Copy link

osousa commented Feb 26, 2026

Awesome @BillCarsonFr , great job! Thank you very much.

@bmarty bmarty force-pushed the valere/rtc/voice_call branch from a741863 to 5491040 Compare March 3, 2026 10:53
@BillCarsonFr BillCarsonFr added the Record-Screenshots Runs the 'Record Screenshots' CI job and adds a commit with any new screenshots found. label Mar 5, 2026
@github-actions github-actions bot removed the Record-Screenshots Runs the 'Record Screenshots' CI job and adds a commit with any new screenshots found. label Mar 5, 2026
@BillCarsonFr BillCarsonFr added the PR-Feature For a new feature label Mar 5, 2026
@codecov
Copy link

codecov bot commented Mar 5, 2026

Codecov Report

❌ Patch coverage is 84.07080% with 18 lines in your changes missing coverage. Please review.
✅ Project coverage is 81.28%. Comparing base (73961b4) to head (9504984).
⚠️ Report is 22 commits behind head on develop.

Files with missing lines Patch % Lines
...roid/features/call/impl/ui/IncomingCallActivity.kt 0.00% 5 Missing ⚠️
...cation/TimelineEventToNotificationContentMapper.kt 0.00% 4 Missing ⚠️
...x/impl/widget/DefaultCallWidgetSettingsProvider.kt 0.00% 4 Missing ⚠️
...mpl/notifications/CallNotificationEventResolver.kt 80.00% 1 Missing and 1 partial ⚠️
...all/impl/receivers/DeclineCallBroadcastReceiver.kt 0.00% 1 Missing ⚠️
...oid/features/userprofile/shared/UserProfileView.kt 50.00% 0 Missing and 1 partial ⚠️
.../impl/notifications/NotificationResultProcessor.kt 75.00% 0 Missing and 1 partial ⚠️
Additional details and impacted files
@@             Coverage Diff             @@
##           develop    #5995      +/-   ##
===========================================
+ Coverage    81.27%   81.28%   +0.01%     
===========================================
  Files         2576     2577       +1     
  Lines        70105    70203      +98     
  Branches      9002     9016      +14     
===========================================
+ Hits         56975    57062      +87     
- Misses        9777     9786       +9     
- Partials      3353     3355       +2     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@BillCarsonFr BillCarsonFr changed the title WIP: Support using Element Call for voice calls in DMs Support for Voice Call only (no video), parity with web Mar 5, 2026
@BillCarsonFr BillCarsonFr marked this pull request as ready for review March 5, 2026 11:57
@BillCarsonFr BillCarsonFr requested a review from a team as a code owner March 5, 2026 11:57
@BillCarsonFr BillCarsonFr requested review from jmartinesp and removed request for a team March 5, 2026 11:57
@BillCarsonFr
Copy link
Member Author

Ready for a first review!

Copy link
Member

@bmarty bmarty left a comment

Choose a reason for hiding this comment

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

Thanks. Some first remarks.

)
}

internal fun aIncomingCallScreenState(
Copy link
Member

Choose a reason for hiding this comment

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

Please rename the function to aCallNotificationData

Copy link
Member Author

Choose a reason for hiding this comment

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

done 79d8ec1

// Only show voice call in DMs
if (roomCallState.isDM) {
IconButton(
modifier = modifier,
Copy link
Member

Choose a reason for hiding this comment

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

You cannot use the modifier twice. I think you can just remove this line. The CI should detect this too.

Copy link
Member Author

Choose a reason for hiding this comment

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

ok, I just used it in the row then. I see that in several places there are no modifiers on Buttons. 4406b50

Copy link
Member

Choose a reason for hiding this comment

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

Thanks. Weird that the CI did not complain about this issue. I'll double check that.

}
}
IconButton(
modifier = modifier,
Copy link
Member

Choose a reason for hiding this comment

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

Same remark, please remove this line.

Copy link
Member Author

Choose a reason for hiding this comment

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

see here 4406b50

onSendLocationClick = callback::navigateToSendLocation,
onCreatePollClick = callback::navigateToCreatePoll,
onJoinCallClick = { callback.navigateToRoomCall(room.roomId) },
onJoinCallClick = { voiceOnly ->
Copy link
Member

Choose a reason for hiding this comment

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

There is a mix between voiceOnly and isAudioCall, maybe we could use a single name across the codebase? I'd vote to only use isAudioCall

Copy link
Member Author

Choose a reason for hiding this comment

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

oh right, I missed that one bad6085

canJoinCall = canJoinCall,
isUserInTheCall = isUserInTheCall,
isUserLocallyInTheCall = isUserLocallyInTheCall,
// TODO resolve intent while the call is ongoing
Copy link
Member

Choose a reason for hiding this comment

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

This TODO will not be handled in this PR?

Copy link
Member Author

@BillCarsonFr BillCarsonFr Mar 5, 2026

Choose a reason for hiding this comment

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

Yes, created this follow-up issue #6291

@jmartinesp
Copy link
Member

jmartinesp commented Mar 6, 2026

I'm testing this by starting a voice call from EX and I only receive a org.matrix.msc3401.call.member event on the other side (EW) and I can't join the call:

image

The other way around (EW -> EXA) seems to work, but I just joined that call from EX with camera enabled for some reason. I don't know if that's expected and will be handled separately?

Grabacion.de.pantalla.2026-03-06.a.las.7.58.54.mov

@BillCarsonFr
Copy link
Member Author

BillCarsonFr commented Mar 6, 2026

I'm testing this by starting a voice call from EX and I only receive a org.matrix.msc3401.call.member event on the other side (EW) and I can't join the call

Regarding join an existing call voice vs Video, there is a separate issue #6291

This PR is just based on the notification event, e.g ringing UX.

For the other issue - web cannot answer - have you created an issue on web with a rageshake?

@jmartinesp
Copy link
Member

jmartinesp commented Mar 6, 2026

This PR is just based on the notification event, e.g ringing UX.

Ok, thanks!

For the other issue - web cannot answer - have you created an issue on web with a rageshake?

I just checked and it's happening for video calls too, maybe that test user doesn't have permission to send the notify call event in those rooms 👀 .

@BillCarsonFr BillCarsonFr requested a review from bmarty March 6, 2026 16:52
@bmarty
Copy link
Member

bmarty commented Mar 9, 2026

I have also checked the permission management, and with a fresh install (i.e. with no specific granted permissions), the application only request for the microphone permission when starting a voice call. If the video is toggled on later, the camera permission is requested. So it's working as expected, that's nice!

@sonarqubecloud
Copy link

sonarqubecloud bot commented Mar 9, 2026

@BillCarsonFr BillCarsonFr merged commit a64bf79 into develop Mar 9, 2026
32 of 33 checks passed
@BillCarsonFr BillCarsonFr deleted the valere/rtc/voice_call branch March 9, 2026 16:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

PR-Feature For a new feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants