diff --git a/android/app/src/main/res/xml/locale_config.xml b/android/app/src/main/res/xml/locale_config.xml index a37191e79..240911b54 100644 --- a/android/app/src/main/res/xml/locale_config.xml +++ b/android/app/src/main/res/xml/locale_config.xml @@ -50,6 +50,7 @@ + diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 526a3ddd2..e16b469b5 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -479,7 +479,12 @@ class ChatController extends State ); sendingClient = Matrix.of(context).client; - readMarkerEventId = room.hasNewMessages ? room.fullyRead : ''; + final lastEventThreadId = + room.lastEvent?.relationshipType == RelationshipTypes.thread + ? room.lastEvent?.relationshipEventId + : null; + readMarkerEventId = + room.hasNewMessages ? lastEventThreadId ?? room.fullyRead : ''; WidgetsBinding.instance.addObserver(this); _tryLoadTimeline(); if (kIsWeb) { @@ -610,7 +615,11 @@ class ChatController extends State loadTimelineFuture = _getTimeline(); try { await loadTimelineFuture; - if (initialEventId != null) scrollToEventId(initialEventId); + // We launched the chat with a given initial event ID: + if (initialEventId != null) { + scrollToEventId(initialEventId); + return; + } var readMarkerEventIndex = readMarkerEventId.isEmpty ? -1 diff --git a/lib/pages/chat_list/chat_list_item.dart b/lib/pages/chat_list/chat_list_item.dart index 346870b00..66b4d338d 100644 --- a/lib/pages/chat_list/chat_list_item.dart +++ b/lib/pages/chat_list/chat_list_item.dart @@ -252,18 +252,53 @@ class ChatListItem extends StatelessWidget { ), const SizedBox(width: 4), ], - AnimatedContainer( - width: typingText.isEmpty ? 0 : 18, + AnimatedSize( clipBehavior: Clip.hardEdge, - decoration: const BoxDecoration(), duration: FluffyThemes.animationDuration, curve: FluffyThemes.animationCurve, - padding: const EdgeInsets.only(right: 4), - child: Icon( - Icons.edit_outlined, - color: theme.colorScheme.secondary, - size: 14, - ), + child: typingText.isNotEmpty + ? Padding( + padding: const EdgeInsets.only(right: 4.0), + child: Icon( + Icons.edit_outlined, + color: theme.colorScheme.secondary, + size: 16, + ), + ) + : room.lastEvent?.relationshipType == + RelationshipTypes.thread + ? Container( + decoration: BoxDecoration( + border: Border.all( + color: theme.colorScheme.outline, + ), + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + ), + padding: + const EdgeInsets.symmetric(horizontal: 8.0), + margin: const EdgeInsets.only(right: 4.0), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + Icons.message_outlined, + size: 12, + color: theme.colorScheme.outline, + ), + const SizedBox(width: 4), + Text( + L10n.of(context).thread, + style: TextStyle( + fontSize: 12, + color: theme.colorScheme.outline, + ), + ), + ], + ), + ) + : const SizedBox.shrink(), ), Expanded( child: room.isSpace && room.membership == Membership.join diff --git a/lib/pages/homeserver_picker/homeserver_picker.dart b/lib/pages/homeserver_picker/homeserver_picker.dart index 1e8d015bf..2d3130201 100644 --- a/lib/pages/homeserver_picker/homeserver_picker.dart +++ b/lib/pages/homeserver_picker/homeserver_picker.dart @@ -147,7 +147,7 @@ class HomeserverPickerController extends State { final result = await FlutterWebAuth2.authenticate( url: url.toString(), callbackUrlScheme: urlScheme, - options: const FlutterWebAuth2Options(), + options: FlutterWebAuth2Options(useWebview: PlatformInfos.isMobile), ); final token = Uri.parse(result).queryParameters['loginToken']; if (token?.isEmpty ?? false) return; diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index e80b349cf..03136b174 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -4,6 +4,7 @@ list(APPEND FLUTTER_PLUGIN_LIST audioplayers_linux + desktop_webview_window dynamic_color emoji_picker_flutter file_selector_linux diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 554a4c901..398940f74 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -9,6 +9,7 @@ import app_links import app_settings import audio_session import audioplayers_darwin +import desktop_webview_window import device_info_plus import dynamic_color import emoji_picker_flutter @@ -51,6 +52,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { AppSettingsPlugin.register(with: registry.registrar(forPlugin: "AppSettingsPlugin")) AudioSessionPlugin.register(with: registry.registrar(forPlugin: "AudioSessionPlugin")) AudioplayersDarwinPlugin.register(with: registry.registrar(forPlugin: "AudioplayersDarwinPlugin")) + DesktopWebviewWindowPlugin.register(with: registry.registrar(forPlugin: "DesktopWebviewWindowPlugin")) DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin")) EmojiPickerFlutterPlugin.register(with: registry.registrar(forPlugin: "EmojiPickerFlutterPlugin")) diff --git a/pubspec.lock b/pubspec.lock index c45d2a9fb..83f4741c7 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -465,6 +465,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.6.3" + desktop_webview_window: + dependency: transitive + description: + name: desktop_webview_window + sha256: "57cf20d81689d5cbb1adfd0017e96b669398a669d927906073b0e42fc64111c0" + url: "https://pub.dev" + source: hosted + version: "0.2.3" device_info_plus: dependency: "direct main" description: @@ -546,13 +554,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.3" - fcm_shared_isolate: - dependency: "direct overridden" - description: - path: "pangea_packages/fcm_shared_isolate" - relative: true - source: path - version: "0.2.0" ffi: dependency: transitive description: @@ -873,14 +874,13 @@ packages: source: hosted version: "9.2.4" flutter_secure_storage_linux: - dependency: "direct overridden" + dependency: transitive description: - path: flutter_secure_storage_linux - ref: patch-2 - resolved-ref: f076cbb65b075afd6e3b648122987a67306dc298 - url: "https://github.com/m-berto/flutter_secure_storage.git" - source: git - version: "2.0.1" + name: flutter_secure_storage_linux + sha256: be76c1d24a97d0b98f8b54bce6b481a380a6590df992d0098f868ad54dc8f688 + url: "https://pub.dev" + source: hosted + version: "1.2.3" flutter_secure_storage_macos: dependency: transitive description: @@ -890,13 +890,13 @@ packages: source: hosted version: "3.1.3" flutter_secure_storage_platform_interface: - dependency: "direct overridden" + dependency: transitive description: name: flutter_secure_storage_platform_interface - sha256: b8337d3d52e429e6c0a7710e38cf9742a3bb05844bd927450eb94f80c11ef85d + sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "1.1.2" flutter_secure_storage_web: dependency: transitive description: @@ -953,20 +953,19 @@ packages: flutter_web_auth_2: dependency: "direct main" description: - path: flutter_web_auth_2 - ref: "3.x-without-v1" - resolved-ref: "48682f19576001e50104a602d891343850adb67f" - url: "https://github.com/ThexXTURBOXx/flutter_web_auth_2.git" - source: git - version: "3.1.2-without-v1" + name: flutter_web_auth_2 + sha256: "3c14babeaa066c371f3a743f204dd0d348b7d42ffa6fae7a9847a521aff33696" + url: "https://pub.dev" + source: hosted + version: "4.1.0" flutter_web_auth_2_platform_interface: dependency: transitive description: name: flutter_web_auth_2_platform_interface - sha256: e8669e262005a8354389ba2971f0fc1c36188481234ff50d013aaf993f30f739 + sha256: c63a472c8070998e4e422f6b34a17070e60782ac442107c70000dd1bed645f4d url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "4.1.0" flutter_web_plugins: dependency: transitive description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index 47f72d0cb..daf5e0ec6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -47,7 +47,7 @@ dependencies: flutter_secure_storage: ^9.2.4 flutter_shortcuts_new: ^2.0.0 flutter_vodozemac: ^0.4.1 - flutter_web_auth_2: ^3.1.1 # Version 4 blocked by https://github.com/MixinNetwork/flutter-plugins/issues/379 + flutter_web_auth_2: ^4.1.0 flutter_webrtc: ^1.2.0 geolocator: ^14.0.2 go_router: ^17.0.0 @@ -175,18 +175,3 @@ flutter: # 2. Always link an (upstream?) issue # 3. Explain how and when this can be removed (overrides must be temporarily) dependency_overrides: - fcm_shared_isolate: - path: pangea_packages/fcm_shared_isolate - # https://github.com/juliansteenbakker/flutter_secure_storage/issues/920 - flutter_secure_storage_linux: - git: - url: https://github.com/m-berto/flutter_secure_storage.git - ref: patch-2 - path: flutter_secure_storage_linux - flutter_secure_storage_platform_interface: 2.0.0 - # https://github.com/ThexXTURBOXx/flutter_web_auth_2/issues/155 - flutter_web_auth_2: - git: - url: https://github.com/ThexXTURBOXx/flutter_web_auth_2.git - ref: 3.x-without-v1 - path: flutter_web_auth_2 diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index bad8f4315..8b853c62a 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -33,6 +34,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { registry->GetRegistrarForPlugin("AppLinksPluginCApi")); AudioplayersWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("AudioplayersWindowsPlugin")); + DesktopWebviewWindowPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("DesktopWebviewWindowPlugin")); DynamicColorPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("DynamicColorPluginCApi")); EmojiPickerFlutterPluginCApiRegisterWithRegistrar( diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 687cbd598..4f57c7fc3 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -5,6 +5,7 @@ list(APPEND FLUTTER_PLUGIN_LIST app_links audioplayers_windows + desktop_webview_window dynamic_color emoji_picker_flutter file_selector_windows