Fix call invite processed after call is ended because of fastlane mode.

This commit is contained in:
ganfra 2021-06-24 20:49:35 +02:00
parent ca3e5cdf90
commit a2c8680d7a
4 changed files with 8 additions and 8 deletions

1
changelog.d/3564.bugfix Normal file
View File

@ -0,0 +1 @@
Fix call invite processed after call is ended because of fastlane mode.

View File

@ -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() {
@ -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)

View File

@ -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)
@ -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)
}

View File

@ -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)