Skip to content

Commit

Permalink
Fix call invite processed after call is ended because of fastlane mode.
Browse files Browse the repository at this point in the history
  • Loading branch information
ganfra committed Jun 24, 2021
1 parent ca3e5cd commit a2c8680
Show file tree
Hide file tree
Showing 4 changed files with 8 additions and 8 deletions.
1 change: 1 addition & 0 deletions changelog.d/3564.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix call invite processed after call is ended because of fastlane mode.
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,8 @@ internal class CallEventProcessor @Inject constructor(private val callSignalingH
return eventType == EventType.CALL_INVITE
}

suspend fun processFastLane(event: Event) {
eventsToPostProcess.add(event)
onPostProcess()
fun processFastLane(event: Event) {
dispatchToCallSignalingHandlerIfNeeded(event)
}

override suspend fun onPostProcess() {
Expand All @@ -73,13 +72,12 @@ internal class CallEventProcessor @Inject constructor(private val callSignalingH

private fun dispatchToCallSignalingHandlerIfNeeded(event: Event) {
val now = System.currentTimeMillis()
// TODO might check if an invite is not closed (hangup/answered) in the same event batch?
event.roomId ?: return Unit.also {
Timber.w("Event with no room id ${event.eventId}")
}
val age = now - (event.ageLocalTs ?: now)
if (age > 40_000) {
// To old to ring?
// Too old to ring?
return
}
callSignalingHandler.onCallEvent(event)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ internal class CallSignalingHandler @Inject constructor(private val activeCallHa
private val mxCallFactory: MxCallFactory,
@UserId private val userId: String) {

private val invitedCallIds = mutableSetOf<String>()
private val callListeners = mutableSetOf<CallListener>()
private val callListenersDispatcher = CallListenersDispatcher(callListeners)

Expand Down Expand Up @@ -182,17 +183,17 @@ internal class CallSignalingHandler @Inject constructor(private val activeCallHa
val content = event.getClearContent().toModel<CallInviteContent>() ?: return

content.callId ?: return
if (activeCallHandler.getCallWithId(content.callId) != null) {
if (invitedCallIds.contains(content.callId)) {
// Call is already known, maybe due to fast lane. Ignore
Timber.d("Ignoring already known call invite")
return
}

val incomingCall = mxCallFactory.createIncomingCall(
roomId = event.roomId,
opponentUserId = event.senderId,
content = content
) ?: return
invitedCallIds.add(content.callId)
activeCallHandler.addCall(incomingCall)
callListenersDispatcher.onCallInviteReceived(incomingCall, content)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ internal class DefaultEventService @Inject constructor(

override suspend fun getEvent(roomId: String, eventId: String): Event {
val event = getEventTask.execute(GetEventTask.Params(roomId, eventId))

event.ageLocalTs = event.unsignedData?.age?.let { System.currentTimeMillis() - it }
// Fast lane to the call event processors: try to make the incoming call ring faster
if (callEventProcessor.shouldProcessFastLane(event.getClearType())) {
callEventProcessor.processFastLane(event)
Expand Down

0 comments on commit a2c8680

Please sign in to comment.