diff --git a/commet/lib/client/matrix/matrix_client.dart b/commet/lib/client/matrix/matrix_client.dart index 64c06e94b..0bac85be0 100644 --- a/commet/lib/client/matrix/matrix_client.dart +++ b/commet/lib/client/matrix/matrix_client.dart @@ -422,6 +422,7 @@ class MatrixClient extends Client { @override Future createRoom(CreateRoomArgs args) async { var creationContent = null; + Map? powerLevelAdditions = {}; List? initialState; if (args.roomType == RoomType.photoAlbum) { @@ -430,6 +431,12 @@ class MatrixClient extends Client { if (args.roomType == RoomType.voipRoom) { creationContent = {"type": "org.matrix.msc3417.call"}; + powerLevelAdditions = { + "events": { + "org.matrix.msc3401.call": 0, + "org.matrix.msc3401.call.member": 0 + } + }; } if (args.roomType == RoomType.calendar) { @@ -481,6 +488,26 @@ class MatrixClient extends Client { await matrixRoom.enableEncryption(); } + if (powerLevelAdditions.isNotEmpty) { + var events = await matrixClient.getRoomState(id); + + var currentPerms = events + .firstWhereOrNull((i) => i.type == matrix.EventTypes.RoomPowerLevels) + ?.content; + + if (currentPerms != null) { + var newPerms = { + ...currentPerms, + "events": { + ...?currentPerms["events"] as Map?, + ...?powerLevelAdditions["events"] as Map?, + } + }; + _matrixClient.setRoomStateWithKey( + id, matrix.EventTypes.RoomPowerLevels, "", newPerms); + } + } + if (hasRoom(id)) return getRoom(id)!; var room = MatrixRoom(this, matrixRoom, _matrixClient); rooms.add(room); diff --git a/commet/lib/ui/organisms/voip_room_view/voip_room_view.dart b/commet/lib/ui/organisms/voip_room_view/voip_room_view.dart index d1d381976..663e32f16 100644 --- a/commet/lib/ui/organisms/voip_room_view/voip_room_view.dart +++ b/commet/lib/ui/organisms/voip_room_view/voip_room_view.dart @@ -65,6 +65,12 @@ class _VoipRoomViewState extends State { var color = Theme.of(context).colorScheme.surfaceContainer; if (currentSession == null) return unjoinedView(color); + if (currentSession?.state == VoipState.ended) { + setState(() { + joining = false; + }); + return unjoinedView(color); + } return CallWidget(currentSession!); }