diff --git a/lib/src/client.dart b/lib/src/client.dart index c8293c61..1b0a986c 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -1098,6 +1098,8 @@ class Client extends MatrixApi { final CachedStreamController onGroupMember = CachedStreamController(); + final CachedStreamController onRoomState = CachedStreamController(); + /// How long should the app wait until it retrys the synchronisation after /// an error? int syncErrorTimeoutSec = 3; diff --git a/lib/src/room.dart b/lib/src/room.dart index 4718e652..f31c00bd 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -197,6 +197,8 @@ class Room { } (states[state.type] ??= {})[stateKey] = state; + + client.onRoomState.add(state); } /// ID of the fully read marker event. diff --git a/lib/src/voip/group_call.dart b/lib/src/voip/group_call.dart index 94c88925..e6667d06 100644 --- a/lib/src/voip/group_call.dart +++ b/lib/src/voip/group_call.dart @@ -197,9 +197,6 @@ class GroupCall { Timer? activeSpeakerLoopTimeout; - Timer? retryCallLoopTimeout; - Map retryCallCounts = {}; - final CachedStreamController onGroupCallFeedsChanged = CachedStreamController(); @@ -430,8 +427,6 @@ class GroupCall { onMemberStateChanged(stateEvent); }); - retryCallLoopTimeout = Timer.periodic( - Duration(milliseconds: retryCallInterval), onRetryCallLoop); onActiveSpeakerLoop(); voip.currentGroupCID = groupCallId; @@ -467,8 +462,6 @@ class GroupCall { activeSpeaker = null; activeSpeakerLoopTimeout?.cancel(); - retryCallCounts.clear(); - retryCallLoopTimeout?.cancel(); _callSubscription?.cancel(); } @@ -876,24 +869,6 @@ class GroupCall { return memberDevices[0]; } - /// Monitor member status and respond to mesh calls by regularly updating - /// the state event in the room - void onRetryCallLoop(Timer _) async { - final memberStateEvents = - await getStateEventsList(EventTypes.GroupCallMemberPrefix); - - memberStateEvents.forEach((event) { - final memberId = event.senderId; - final existingCall = - calls.indexWhere((call) => call.remoteUser!.id == memberId) != -1; - final retryCallCount = retryCallCounts[memberId] ?? 0; - if (!existingCall && retryCallCount < 3) { - retryCallCounts[memberId] = retryCallCount + 1; - onMemberStateChanged(event); - } - }); - } - CallSession? getCallByUserId(String userId) { final value = calls.where((item) => item.remoteUser!.id == userId); if (value.isNotEmpty) { @@ -1064,10 +1039,6 @@ class GroupCall { call.isLocalVideoMuted != videoMuted) { call.setLocalVideoMuted(videoMuted); } - - if (state == CallState.kConnected) { - retryCallCounts.remove(call.remoteUser!.id); - } } void onCallHangup(CallSession call) { diff --git a/lib/src/voip/voip.dart b/lib/src/voip/voip.dart index 334418c5..45f031ea 100644 --- a/lib/src/voip/voip.dart +++ b/lib/src/voip/voip.dart @@ -68,9 +68,14 @@ class VoIP { client.onAssertedIdentityReceived.stream .listen((event) => _handleEvent(event, onAssertedIdentityReceived)); - client.onGroupCallRequest.stream.listen((event) { - Logs().v('[VOIP] onGroupCallRequest: type ${event.toJson()}.'); - onRoomStateChanged(event); + client.onRoomState.stream.listen((event) { + if ([ + EventTypes.GroupCallPrefix, + EventTypes.GroupCallMemberPrefix, + ].contains(event.type)) { + Logs().v('[VOIP] onRoomState: type ${event.toJson()}.'); + onRoomStateChanged(event); + } }); client.onToDeviceEvent.stream.listen((event) {