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