diff --git a/assets/sounds/phone.ogg b/assets/sounds/phone.ogg new file mode 100644 index 00000000..7cd28648 Binary files /dev/null and b/assets/sounds/phone.ogg differ diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 9adf24af..918c17e6 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -990,9 +990,7 @@ class ChatController extends State { final voipPlugin = Matrix.of(context).voipPlugin; await voipPlugin!.voip.inviteToCall(room!.id, callType).catchError((e) { ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(e.toString()) - // Text(LocalizedExceptionExtension(context, e)), - ), + SnackBar(content: Text((e as Object).toLocalizedString(context))), ); }); } else { diff --git a/lib/pages/chat/events/message.dart b/lib/pages/chat/events/message.dart index e14098ca..c5c0f3c5 100644 --- a/lib/pages/chat/events/message.dart +++ b/lib/pages/chat/events/message.dart @@ -45,8 +45,15 @@ class Message extends StatelessWidget { @override Widget build(BuildContext context) { - if (![EventTypes.Message, EventTypes.Sticker, EventTypes.Encrypted] - .contains(event.type)) { + if (!{ + EventTypes.Message, + EventTypes.Sticker, + EventTypes.Encrypted, + EventTypes.CallInvite + }.contains(event.type)) { + if (event.type.startsWith('m.call.')) { + return Container(); + } return StateMessage(event, unfold: unfold); } diff --git a/lib/pages/chat/events/message_content.dart b/lib/pages/chat/events/message_content.dart index ddcbb9e4..61b0bdc4 100644 --- a/lib/pages/chat/events/message_content.dart +++ b/lib/pages/chat/events/message_content.dart @@ -199,6 +199,13 @@ class MessageContent extends StatelessWidget { onLinkTap: (url) => UrlLauncher(context, url).launchUrl(), ); } + case EventTypes.CallInvite: + return _ButtonContent( + label: L10n.of(context)!.startedACall(event.sender.calcDisplayname()), + icon: const Icon(Icons.phone_outlined), + textColor: buttonTextColor, + onPressed: () => onInfoTab!(event), + ); default: return _ButtonContent( label: L10n.of(context)! @@ -227,11 +234,14 @@ class _ButtonContent extends StatelessWidget { @override Widget build(BuildContext context) { - return TextButton.icon( + return OutlinedButton.icon( onPressed: onPressed, icon: icon, label: Text(label, overflow: TextOverflow.ellipsis), - style: TextButton.styleFrom(primary: textColor), + style: OutlinedButton.styleFrom( + primary: textColor, + backgroundColor: Colors.white.withAlpha(64), + ), ); } } diff --git a/lib/pages/dialer/dialer.dart b/lib/pages/dialer/dialer.dart index f8319d53..a868f515 100644 --- a/lib/pages/dialer/dialer.dart +++ b/lib/pages/dialer/dialer.dart @@ -26,7 +26,6 @@ import 'package:assets_audio_player/assets_audio_player.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart'; import 'package:matrix/matrix.dart'; import 'package:pedantic/pedantic.dart'; -import 'package:universal_html/html.dart' as darthtml; import 'package:wakelock/wakelock.dart'; import 'package:fluffychat/utils/platform_infos.dart'; @@ -174,12 +173,7 @@ class _MyCallingPage extends State { void _playCallSound() async { const path = 'assets/sounds/call.ogg'; - if (kIsWeb) { - darthtml.AudioElement() - ..src = 'assets/$path' - ..autoplay = true - ..load(); - } else if (PlatformInfos.isMobile) { + if (kIsWeb || PlatformInfos.isMobile || PlatformInfos.isMacOS) { await AssetsAudioPlayer.newPlayer().open(Audio(path)); } else { Logs().w('Playing sound not implemented for this platform!'); @@ -269,7 +263,6 @@ class _MyCallingPage extends State { } void _hangUp() { - _playCallSound(); setState(() { if (call != null && (call?.isRinging ?? false)) { call?.reject(); diff --git a/lib/utils/voip/user_media_manager.dart b/lib/utils/voip/user_media_manager.dart index 98d6ba3a..8d06ffbf 100644 --- a/lib/utils/voip/user_media_manager.dart +++ b/lib/utils/voip/user_media_manager.dart @@ -1,7 +1,10 @@ import 'package:flutter/foundation.dart'; +import 'package:assets_audio_player/assets_audio_player.dart'; import 'package:flutter_ringtone_player/flutter_ringtone_player.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; + class UserMediaManager { factory UserMediaManager() { return _instance; @@ -11,17 +14,27 @@ class UserMediaManager { static final UserMediaManager _instance = UserMediaManager._internal(); - Future startRingingTone() { - if (kIsWeb) { - throw 'Platform [web] not supported'; + AssetsAudioPlayer? _assetsAudioPlayer; + + Future startRingingTone() async { + if (PlatformInfos.isMobile) { + await FlutterRingtonePlayer.playRingtone(volume: 80); + } else if ((kIsWeb || PlatformInfos.isMacOS) && + _assetsAudioPlayer != null) { + const path = 'assets/sounds/phone.ogg'; + final player = _assetsAudioPlayer = AssetsAudioPlayer.newPlayer(); + await player.open(Audio(path), + autoStart: true, loopMode: LoopMode.playlist); } - return FlutterRingtonePlayer.playRingtone(volume: 80); + return; } - Future stopRingingTone() { - if (kIsWeb) { - throw 'Platform [web] not supported'; + Future stopRingingTone() async { + if (PlatformInfos.isMobile) { + await FlutterRingtonePlayer.stop(); } - return FlutterRingtonePlayer.stop(); + await _assetsAudioPlayer?.stop(); + _assetsAudioPlayer = null; + return; } } diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 43424f5e..818fa7f6 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -10,9 +10,6 @@ list(APPEND FLUTTER_PLUGIN_LIST url_launcher_linux ) -list(APPEND FLUTTER_FFI_PLUGIN_LIST -) - set(PLUGIN_BUNDLED_LIBRARIES) foreach(plugin ${FLUTTER_PLUGIN_LIST}) @@ -21,8 +18,3 @@ foreach(plugin ${FLUTTER_PLUGIN_LIST}) list(APPEND PLUGIN_BUNDLED_LIBRARIES $) list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) endforeach(plugin) - -foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) -endforeach(ffi_plugin) diff --git a/pubspec.lock b/pubspec.lock index 24b8740a..03f8a0c8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -890,7 +890,7 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.4" + version: "0.6.3" latlong2: dependency: transitive description: @@ -1107,7 +1107,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.0" path_drawing: dependency: transitive description: @@ -1560,21 +1560,21 @@ packages: name: test url: "https://pub.dartlang.org" source: hosted - version: "1.20.1" + version: "1.19.5" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.9" + version: "0.4.8" test_core: dependency: transitive description: name: test_core url: "https://pub.dartlang.org" source: hosted - version: "0.4.11" + version: "0.4.9" timezone: dependency: transitive description: @@ -1898,5 +1898,5 @@ packages: source: hosted version: "3.1.0" sdks: - dart: ">=2.16.0-100.0.dev <3.0.0" + dart: ">=2.15.1 <3.0.0" flutter: ">=2.8.0" diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index cd2a6cc0..b18dd536 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -12,9 +12,6 @@ list(APPEND FLUTTER_PLUGIN_LIST url_launcher_windows ) -list(APPEND FLUTTER_FFI_PLUGIN_LIST -) - set(PLUGIN_BUNDLED_LIBRARIES) foreach(plugin ${FLUTTER_PLUGIN_LIST}) @@ -23,8 +20,3 @@ foreach(plugin ${FLUTTER_PLUGIN_LIST}) list(APPEND PLUGIN_BUNDLED_LIBRARIES $) list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) endforeach(plugin) - -foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) -endforeach(ffi_plugin)