diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 87fe22f4..46abae8e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,5 +1,5 @@ variables: - FLUTTER_VERSION: 3.0.1 + FLUTTER_VERSION: 3.0.2 image: cirrusci/flutter:${FLUTTER_VERSION} @@ -34,7 +34,7 @@ test: integration_test: image: registry.gitlab.com/famedly/company/frontend/flutter-dockerimages/integration/stable:${FLUTTER_VERSION} stage: coverage - services: + services: - name: docker:dind alias: docker variables: @@ -195,7 +195,7 @@ build_linux_x86: stage: coverage before_script: [ - sudo apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install keyboard-configuration -y && sudo apt-get install curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libjsoncpp1 libsecret-1-dev libsecret-1-0 librhash0 -y, + sudo apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install keyboard-configuration -y && sudo apt-get install curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 -y, ] script: [./scripts/build-linux.sh] artifacts: diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index db30b324..ff394d9d 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -25,7 +25,7 @@ + tools:overrideLibrary="io.wazo.callkeep, net.touchcapture.qr.flutterqr, com.cloudwebrtc.webrtc, org.webrtc, com.it_nomads.fluttersecurestorage, com.pichillilorenzo.flutter_inappwebview, com.example.video_compress, com.otaliastudios.transcoder, com.otaliastudios.opengl, com.kineapps.flutter_file_dialog, com.llfbandit.record"/> { } void voiceMessageAction() async { + if (PlatformInfos.isAndroid) { + final info = await DeviceInfoPlugin().androidInfo; + if ((info.version.sdkInt ?? 16) < 19) { + showOkAlertDialog( + context: context, + title: L10n.of(context)!.unsupportedAndroidVersion, + message: L10n.of(context)!.unsupportedAndroidVersionLong, + okLabel: L10n.of(context)!.close, + ); + return; + } + } + if (await Record().hasPermission() == false) return; final result = await showDialog( context: context, diff --git a/lib/pages/chat/chat_input_row.dart b/lib/pages/chat/chat_input_row.dart index 62f1db76..346b3b44 100644 --- a/lib/pages/chat/chat_input_row.dart +++ b/lib/pages/chat/chat_input_row.dart @@ -246,7 +246,8 @@ class ChatInputRow extends StatelessWidget { ), ), ), - if (PlatformInfos.isMobile && controller.inputText.isEmpty) + if (PlatformInfos.platformCanRecord && + controller.inputText.isEmpty) Container( height: 56, alignment: Alignment.center, diff --git a/lib/pages/chat/recording_dialog.dart b/lib/pages/chat/recording_dialog.dart index 26cfefeb..1958860d 100644 --- a/lib/pages/chat/recording_dialog.dart +++ b/lib/pages/chat/recording_dialog.dart @@ -33,7 +33,7 @@ class _RecordingDialogState extends State { final List amplitudeTimeline = []; static const int bitRate = 64000; - static const double samplingRate = 22050.0; + static const int samplingRate = 22050; Future startRecording() async { try { @@ -49,7 +49,6 @@ class _RecordingDialogState extends State { await Wakelock.enable(); await _audioRecorder.start( path: _recordedPath, - encoder: AudioEncoder.AAC, bitRate: bitRate, samplingRate: samplingRate, ); diff --git a/lib/pages/dialer/dialer.dart b/lib/pages/dialer/dialer.dart index b8470903..212324ca 100644 --- a/lib/pages/dialer/dialer.dart +++ b/lib/pages/dialer/dialer.dart @@ -193,8 +193,8 @@ class _MyCallingPage extends State { final call = this.call; if (call == null) return; - call.onCallStateChanged.listen(_handleCallState); - call.onCallEventChanged.listen((event) { + call.onCallStateChanged.stream.listen(_handleCallState); + call.onCallEventChanged.stream.listen((event) { if (event == CallEvent.kFeedsChanged) { setState(() { call.tryRemoveStopedStreams(); diff --git a/lib/utils/platform_infos.dart b/lib/utils/platform_infos.dart index 47baf1a7..a8071430 100644 --- a/lib/utils/platform_infos.dart +++ b/lib/utils/platform_infos.dart @@ -30,6 +30,8 @@ abstract class PlatformInfos { static bool get usesTouchscreen => !isMobile; + static bool get platformCanRecord => (isMobile || isMacOS); + static String get clientName => '${AppConfig.applicationName} ${isWeb ? 'web' : Platform.operatingSystem}${kReleaseMode ? '' : 'Debug'}'; diff --git a/lib/utils/voip/callkeep_manager.dart b/lib/utils/voip/callkeep_manager.dart index ca0d4473..d2b56f23 100644 --- a/lib/utils/voip/callkeep_manager.dart +++ b/lib/utils/voip/callkeep_manager.dart @@ -11,7 +11,7 @@ import 'package:fluffychat/utils/voip_plugin.dart'; class CallKeeper { CallKeeper(this.callKeepManager, this.uuid, this.number, this.call) { - call?.onCallStateChanged.listen(_handleCallState); + call?.onCallStateChanged.stream.listen(_handleCallState); } CallKeepManager callKeepManager; @@ -119,12 +119,12 @@ class CallKeepManager { await displayIncomingCall(call); - call.onCallStateChanged.listen((state) { + call.onCallStateChanged.stream.listen((state) { if (state == CallState.kEnded) { _callKeep.endAllCalls(); } }); - call.onCallEventChanged.listen((event) { + call.onCallEventChanged.stream.listen((event) { if (event == CallEvent.kLocalHoldUnhold) { Logs().i( 'Call hold event: local ${call.localHold}, remote ${call.remoteOnHold}'); diff --git a/lib/utils/voip_plugin.dart b/lib/utils/voip_plugin.dart index 101ccd45..1b9de844 100644 --- a/lib/utils/voip_plugin.dart +++ b/lib/utils/voip_plugin.dart @@ -154,4 +154,14 @@ class VoipPlugin extends WidgetsBindingObserver implements WebRTCDelegate { overlayEntry = null; } } + + @override + void handleGroupCallEnded(GroupCall groupCall) { + // TODO: implement handleGroupCallEnded + } + + @override + void handleNewGroupCall(GroupCall groupCall) { + // TODO: implement handleNewGroupCall + } } diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index c8d88da9..6f2fa9d2 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -19,6 +19,7 @@ import geolocator_apple import just_audio import package_info_plus_macos import path_provider_macos +import record_macos import share_plus_macos import shared_preferences_macos import sqflite @@ -41,6 +42,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin")) FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + RecordMacosPlugin.register(with: registry.registrar(forPlugin: "RecordMacosPlugin")) SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) diff --git a/pubspec.lock b/pubspec.lock index 53abc989..a6967c87 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -21,7 +21,7 @@ packages: name: adaptive_theme url: "https://pub.dartlang.org" source: hosted - version: "2.3.1" + version: "3.0.0" analyzer: dependency: transitive description: @@ -324,7 +324,7 @@ packages: name: device_info_plus url: "https://pub.dartlang.org" source: hosted - version: "3.2.2" + version: "4.0.0" device_info_plus_linux: dependency: transitive description: @@ -338,7 +338,7 @@ packages: name: device_info_plus_macos url: "https://pub.dartlang.org" source: hosted - version: "2.2.2" + version: "2.2.3" device_info_plus_platform_interface: dependency: transitive description: @@ -497,7 +497,7 @@ packages: name: flutter_blurhash url: "https://pub.dartlang.org" source: hosted - version: "0.6.4" + version: "0.7.0" flutter_cache_manager: dependency: "direct main" description: @@ -584,7 +584,7 @@ packages: name: flutter_map url: "https://pub.dartlang.org" source: hosted - version: "0.14.0" + version: "1.1.0" flutter_math_fork: dependency: transitive description: @@ -701,7 +701,7 @@ packages: name: flutter_typeahead url: "https://pub.dartlang.org" source: hosted - version: "3.2.5" + version: "4.0.0" flutter_web_auth: dependency: "direct main" description: @@ -1019,7 +1019,7 @@ packages: name: matrix url: "https://pub.dartlang.org" source: hosted - version: "0.9.12" + version: "0.10.1" matrix_api_lite: dependency: transitive description: @@ -1105,7 +1105,7 @@ packages: name: octo_image url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.0.2" olm: dependency: transitive description: @@ -1245,14 +1245,14 @@ packages: name: permission_handler url: "https://pub.dartlang.org" source: hosted - version: "9.2.0" + version: "10.0.0" permission_handler_android: dependency: transitive description: name: permission_handler_android url: "https://pub.dartlang.org" source: hosted - version: "9.0.2+1" + version: "10.0.0" permission_handler_apple: dependency: transitive description: @@ -1309,6 +1309,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.5.2" + polylabel: + dependency: transitive + description: + name: polylabel + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" pool: dependency: transitive description: @@ -1408,21 +1415,42 @@ packages: name: record url: "https://pub.dartlang.org" source: hosted - version: "3.0.3" + version: "4.1.1" + record_linux: + dependency: transitive + description: + name: record_linux + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.0" + record_macos: + dependency: transitive + description: + name: record_macos + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.0" record_platform_interface: dependency: transitive description: name: record_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "0.2.0" + version: "0.3.0" record_web: dependency: transitive description: name: record_web url: "https://pub.dartlang.org" source: hosted - version: "0.2.1" + version: "0.3.1" + record_windows: + dependency: transitive + description: + name: record_windows + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.3" rxdart: dependency: transitive description: @@ -1443,7 +1471,7 @@ packages: name: scroll_to_index url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "3.0.1" sdp_transform: dependency: transitive description: @@ -1464,7 +1492,7 @@ packages: name: share_plus url: "https://pub.dartlang.org" source: hosted - version: "4.0.8" + version: "4.0.9" share_plus_linux: dependency: transitive description: @@ -1724,13 +1752,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.0" - transparent_image: - dependency: transitive - description: - name: transparent_image - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" tuple: dependency: transitive description: @@ -2068,5 +2089,5 @@ packages: source: hosted version: "3.1.0" sdks: - dart: ">=2.17.0-0 <3.0.0" - flutter: ">=2.13.0-0.2.pre" + dart: ">=2.17.0 <3.0.0" + flutter: ">=3.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index a8cc2d59..1672723d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -8,7 +8,7 @@ environment: dependencies: adaptive_dialog: ^1.5.1 - adaptive_theme: ^2.3.1 + adaptive_theme: ^3.0.0 animations: ^2.0.2 blurhash_dart: ^1.1.0 cached_network_image: ^3.2.0 @@ -20,7 +20,7 @@ dependencies: desktop_drop: ^0.3.2 desktop_lifecycle: ^0.1.0 desktop_notifications: ^0.6.3 - device_info_plus: ^3.2.1 + device_info_plus: ^4.0.0 dynamic_color: ^1.2.2 email_validator: ^2.0.1 emoji_picker_flutter: ^1.1.2 @@ -31,12 +31,12 @@ dependencies: sdk: flutter flutter_app_badger: ^1.3.0 flutter_app_lock: ^2.0.0 - flutter_blurhash: ^0.6.4 + flutter_blurhash: ^0.7.0 flutter_cache_manager: ^3.3.0 flutter_local_notifications: ^9.4.0 flutter_localizations: sdk: flutter - flutter_map: ^0.14.0 + flutter_map: ^1.1.0 flutter_matrix_html: ^1.1.0 flutter_olm: ^1.2.0 flutter_openssl_crypto: ^0.1.0 @@ -44,7 +44,7 @@ dependencies: flutter_secure_storage: ^5.0.2 flutter_slidable: ^1.2.0 flutter_svg: ^0.22.0 - flutter_typeahead: ^3.2.5 + flutter_typeahead: ^4.0.0 flutter_web_auth: ^0.4.0 flutter_webrtc: ^0.8.7 future_loading_dialog: ^0.2.3 @@ -57,25 +57,25 @@ dependencies: keyboard_shortcuts: ^0.1.4 localstorage: ^4.0.0+1 lottie: ^1.2.2 - matrix: ^0.9.12 + matrix: ^0.10.1 matrix_homeserver_recommendations: ^0.2.0 matrix_link_text: ^1.0.2 native_imaging: git: https://gitlab.com/famedly/company/frontend/libraries/native_imaging.git package_info_plus: ^1.3.0 path_provider: ^2.0.9 - permission_handler: ^9.2.0 + permission_handler: ^10.0.0 pin_code_text_field: ^1.8.0 provider: ^6.0.2 punycode: ^1.0.0 qr_code_scanner: ^0.7.0 qr_flutter: ^4.0.0 receive_sharing_intent: ^1.4.5 - record: ^3.0.2 + record: ^4.1.1 salomon_bottom_bar: ^3.2.0 - scroll_to_index: ^2.1.1 + scroll_to_index: ^3.0.1 sentry: ^6.3.0 - share_plus: ^4.0.8 + share_plus: ^4.0.9 shared_preferences: ^2.0.13 slugify: ^2.0.0 snapping_sheet: ^3.1.0