This commit is contained in:
Inex Code 2020-10-18 01:32:21 +00:00
commit 2a3cb73e32
16 changed files with 212 additions and 149 deletions

View File

@ -1,12 +1,18 @@
# Version 0.20.0 - 2020-??-?? # Version 0.20.0 - 2020-??-??
### Features ### Features
- Added translations: Arabic
- Add ability to enable / disable emotes globally - Add ability to enable / disable emotes globally
- Add ability to manage emote packs with different state keys - Add ability to manage emote packs with different state keys
- Add swipe to reply - Thanks @inexcode
- Initial support for compiling to desktop
- Initial snap metadata - Thanks @RAOF_47
### Changes ### Changes
- Re-scale images in a separate isolate to prevent the UI from freezing - Re-scale images in a separate isolate to prevent the UI from freezing
- URLs without https:// now linkify
### Fixes ### Fixes
- Fix amoled / theme settings not always saving properly - Fix amoled / theme settings not always saving properly
- Show device name in account information correctly - Show device name in account information correctly
- Fix tapping on aliases / room pills not always working
# Version 0.19.0 - 2020-09-21 # Version 0.19.0 - 2020-09-21
### Features ### Features

View File

@ -3,7 +3,6 @@ import 'package:famedlysdk/famedlysdk.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../utils/platform_infos.dart';
import '../utils/string_color.dart'; import '../utils/string_color.dart';
import 'matrix.dart'; import 'matrix.dart';
@ -28,31 +27,49 @@ class Avatar extends StatelessWidget {
Matrix.of(context).client, Matrix.of(context).client,
width: size * MediaQuery.of(context).devicePixelRatio, width: size * MediaQuery.of(context).devicePixelRatio,
height: size * MediaQuery.of(context).devicePixelRatio, height: size * MediaQuery.of(context).devicePixelRatio,
method: ThumbnailMethod.scale,
); );
final src = thumbnail; final src = thumbnail;
var fallbackLetters = '@'; var fallbackLetters = '@';
if ((name?.length ?? 0) >= 2) { if ((name?.length ?? 0) >= 2) {
fallbackLetters = name.substring(0, 2); fallbackLetters = String.fromCharCodes(name.runes, 0, 2);
} else if ((name?.length ?? 0) == 1) { } else if ((name?.length ?? 0) == 1) {
fallbackLetters = name; fallbackLetters = name;
} }
final textWidget = Center(
child: Text(
fallbackLetters,
style: TextStyle(
color: Colors.white,
fontSize: 18,
),
),
);
final noPic = mxContent == null || mxContent.toString().isEmpty; final noPic = mxContent == null || mxContent.toString().isEmpty;
return InkWell( return InkWell(
onTap: onTap, onTap: onTap,
child: CircleAvatar( child: ClipRRect(
radius: size / 2, borderRadius: BorderRadius.circular(size / 2),
backgroundImage: !noPic child: Container(
? PlatformInfos.isBetaDesktop width: size,
? NetworkImage(src) height: size,
: CachedNetworkImageProvider(src) color: noPic
: null, ? name?.lightColor ?? Theme.of(context).secondaryHeaderColor
backgroundColor: noPic : Theme.of(context).secondaryHeaderColor,
? name?.lightColor ?? Theme.of(context).secondaryHeaderColor child: noPic
: Theme.of(context).secondaryHeaderColor, ? textWidget
child: noPic : CachedNetworkImage(
? Text(fallbackLetters, style: TextStyle(color: Colors.white)) imageUrl: src,
: null, fit: BoxFit.cover,
width: size,
height: size,
placeholder: (c, s) => Stack(
children: [
Center(child: CircularProgressIndicator(strokeWidth: 2)),
textWidget,
],
),
),
),
), ),
); );
} }

View File

