/* * Famedly Matrix SDK * Copyright (C) 2021 Famedly GmbH * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ class CallReplacesTarget { String? id; String? display_name; String? avatar_url; CallReplacesTarget({this.id, this.display_name, this.avatar_url}); factory CallReplacesTarget.fromJson(Map json) => CallReplacesTarget( id: json['id'].toString(), display_name: json['display_name'].toString(), avatar_url: json['avatar_url'].toString(), ); Map toJson() => { if (id != null) 'id': id, if (display_name != null) 'display_name': display_name, if (avatar_url != null) 'avatar_url': avatar_url, }; } /// MSC2747: VoIP call transfers /// https://github.com/matrix-org/matrix-doc/pull/2747 class CallReplaces { String? replacement_id; CallReplacesTarget? target_user; String? create_call; String? await_call; String? target_room; CallReplaces({ this.replacement_id, this.target_user, this.create_call, this.await_call, this.target_room, }); factory CallReplaces.fromJson(Map json) => CallReplaces( replacement_id: json['replacement_id']?.toString(), create_call: json['create_call']?.toString(), await_call: json['await_call']?.toString(), target_room: json['target_room']?.toString(), target_user: CallReplacesTarget.fromJson(json['target_user']), ); Map toJson() => { if (replacement_id != null) 'replacement_id': replacement_id, if (target_user != null) 'target_user': target_user!.toJson(), if (create_call != null) 'create_call': create_call, if (await_call != null) 'await_call': await_call, if (target_room != null) 'target_room': target_room, }; } // TODO: Change to "sdp_stream_metadata" when MSC3077 is merged const String sdpStreamMetadataKey = 'org.matrix.msc3077.sdp_stream_metadata'; /// https://github.com/matrix-org/matrix-doc/blob/dbkr/msc2747/proposals/2747-voip-call-transfer.md#capability-advertisment /// https://github.com/matrix-org/matrix-doc/blob/dbkr/msc2746/proposals/2746-reliable-voip.md#add-dtmf class CallCapabilities { bool transferee; bool dtmf; CallCapabilities({this.transferee = false, this.dtmf = false}); factory CallCapabilities.fromJson(Map json) => CallCapabilities( dtmf: json['m.call.dtmf'] as bool? ?? false, transferee: json['m.call.transferee'] as bool? ?? false, ); Map toJson() => { 'm.call.transferee': transferee, 'm.call.dtmf': dtmf, }; } /// MSC3077: Support for multi-stream VoIP /// https://github.com/matrix-org/matrix-doc/pull/3077 /// /// MSC3291: Muting in VoIP calls /// https://github.com/SimonBrandner/matrix-doc/blob/msc/muting/proposals/3291-muting.md /// /// This MSC proposes adding an sdp_stream_metadata field /// to the events containing a session description i.e.: /// m.call.invite, m.call.answer, m.call.negotiate /// class SDPStreamPurpose { // SDPStreamMetadataPurpose String purpose; bool audio_muted; bool video_muted; SDPStreamPurpose( {required this.purpose, this.audio_muted = false, this.video_muted = false}); factory SDPStreamPurpose.fromJson(Map json) => SDPStreamPurpose( audio_muted: json['audio_muted'] as bool? ?? false, video_muted: json['video_muted'] as bool? ?? false, purpose: json['purpose'] as String, ); Map toJson() => { 'purpose': purpose, 'audio_muted': audio_muted, 'video_muted': video_muted, }; } class SDPStreamMetadataPurpose { static String Usermedia = 'm.usermedia'; static String Screenshare = 'm.screenshare'; } class SDPStreamMetadata { Map sdpStreamMetadatas; SDPStreamMetadata(this.sdpStreamMetadatas); factory SDPStreamMetadata.fromJson(Map json) => SDPStreamMetadata(json.map( (key, value) => MapEntry(key, SDPStreamPurpose.fromJson(value)))); Map toJson() => sdpStreamMetadatas.map((key, value) => MapEntry(key, value.toJson())); } /// MSC3086: Asserted identity on VoIP calls /// https://github.com/matrix-org/matrix-doc/pull/3086 class AssertedIdentity { String? id; String? displayName; String? avatarUrl; AssertedIdentity({this.id, this.displayName, this.avatarUrl}); factory AssertedIdentity.fromJson(Map json) => AssertedIdentity( displayName: json['display_name'] as String?, id: json['id'] as String?, avatarUrl: json['avatar_url'] as String?, ); Map toJson() => { if (displayName != null) 'display_name': displayName, if (id != null) 'id': id, if (avatarUrl != null) 'avatar_url': avatarUrl, }; }