WIP: Support using Element Call for voice calls in DMs

This commit is contained in:
Valere 2026-01-12 10:48:20 +01:00 committed by Benoit Marty
parent 66c3bf267a
commit ec420332c3
26 changed files with 122 additions and 42 deletions

View file

@ -26,9 +26,10 @@ sealed interface CallType : NodeInputs, Parcelable {
data class RoomCall( data class RoomCall(
val sessionId: SessionId, val sessionId: SessionId,
val roomId: RoomId, val roomId: RoomId,
val voiceIntent: Boolean
) : CallType { ) : CallType {
override fun toString(): String { override fun toString(): String {
return "RoomCall(sessionId=$sessionId, roomId=$roomId)" return "RoomCall(sessionId=$sessionId, roomId=$roomId, voiceIntent=$voiceIntent)"
} }
} }
} }

View file

@ -88,7 +88,8 @@ class RingingCallNotificationCreator(
.setImportant(true) .setImportant(true)
.build() .build()
val answerIntent = IntentProvider.getPendingIntent(context, CallType.RoomCall(sessionId, roomId)) // TODO
val answerIntent = IntentProvider.getPendingIntent(context, CallType.RoomCall(sessionId, roomId, voiceIntent = false))
val notificationData = CallNotificationData( val notificationData = CallNotificationData(
sessionId = sessionId, sessionId = sessionId,
roomId = roomId, roomId = roomId,

View file

@ -45,8 +45,9 @@ class DeclineCallBroadcastReceiver : BroadcastReceiver() {
callType = CallType.RoomCall( callType = CallType.RoomCall(
sessionId = notificationData.sessionId, sessionId = notificationData.sessionId,
roomId = notificationData.roomId, roomId = notificationData.roomId,
), // TODO
notificationData = notificationData, voiceIntent = false
)
) )
} }
} }

View file

@ -226,6 +226,7 @@ class CallScreenPresenter(
sessionId = inputs.sessionId, sessionId = inputs.sessionId,
roomId = inputs.roomId, roomId = inputs.roomId,
clientId = UUID.randomUUID().toString(), clientId = UUID.randomUUID().toString(),
voiceOnly = inputs.voiceIntent,
languageTag = languageTag, languageTag = languageTag,
theme = theme, theme = theme,
).getOrThrow() ).getOrThrow()

View file

