Compare commits

...

19 Commits

Author SHA1 Message Date
Krille-chan
b4fcb5b0d9 chore: Use correct versions of adaptive_dialog 2023-07-14 08:02:47 +00:00
Krille
1911004d05
refactor: Update dependencies 2023-07-13 19:46:16 +09:00
Raatty
5d67564445
Added translation using Weblate (Greek) 2023-07-09 09:42:27 +02:00
Krille
be04c5a46e
design: Adjust open url dialog design a little bit 2023-07-07 12:10:07 +09:00
Farooq Karimi Zadeh
bd7a4c9dfb
Translated using Weblate (Persian)
Currently translated at 100.0% (549 of 549 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/fa/
2023-07-06 10:52:33 +02:00
Krille
10ee57722e
chore: Enable webrtc for linux again 2023-06-30 19:15:45 +09:00
Malin Errenst
ff5f7ab50e Merge branch 'malin/group-notification-channels' into 'main'
feat: Added grouping to message notification channels

See merge request famedly/fluffychat!1134
2023-06-30 07:55:24 +00:00
Krille
277885a61e
chore: Streamline background gradients 2023-06-29 16:56:15 +09:00
Malin Errenst
6633ebc376
feat: Added grouping to message notification channels 2023-06-29 09:36:08 +02:00
Krille-chan
b2d9986cd3 Merge branch 'braid/cute-events' into 'main'
fix: overflow in cute events

See merge request famedly/fluffychat!1132
2023-06-29 07:13:55 +00:00
Krille-chan
a0b9bb277f Merge branch 'braid/url-launch-copy' into 'main'
feat: add button to copy url in open dialog

See merge request famedly/fluffychat!1133
2023-06-29 07:13:30 +00:00
TheOneWithTheBraid
d381705cdd
feat: add button to copy url in open dialog
Signed-off-by: TheOneWithTheBraid <the-one@with-the-braid.cf>
2023-06-27 14:09:00 +02:00
3820d4264a
Translated using Weblate (Finnish)
Currently translated at 100.0% (549 of 549 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/fi/
2023-06-26 14:50:25 +02:00
Milo Ivir
cf4e2d3fad
Translated using Weblate (Croatian)
Currently translated at 100.0% (549 of 549 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/hr/
2023-06-26 14:50:24 +02:00
josé m
002dc87577
Translated using Weblate (Galician)
Currently translated at 100.0% (549 of 549 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/gl/
2023-06-22 07:51:05 +02:00
The one with the braid
922e7ad0ff fix: overflow in cute events
Signed-off-by: The one with the braid <the-one@with-the-braid.cf>
2023-06-21 16:08:20 +02:00
Oğuz Ersen
5d7be8a672
Translated using Weblate (Turkish)
Currently translated at 100.0% (549 of 549 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/tr/
2023-06-20 19:50:49 +02:00
Krille-chan
431b357cfa Merge branch 'braid/allow-aarch64-failure' into 'main'
fix: allow aarch64 upload failure

See merge request famedly/fluffychat!1131
2023-06-19 10:35:58 +00:00
TheOneWithTheBraid
2938acf152 fix: allow aarch64 upload failure
Signed-off-by: TheOneWithTheBraid <the-one@with-the-braid.cf>
2023-06-19 12:27:07 +02:00
33 changed files with 8089 additions and 7792 deletions

View File

@ -372,6 +372,7 @@ upload_linux_arm64:
- tar czf package.tar.gz -C build/linux/arm64/release/bundle/ .
- |
curl --fail-with-body --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file package.tar.gz ${PACKAGE_REGISTRY_URL}/fluffychat-linux-arm64.tar.gz
allow_failure: true
upload_windows:
extends: .release

1
assets/l10n/intl_el.arb Normal file
View File

@ -0,0 +1 @@
{}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -23,7 +23,7 @@
"type": "text",
"placeholders": {}
},
"activatedEndToEndEncryption": "🔐 {username} activou o cifrado extremo-a-extremo",
"activatedEndToEndEncryption": "🔐 {username} activou a cifraxe extremo-a-extremo",
"@activatedEndToEndEncryption": {
"type": "text",
"placeholders": {
@ -314,7 +314,7 @@
"type": "text",
"placeholders": {}
},
"channelCorruptedDecryptError": "O cifrado está corrompido",
"channelCorruptedDecryptError": "A cifraxe está estragada",
"@channelCorruptedDecryptError": {
"type": "text",
"placeholders": {}
@ -704,12 +704,12 @@
"type": "text",
"placeholders": {}
},
"enableEncryption": "Activar cifrado",
"enableEncryption": "Activar cifraxe",
"@enableEncryption": {
"type": "text",
"placeholders": {}
},
"enableEncryptionWarning": "Non poderás desactivar o cifrado posteriormente, tes certeza?",
"enableEncryptionWarning": "Non poderás desactivar a cifraxe posteriormente, tes certeza?",
"@enableEncryptionWarning": {
"type": "text",
"placeholders": {}
@ -719,12 +719,12 @@
"type": "text",
"placeholders": {}
},
"encryption": "Cifrado",
"encryption": "Cifraxe",
"@encryption": {
"type": "text",
"placeholders": {}
},
"encryptionNotEnabled": "O cifrado non está activado",
"encryptionNotEnabled": "A cifraxe non está activada",
"@encryptionNotEnabled": {
"type": "text",
"placeholders": {}
@ -1119,7 +1119,7 @@
"type": "text",
"placeholders": {}
},
"needPantalaimonWarning": "Ten en conta que polo de agora precisas Pantalaimon para o cifrado extremo-a-extremo.",
"needPantalaimonWarning": "Ten en conta que polo de agora precisas Pantalaimon para a cifraxe extremo-a-extremo.",
"@needPantalaimonWarning": {
"type": "text",
"placeholders": {}
@ -1159,7 +1159,7 @@
"type": "text",
"placeholders": {}
},
"noEncryptionForPublicRooms": "Só podes activar o cifrado tan pronto como a sala non sexa públicamente accesible.",
"noEncryptionForPublicRooms": "Só podes activar a cifraxe tan pronto como a sala non sexa públicamente accesible.",
"@noEncryptionForPublicRooms": {
"type": "text",
"placeholders": {}
@ -1824,7 +1824,7 @@
"type": "text",
"placeholders": {}
},
"unknownEncryptionAlgorithm": "Algoritmo de cifrado descoñecido",
"unknownEncryptionAlgorithm": "Algoritmo de cifraxe descoñecido",
"@unknownEncryptionAlgorithm": {
"type": "text",
"placeholders": {}
@ -2103,7 +2103,7 @@
"type": "text",
"description": "Usage hint for the command /discardsession"
},
"commandHint_create": "Crear un grupo de conversa baleiro\nUsa --no-encryption para desactivar o cifrado",
"commandHint_create": "Crear un grupo de conversa baleiro\nUsa --no-encryption para desactivar a cifraxe",
"@commandHint_create": {
"type": "text",
"description": "Usage hint for the command /create"
@ -2113,7 +2113,7 @@
"type": "text",
"description": "Usage hint for the command /clearcache"
},
"commandHint_dm": "Iniciar un chat directo\nUsa --no-encryption para desactivar o cifrado",
"commandHint_dm": "Iniciar un chat directo\nUsa --no-encryption para desactivar a cifraxe",
"@commandHint_dm": {
"type": "text",
"description": "Usage hint for the command /dm"
@ -2447,9 +2447,9 @@
"@enterInviteLinkOrMatrixId": {},
"encryptThisChat": "Cifrar esta conversa",
"@encryptThisChat": {},
"endToEndEncryption": "Cifrado de extremo a extremo",
"endToEndEncryption": "Cifraxe de extremo a extremo",
"@endToEndEncryption": {},
"disableEncryptionWarning": "Por razóns de seguridade non podes desactivar o cifrado dunha conversa onde foi activado previamente.",
"disableEncryptionWarning": "Por razóns de seguridade non podes desactivar a cifraxe dunha conversa onde foi activada previamente.",
"@disableEncryptionWarning": {},
"sorryThatsNotPossible": "Lamentámolo... iso non é posible",
"@sorryThatsNotPossible": {},

View File

@ -2503,6 +2503,12 @@
"type": "text",
"placeholders": {}
},
"reportErrorDescription": "Dogodila se greška. Pokušaj ponovo kasnije. Ako želiš grešku možeš prijaviti programerima.",
"@reportErrorDescription": {}
"reportErrorDescription": "Dogodila se greška. Pokušaj ponovo kasnije. Ako želiš, grešku možeš prijaviti programerima.",
"@reportErrorDescription": {},
"signInWithPassword": "Prijavi se s lozinkom",
"@signInWithPassword": {},
"continueWith": "Nastavi sa:",
"@continueWith": {},
"pleaseTryAgainLaterOrChooseDifferentServer": "Pokušaj ponovo kasnije ili odaberi jedan drugi poslužitelj.",
"@pleaseTryAgainLaterOrChooseDifferentServer": {}
}

File diff suppressed because it is too large Load Diff

View File

@ -41,6 +41,22 @@ abstract class FluffyThemes {
titleSmall: fallbackTextStyle,
);
static LinearGradient backgroundGradient(
BuildContext context,
int alpha,
) {
final colorScheme = Theme.of(context).colorScheme;
return LinearGradient(
begin: Alignment.topCenter,
colors: [
colorScheme.primaryContainer.withAlpha(alpha),
colorScheme.secondaryContainer.withAlpha(alpha),
colorScheme.tertiaryContainer.withAlpha(alpha),
colorScheme.primaryContainer.withAlpha(alpha),
],
);
}
static const Duration animationDuration = Duration(milliseconds: 250);
static const Curve animationCurve = Curves.easeInOut;

View File

@ -869,8 +869,11 @@ class ChatController extends State<ChatPageWithRoom> {
setState(() => showEmojiPicker = false);
if (emoji == null) return;
// make sure we don't send the same emoji twice
if (_allReactionEvents
.any((e) => e.content['m.relates_to']['key'] == emoji.emoji)) return;
if (_allReactionEvents.any(
(e) => e.content.tryGetMap('m.relates_to')?['key'] == emoji.emoji,
)) {
return;
}
return sendEmojiAction(emoji.emoji);
}

View File

@ -146,7 +146,6 @@ class ChatView extends StatelessWidget {
);
}
final bottomSheetPadding = FluffyThemes.isColumnMode(context) ? 16.0 : 8.0;
final colorScheme = Theme.of(context).colorScheme;
return VWidgetGuard(
onSystemPop: (redirector) async {
@ -220,14 +219,9 @@ class ChatView extends StatelessWidget {
else
Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
colors: [
colorScheme.primaryContainer.withAlpha(64),
colorScheme.secondaryContainer.withAlpha(64),
colorScheme.tertiaryContainer.withAlpha(64),
colorScheme.primaryContainer.withAlpha(64),
],
gradient: FluffyThemes.backgroundGradient(
context,
64,
),
),
),

View File

@ -36,19 +36,16 @@ class _CuteContentState extends State<CuteContent> {
return GestureDetector(
onTap: addOverlay,
child: SizedBox.square(
dimension: 300,
child: Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
widget.event.text,
style: const TextStyle(fontSize: 150),
),
if (label != null) Text(label)
],
),
child: Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
widget.event.text,
style: const TextStyle(fontSize: 150),
),
if (label != null) Text(label)
],
),
);
},
@ -144,24 +141,26 @@ class _CuteEventOverlayState extends State<CuteEventOverlay>
return SizedBox(
height: constraints.maxHeight,
width: constraints.maxWidth,
child: Stack(
alignment: Alignment.bottomLeft,
fit: StackFit.expand,
children: items
.map(
(position) => Positioned(
left: position.width * width,
bottom: (height *
.25 *
position.height *
(controller?.value ?? 0)) -
_CuteOverlayContent.size,
child: _CuteOverlayContent(
emoji: widget.emoji,
child: OverflowBox(
child: Stack(
alignment: Alignment.bottomLeft,
fit: StackFit.expand,
children: items
.map(
(position) => Positioned(
left: position.width * width,
bottom: (height *
.25 *
position.height *
(controller?.value ?? 0)) -
_CuteOverlayContent.size,
child: _CuteOverlayContent(
emoji: widget.emoji,
),
),
),
)
.toList(),
)
.toList(),
),
),
);
},

View File

@ -61,7 +61,7 @@ class MessageReactions extends StatelessWidget {
final evt = allReactionEvents.firstWhereOrNull(
(e) =>
e.senderId == e.room.client.userID &&
e.content['m.relates_to']['key'] == r.key,
e.content.tryGetMap('m.relates_to')?['key'] == r.key,
);
if (evt != null) {
showFutureLoadingDialog(

View File

@ -52,7 +52,8 @@ class EventVideoPlayerState extends State<EventVideoPlayer> {
final networkUri = _networkUri;
if (kIsWeb && networkUri != null && _chewieManager == null) {
_chewieManager ??= ChewieController(
videoPlayerController: VideoPlayerController.network(networkUri),
videoPlayerController:
VideoPlayerController.networkUrl(Uri.parse(networkUri)),
autoPlay: true,
autoInitialize: true,
);

View File

@ -183,12 +183,13 @@ class InputBar extends StatelessWidget {
final state = r.getState(EventTypes.RoomCanonicalAlias);
if ((state != null &&
((state.content['alias'] is String &&
state.content['alias']
state.content
.tryGet<String>('alias')!
.split(':')[0]
.toLowerCase()
.contains(roomSearch)) ||
(state.content['alt_aliases'] is List &&
state.content['alt_aliases'].any(
(state.content['alt_aliases'] as List).any(
(l) =>
l is String &&
l

View File

@ -52,7 +52,7 @@ class ReactionsPicker extends StatelessWidget {
for (final event in allReactionEvents) {
try {
emojis.remove(event.content['m.relates_to']['key']);
emojis.remove(event.content.tryGetMap('m.relates_to')!['key']);
} catch (_) {}
}
return Row(

View File

@ -83,7 +83,9 @@ class ChatDetailsController extends State<ChatDetails> {
RequestType.GET,
'/client/unstable/org.matrix.msc2432/rooms/${Uri.encodeComponent(room.id)}/aliases',
)
.then((response) => List<String>.from(response['aliases'])),
.then(
(response) => List<String>.from(response['aliases'] as Iterable),
),
);
// Switch to the stable api once it is implemented.

View File

@ -73,8 +73,10 @@ class ChatPermissionsSettingsController extends State<ChatPermissionsSettings> {
void updateRoomAction(Capabilities capabilities) async {
final room = Matrix.of(context).client.getRoomById(roomId!)!;
final String roomVersion =
room.getState(EventTypes.RoomCreate)!.content['room_version'] ?? '1';
final roomVersion = room
.getState(EventTypes.RoomCreate)!
.content['room_version'] as String? ??
'1';
final newVersion = await showConfirmationDialog<String>(
context: context,
title: L10n.of(context)!.replaceRoomWithNewerVersion,

View File

@ -127,9 +127,9 @@ class ChatPermissionsSettingsView extends StatelessWidget {
),
);
}
final String roomVersion = room
final roomVersion = room
.getState(EventTypes.RoomCreate)!
.content['room_version'] ??
.content['room_version'] as String? ??
'1';
return ListTile(

View File

@ -109,6 +109,10 @@ class KeyVerificationPageState extends State<KeyVerificationDialog> {
Widget body;
final buttons = <Widget>[];
switch (widget.request.state) {
case KeyVerificationState.showQRSuccess:
case KeyVerificationState.confirmQRScan:
case KeyVerificationState.askChoice:
throw 'Not implemented';
case KeyVerificationState.askSSSS:
// prompt the user for their ssss passphrase / key
final textEditingController = TextEditingController();

View File

@ -59,7 +59,7 @@ class NewPrivateChatView extends StatelessWidget {
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
QrImage(
QrImageView(
data:
'https://matrix.to/#/${Matrix.of(context).client.userID}',
version: QrVersions.auto,

View File

@ -151,12 +151,11 @@ class EmotesSettingsController extends State<EmotesSettings> {
bool isGloballyActive(Client? client) =>
room != null &&
client!.accountData['im.ponies.emote_rooms']?.content is Map &&
client.accountData['im.ponies.emote_rooms']!.content['rooms'] is Map &&
client.accountData['im.ponies.emote_rooms']!.content['rooms'][room!.id]
is Map &&
client.accountData['im.ponies.emote_rooms']!.content['rooms'][room!.id]
[stateKey ?? ''] is Map;
client!.accountData['im.ponies.emote_rooms']?.content
.tryGetMap<String, Object?>('rooms')
?.tryGetMap<String, Object?>(room!.id)
?.tryGetMap<String, Object?>(stateKey ?? '') !=
null;
bool get readonly =>
room == null ? false : !(room!.canSendEvent('im.ponies.room_emotes'));

View File

@ -40,16 +40,14 @@ class MultipleEmotesSettingsView extends StatelessWidget {
itemCount: keys.length,
itemBuilder: (BuildContext context, int i) {
final event = packs[keys[i]];
String? packName = keys[i].isNotEmpty ? keys[i] : 'Default Pack';
if (event != null && event.content['pack'] is Map) {
if (event.content['pack']['displayname'] is String) {
packName = event.content['pack']['displayname'];
} else if (event.content['pack']['name'] is String) {
packName = event.content['pack']['name'];
}
}
final eventPack =
event?.content.tryGetMap<String, Object?>('pack');
final packName = eventPack?.tryGet<String>('displayname') ??
eventPack?.tryGet<String>('name') ??
(keys[i].isNotEmpty ? keys[i] : 'Default Pack');
return ListTile(
title: Text(packName!),
title: Text(packName),
onTap: () async {
VRouter.of(context).toSegments(
['rooms', room.id, 'details', 'emotes', keys[i]],

View File

@ -182,8 +182,12 @@ class MatrixLocals extends MatrixLocalizations {
String get noPermission => l10n.noKeyForThisMessage;
@override
String redactedAnEvent(String senderName) {
return l10n.redactedAnEvent(senderName);
String redactedAnEvent(Event redactedEvent) {
return l10n.redactedAnEvent(
redactedEvent.redactedBecause?.senderFromMemoryOrFallback
.calcLocalizedBodyFallback(this) ??
l10n.user,
);
}
@override
@ -192,8 +196,10 @@ class MatrixLocals extends MatrixLocalizations {
}
@override
String removedBy(String calcDisplayname) {
return l10n.removedBy(calcDisplayname);
String removedBy(Event redactedEvent) {
return l10n.removedBy(
redactedEvent.senderFromMemoryOrFallback.calcLocalizedBodyFallback(this),
);
}
@override

View File

@ -198,11 +198,33 @@ Future<void> _tryPushHelper(
final roomName = event.room.getLocalizedDisplayname(MatrixLocals(l10n));
final notificationGroupId =
event.room.isDirectChat ? 'directChats' : 'groupChats';
final groupName = event.room.isDirectChat ? l10n.directChats : l10n.groups;
final messageRooms = AndroidNotificationChannelGroup(
notificationGroupId,
groupName,
);
final roomsChannel = AndroidNotificationChannel(
event.room.id,
roomName,
groupId: notificationGroupId,
);
await flutterLocalNotificationsPlugin
.resolvePlatformSpecificImplementation<
AndroidFlutterLocalNotificationsPlugin>()
?.createNotificationChannelGroup(messageRooms);
await flutterLocalNotificationsPlugin
.resolvePlatformSpecificImplementation<
AndroidFlutterLocalNotificationsPlugin>()
?.createNotificationChannel(roomsChannel);
final androidPlatformChannelSpecifics = AndroidNotificationDetails(
event.room.id,
roomName,
channelDescription:
event.room.isDirectChat ? l10n.directChats : l10n.groups,
channelDescription: groupName,
number: notification.counts?.unread,
category: AndroidNotificationCategory.message,
styleInformation: messagingStyleInformation ??
@ -215,7 +237,7 @@ Future<void> _tryPushHelper(
ticker: l10n.unreadChats(notification.counts?.unread ?? 1),
importance: Importance.max,
priority: Priority.max,
groupKey: event.room.id,
groupKey: notificationGroupId,
);
const iOSPlatformChannelSpecifics = DarwinNotificationDetails();
final platformChannelSpecifics = NotificationDetails(

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:adaptive_dialog/adaptive_dialog.dart';
import 'package:collection/collection.dart' show IterableExtension;
@ -37,14 +38,34 @@ class UrlLauncher {
);
return;
}
final consent = await showOkCancelAlertDialog(
final consent = await showModalActionSheet<_LaunchUrlResponse>(
context: context,
title: L10n.of(context)!.openLinkInBrowser,
message: url,
okLabel: L10n.of(context)!.ok,
cancelLabel: L10n.of(context)!.cancel,
title: url,
style: AdaptiveStyle.material,
actions: [
SheetAction(
key: _LaunchUrlResponse.copy,
icon: Icons.copy_outlined,
label: L10n.of(context)!.copy,
),
SheetAction(
key: _LaunchUrlResponse.launch,
icon: Icons.launch_outlined,
label: L10n.of(context)!.openLinkInBrowser,
),
],
);
if (consent != OkCancelResult.ok) return;
if (consent == _LaunchUrlResponse.copy) {
await Clipboard.setData(ClipboardData(text: uri.toString()));
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(L10n.of(context)!.copiedToClipboard),
),
);
return;
}
if (consent != _LaunchUrlResponse.launch) return;
if (!{'https', 'http'}.contains(uri.scheme)) {
// just launch non-https / non-http uris directly
@ -215,3 +236,8 @@ class UrlLauncher {
}
}
}
enum _LaunchUrlResponse {
launch,
copy,
}

View File

@ -48,18 +48,9 @@ class LoginScaffold extends StatelessWidget {
: null,
);
if (isMobileMode) return scaffold;
final colorScheme = Theme.of(context).colorScheme;
return Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
colors: [
colorScheme.primaryContainer.withAlpha(64),
colorScheme.secondaryContainer.withAlpha(64),
colorScheme.tertiaryContainer.withAlpha(64),
colorScheme.primaryContainer.withAlpha(64),
],
),
gradient: FluffyThemes.backgroundGradient(context, 156),
),
child: Column(
children: [

View File

@ -10,7 +10,9 @@
#include <desktop_lifecycle/desktop_lifecycle_plugin.h>
#include <dynamic_color/dynamic_color_plugin.h>
#include <emoji_picker_flutter/emoji_picker_flutter_plugin.h>
#include <file_selector_linux/file_selector_plugin.h>
#include <flutter_secure_storage_linux/flutter_secure_storage_linux_plugin.h>
#include <flutter_webrtc/flutter_web_r_t_c_plugin.h>
#include <handy_window/handy_window_plugin.h>
#include <record_linux/record_linux_plugin.h>
#include <url_launcher_linux/url_launcher_plugin.h>
@ -29,9 +31,15 @@ void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) emoji_picker_flutter_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "EmojiPickerFlutterPlugin");
emoji_picker_flutter_plugin_register_with_registrar(emoji_picker_flutter_registrar);
g_autoptr(FlPluginRegistrar) file_selector_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin");
file_selector_plugin_register_with_registrar(file_selector_linux_registrar);
g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin");
flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar);
g_autoptr(FlPluginRegistrar) flutter_webrtc_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterWebRTCPlugin");
flutter_web_r_t_c_plugin_register_with_registrar(flutter_webrtc_registrar);
g_autoptr(FlPluginRegistrar) handy_window_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "HandyWindowPlugin");
handy_window_plugin_register_with_registrar(handy_window_registrar);

View File

@ -7,7 +7,9 @@ list(APPEND FLUTTER_PLUGIN_LIST
desktop_lifecycle
dynamic_color
emoji_picker_flutter
file_selector_linux
flutter_secure_storage_linux
flutter_webrtc
handy_window
record_linux
url_launcher_linux

View File

@ -12,6 +12,7 @@ import desktop_lifecycle
import device_info_plus
import dynamic_color
import emoji_picker_flutter
import file_selector_macos
import flutter_app_badger
import flutter_local_notifications
import flutter_secure_storage_macos
@ -19,15 +20,18 @@ import flutter_web_auth_2
import flutter_webrtc
import geolocator_apple
import just_audio
import macos_ui
import macos_window_utils
import package_info_plus
import path_provider_foundation
import record_macos
import share_plus
import shared_preferences_macos
import shared_preferences_foundation
import sqflite
import url_launcher_macos
import video_compress
import wakelock_macos
import wakelock_plus
import window_to_front
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
@ -38,6 +42,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin"))
EmojiPickerFlutterPlugin.register(with: registry.registrar(forPlugin: "EmojiPickerFlutterPlugin"))
FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin"))
FlutterAppBadgerPlugin.register(with: registry.registrar(forPlugin: "FlutterAppBadgerPlugin"))
FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin"))
FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin"))
@ -45,6 +50,8 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
FlutterWebRTCPlugin.register(with: registry.registrar(forPlugin: "FlutterWebRTCPlugin"))
GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin"))
JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin"))
MacOSUiPlugin.register(with: registry.registrar(forPlugin: "MacOSUiPlugin"))
MacOSWindowUtilsPlugin.register(with: registry.registrar(forPlugin: "MacOSWindowUtilsPlugin"))
FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin"))
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
RecordMacosPlugin.register(with: registry.registrar(forPlugin: "RecordMacosPlugin"))
@ -54,5 +61,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
VideoCompressPlugin.register(with: registry.registrar(forPlugin: "VideoCompressPlugin"))
WakelockMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockMacosPlugin"))
WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin"))
WindowToFrontPlugin.register(with: registry.registrar(forPlugin: "WindowToFrontPlugin"))
}

File diff suppressed because it is too large Load Diff

View File

@ -7,19 +7,19 @@ environment:
sdk: ">=3.0.0 <4.0.0"
dependencies:
adaptive_dialog: ^1.9.0-no-macos.2
adaptive_dialog: ^1.9.0-x-macos-beta.1
animations: ^2.0.7
badges: ^2.0.3
blurhash_dart: ^1.1.0
callkeep: ^0.3.2
chewie: ^1.3.6
collection: ^1.16.0
connectivity_plus: ^3.0.2
connectivity_plus: ^4.0.1
cupertino_icons: any
desktop_drop: ^0.4.0
desktop_lifecycle: ^0.1.0
desktop_notifications: ^0.6.3
device_info_plus: ^8.0.0
device_info_plus: ^9.0.2
dynamic_color: ^1.6.0
emoji_picker_flutter: ^1.5.1
emoji_proposal: ^0.0.1
@ -32,37 +32,37 @@ dependencies:
flutter_app_lock: ^3.0.0
flutter_blurhash: ^0.7.0
flutter_cache_manager: ^3.3.0
flutter_foreground_task: ^3.10.0
flutter_foreground_task: ^6.0.0+1
flutter_highlighter: ^0.1.1
flutter_html: ^3.0.0-beta.2
flutter_html_table: ^3.0.0-beta.2
flutter_linkify: ^6.0.0
flutter_local_notifications: ^12.0.2
flutter_local_notifications: ^15.1.0+1
flutter_localizations:
sdk: flutter
flutter_map: ^3.1.0
flutter_map: ^4.0.0
flutter_math_fork: ^0.7.1
flutter_olm: ^1.2.0
flutter_openssl_crypto: ^0.1.0
flutter_ringtone_player: ^3.1.1
flutter_secure_storage: ^7.0.1
flutter_secure_storage: ^8.0.0
flutter_typeahead: ^4.3.2
flutter_web_auth_2: ^2.1.1
flutter_webrtc: ^0.9.30+hotfix.2
flutter_webrtc: ^0.9.35
future_loading_dialog: ^0.2.3
geolocator: ^7.6.2
handy_window: ^0.1.9
handy_window: ^0.3.1
hive: ^2.2.3
hive_flutter: ^1.1.0
http: ^0.13.4
image_picker: ^0.8.4+8
image_picker: ^1.0.0
intl: any
just_audio: ^0.9.30
just_audio_mpv: ^0.1.6
keyboard_shortcuts: ^0.1.4
latlong2: ^0.8.1
linkify: ^5.0.0
matrix: ^0.20.5
matrix: ^0.22.0
matrix_homeserver_recommendations: ^0.3.0
native_imaging: ^0.1.0
package_info_plus: ^4.0.0
@ -77,12 +77,12 @@ dependencies:
record: ^4.4.4
scroll_to_index: ^3.0.1
share_plus: ^7.0.0
shared_preferences: 2.0.15 # Pinned because https://github.com/flutter/flutter/issues/118401
shared_preferences: ^2.2.0 # Pinned because https://github.com/flutter/flutter/issues/118401
slugify: ^2.0.0
swipe_to_action: ^0.2.0
tor_detector_web: ^1.1.0
uni_links: ^0.5.1
unifiedpush: ^4.0.3
unifiedpush: ^5.0.0
universal_html: ^2.0.8
url_launcher: ^6.0.20
vibration: ^1.7.4-nullsafety.0
@ -93,7 +93,7 @@ dependencies:
webrtc_interface: ^1.0.13
dev_dependencies:
dart_code_metrics: ^4.10.1
dart_code_metrics: ^5.7.5
flutter_lints: ^2.0.1
flutter_native_splash: ^2.0.3+1
flutter_test:
@ -153,8 +153,6 @@ dependency_overrides:
git:
url: https://gitlab.com/TheOneWithTheBraid/flutter_secure_storage_windows.git
ref: main
flutter_webrtc:
git: https://github.com/krille-chan/flutter-webrtc.git
geolocator_android:
hosted:
name: geolocator_android

View File

@ -11,6 +11,7 @@
#include <desktop_lifecycle/desktop_lifecycle_plugin.h>
#include <dynamic_color/dynamic_color_plugin_c_api.h>
#include <emoji_picker_flutter/emoji_picker_flutter_plugin_c_api.h>
#include <file_selector_windows/file_selector_windows.h>
#include <flutter_webrtc/flutter_web_r_t_c_plugin.h>
#include <permission_handler_windows/permission_handler_windows_plugin.h>
#include <record_windows/record_windows_plugin_c_api.h>
@ -29,6 +30,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) {
registry->GetRegistrarForPlugin("DynamicColorPluginCApi"));
EmojiPickerFlutterPluginCApiRegisterWithRegistrar(
registry->GetRegistrarForPlugin("EmojiPickerFlutterPluginCApi"));
FileSelectorWindowsRegisterWithRegistrar(
registry->GetRegistrarForPlugin("FileSelectorWindows"));
FlutterWebRTCPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("FlutterWebRTCPlugin"));
PermissionHandlerWindowsPluginRegisterWithRegistrar(

View File

@ -8,6 +8,7 @@ list(APPEND FLUTTER_PLUGIN_LIST
desktop_lifecycle
dynamic_color
emoji_picker_flutter
file_selector_windows
flutter_webrtc
permission_handler_windows
record_windows