diff --git a/lib/src/voip/group_call_session.dart b/lib/src/voip/group_call_session.dart index 545ba8e7..48e13bfd 100644 --- a/lib/src/voip/group_call_session.dart +++ b/lib/src/voip/group_call_session.dart @@ -197,7 +197,6 @@ class GroupCallSession { } return room.removeFamedlyCallMemberEvent( groupCallId, - client.deviceID!, voip, application: application, scope: scope, diff --git a/lib/src/voip/utils/famedly_call_extension.dart b/lib/src/voip/utils/famedly_call_extension.dart index 354d691f..4e4c9838 100644 --- a/lib/src/voip/utils/famedly_call_extension.dart +++ b/lib/src/voip/utils/famedly_call_extension.dart @@ -121,12 +121,14 @@ extension FamedlyCallMemberEventsExtension on Room { await setFamedlyCallMemberEvent( newContent, callMembership.voip, + callMembership.callId, + application: callMembership.application, + scope: callMembership.scope, ); } Future removeFamedlyCallMemberEvent( String groupCallId, - String deviceId, VoIP voip, { String? application = 'm.call', String? scope = 'm.room', @@ -140,7 +142,7 @@ extension FamedlyCallMemberEventsExtension on Room { ownMemberships.removeWhere( (mem) => mem.callId == groupCallId && - mem.deviceId == deviceId && + mem.deviceId == client.deviceID! && mem.application == application && mem.scope == scope, ); @@ -148,7 +150,13 @@ extension FamedlyCallMemberEventsExtension on Room { final newContent = { 'memberships': List.from(ownMemberships.map((e) => e.toJson())), }; - await setFamedlyCallMemberEvent(newContent, voip); + await setFamedlyCallMemberEvent( + newContent, + voip, + groupCallId, + application: application, + scope: scope, + ); _restartDelayedLeaveEventTimer?.cancel(); if (_delayedLeaveEventId != null) { @@ -163,7 +171,10 @@ extension FamedlyCallMemberEventsExtension on Room { Future setFamedlyCallMemberEvent( Map newContent, VoIP voip, - ) async { + String groupCallId, { + String? application = 'm.call', + String? scope = 'm.room', + }) async { if (canJoinGroupCall) { final stateKey = (roomVersion?.contains('msc3757') ?? false) ? '${client.userID!}_${client.deviceID!}' @@ -175,7 +186,7 @@ extension FamedlyCallMemberEventsExtension on Room { /// can use delayed events and haven't used it yet if (useDelayedEvents && _delayedLeaveEventId == null) { - // get existing ones + // get existing ones and cancel them final List alreadyScheduledEvents = []; String? nextBatch; final sEvents = await client.getScheduledDelayedEvents(); @@ -200,14 +211,39 @@ extension FamedlyCallMemberEventsExtension on Room { ); } + Map newContent; + if (roomVersion?.contains('msc3757') ?? false) { + // scoped to deviceIds so clear the whole mems list + newContent = { + 'memberships': [], + }; + } else { + // only clear our own deviceId + final ownMemberships = getCallMembershipsForUser( + client.userID!, + client.deviceID!, + voip, + ); + + ownMemberships.removeWhere( + (mem) => + mem.callId == groupCallId && + mem.deviceId == client.deviceID! && + mem.application == application && + mem.scope == scope, + ); + + newContent = { + 'memberships': List.from(ownMemberships.map((e) => e.toJson())), + }; + } + _delayedLeaveEventId = await client.setRoomStateWithKeyWithDelay( id, EventTypes.GroupCallMember, stateKey, voip.timeouts!.delayedEventApplyLeave.inMilliseconds, - { - 'memberships': [], - }, + newContent, ); _restartDelayedLeaveEventTimer = Timer.periodic(