@ -112,7 +112,14 @@ class IncomingCallActivity : AppCompatActivity() {
} }
private fun onAnswer(notificationData: CallNotificationData) { private fun onAnswer(notificationData: CallNotificationData) {
elementCallEntryPoint.startCall(CallType.RoomCall(notificationData.sessionId, notificationData.roomId)) elementCallEntryPoint.startCall(
CallType.RoomCall(
notificationData.sessionId,
notificationData.roomId,
// TODO
voiceIntent = false
)
)
} }
private fun onCancel() { private fun onCancel() {

View file

@ -146,6 +146,8 @@ class DefaultActiveCallManager(
callType = CallType.RoomCall( callType = CallType.RoomCall(
sessionId = notificationData.sessionId, sessionId = notificationData.sessionId,
roomId = notificationData.roomId, roomId = notificationData.roomId,
// TODO
voiceIntent = false,
), ),
callState = CallState.Ringing(notificationData), callState = CallState.Ringing(notificationData),
) )

View file

@ -16,6 +16,7 @@ interface CallWidgetProvider {
suspend fun getWidget( suspend fun getWidget(
sessionId: SessionId, sessionId: SessionId,
roomId: RoomId, roomId: RoomId,
voiceOnly: Boolean,
clientId: String, clientId: String,
languageTag: String?, languageTag: String?,
theme: String?, theme: String?,

View file

@ -32,6 +32,7 @@ class DefaultCallWidgetProvider(
override suspend fun getWidget( override suspend fun getWidget(
sessionId: SessionId, sessionId: SessionId,
roomId: RoomId, roomId: RoomId,
voiceOnly: Boolean,
clientId: String, clientId: String,
languageTag: String?, languageTag: String?,
theme: String?, theme: String?,
@ -50,6 +51,7 @@ class DefaultCallWidgetProvider(
baseUrl = baseUrl, baseUrl = baseUrl,
encrypted = isEncrypted, encrypted = isEncrypted,
direct = room.isDm(), direct = room.isDm(),
voiceOnly = voiceOnly,
hasActiveCall = roomInfo.hasRoomCall, hasActiveCall = roomInfo.hasRoomCall,
) )
val callUrl = room.generateWidgetWebViewUrl( val callUrl = room.generateWidgetWebViewUrl(

View file

@ -272,10 +272,11 @@ class MessagesFlowNode(
backstack.push(NavTarget.EditPoll(Timeline.Mode.Live, eventId)) backstack.push(NavTarget.EditPoll(Timeline.Mode.Live, eventId))
} }
override fun navigateToRoomCall(roomId: RoomId) { override fun navigateToRoomCall(roomId: RoomId, voiceIntent: Boolean) {
val callType = CallType.RoomCall( val callType = CallType.RoomCall(
sessionId = sessionId, sessionId = sessionId,
roomId = roomId, roomId = roomId,
voiceIntent = voiceIntent
) )
analyticsService.captureInteraction(Interaction.Name.MobileRoomCallButton) analyticsService.captureInteraction(Interaction.Name.MobileRoomCallButton)
elementCallEntryPoint.startCall(callType) elementCallEntryPoint.startCall(callType)
@ -488,10 +489,11 @@ class MessagesFlowNode(
backstack.push(NavTarget.EditPoll(Timeline.Mode.Thread(navTarget.threadRootId), eventId)) backstack.push(NavTarget.EditPoll(Timeline.Mode.Thread(navTarget.threadRootId), eventId))
} }
override fun navigateToRoomCall(roomId: RoomId) { override fun navigateToRoomCall(roomId: RoomId, voiceOnly: Boolean) {
val callType = CallType.RoomCall( val callType = CallType.RoomCall(
sessionId = sessionId, sessionId = sessionId,
roomId = roomId, roomId = roomId,
voiceIntent = voiceOnly
) )
analyticsService.captureInteraction(Interaction.Name.MobileRoomCallButton) analyticsService.captureInteraction(Interaction.Name.MobileRoomCallButton)
elementCallEntryPoint.startCall(callType) elementCallEntryPoint.startCall(callType)

View file

@ -125,7 +125,7 @@ class MessagesNode(
fun navigateToSendLocation() fun navigateToSendLocation()
fun navigateToCreatePoll() fun navigateToCreatePoll()
fun navigateToEditPoll(eventId: EventId) fun navigateToEditPoll(eventId: EventId)
fun navigateToRoomCall(roomId: RoomId) fun navigateToRoomCall(roomId: RoomId, voiceIntent: Boolean)
fun navigateToThread(threadRootId: ThreadId, focusedEventId: EventId?) fun navigateToThread(threadRootId: ThreadId, focusedEventId: EventId?)
fun navigateToRoomDetails() fun navigateToRoomDetails()
fun navigateToPinnedMessagesList() fun navigateToPinnedMessagesList()
@ -279,7 +279,9 @@ class MessagesNode(
}, },
onSendLocationClick = callback::navigateToSendLocation, onSendLocationClick = callback::navigateToSendLocation,
onCreatePollClick = callback::navigateToCreatePoll, onCreatePollClick = callback::navigateToCreatePoll,
onJoinCallClick = { callback.navigateToRoomCall(room.roomId) }, onJoinCallClick = { voiceOnly ->
callback.navigateToRoomCall(room.roomId, voiceOnly)
},
onViewAllPinnedMessagesClick = callback::navigateToPinnedMessagesList, onViewAllPinnedMessagesClick = callback::navigateToPinnedMessagesList,
modifier = modifier, modifier = modifier,
knockRequestsBannerView = { knockRequestsBannerView = {

View file

@ -130,7 +130,7 @@ fun MessagesView(
onLinkClick: (String, Boolean) -> Unit, onLinkClick: (String, Boolean) -> Unit,
onSendLocationClick: () -> Unit, onSendLocationClick: () -> Unit,
onCreatePollClick: () -> Unit, onCreatePollClick: () -> Unit,
onJoinCallClick: () -> Unit, onJoinCallClick: (voiceIntent: Boolean) -> Unit,
onViewAllPinnedMessagesClick: () -> Unit, onViewAllPinnedMessagesClick: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
forceJumpToBottomVisibility: Boolean = false, forceJumpToBottomVisibility: Boolean = false,
@ -423,7 +423,7 @@ private fun MessagesViewContent(
onMessageLongClick: (TimelineItem.Event) -> Unit, onMessageLongClick: (TimelineItem.Event) -> Unit,
onSendLocationClick: () -> Unit, onSendLocationClick: () -> Unit,
onCreatePollClick: () -> Unit, onCreatePollClick: () -> Unit,
onJoinCallClick: () -> Unit, onJoinCallClick: (voiceIntent: Boolean) -> Unit,
onViewAllPinnedMessagesClick: () -> Unit, onViewAllPinnedMessagesClick: () -> Unit,
forceJumpToBottomVisibility: Boolean, forceJumpToBottomVisibility: Boolean,
onSwipeToReply: (TimelineItem.Event) -> Unit, onSwipeToReply: (TimelineItem.Event) -> Unit,

View file

@ -130,7 +130,7 @@ class ThreadedMessagesNode(
fun navigateToSendLocation() fun navigateToSendLocation()
fun navigateToCreatePoll() fun navigateToCreatePoll()
fun navigateToEditPoll(eventId: EventId) fun navigateToEditPoll(eventId: EventId)
fun navigateToRoomCall(roomId: RoomId) fun navigateToRoomCall(roomId: RoomId, voiceOnly: Boolean)
fun navigateToThread(threadRootId: ThreadId, focusedEventId: EventId?) fun navigateToThread(threadRootId: ThreadId, focusedEventId: EventId?)
} }
@ -281,7 +281,9 @@ class ThreadedMessagesNode(
}, },
onSendLocationClick = callback::navigateToSendLocation, onSendLocationClick = callback::navigateToSendLocation,
onCreatePollClick = callback::navigateToCreatePoll, onCreatePollClick = callback::navigateToCreatePoll,
onJoinCallClick = { callback.navigateToRoomCall(room.roomId) }, onJoinCallClick = { voiceIntent ->
callback.navigateToRoomCall(room.roomId, voiceIntent)
},
onViewAllPinnedMessagesClick = {}, onViewAllPinnedMessagesClick = {},
modifier = modifier, modifier = modifier,
knockRequestsBannerView = {}, knockRequestsBannerView = {},

View file

@ -100,7 +100,7 @@ fun TimelineView(
onReactionLongClick: (emoji: String, TimelineItem.Event) -> Unit, onReactionLongClick: (emoji: String, TimelineItem.Event) -> Unit,
onMoreReactionsClick: (TimelineItem.Event) -> Unit, onMoreReactionsClick: (TimelineItem.Event) -> Unit,
onReadReceiptClick: (TimelineItem.Event) -> Unit, onReadReceiptClick: (TimelineItem.Event) -> Unit,
onJoinCallClick: () -> Unit, onJoinCallClick: (voiceIntent: Boolean) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
lazyListState: LazyListState = rememberLazyListState(), lazyListState: LazyListState = rememberLazyListState(),
forceJumpToBottomVisibility: Boolean = false, forceJumpToBottomVisibility: Boolean = false,

View file

@ -10,6 +10,7 @@ package io.element.android.features.messages.impl.timeline.components
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
@ -35,7 +36,7 @@ import io.element.android.libraries.ui.strings.CommonStrings
@Composable @Composable
internal fun CallMenuItem( internal fun CallMenuItem(
roomCallState: RoomCallState, roomCallState: RoomCallState,
onJoinCallClick: () -> Unit, onJoinCallClick: (voiceOnly: Boolean) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
when (roomCallState) { when (roomCallState) {
@ -52,7 +53,7 @@ internal fun CallMenuItem(
is RoomCallState.OnGoing -> { is RoomCallState.OnGoing -> {
OnGoingCallMenuItem( OnGoingCallMenuItem(
roomCallState = roomCallState, roomCallState = roomCallState,
onJoinCallClick = onJoinCallClick, onJoinCallClick = { onJoinCallClick(roomCallState.isVoiceIntent) },
modifier = modifier, modifier = modifier,
) )
} }
@ -62,18 +63,30 @@ internal fun CallMenuItem(
@Composable @Composable
private fun StandByCallMenuItem( private fun StandByCallMenuItem(
roomCallState: RoomCallState.StandBy, roomCallState: RoomCallState.StandBy,
onJoinCallClick: () -> Unit, onJoinCallClick: (voiceOnly: Boolean) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
IconButton( Row(modifier = modifier) {
modifier = modifier, IconButton(
onClick = onJoinCallClick, modifier = modifier,
enabled = roomCallState.canStartCall, onClick = { onJoinCallClick(true) },
) { enabled = roomCallState.canStartCall,
Icon( ) {
imageVector = CompoundIcons.VideoCallSolid(), Icon(
contentDescription = stringResource(CommonStrings.a11y_start_call), imageVector = CompoundIcons.VoiceCallSolid(),
) contentDescription = stringResource(CommonStrings.a11y_start_call),
)
}
IconButton(
modifier = modifier,
onClick = { onJoinCallClick(false) },
enabled = roomCallState.canStartCall,
) {
Icon(
imageVector = CompoundIcons.VideoCallSolid(),
contentDescription = stringResource(CommonStrings.a11y_start_call),
)
}
} }
} }
@ -96,7 +109,11 @@ private fun OnGoingCallMenuItem(
) { ) {
Icon( Icon(
modifier = Modifier.size(20.dp), modifier = Modifier.size(20.dp),
imageVector = CompoundIcons.VideoCallSolid(), imageVector = if (roomCallState.isVoiceIntent) {
CompoundIcons.VoiceCallSolid()
} else {
CompoundIcons.VideoCallSolid()
},
contentDescription = null contentDescription = null
) )
Spacer(Modifier.width(8.dp)) Spacer(Modifier.width(8.dp))

View file

@ -46,7 +46,7 @@ internal fun TimelineItemCallNotifyView(
event: TimelineItem.Event, event: TimelineItem.Event,
roomCallState: RoomCallState, roomCallState: RoomCallState,
onLongClick: (TimelineItem.Event) -> Unit, onLongClick: (TimelineItem.Event) -> Unit,
onJoinCallClick: () -> Unit, onJoinCallClick: (voiceOnly: Boolean) -> Unit,
modifier: Modifier = Modifier modifier: Modifier = Modifier
) { ) {
Row( Row(

View file

@ -72,7 +72,7 @@ internal fun TimelineItemRow(
onMoreReactionsClick: (TimelineItem.Event) -> Unit, onMoreReactionsClick: (TimelineItem.Event) -> Unit,
onReadReceiptClick: (TimelineItem.Event) -> Unit, onReadReceiptClick: (TimelineItem.Event) -> Unit,
onSwipeToReply: (TimelineItem.Event) -> Unit, onSwipeToReply: (TimelineItem.Event) -> Unit,
onJoinCallClick: () -> Unit, onJoinCallClick: (voiceIntent: Boolean) -> Unit,
eventSink: (TimelineEvent.TimelineItemEvent) -> Unit, eventSink: (TimelineEvent.TimelineItemEvent) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
eventContentView: @Composable (TimelineItem.Event, Modifier, (ContentAvoidingLayoutData) -> Unit) -> Unit = eventContentView: @Composable (TimelineItem.Event, Modifier, (ContentAvoidingLayoutData) -> Unit) -> Unit =

View file

@ -66,7 +66,7 @@ internal fun MessagesViewTopBar(
dmUserIdentityState: IdentityState?, dmUserIdentityState: IdentityState?,
sharedHistoryIcon: SharedHistoryIcon, sharedHistoryIcon: SharedHistoryIcon,
onRoomDetailsClick: () -> Unit, onRoomDetailsClick: () -> Unit,
onJoinCallClick: () -> Unit, onJoinCallClick: (voiceIntent: Boolean) -> Unit,
onBackClick: () -> Unit, onBackClick: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {

View file

@ -18,10 +18,12 @@ sealed interface RoomCallState {
data class StandBy( data class StandBy(
val canStartCall: Boolean, val canStartCall: Boolean,
// TODO: add is DM to know if should show the voice call option?
) : RoomCallState ) : RoomCallState
data class OnGoing( data class OnGoing(
val canJoinCall: Boolean, val canJoinCall: Boolean,
val isVoiceIntent: Boolean,
val isUserInTheCall: Boolean, val isUserInTheCall: Boolean,
val isUserLocallyInTheCall: Boolean, val isUserLocallyInTheCall: Boolean,
) : RoomCallState ) : RoomCallState

View file

@ -17,6 +17,7 @@ open class RoomCallStateProvider : PreviewParameterProvider<RoomCallState> {
anOngoingCallState(), anOngoingCallState(),
anOngoingCallState(canJoinCall = false), anOngoingCallState(canJoinCall = false),
anOngoingCallState(canJoinCall = true, isUserInTheCall = true), anOngoingCallState(canJoinCall = true, isUserInTheCall = true),
anOngoingCallState(canJoinCall = true, isVoiceIntent = true),
RoomCallState.Unavailable, RoomCallState.Unavailable,
) )
} }
@ -25,10 +26,12 @@ fun anOngoingCallState(
canJoinCall: Boolean = true, canJoinCall: Boolean = true,
isUserInTheCall: Boolean = false, isUserInTheCall: Boolean = false,
isUserLocallyInTheCall: Boolean = isUserInTheCall, isUserLocallyInTheCall: Boolean = isUserInTheCall,
isVoiceIntent: Boolean = false,
) = RoomCallState.OnGoing( ) = RoomCallState.OnGoing(
canJoinCall = canJoinCall, canJoinCall = canJoinCall,
isUserInTheCall = isUserInTheCall, isUserInTheCall = isUserInTheCall,
isUserLocallyInTheCall = isUserLocallyInTheCall, isUserLocallyInTheCall = isUserLocallyInTheCall,
isVoiceIntent = isVoiceIntent
) )
fun aStandByCallState( fun aStandByCallState(

View file

@ -56,6 +56,7 @@ class RoomCallStatePresenter(
canJoinCall = canJoinCall, canJoinCall = canJoinCall,
isUserInTheCall = isUserInTheCall, isUserInTheCall = isUserInTheCall,
isUserLocallyInTheCall = isUserLocallyInTheCall, isUserLocallyInTheCall = isUserLocallyInTheCall,
isVoiceIntent = false // TODO
) )
else -> RoomCallState.StandBy(canStartCall = canJoinCall) else -> RoomCallState.StandBy(canStartCall = canJoinCall)
} }

View file

@ -227,6 +227,8 @@ class RoomDetailsFlowNode(
val inputs = CallType.RoomCall( val inputs = CallType.RoomCall(
sessionId = room.sessionId, sessionId = room.sessionId,
roomId = room.roomId, roomId = room.roomId,
// TODO
voiceIntent = false
) )
analyticsService.captureInteraction(Interaction.Name.MobileRoomCallButton) analyticsService.captureInteraction(Interaction.Name.MobileRoomCallButton)
elementCallEntryPoint.startCall(inputs) elementCallEntryPoint.startCall(inputs)
@ -285,7 +287,14 @@ class RoomDetailsFlowNode(
} }
override fun startCall(dmRoomId: RoomId) { override fun startCall(dmRoomId: RoomId) {
elementCallEntryPoint.startCall(CallType.RoomCall(roomId = dmRoomId, sessionId = room.sessionId)) elementCallEntryPoint.startCall(
CallType.RoomCall(
roomId = dmRoomId,
sessionId = room.sessionId,
// TODO
voiceIntent = false
)
)
} }
override fun startVerifyUserFlow(userId: UserId) { override fun startVerifyUserFlow(userId: UserId) {

View file

@ -84,7 +84,8 @@ class UserProfileFlowNode(
} }
override fun startCall(dmRoomId: RoomId) { override fun startCall(dmRoomId: RoomId) {
elementCallEntryPoint.startCall(CallType.RoomCall(sessionId = sessionId, roomId = dmRoomId)) // TODO
elementCallEntryPoint.startCall(CallType.RoomCall(sessionId = sessionId, roomId = dmRoomId, voiceIntent = false))
} }
override fun startVerifyUserFlow(userId: UserId) { override fun startVerifyUserFlow(userId: UserId) {

View file

@ -16,6 +16,7 @@ interface CallWidgetSettingsProvider {
widgetId: String = UUID.randomUUID().toString(), widgetId: String = UUID.randomUUID().toString(),
encrypted: Boolean, encrypted: Boolean,
direct: Boolean, direct: Boolean,
voiceOnly: Boolean,
hasActiveCall: Boolean, hasActiveCall: Boolean,
): MatrixWidgetSettings ): MatrixWidgetSettings
} }

View file

@ -30,7 +30,14 @@ class DefaultCallWidgetSettingsProvider(
private val callAnalyticsCredentialsProvider: CallAnalyticCredentialsProvider, private val callAnalyticsCredentialsProvider: CallAnalyticCredentialsProvider,
private val analyticsService: AnalyticsService, private val analyticsService: AnalyticsService,
) : CallWidgetSettingsProvider { ) : CallWidgetSettingsProvider {
override suspend fun provide(baseUrl: String, widgetId: String, encrypted: Boolean, direct: Boolean, hasActiveCall: Boolean): MatrixWidgetSettings { override suspend fun provide(
baseUrl: String,
widgetId: String,
encrypted: Boolean,
direct: Boolean,
voiceOnly: Boolean,
hasActiveCall: Boolean
): MatrixWidgetSettings {
val isAnalyticsEnabled = analyticsService.userConsentFlow.first() val isAnalyticsEnabled = analyticsService.userConsentFlow.first()
val properties = VirtualElementCallWidgetProperties( val properties = VirtualElementCallWidgetProperties(
elementCallUrl = baseUrl, elementCallUrl = baseUrl,
@ -47,14 +54,18 @@ class DefaultCallWidgetSettingsProvider(
parentUrl = null, parentUrl = null,
) )
val config = VirtualElementCallWidgetConfig( val config = VirtualElementCallWidgetConfig(
// TODO remove this once we have the next EC version // // TODO remove this once we have the next EC version
preload = false, // preload = false,
// TODO remove this once we have the next EC version // // TODO remove this once we have the next EC version
skipLobby = null, // skipLobby = null,
intent = when { intent = when {
direct && hasActiveCall -> CallIntent.JOIN_EXISTING_DM direct && hasActiveCall -> {
if (voiceOnly) CallIntent.JOIN_EXISTING_DM_VOICE else CallIntent.JOIN_EXISTING_DM
}
hasActiveCall -> CallIntent.JOIN_EXISTING hasActiveCall -> CallIntent.JOIN_EXISTING
direct -> CallIntent.START_CALL_DM direct -> {
if (voiceOnly) CallIntent.START_CALL_DM_VOICE else CallIntent.START_CALL_DM
}
else -> CallIntent.START_CALL else -> CallIntent.START_CALL
}.also { }.also {
Timber.d("Starting/joining call with intent: $it") Timber.d("Starting/joining call with intent: $it")

View file

@ -12,7 +12,14 @@ import io.element.android.libraries.matrix.api.widget.CallWidgetSettingsProvider
import io.element.android.libraries.matrix.api.widget.MatrixWidgetSettings import io.element.android.libraries.matrix.api.widget.MatrixWidgetSettings
class FakeCallWidgetSettingsProvider( class FakeCallWidgetSettingsProvider(
private val provideFn: (String, String, Boolean, Boolean, Boolean) -> MatrixWidgetSettings = { _, _, _, _, _ -> MatrixWidgetSettings("id", true, "url") } private val provideFn: (
String,
String,
Boolean,
Boolean,
Boolean,
Boolean
) -> MatrixWidgetSettings = { _, _, _, _, _, _ -> MatrixWidgetSettings("id", true, "url") }
) : CallWidgetSettingsProvider { ) : CallWidgetSettingsProvider {
val providedBaseUrls = mutableListOf<String>() val providedBaseUrls = mutableListOf<String>()
@ -21,9 +28,10 @@ class FakeCallWidgetSettingsProvider(
widgetId: String, widgetId: String,
encrypted: Boolean, encrypted: Boolean,
direct: Boolean, direct: Boolean,
voiceOnly: Boolean,
hasActiveCall: Boolean hasActiveCall: Boolean
): MatrixWidgetSettings { ): MatrixWidgetSettings {
providedBaseUrls += baseUrl providedBaseUrls += baseUrl
return provideFn(baseUrl, widgetId, encrypted, direct, hasActiveCall) return provideFn(baseUrl, widgetId, encrypted, direct, voiceOnly, hasActiveCall)
} }
} }

View file

@ -300,7 +300,12 @@ class DefaultPushHandler(
private suspend fun handleRingingCallEvent(notifiableEvent: NotifiableRingingCallEvent) { private suspend fun handleRingingCallEvent(notifiableEvent: NotifiableRingingCallEvent) {
Timber.i("## handleInternal() : Incoming call.") Timber.i("## handleInternal() : Incoming call.")
elementCallEntryPoint.handleIncomingCall( elementCallEntryPoint.handleIncomingCall(
callType = CallType.RoomCall(notifiableEvent.sessionId, notifiableEvent.roomId), callType = CallType.RoomCall(
notifiableEvent.sessionId,
notifiableEvent.roomId,
// TODO
voiceIntent = false
),
eventId = notifiableEvent.eventId, eventId = notifiableEvent.eventId,
senderId = notifiableEvent.senderId, senderId = notifiableEvent.senderId,
roomName = notifiableEvent.roomName, roomName = notifiableEvent.roomName,