From f556ac4593f7f248141c5a3af77dae1579e25b1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Bed=C3=A1=C5=88?= Date: Sat, 10 Aug 2024 05:21:01 +0000 Subject: [PATCH 1/8] Translated using Weblate (Czech) Currently translated at 78.6% (516 of 656 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/cs/ --- assets/l10n/intl_cs.arb | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/assets/l10n/intl_cs.arb b/assets/l10n/intl_cs.arb index 34549bee4..73ed1592a 100644 --- a/assets/l10n/intl_cs.arb +++ b/assets/l10n/intl_cs.arb @@ -2367,5 +2367,17 @@ "accessAndVisibilityDescription": "Kdo se může připojit a najít tuto konverzaci.", "@accessAndVisibilityDescription": {}, "customEmojisAndStickersBody": "Přidat nebo sdílet vlastní emoji nebo nálepky, které mohou být použité v konverzaci.", - "@customEmojisAndStickersBody": {} + "@customEmojisAndStickersBody": {}, + "swipeRightToLeftToReply": "Potáhněte z prava do leva pro odpověď", + "@swipeRightToLeftToReply": {}, + "countChatsAndCountParticipants": "{chats} konverzaci a {participants} účastníci", + "@countChatsAndCountParticipants": { + "type": "text", + "placeholders": { + "chats": {}, + "participants": {} + } + }, + "noMoreChatsFound": "Žádné další konverzace nalezeny...", + "@noMoreChatsFound": {} } From d3298f0b09ec6a2258a841e66df473e3060a28f9 Mon Sep 17 00:00:00 2001 From: krille-chan Date: Sun, 11 Aug 2024 08:55:10 +0200 Subject: [PATCH 2/8] chore: Follow up display read marker in timeline --- lib/pages/chat/chat.dart | 38 ++++++++++++++++++----------- lib/pages/chat/chat_event_list.dart | 3 +-- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 990557ee5..a373b87ea 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -102,7 +102,7 @@ class ChatController extends State Timeline? timeline; - String? readMarkerEventId; + late final String readMarkerEventId; String get roomId => widget.room.id; @@ -270,6 +270,7 @@ class ChatController extends State ); sendingClient = Matrix.of(context).client; + readMarkerEventId = room.hasNewMessages ? room.fullyRead : ''; WidgetsBinding.instance.addObserver(this); _tryLoadTimeline(); if (kIsWeb) { @@ -284,19 +285,22 @@ class ChatController extends State await loadTimelineFuture; if (initialEventId != null) scrollToEventId(initialEventId); - final fullyRead = room.fullyRead; - if (fullyRead.isEmpty) { - setReadMarker(); - return; - } - if (timeline?.events.any((event) => event.eventId == fullyRead) ?? - false) { - Logs().v('Scroll up to visible event', fullyRead); - scrollToEventId(fullyRead, highlightEvent: false); + final readMarkerEventIndex = readMarkerEventId.isEmpty + ? -1 + : timeline!.events + .where((e) => e.isVisibleInGui) + .toList() + .indexWhere((e) => e.eventId == readMarkerEventId); + + if (readMarkerEventIndex > 1) { + Logs().v('Scroll up to visible event', readMarkerEventId); + scrollToEventId(readMarkerEventId, highlightEvent: false); return; + } else if (readMarkerEventId.isNotEmpty && readMarkerEventIndex == -1) { + _showScrollUpMaterialBanner(readMarkerEventId); } + if (!mounted) return; - _showScrollUpMaterialBanner(fullyRead); } catch (e, s) { ErrorReporter(context, 'Unable to load timeline').onErrorCallback(e, s); rethrow; @@ -323,13 +327,16 @@ class ChatController extends State int? animateInEventIndex; void onInsert(int i) { + onChange(i); + // setState will be called by updateView() anyway + animateInEventIndex = i; + } + + void onChange(int i) { if (timeline?.events[i].status == EventStatus.synced) { final index = timeline!.events.firstIndexWhereNotError; if (i == index) setReadMarker(eventId: timeline?.events[i].eventId); } - - // setState will be called by updateView() anyway - animateInEventIndex = i; } Future _getTimeline({ @@ -347,6 +354,7 @@ class ChatController extends State onUpdate: updateView, eventContextId: eventContextId, onInsert: onInsert, + onChange: onChange, ); } catch (e, s) { Logs().w('Unable to load timeline on event ID $eventContextId', e, s); @@ -354,6 +362,7 @@ class ChatController extends State timeline = await room.getTimeline( onUpdate: updateView, onInsert: onInsert, + onChange: onChange, ); if (!mounted) return; if (e is TimeoutException || e is IOException) { @@ -380,6 +389,7 @@ class ChatController extends State if (_setReadMarkerFuture != null) return; if (_scrolledUp) return; if (scrollUpBannerEventId != null) return; + if (eventId == null && !room.hasNewMessages && room.notificationCount == 0) { diff --git a/lib/pages/chat/chat_event_list.dart b/lib/pages/chat/chat_event_list.dart index 2d56aa5c0..65c920360 100644 --- a/lib/pages/chat/chat_event_list.dart +++ b/lib/pages/chat/chat_event_list.dart @@ -141,8 +141,7 @@ class ChatEventList extends StatelessWidget { .any((e) => e.eventId == event.eventId), timeline: controller.timeline!, displayReadMarker: - controller.readMarkerEventId == event.eventId && - controller.timeline?.allowNewEvent == false, + i > 0 && controller.readMarkerEventId == event.eventId, nextEvent: i + 1 < events.length ? events[i + 1] : null, previousEvent: i > 0 ? events[i - 1] : null, avatarPresenceBackgroundColor: From 1c6d8a05793846a809aa83c534a2320e65420b8b Mon Sep 17 00:00:00 2001 From: krille-chan Date: Sun, 11 Aug 2024 08:56:48 +0200 Subject: [PATCH 3/8] chore: Make VOIP plugin less noisy in logs --- lib/utils/voip_plugin.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/utils/voip_plugin.dart b/lib/utils/voip_plugin.dart index 8a71390ef..d2ca1f999 100644 --- a/lib/utils/voip_plugin.dart +++ b/lib/utils/voip_plugin.dart @@ -36,7 +36,6 @@ class VoipPlugin with WidgetsBindingObserver implements WebRTCDelegate { void didChangeAppLifecycleState(AppLifecycleState? state) { background = (state == AppLifecycleState.detached || state == AppLifecycleState.paused); - Logs().w('Set background mode in VOIP plugin', background); } void addCallingOverlay(String callId, CallSession call) { From 664548d937367a4e8d4f4dd8bb8c90ba3833bd2d Mon Sep 17 00:00:00 2001 From: krille-chan Date: Sun, 11 Aug 2024 09:40:08 +0200 Subject: [PATCH 4/8] chore: Nicer empty chat list placeholder --- assets/l10n/intl_en.arb | 1 + lib/pages/chat_list/chat_list_body.dart | 99 ++++++++----------- lib/pages/chat_list/dummy_chat_list_item.dart | 72 ++++++++++++++ 3 files changed, 114 insertions(+), 58 deletions(-) create mode 100644 lib/pages/chat_list/dummy_chat_list_item.dart diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index 8441314e1..aa2d05420 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -205,6 +205,7 @@ } }, "noMoreChatsFound": "No more chats found...", + "noChatsFoundHere": "No chats found here yet. Start a new chat with someone by using the button below. ⤵️", "joinedChats": "Joined chats", "unread": "Unread", "space": "Space", diff --git a/lib/pages/chat_list/chat_list_body.dart b/lib/pages/chat_list/chat_list_body.dart index 27a640d6a..0f06fde97 100644 --- a/lib/pages/chat_list/chat_list_body.dart +++ b/lib/pages/chat_list/chat_list_body.dart @@ -7,6 +7,7 @@ import 'package:matrix/matrix.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pages/chat_list/chat_list.dart'; import 'package:fluffychat/pages/chat_list/chat_list_item.dart'; +import 'package:fluffychat/pages/chat_list/dummy_chat_list_item.dart'; import 'package:fluffychat/pages/chat_list/search_title.dart'; import 'package:fluffychat/pages/chat_list/space_view.dart'; import 'package:fluffychat/pages/chat_list/status_msg_list.dart'; @@ -61,8 +62,6 @@ class ChatListViewBody extends StatelessWidget { .toList(); final userSearchResult = controller.userSearchResult; const dummyChatCount = 4; - final titleColor = theme.textTheme.bodyLarge!.color!.withAlpha(100); - final subtitleColor = theme.textTheme.bodyLarge!.color!.withAlpha(50); final filter = controller.searchController.text.toLowerCase(); return StreamBuilder( key: ValueKey( @@ -238,13 +237,44 @@ class ChatListViewBody extends StatelessWidget { if (client.prevBatch != null && rooms.isEmpty && !controller.isSearchMode) ...[ - Padding( - padding: const EdgeInsets.all(32.0), - child: Icon( - CupertinoIcons.chat_bubble_2, - size: 128, - color: theme.colorScheme.secondary, - ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Stack( + alignment: Alignment.center, + children: [ + const Column( + mainAxisSize: MainAxisSize.min, + children: [ + DummyChatListItem( + opacity: 0.5, + animate: false, + ), + DummyChatListItem( + opacity: 0.3, + animate: false, + ), + ], + ), + Icon( + CupertinoIcons.chat_bubble_text_fill, + size: 128, + color: theme.colorScheme.secondary, + ), + ], + ), + Padding( + padding: const EdgeInsets.all(16.0), + child: Text( + L10n.of(context)!.noChatsFoundHere, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 18, + color: theme.colorScheme.secondary, + ), + ), + ), + ], ), ], ], @@ -253,56 +283,9 @@ class ChatListViewBody extends StatelessWidget { if (client.prevBatch == null) SliverList( delegate: SliverChildBuilderDelegate( - (context, i) => Opacity( + (context, i) => DummyChatListItem( opacity: (dummyChatCount - i) / dummyChatCount, - child: ListTile( - leading: CircleAvatar( - backgroundColor: titleColor, - child: CircularProgressIndicator( - strokeWidth: 1, - color: theme.textTheme.bodyLarge!.color, - ), - ), - title: Row( - children: [ - Expanded( - child: Container( - height: 14, - decoration: BoxDecoration( - color: titleColor, - borderRadius: BorderRadius.circular(3), - ), - ), - ), - const SizedBox(width: 36), - Container( - height: 14, - width: 14, - decoration: BoxDecoration( - color: subtitleColor, - borderRadius: BorderRadius.circular(14), - ), - ), - const SizedBox(width: 12), - Container( - height: 14, - width: 14, - decoration: BoxDecoration( - color: subtitleColor, - borderRadius: BorderRadius.circular(14), - ), - ), - ], - ), - subtitle: Container( - decoration: BoxDecoration( - color: subtitleColor, - borderRadius: BorderRadius.circular(3), - ), - height: 12, - margin: const EdgeInsets.only(right: 22), - ), - ), + animate: true, ), childCount: dummyChatCount, ), diff --git a/lib/pages/chat_list/dummy_chat_list_item.dart b/lib/pages/chat_list/dummy_chat_list_item.dart new file mode 100644 index 000000000..8652cccd1 --- /dev/null +++ b/lib/pages/chat_list/dummy_chat_list_item.dart @@ -0,0 +1,72 @@ +import 'package:flutter/material.dart'; + +class DummyChatListItem extends StatelessWidget { + final double opacity; + final bool animate; + + const DummyChatListItem({ + required this.opacity, + required this.animate, + super.key, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final titleColor = theme.textTheme.bodyLarge!.color!.withAlpha(100); + final subtitleColor = theme.textTheme.bodyLarge!.color!.withAlpha(50); + return Opacity( + opacity: opacity, + child: ListTile( + leading: CircleAvatar( + backgroundColor: titleColor, + child: animate + ? CircularProgressIndicator( + strokeWidth: 1, + color: theme.textTheme.bodyLarge!.color, + ) + : const SizedBox.shrink(), + ), + title: Row( + children: [ + Expanded( + child: Container( + height: 14, + decoration: BoxDecoration( + color: titleColor, + borderRadius: BorderRadius.circular(3), + ), + ), + ), + const SizedBox(width: 36), + Container( + height: 14, + width: 14, + decoration: BoxDecoration( + color: subtitleColor, + borderRadius: BorderRadius.circular(14), + ), + ), + const SizedBox(width: 12), + Container( + height: 14, + width: 14, + decoration: BoxDecoration( + color: subtitleColor, + borderRadius: BorderRadius.circular(14), + ), + ), + ], + ), + subtitle: Container( + decoration: BoxDecoration( + color: subtitleColor, + borderRadius: BorderRadius.circular(3), + ), + height: 12, + margin: const EdgeInsets.only(right: 22), + ), + ), + ); + } +} From 612711d60213c9152acea6567bfc9c3559ad89da Mon Sep 17 00:00:00 2001 From: krille-chan Date: Sun, 11 Aug 2024 11:35:26 +0200 Subject: [PATCH 5/8] chore: Follow up no more chats found label --- lib/pages/chat_list/chat_list_body.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/pages/chat_list/chat_list_body.dart b/lib/pages/chat_list/chat_list_body.dart index 0f06fde97..bf23e841e 100644 --- a/lib/pages/chat_list/chat_list_body.dart +++ b/lib/pages/chat_list/chat_list_body.dart @@ -266,7 +266,9 @@ class ChatListViewBody extends StatelessWidget { Padding( padding: const EdgeInsets.all(16.0), child: Text( - L10n.of(context)!.noChatsFoundHere, + client.rooms.isEmpty + ? L10n.of(context)!.noChatsFoundHere + : L10n.of(context)!.noMoreChatsFound, textAlign: TextAlign.center, style: TextStyle( fontSize: 18, From ebd8b700b10ee9693ad194382d2b3faeef3de892 Mon Sep 17 00:00:00 2001 From: krille-chan Date: Sun, 11 Aug 2024 12:31:10 +0200 Subject: [PATCH 6/8] chore: Show short forms of months and week days in UI --- lib/utils/date_time_extension.dart | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/lib/utils/date_time_extension.dart b/lib/utils/date_time_extension.dart index 13bae4efa..0346dd289 100644 --- a/lib/utils/date_time_extension.dart +++ b/lib/utils/date_time_extension.dart @@ -56,19 +56,14 @@ extension DateTimeExtension on DateTime { if (sameDay) { return localizedTimeOfDay(context); } else if (sameWeek) { - return DateFormat.EEEE(Localizations.localeOf(context).languageCode) + return DateFormat.E(Localizations.localeOf(context).languageCode) .format(this); } else if (sameYear) { - return L10n.of(context)!.dateWithoutYear( - month.toString().padLeft(2, '0'), - day.toString().padLeft(2, '0'), - ); + return DateFormat.MMMd(Localizations.localeOf(context).languageCode) + .format(this); } - return L10n.of(context)!.dateWithYear( - year.toString(), - month.toString().padLeft(2, '0'), - day.toString().padLeft(2, '0'), - ); + return DateFormat.yMMMd(Localizations.localeOf(context).languageCode) + .format(this); } /// If the DateTime is today, this returns [localizedTimeOfDay()], if not it also From 6cc8f6aa9b7f3051aaf906c3ee242b24a297dbac Mon Sep 17 00:00:00 2001 From: krille-chan Date: Sun, 11 Aug 2024 12:42:10 +0200 Subject: [PATCH 7/8] docs: Update privacy policy --- PRIVACY.md | 30 ++++-------------------------- 1 file changed, 4 insertions(+), 26 deletions(-) diff --git a/PRIVACY.md b/PRIVACY.md index dd978f243..8c1ca45e5 100644 --- a/PRIVACY.md +++ b/PRIVACY.md @@ -3,31 +3,29 @@ FluffyChat is available on Android, iOS and as a web version. Desktop versions for Windows, Linux and macOS may follow. * [Matrix](#matrix) -* Sentry * [Database](#database) * [Encryption](#encryption) * [App Permissions](#app-permissions) * [Push Notifications](#push-notifications) -* [Stories](#stories) ## Matrix FluffyChat uses the Matrix protocol. This means that FluffyChat is just a client that can be connected to any compatible matrix server. The respective data protection agreement of the server selected by the user then applies. For convenience, one or more servers are set as default that the FluffyChat developers consider trustworthy. The developers of FluffyChat do not guarantee their trustworthiness. Before the first communication, users are informed which server they are connecting to. -FluffyChat only communicates with the selected server, with sentry.io if enabled and with [OpenStreetMap](https://openstreetmap.org) to display maps. +FluffyChat only communicates with the selected server and with [OpenStreetMap](https://openstreetmap.org) to display maps. More information is available at: [https://matrix.org](https://matrix.org) ## Database -FluffyChat caches some data received from the server in a local database on the device of the user. +FluffyChat caches some data received from the server in a local sqflite database on the device of the user. On web indexedDB is used. FluffyChat always tries to encrypt the database by using SQLCipher and stores the encryption key in the [Secure Storage](https://pub.dev/packages/flutter_secure_storage) of the device. -More information is available at: [https://pub.dev/packages/hive](https://pub.dev/packages/hive) +More information is available at: [https://pub.dev/packages/sqflite](https://pub.dev/packages/sqflite) and [https://pub.dev/packages/sqlcipher_flutter_libs](https://pub.dev/packages/sqlcipher_flutter_libs) ## Encryption All communication of substantive content between Fluffychat and any server is done in secure way, using transport encryption to protect it. -FluffyChat is able to use End-To-End-Encryption as a tech preview. +FluffyChat also uses End-To-End-Encryption by using [libolm](https://gitlab.matrix.org/matrix-org/olm) and enables it by default for private chats. ## App Permissions @@ -94,23 +92,3 @@ A typical push notification could look like this: ``` FluffyChat sets the `event_id_only` flag at the Matrix Server. This server is then responsible to send the correct data. - -## Stories - -FluffyChat supports stories which is a feature similar to WhatsApp status or Instagram stories. However it is just a different GUI for the same room-related communication. More information about the feature can be found here: - -https://github.com/krillefear/matrix-doc/blob/main/proposals/3588-stories-as-rooms.md - -Stories are basically: - -- End to end encrypted rooms -- Read-only rooms with only one admin who can post stuff (while there is no technical limitation to have multiple admins) - -By default: - -- The user has to invite all contacts manually to a story room -- The user can only invite contacts (matrix users the user shares a DM room with) to the story room -- The story room is created when the first story is posted -- User can mute and leave story rooms - -The user is informed in the app that in theory all contacts can see each other in the story room. The user must give consent here. However the user is at any time able to create a group chat and invite all of their contacts to this chat in any matrix client which has the same result. From 28473cda605b3e0f5ed362b786817bb8012ab2e9 Mon Sep 17 00:00:00 2001 From: krille-chan Date: Sun, 11 Aug 2024 15:12:11 +0200 Subject: [PATCH 8/8] build: Bump version to v1.22.0 --- CHANGELOG.md | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++ pubspec.yaml | 2 +- 2 files changed, 86 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 627272439..7132708af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,88 @@ +## v1.22.0 + +FluffyChat v1.22.0 brings a new design for spaces, replaces the bottom navigation bar with filter chips and makes it finally possible to play ogg audio messages on iOS. A lot of other fixes and improvements have also been added to this release. + +- build: (deps): bump docker/build-push-action from 5 to 6 (dependabot[bot]) +- build(deps): bump rexml from 3.2.8 to 3.3.3 in /ios (dependabot[bot]) +- build: Remove permissions for screensharing until it is fixed (Krille) +- build: Update android target sdk to 34 (Krille) +- build: Update dependencies after release (krille-chan) +- build: Update to Flutter 3.22.3 (krille-chan) +- build: Update to Matrix SDK 0.32.0 (Krille) +- chore: Bring back add to space feature (Krille) +- chore: Bring back navrail (krille-chan) +- chore: Bring back separate chat types (krille-chan) +- chore: Chat permissions page follow up (krille-chan) +- chore: Do not hide error on file sending (Krille) +- chore: Improved create group and space design (Krille) +- chore: Make VOIP plugin less noisy in logs (krille-chan) +- chore: Move default PR template to correct dir (krille-chan) +- chore: nicer bottom sheets (krille-chan) +- chore: Nicer empty chat list placeholder (krille-chan) +- chore: Polish public room bottom sheet (krille-chan) +- chore: Show short forms of months and week days in UI (krille-chan) +- chore: Sligthly improve chat permissions page design (krille-chan) +- design: Add snackbar with link to changelog on new version (Krille) +- docs: Update privacy policy (krille-chan) +- feat: Convert opus to aac on iOS before playing (Krille) +- feat: New spaces and chat list design (krille-chan) +- feat: Record voice message with opus/ogg if supported (Krille) +- feat: Send voice messages from web (Krille) +- fix: Display only available join rules (Krille) +- fix: Path correct userId to ignore list (krille-chan) +- fix: Scroll to event missing the position (Krille) +- Fix web base url and privacy url configuration processing (dlyrsk) +- refactor: Clean up some widths (krille-chan) +- refactor: Design polishment and better user viewer (Krille) +- refactor: Migrate android gradle plugin (Krille) +- refactor: Only initialize FlutterLocalNotificationsPlugin once (krille-chan) +- refactor: Recording dialog (Krille) +- Refactor: Reduce .of(context) calls theme (Thomas Klein Langenhorst) +- refactor: Use cached network image for mxc image uris (Krille) +- Translated using Weblate (Arabic) (kdh8219) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (kdh8219) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (kdh8219) +- Translated using Weblate (Chinese (Simplified)) (大王叫我来巡山) +- Translated using Weblate (Chinese (Traditional)) (kdh8219) +- Translated using Weblate (Chinese (Traditional)) (Lukas) +- Translated using Weblate (Chinese (Traditional)) (Ricky From Hong Kong) +- Translated using Weblate (Chinese (Traditional)) (不知火 Shiranui) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Czech) (Anonymous) +- Translated using Weblate (Czech) (Michal Bedáň) +- Translated using Weblate (Dutch) (Guacamolie) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Dutch) (Thomas Klein Langenhorst) +- Translated using Weblate (Esperanto) (Anonymous) +- Translated using Weblate (Estonian) (kdh8219) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Finnish) (Anonymous) +- Translated using Weblate (French) (Sovkipyk) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (German) (Pixelcode) +- Translated using Weblate (German) (tct123) +- Translated using Weblate (Hebrew) (Anonymous) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Irish) (Anonymous) +- Translated using Weblate (Japanese) (Anonymous) +- Translated using Weblate (Korean) (kdh8219) +- Translated using Weblate (Lithuanian) (Anonymous) +- Translated using Weblate (Norwegian Bokmål) (Anonymous) +- Translated using Weblate (Persian) (Anonymous) +- Translated using Weblate (Portuguese (Portugal)) (Anonymous) +- Translated using Weblate (Romanian) (Anonymous) +- Translated using Weblate (Russian) (-) +- Translated using Weblate (Serbian) (Anonymous) +- Translated using Weblate (Slovenian) (Anonymous) +- Translated using Weblate (Spanish) (Anonymous) +- Translated using Weblate (Turkish) (kdh8219) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Bezruchenko Simon) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) + ## v1.21.2 Updates the Matrix Dart SDK to fix some minor bugs. diff --git a/pubspec.yaml b/pubspec.yaml index 93ea6e2e9..5e6d4a25d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: fluffychat description: Chat with your friends. publish_to: none # On version bump also increase the build number for F-Droid -version: 1.21.2+3534 +version: 1.22.0+3535 environment: sdk: ">=3.0.0 <4.0.0"