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