@ -49,17 +49,11 @@ class ContentBanner extends StatelessWidget {
opacity: 0.75, opacity: 0.75,
child: !loading child: !loading
? mxContent != null ? mxContent != null
? PlatformInfos.isBetaDesktop ? CachedNetworkImage(
? Image.network( imageUrl: src,
src, height: 300,
height: 300, fit: BoxFit.cover,
fit: BoxFit.cover, )
)
: CachedNetworkImage(
imageUrl: src,
height: 300,
fit: BoxFit.cover,
)
: Icon(defaultIcon, size: 300) : Icon(defaultIcon, size: 300)
: Icon(defaultIcon, size: 300), : Icon(defaultIcon, size: 300),
), ),

View File

@ -128,17 +128,11 @@ class _ImageBubbleState extends State<ImageBubble> {
width: 800, width: 800,
height: 800, height: 800,
method: ThumbnailMethod.scale); method: ThumbnailMethod.scale);
renderWidget = PlatformInfos.isBetaDesktop renderWidget = CachedNetworkImage(
? Image.network( imageUrl: src,
src, placeholder: (context, url) => generatePlaceholderWidget(),
fit: widget.fit, fit: widget.fit,
) );
: CachedNetworkImage(
imageUrl: src,
placeholder: (context, url) =>
generatePlaceholderWidget(),
fit: widget.fit,
);
} else { } else {
renderWidget = generatePlaceholderWidget(); renderWidget = generatePlaceholderWidget();
} }

View File

@ -150,17 +150,11 @@ class InputBar extends StatelessWidget {
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[ children: <Widget>[
PlatformInfos.isBetaDesktop CachedNetworkImage(
? Image.network( imageUrl: url,
url, width: size,
width: size, height: size,
height: size, ),
)
: CachedNetworkImage(
imageUrl: url,
width: size,
height: size,
),
SizedBox(width: 6), SizedBox(width: 6),
Text(suggestion['name']), Text(suggestion['name']),
Expanded( Expanded(

View File

@ -1,4 +1,5 @@
import 'package:bot_toast/bot_toast.dart'; import 'package:bot_toast/bot_toast.dart';
import 'package:circular_check_box/circular_check_box.dart';
import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/famedlysdk.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
@ -12,6 +13,7 @@ import '../avatar.dart';
import '../dialogs/send_file_dialog.dart'; import '../dialogs/send_file_dialog.dart';
import '../dialogs/simple_dialogs.dart'; import '../dialogs/simple_dialogs.dart';
import '../matrix.dart'; import '../matrix.dart';
import '../mouse_over_builder.dart';
import '../theme_switcher.dart'; import '../theme_switcher.dart';
class ChatListItem extends StatelessWidget { class ChatListItem extends StatelessWidget {
@ -127,7 +129,20 @@ class ChatListItem extends StatelessWidget {
color: chatListItemColor(context, activeChat, selected), color: chatListItemColor(context, activeChat, selected),
child: ListTile( child: ListTile(
onLongPress: onLongPress, onLongPress: onLongPress,
leading: Avatar(room.avatar, room.displayname), leading: MouseOverBuilder(
builder: (context, hover) =>
onLongPress != null && (hover || selected)
? Container(
width: Avatar.defaultSize,
height: Avatar.defaultSize,
alignment: Alignment.center,
child: CircularCheckBox(
value: selected,
onChanged: (_) => onLongPress(),
),
)
: Avatar(room.avatar, room.displayname),
),
title: Row( title: Row(
children: <Widget>[ children: <Widget>[
Expanded( Expanded(

View File

@ -5,6 +5,7 @@ import 'package:flutter_gen/gen_l10n/l10n.dart';
import '../../utils/date_time_extension.dart'; import '../../utils/date_time_extension.dart';
import '../../utils/event_extension.dart'; import '../../utils/event_extension.dart';
import '../../utils/string_color.dart'; import '../../utils/string_color.dart';
import '../adaptive_page_layout.dart';
import '../avatar.dart'; import '../avatar.dart';
import '../dialogs/simple_dialogs.dart'; import '../dialogs/simple_dialogs.dart';
import '../matrix.dart'; import '../matrix.dart';
@ -86,6 +87,8 @@ class Message extends StatelessWidget {
color: color, color: color,
borderRadius: BorderRadius.circular(radius), borderRadius: BorderRadius.circular(radius),
), ),
constraints:
BoxConstraints(maxWidth: AdaptivePageLayout.defaultMinWidth),
child: Stack( child: Stack(
children: <Widget>[ children: <Widget>[
Column( Column(

View File

@ -8,6 +8,10 @@ import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:universal_html/prefer_universal/html.dart' as html; import 'package:universal_html/prefer_universal/html.dart' as html;
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
/*import 'package:fluffychat/views/chat.dart';
import 'package:fluffychat/config/app_config.dart';
import 'package:dbus/dbus.dart';
import 'package:desktop_notifications/desktop_notifications.dart';*/
import '../utils/app_route.dart'; import '../utils/app_route.dart';
import '../utils/beautify_string_extension.dart'; import '../utils/beautify_string_extension.dart';
@ -179,9 +183,10 @@ class MatrixState extends State<Matrix> {
bool webHasFocus = true; bool webHasFocus = true;
void _showWebNotification(EventUpdate eventUpdate) async { void _showLocalNotification(EventUpdate eventUpdate) async {
if (webHasFocus && activeRoomId == eventUpdate.roomID) return; final roomId = eventUpdate.roomID;
final room = client.getRoomById(eventUpdate.roomID); if (webHasFocus && activeRoomId == roomId) return;
final room = client.getRoomById(roomId);
if (room.notificationCount == 0) return; if (room.notificationCount == 0) return;
final event = Event.fromJson(eventUpdate.content, room); final event = Event.fromJson(eventUpdate.content, room);
final body = event.getLocalizedBody( final body = event.getLocalizedBody(
@ -189,20 +194,41 @@ class MatrixState extends State<Matrix> {
withSenderNamePrefix: withSenderNamePrefix:
!room.isDirectChat || room.lastEvent.senderId == client.userID, !room.isDirectChat || room.lastEvent.senderId == client.userID,
); );
html.AudioElement() final icon = event.sender.avatarUrl?.getThumbnail(client,
..src = 'assets/assets/sounds/notification.wav' width: 64, height: 64, method: ThumbnailMethod.crop) ??
..autoplay = true room.avatar?.getThumbnail(client,
..load(); width: 64, height: 64, method: ThumbnailMethod.crop);
html.Notification( if (kIsWeb) {
room.getLocalizedDisplayname(MatrixLocals(L10n.of(context))), html.AudioElement()
body: body, ..src = 'assets/assets/sounds/notification.wav'
icon: event.sender.avatarUrl?.getThumbnail(client, ..autoplay = true
width: 64, height: 64, method: ThumbnailMethod.crop) ?? ..load();
room.avatar?.getThumbnail(client, html.Notification(
width: 64, height: 64, method: ThumbnailMethod.crop), room.getLocalizedDisplayname(MatrixLocals(L10n.of(context))),
); body: body,
icon: icon,
);
} else if (Platform.isLinux) {
/*var sessionBus = DBusClient.session();
var client = NotificationClient(sessionBus);
_linuxNotificationIds[roomId] = await client.notify(
room.getLocalizedDisplayname(MatrixLocals(L10n.of(context))),
body: body,
replacesID: _linuxNotificationIds[roomId] ?? -1,
appName: AppConfig.applicationName,
actionCallback: (_) => Navigator.of(context).pushAndRemoveUntil(
AppRoute.defaultRoute(
context,
ChatView(roomId),
),
(r) => r.isFirst),
);
await sessionBus.close();*/
}
} }
//final Map<String, int> _linuxNotificationIds = {};
@override @override
void initState() { void initState() {
store = widget.store ?? Store(); store = widget.store ?? Store();
@ -299,7 +325,8 @@ class MatrixState extends State<Matrix> {
if (kIsWeb) { if (kIsWeb) {
onFocusSub = html.window.onFocus.listen((_) => webHasFocus = true); onFocusSub = html.window.onFocus.listen((_) => webHasFocus = true);
onBlurSub = html.window.onBlur.listen((_) => webHasFocus = false); onBlurSub = html.window.onBlur.listen((_) => webHasFocus = false);
}
if (kIsWeb || Platform.isLinux) {
client.onSync.stream.first.then((s) { client.onSync.stream.first.then((s) {
html.Notification.requestPermission(); html.Notification.requestPermission();
onNotification ??= client.onEvent.stream onNotification ??= client.onEvent.stream
@ -308,7 +335,7 @@ class MatrixState extends State<Matrix> {
[EventTypes.Message, EventTypes.Sticker, EventTypes.Encrypted] [EventTypes.Message, EventTypes.Sticker, EventTypes.Encrypted]
.contains(e.eventType) && .contains(e.eventType) &&
e.content['sender'] != client.userID) e.content['sender'] != client.userID)
.listen(_showWebNotification); .listen(_showLocalNotification);
}); });
} }
super.initState(); super.initState();

View File

@ -93,15 +93,10 @@ class _Reaction extends StatelessWidget {
content = Row( content = Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: <Widget>[ children: <Widget>[
PlatformInfos.isBetaDesktop CachedNetworkImage(
? Image.network( imageUrl: src,
src, height: fontSize,
height: fontSize, ),
)
: CachedNetworkImage(
imageUrl: src,
height: fontSize,
),
Container(width: 4), Container(width: 4),
Text(count.toString(), Text(count.toString(),
style: TextStyle( style: TextStyle(

View File

@ -0,0 +1,28 @@
import 'package:flutter/material.dart';
class MouseOverBuilder extends StatefulWidget {
final Function(BuildContext, bool) builder;
const MouseOverBuilder({Key key, this.builder}) : super(key: key);
@override
_MouseOverBuilderState createState() => _MouseOverBuilderState();
}
class _MouseOverBuilderState extends State<MouseOverBuilder> {
bool _hover = false;
void _toggleHover(bool hover) {
if (_hover != hover) {
setState(() => _hover = hover);
}
}
@override
Widget build(BuildContext context) {
return MouseRegion(
onEnter: (_) => _toggleHover(true),
onExit: (_) => _toggleHover(false),
child: widget.builder != null ? widget.builder(context, _hover) : null,
);
}
}

View File

@ -683,14 +683,11 @@ class _ChatState extends State<_Chat> {
body: Stack( body: Stack(
children: <Widget>[ children: <Widget>[
if (Matrix.of(context).wallpaper != null) if (Matrix.of(context).wallpaper != null)
Opacity( Image.file(
opacity: 0.66, Matrix.of(context).wallpaper,
child: Image.file( height: double.infinity,
Matrix.of(context).wallpaper, width: double.infinity,
height: double.infinity, fit: BoxFit.cover,
width: double.infinity,
fit: BoxFit.cover,
),
), ),
Column( Column(
children: <Widget>[ children: <Widget>[
@ -935,8 +932,7 @@ class _ChatState extends State<_Chat> {
room.canSendDefaultMessages && room.membership == Membership.join room.canSendDefaultMessages && room.membership == Membership.join
? Container( ? Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: color: Theme.of(context).backgroundColor,
Theme.of(context).backgroundColor.withOpacity(0.8),
), ),
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,

View File

@ -420,37 +420,34 @@ class _ChatListState extends State<ChatList> {
), ),
), ),
), ),
floatingActionButton: floatingActionButton: AdaptivePageLayout.columnMode(context)
(AdaptivePageLayout.columnMode(context) || ? null
selectMode != SelectMode.normal) : Column(
? null mainAxisSize: MainAxisSize.min,
: Column( children: [
mainAxisSize: MainAxisSize.min, FloatingActionButton(
children: [ heroTag: null,
FloatingActionButton( child: Icon(
heroTag: null, Icons.edit,
child: Icon( color: Theme.of(context).primaryColor,
Icons.edit, ),
color: Theme.of(context).primaryColor, elevation: 1,
), backgroundColor:
elevation: 1, Theme.of(context).secondaryHeaderColor,
backgroundColor: onPressed: () => _setStatus(context),
Theme.of(context).secondaryHeaderColor,
onPressed: () => _setStatus(context),
),
SizedBox(height: 16.0),
FloatingActionButton(
child: Icon(Icons.add),
backgroundColor:
Theme.of(context).primaryColor,
onPressed: () => Navigator.of(context)
.pushAndRemoveUntil(
AppRoute.defaultRoute(
context, NewPrivateChatView()),
(r) => r.isFirst),
),
],
), ),
SizedBox(height: 16.0),
FloatingActionButton(
child: Icon(Icons.add),
backgroundColor: Theme.of(context).primaryColor,
onPressed: () => Navigator.of(context)
.pushAndRemoveUntil(
AppRoute.defaultRoute(
context, NewPrivateChatView()),
(r) => r.isFirst),
),
],
),
body: Column( body: Column(
children: [ children: [
ConnectionStatusHeader(), ConnectionStatusHeader(),
@ -532,11 +529,7 @@ class _ChatListState extends State<ChatList> {
(BuildContext context, int i) { (BuildContext context, int i) {
if (i == 0) { if (i == 0) {
final displayPresences = final displayPresences =
Matrix.of(context) selectMode != SelectMode.share;
.userStatuses
.isNotEmpty &&
selectMode ==
SelectMode.normal;
final displayShareStatus = final displayShareStatus =
selectMode == selectMode ==
SelectMode.share && SelectMode.share &&

View File

@ -416,19 +416,12 @@ class _EmoteImage extends StatelessWidget {
height: size * devicePixelRatio, height: size * devicePixelRatio,
method: ThumbnailMethod.scale, method: ThumbnailMethod.scale,
); );
return PlatformInfos.isBetaDesktop return CachedNetworkImage(
? Image.network( imageUrl: url,
url, fit: BoxFit.contain,
fit: BoxFit.contain, width: size,
width: size, height: size,
height: size, );
)
: CachedNetworkImage(
imageUrl: url,
fit: BoxFit.contain,
width: size,
height: size,
);
} }
} }

View File

@ -19,7 +19,7 @@ static void my_application_activate(GApplication* application) {
gtk_header_bar_set_title(header_bar, "fluffychat"); gtk_header_bar_set_title(header_bar, "fluffychat");
gtk_header_bar_set_show_close_button(header_bar, TRUE); gtk_header_bar_set_show_close_button(header_bar, TRUE);
gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); gtk_window_set_titlebar(window, GTK_WIDGET(header_bar));
gtk_window_set_default_size(window, 1280, 720); gtk_window_set_default_size(window, 802, 520);
gtk_widget_show(GTK_WIDGET(window)); gtk_widget_show(GTK_WIDGET(window));
g_autoptr(FlDartProject) project = fl_dart_project_new(); g_autoptr(FlDartProject) project = fl_dart_project_new();

View File

@ -77,7 +77,7 @@ packages:
name: cached_network_image name: cached_network_image
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.3.2+1" version: "2.3.3"
canonical_json: canonical_json:
dependency: transitive dependency: transitive
description: description:
@ -99,6 +99,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0-nullsafety.1" version: "1.2.0-nullsafety.1"
circular_check_box:
dependency: "direct main"
description:
name: circular_check_box
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.4"
cli_util: cli_util:
dependency: transitive dependency: transitive
description: description:
@ -188,7 +195,7 @@ packages:
description: description:
path: "." path: "."
ref: yiffed ref: yiffed
resolved-ref: c1791edd4d9788d353c618cf1717a88d6c3b547b resolved-ref: d9bc92d6543e51845ef384ee7650fcb3428d0718
url: "https://github.com/innereq/famedlysdk-fork.git" url: "https://github.com/innereq/famedlysdk-fork.git"
source: git source: git
version: "0.0.1" version: "0.0.1"
@ -233,7 +240,7 @@ packages:
name: firebase name: firebase
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "7.3.1" version: "7.3.2"
firebase_core: firebase_core:
dependency: transitive dependency: transitive
description: description:
@ -280,7 +287,7 @@ packages:
name: flutter_cache_manager name: flutter_cache_manager
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.4.2" version: "2.0.0"
flutter_keyboard_visibility: flutter_keyboard_visibility:
dependency: transitive dependency: transitive
description: description:
@ -301,7 +308,7 @@ packages:
name: flutter_local_notifications name: flutter_local_notifications
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.0+1" version: "2.0.1"
flutter_local_notifications_platform_interface: flutter_local_notifications_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -428,7 +435,7 @@ packages:
name: image_picker name: image_picker
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.6.7+11" version: "0.6.7+12"
image_picker_platform_interface: image_picker_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -477,7 +484,7 @@ packages:
name: localstorage name: localstorage
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.2+5" version: "3.0.3+6"
logging: logging:
dependency: transitive dependency: transitive
description: description:
@ -512,7 +519,7 @@ packages:
name: matrix_link_text name: matrix_link_text
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.1.5" version: "0.2.0"
meta: meta:
dependency: transitive dependency: transitive
description: description:
@ -626,7 +633,7 @@ packages:
name: path_provider name: path_provider
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.6.18" version: "1.6.21"
path_provider_linux: path_provider_linux:
dependency: transitive dependency: transitive
description: description:
@ -759,7 +766,7 @@ packages:
name: share name: share
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.6.5+2" version: "0.6.5+3"
shelf: shelf:
dependency: transitive dependency: transitive
description: description:
@ -834,7 +841,7 @@ packages:
name: sqlite3 name: sqlite3
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.1.6" version: "0.1.7"
sqlite3_flutter_libs: sqlite3_flutter_libs:
dependency: "direct main" dependency: "direct main"
description: description:
@ -946,7 +953,7 @@ packages:
name: url_launcher name: url_launcher
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "5.7.2" version: "5.7.5"
url_launcher_linux: url_launcher_linux:
dependency: transitive dependency: transitive
description: description:

View File

@ -34,10 +34,10 @@ dependencies:
file_picker_cross: ^4.2.2 file_picker_cross: ^4.2.2
image_picker: ^0.6.7+11 image_picker: ^0.6.7+11
url_launcher: ^5.7.2 url_launcher: ^5.7.2
cached_network_image: ^2.3.2+1 cached_network_image: ^2.3.3
firebase_messaging: ^7.0.2 firebase_messaging: ^7.0.2
flutter_local_notifications: ^2.0.0+1 flutter_local_notifications: ^2.0.0+1
matrix_link_text: ^0.1.5 matrix_link_text: ^0.2.0
path_provider: ^1.5.1 path_provider: ^1.5.1
webview_flutter: ^0.3.19+9 webview_flutter: ^0.3.19+9
share: ^0.6.3+5 share: ^0.6.3+5
@ -60,6 +60,7 @@ dependencies:
flutter_olm: ^1.0.1 flutter_olm: ^1.0.1
intl: ^0.16.1 intl: ^0.16.1
intl_translation: ^0.17.9 intl_translation: ^0.17.9
circular_check_box: ^1.0.4
flutter_localizations: flutter_localizations:
sdk: flutter sdk: flutter
sqflite: ^1.1.7 # Still used to obtain the database location sqflite: ^1.1.7 # Still used to obtain the database location