From 8aa05a1016ecdc152162650d2d70a378ba6aa4a2 Mon Sep 17 00:00:00 2001 From: Gabby Gurdin Date: Tue, 26 Mar 2024 10:07:47 -0400 Subject: [PATCH 1/8] update pangea message event after editting a message --- lib/pages/chat/chat.dart | 16 +++++++++++++++- lib/pages/chat/events/message.dart | 13 +++++++++++-- lib/pangea/models/pangea_message_event.dart | 6 ++++++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 67e459e03..0d2e180a7 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -535,6 +535,12 @@ class ChatController extends State }); // #Pangea + final List edittingEvents = []; + void clearEdittingEvent(String eventId) { + edittingEvents.remove(eventId); + setState(() {}); + } + // Future send() async { // Original send function gets the tx id within the matrix lib, // but for choero, the tx id is generated before the message send. @@ -577,6 +583,7 @@ class ChatController extends State // editEventId: editEvent?.eventId, // parseCommands: parseCommands, // ); + final previousEdit = editEvent; room .pangeaSendTextEvent( sendController.text, @@ -592,6 +599,13 @@ class ChatController extends State ) .then( (String? msgEventId) { + // #Pangea + setState(() { + if (previousEdit != null) { + edittingEvents.add(previousEdit.eventId); + } + }); + // Pangea# GoogleAnalytics.sendMessage( room.id, room.classCode, @@ -1219,7 +1233,7 @@ class ChatController extends State void clearSelectedEvents() => setState(() { selectedEvents.clear(); showEmojiPicker = false; -//#Pangea + //#Pangea choreographer.messageOptions.resetSelectedDisplayLang(); //Pangea# }); diff --git a/lib/pages/chat/events/message.dart b/lib/pages/chat/events/message.dart index 5b1a56cf5..cc537a858 100644 --- a/lib/pages/chat/events/message.dart +++ b/lib/pages/chat/events/message.dart @@ -68,10 +68,21 @@ class Message extends StatelessWidget { super.key, }); + // #Pangea + PangeaMessageEvent? get pangeaMessageEvent => + controller.getPangeaMessageEvent(event.eventId); + // Pangea# + @override Widget build(BuildContext context) { // #Pangea debugPrint('Message.build()'); + WidgetsBinding.instance.addPostFrameCallback((_) { + if (controller.edittingEvents.contains(event.eventId)) { + pangeaMessageEvent?.updateLatestEdit(); + controller.clearEdittingEvent(event.eventId); + } + }); // Pangea# if (!{ EventTypes.Message, @@ -141,8 +152,6 @@ class Message extends StatelessWidget { } // #Pangea - final PangeaMessageEvent? pangeaMessageEvent = - controller.getPangeaMessageEvent(event.eventId); ToolbarDisplayController? toolbarController; if (event.messageType == MessageTypes.Text || event.messageType == MessageTypes.Notice) { diff --git a/lib/pangea/models/pangea_message_event.dart b/lib/pangea/models/pangea_message_event.dart index ebc8c2665..b8eb99a0a 100644 --- a/lib/pangea/models/pangea_message_event.dart +++ b/lib/pangea/models/pangea_message_event.dart @@ -69,6 +69,12 @@ class PangeaMessageEvent { .firstOrNull ?? _event; + Event updateLatestEdit() { + _latestEditCache = null; + _representations = null; + return _latestEdit; + } + bool showRichText(bool selected, bool highlighted) { if (!_isValidPangeaMessageEvent) { return false; From 62a4ea785a6a33f9c9bc7a5441f1961babf21104 Mon Sep 17 00:00:00 2001 From: Gabby Gurdin Date: Wed, 27 Mar 2024 12:26:15 -0400 Subject: [PATCH 2/8] remove former version of editted messages from analytics --- assets/l10n/intl_en.arb | 3 +- lib/pages/chat/chat.dart | 2 + .../controllers/my_analytics_controller.dart | 13 +++--- lib/pangea/extensions/client_extension.dart | 27 +++++++++++++ .../extensions/pangea_room_extension.dart | 31 ++++++++++++-- .../models/construct_analytics_event.dart | 21 +++++++++- .../models/student_analytics_event.dart | 40 ++++++++++++++++--- .../student_analytics_summary_model.dart | 11 ++++- .../student_analytics/student_analytics.dart | 4 -- 9 files changed, 129 insertions(+), 23 deletions(-) diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index 0783205a6..3d1fe90cb 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -3952,5 +3952,6 @@ "joinToView": "Join this room to view details", "refresh": "Refresh", "autoPlayTitle": "Auto Play Messages", - "autoPlayDesc": "When enabled, the text-to-speech audio of messages will play automatically when selected." + "autoPlayDesc": "When enabled, the text-to-speech audio of messages will play automatically when selected.", + "messageAnalytics": "Message Analytics" } \ No newline at end of file diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 0d2e180a7..52c7bdcc7 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -628,6 +628,7 @@ class ChatController extends State useType: useType ?? UseType.un, time: DateTime.now(), ), + isEdit: previousEdit != null, ); if (choreo != null && @@ -641,6 +642,7 @@ class ChatController extends State ...choreo.toGrammarConstructUse(msgEventId, room.id), ], originalSent!.langCode, + isEdit: previousEdit != null, ); } }, diff --git a/lib/pangea/controllers/my_analytics_controller.dart b/lib/pangea/controllers/my_analytics_controller.dart index a33748fda..deafd8f2a 100644 --- a/lib/pangea/controllers/my_analytics_controller.dart +++ b/lib/pangea/controllers/my_analytics_controller.dart @@ -24,8 +24,9 @@ class MyAnalyticsController { //PTODO - locally cache and update periodically Future handleMessage( Room room, - RecentMessageRecord messageRecord, - ) async { + RecentMessageRecord messageRecord, { + bool isEdit = false, + }) async { try { debugPrint("in handle message with type ${messageRecord.useType}"); if (_userId == null) { @@ -48,7 +49,7 @@ class MyAnalyticsController { for (final event in events) { if (event != null) { - event.handleNewMessage(messageRecord); + event.handleNewMessage(messageRecord, isEdit: isEdit); } } } catch (err) { @@ -76,8 +77,9 @@ class MyAnalyticsController { Future saveConstructsMixed( List allUses, - String langCode, - ) async { + String langCode, { + bool isEdit = false, + }) async { try { final Map> aggregatedVocabUse = {}; for (final use in allUses) { @@ -96,6 +98,7 @@ class MyAnalyticsController { uses.key, uses.value.first.constructType!, uses.value, + isEdit: isEdit, ), ); } diff --git a/lib/pangea/extensions/client_extension.dart b/lib/pangea/extensions/client_extension.dart index f5a32c95e..973ece6b3 100644 --- a/lib/pangea/extensions/client_extension.dart +++ b/lib/pangea/extensions/client_extension.dart @@ -212,4 +212,31 @@ extension PangeaClient on Client { } return false; } + + Future> getEditHistory( + String roomId, + String eventId, + ) async { + final Room? room = getRoomById(roomId); + final Event? editEvent = await room?.getEventById(eventId); + final String? edittedEventId = + editEvent?.content.tryGetMap('m.relates_to')?['event_id']; + if (edittedEventId == null) return []; + + final Event? originalEvent = await room!.getEventById(edittedEventId); + if (originalEvent == null) return []; + + final Timeline timeline = await room.getTimeline(); + final List editEvents = originalEvent + .aggregatedEvents( + timeline, + RelationshipTypes.edit, + ) + .sorted( + (a, b) => b.originServerTs.compareTo(a.originServerTs), + ) + .toList(); + editEvents.add(originalEvent); + return editEvents.slice(1).map((e) => e.eventId).toList(); + } } diff --git a/lib/pangea/extensions/pangea_room_extension.dart b/lib/pangea/extensions/pangea_room_extension.dart index e617247de..7af3d6233 100644 --- a/lib/pangea/extensions/pangea_room_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension.dart @@ -692,16 +692,39 @@ extension PangeaRoom on Room { } } + Future> removeEdittedLemmas( + List lemmaUses, + ) async { + final List removeUses = []; + for (final use in lemmaUses) { + if (use.msgId == null) continue; + final List removeIds = await client.getEditHistory( + use.chatId, + use.msgId!, + ); + removeUses.addAll(removeIds); + } + lemmaUses.removeWhere((use) => removeUses.contains(use.msgId)); + final allEvents = await allConstructEvents; + for (final constructEvent in allEvents) { + await constructEvent.removeEdittedUses(removeUses, client); + } + return lemmaUses; + } + Future saveConstructUsesSameLemma( String lemma, ConstructType type, - List lemmaUses, - ) async { + List lemmaUses, { + bool isEdit = false, + }) async { final ConstructEvent? localEvent = _vocabEventLocal(lemma); + if (isEdit) { + lemmaUses = await removeEdittedLemmas(lemmaUses); + } + if (localEvent == null) { - final json = - ConstructUses(lemma: lemma, type: type, uses: lemmaUses).toJson(); await client.setRoomStateWithKey( id, PangeaEventTypes.vocab, diff --git a/lib/pangea/models/construct_analytics_event.dart b/lib/pangea/models/construct_analytics_event.dart index 66921b8a2..a97950cdd 100644 --- a/lib/pangea/models/construct_analytics_event.dart +++ b/lib/pangea/models/construct_analytics_event.dart @@ -1,6 +1,6 @@ +import 'package:fluffychat/pangea/models/constructs_analytics_model.dart'; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/pangea/models/constructs_analytics_model.dart'; import '../constants/pangea_event_types.dart'; class ConstructEvent { @@ -30,4 +30,23 @@ class ConstructEvent { content.uses.addAll(uses); event.content = content.toJson(); } + + Future removeEdittedUses( + List removeIds, + Client client, + ) async { + _contentCache ??= ConstructUses.fromJson(event.content); + final previousLength = _contentCache!.uses.length; + _contentCache!.uses.removeWhere( + (element) => removeIds.contains(element.msgId), + ); + if (previousLength > _contentCache!.uses.length) { + await client.setRoomStateWithKey( + _event.room.id, + _event.type, + _event.stateKey!, + _contentCache!.toJson(), + ); + } + } } diff --git a/lib/pangea/models/student_analytics_event.dart b/lib/pangea/models/student_analytics_event.dart index 738014bb8..1884b43b4 100644 --- a/lib/pangea/models/student_analytics_event.dart +++ b/lib/pangea/models/student_analytics_event.dart @@ -1,12 +1,12 @@ import 'dart:developer'; -import 'package:flutter/foundation.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/pangea/constants/class_default_values.dart'; +import 'package:fluffychat/pangea/extensions/client_extension.dart'; import 'package:fluffychat/pangea/models/student_analytics_summary_model.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; +import 'package:flutter/foundation.dart'; +import 'package:matrix/matrix.dart'; + import '../constants/pangea_event_types.dart'; import 'chart_analytics_model.dart'; @@ -41,8 +41,27 @@ class StudentAnalyticsEvent { return _contentCache!; } - Future handleNewMessage(RecentMessageRecord message) async { - debugPrint("handle new message"); + Future removeEdittedMessages( + RecentMessageRecord message, + ) async { + final List removeIds = await classRoom.client.getEditHistory( + message.chatId, + message.eventId, + ); + if (removeIds.isEmpty) return; + _messagesToSave.removeWhere( + (msg) => removeIds.any((e) => e == msg.eventId), + ); + content.removeEdittedMessages( + classRoom.client, + removeIds, + ); + } + + Future handleNewMessage( + RecentMessageRecord message, { + isEdit = false, + }) async { if (classRoom.client.userID != _event.stateKey) { debugger(when: kDebugMode); ErrorHandler.logError( @@ -50,6 +69,10 @@ class StudentAnalyticsEvent { ); return; } + + if (isEdit) { + await removeEdittedMessages(message); + } _addMessage(message); if (DateTime.now().difference(content.lastUpdated).inMinutes > @@ -66,6 +89,10 @@ class StudentAnalyticsEvent { ); return; } + for (final message in messages) { + await removeEdittedMessages(message); + } + _messagesToSave.addAll(messages); _updateStudentAnalytics(); } @@ -75,6 +102,7 @@ class StudentAnalyticsEvent { content.addAll(_messagesToSave); debugPrint("updating student analytics"); _clearMessages(); + await classRoom.client.setRoomStateWithKey( classRoom.id, _event.type, diff --git a/lib/pangea/models/student_analytics_summary_model.dart b/lib/pangea/models/student_analytics_summary_model.dart index 682768b28..69d237ea9 100644 --- a/lib/pangea/models/student_analytics_summary_model.dart +++ b/lib/pangea/models/student_analytics_summary_model.dart @@ -1,8 +1,9 @@ import 'dart:convert'; -import 'package:flutter/foundation.dart'; - import 'package:fluffychat/pangea/utils/error_handler.dart'; +import 'package:flutter/foundation.dart'; +import 'package:matrix/matrix.dart'; + import '../enum/use_type.dart'; class RecentMessageRecord { @@ -78,6 +79,12 @@ class StudentAnalyticsSummary { } } + void removeEdittedMessages(Client client, List removeEventIds) { + _messages.removeWhere( + (element) => removeEventIds.contains(element.eventId), + ); + } + List get messages => _messages; static const _messagesKey = "msgs"; diff --git a/lib/pangea/pages/analytics/student_analytics/student_analytics.dart b/lib/pangea/pages/analytics/student_analytics/student_analytics.dart index fe0e79629..44843bd41 100644 --- a/lib/pangea/pages/analytics/student_analytics/student_analytics.dart +++ b/lib/pangea/pages/analytics/student_analytics/student_analytics.dart @@ -49,10 +49,6 @@ class StudentAnalyticsController extends State { } Future initialize() async { - await _pangeaController.matrixState.client - .updateMyLearningAnalyticsForAllClassesImIn( - _pangeaController.pStoreService, - ); await getClassAndChatAnalytics(context); stateSub = _pangeaController.matrixState.client.onRoomState.stream .where( From b086aa49c1e111c934c364479332574a0aed4103 Mon Sep 17 00:00:00 2001 From: Gabby Gurdin Date: Wed, 27 Mar 2024 12:33:05 -0400 Subject: [PATCH 3/8] fixes for null checks --- lib/pangea/controllers/my_analytics_controller.dart | 3 ++- lib/pangea/models/construct_analytics_event.dart | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/pangea/controllers/my_analytics_controller.dart b/lib/pangea/controllers/my_analytics_controller.dart index deafd8f2a..4b7c8cc96 100644 --- a/lib/pangea/controllers/my_analytics_controller.dart +++ b/lib/pangea/controllers/my_analytics_controller.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:developer'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; +import 'package:fluffychat/pangea/enum/construct_type_enum.dart'; import 'package:fluffychat/pangea/models/student_analytics_summary_model.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:flutter/foundation.dart'; @@ -96,7 +97,7 @@ class MyAnalyticsController { saveFutures.add( analyticsRoom.saveConstructUsesSameLemma( uses.key, - uses.value.first.constructType!, + uses.value.first.constructType ?? ConstructType.grammar, uses.value, isEdit: isEdit, ), diff --git a/lib/pangea/models/construct_analytics_event.dart b/lib/pangea/models/construct_analytics_event.dart index a97950cdd..176d84bbd 100644 --- a/lib/pangea/models/construct_analytics_event.dart +++ b/lib/pangea/models/construct_analytics_event.dart @@ -36,6 +36,7 @@ class ConstructEvent { Client client, ) async { _contentCache ??= ConstructUses.fromJson(event.content); + if (_contentCache == null || _event.stateKey == null) return; final previousLength = _contentCache!.uses.length; _contentCache!.uses.removeWhere( (element) => removeIds.contains(element.msgId), From 63f6dcc32df097add35cea9f481ea1a3fe5ae553 Mon Sep 17 00:00:00 2001 From: Gabby Gurdin Date: Thu, 11 Apr 2024 13:01:22 -0400 Subject: [PATCH 4/8] added push rule to prevent notifications for text-to-speech events --- lib/pages/chat_list/chat_list.dart | 1 + lib/pangea/constants/pangea_event_types.dart | 1 + lib/pangea/controllers/pangea_controller.dart | 32 +++++++++++++++++++ lib/widgets/matrix.dart | 7 +++- 4 files changed, 40 insertions(+), 1 deletion(-) diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index 7dd0a735e..15b29ecee 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -770,6 +770,7 @@ class ChatListController extends State await pangeaController.subscriptionController.initialize(); pangeaController.afterSyncAndFirstLoginInitialization(context); await pangeaController.inviteBotToExistingSpaces(); + await pangeaController.setPangeaPushRules(); } else { ErrorHandler.logError( m: "didn't run afterSyncAndFirstLoginInitialization because not mounted", diff --git a/lib/pangea/constants/pangea_event_types.dart b/lib/pangea/constants/pangea_event_types.dart index abd155460..6494843c9 100644 --- a/lib/pangea/constants/pangea_event_types.dart +++ b/lib/pangea/constants/pangea_event_types.dart @@ -18,4 +18,5 @@ class PangeaEventTypes { static const botOptions = "pangea.bot_options"; static const userAge = "pangea.user_age"; + static const textToSpeechRule = "p.rule.text_to_speech"; } diff --git a/lib/pangea/controllers/pangea_controller.dart b/lib/pangea/controllers/pangea_controller.dart index 86946f314..a258d107a 100644 --- a/lib/pangea/controllers/pangea_controller.dart +++ b/lib/pangea/controllers/pangea_controller.dart @@ -2,6 +2,7 @@ import 'dart:developer'; import 'dart:math'; import 'package:fluffychat/pangea/constants/class_default_values.dart'; +import 'package:fluffychat/pangea/constants/pangea_event_types.dart'; import 'package:fluffychat/pangea/controllers/class_controller.dart'; import 'package:fluffychat/pangea/controllers/contextual_definition_controller.dart'; import 'package:fluffychat/pangea/controllers/language_controller.dart'; @@ -243,4 +244,35 @@ class PangeaController { } } } + + Future setPangeaPushRules() async { + if (!(matrixState.client.globalPushRules?.override?.any( + (element) => element.ruleId == PangeaEventTypes.textToSpeechRule, + ) ?? + false)) { + await matrixState.client.setPushRule( + 'global', + PushRuleKind.override, + PangeaEventTypes.textToSpeechRule, + [PushRuleAction.dontNotify], + conditions: [ + PushCondition( + kind: 'event_match', + key: 'content.msgtype', + pattern: MessageTypes.Audio, + ), + PushCondition( + kind: 'event_match', + key: 'content.transcription.lang_code', + pattern: '*', + ), + PushCondition( + kind: 'event_match', + key: 'content.transcription.text', + pattern: '*', + ), + ], + ); + } + } } diff --git a/lib/widgets/matrix.dart b/lib/widgets/matrix.dart index e6d47e13b..665528b49 100644 --- a/lib/widgets/matrix.dart +++ b/lib/widgets/matrix.dart @@ -4,6 +4,7 @@ import 'dart:convert'; import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:collection/collection.dart'; import 'package:desktop_notifications/desktop_notifications.dart'; +import 'package:fluffychat/pangea/constants/model_keys.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/utils/any_state_holder.dart'; import 'package:fluffychat/utils/client_manager.dart'; @@ -372,7 +373,11 @@ class MatrixState extends State with WidgetsBindingObserver { e.type == EventUpdateType.timeline && [EventTypes.Message, EventTypes.Sticker, EventTypes.Encrypted] .contains(e.content['type']) && - e.content['sender'] != c.userID, + e.content['sender'] != c.userID + // #Pangea + && + !e.content['content']?.containsKey(ModelKey.transcription), + // Pangea#, ) .listen(showLocalNotification); }); From 1d507226f326caf14cacb99725202cf012e1f17c Mon Sep 17 00:00:00 2001 From: Gabby Gurdin Date: Thu, 18 Apr 2024 14:30:04 -0400 Subject: [PATCH 5/8] don't change add to space toggle value if error when trying to add --- lib/pangea/controllers/pangea_controller.dart | 1 + lib/pangea/widgets/class/add_space_toggles.dart | 8 ++++++++ lib/widgets/matrix.dart | 10 ++++++++-- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/pangea/controllers/pangea_controller.dart b/lib/pangea/controllers/pangea_controller.dart index a258d107a..7f463713d 100644 --- a/lib/pangea/controllers/pangea_controller.dart +++ b/lib/pangea/controllers/pangea_controller.dart @@ -232,6 +232,7 @@ class PangeaController { if (space.canInvite && !userIds.contains(BotName.byEnvironment)) { try { await space.invite(BotName.byEnvironment); + await space.postLoad(); await space.setPower( BotName.byEnvironment, ClassDefaultValues.powerLevelOfAdmin, diff --git a/lib/pangea/widgets/class/add_space_toggles.dart b/lib/pangea/widgets/class/add_space_toggles.dart index 9103bad16..307db42ef 100644 --- a/lib/pangea/widgets/class/add_space_toggles.dart +++ b/lib/pangea/widgets/class/add_space_toggles.dart @@ -2,6 +2,7 @@ import 'package:collection/collection.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:future_loading_dialog/future_loading_dialog.dart'; @@ -134,6 +135,13 @@ class AddToSpaceState extends State { future: () => add ? _addSingleSpace(room!.id, possibleParent) : possibleParent.removeSpaceChild(room!.id), + onError: (e) { + // if error occurs, do not change value of toggle + add = !add; + return (e as Object?)?.toLocalizedString(context) ?? + e?.toString() ?? + L10n.of(context)!.oopsSomethingWentWrong; + }, ); } diff --git a/lib/widgets/matrix.dart b/lib/widgets/matrix.dart index 665528b49..afe470a7e 100644 --- a/lib/widgets/matrix.dart +++ b/lib/widgets/matrix.dart @@ -268,8 +268,14 @@ class MatrixState extends State with WidgetsBindingObserver { WidgetsBinding.instance.addPostFrameCallback((_) { LoadingDialog.defaultTitle = L10n.of(context)!.loadingPleaseWait; LoadingDialog.defaultBackLabel = L10n.of(context)!.close; - LoadingDialog.defaultOnError = - (e) => (e as Object?)!.toLocalizedString(context); + // #Pangea + // LoadingDialog.defaultOnError = + // (e) => (e as Object?)!.toLocalizedString(context); + LoadingDialog.defaultOnError = (e) => + (e as Object?)?.toLocalizedString(context) ?? + e?.toString() ?? + L10n.of(context)!.oopsSomethingWentWrong; + // Pangea# }); } From 614f83ad29c606e48a29549cf03d0d54a34ffabd Mon Sep 17 00:00:00 2001 From: Gabby Gurdin Date: Thu, 18 Apr 2024 15:18:35 -0400 Subject: [PATCH 6/8] cache pangea reps so direct translation is not called multiple times, don't translate names of audio message files --- .../controllers/message_data_controller.dart | 45 ++++++++++++++++++- .../utils/get_chat_list_item_subtitle.dart | 1 + 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/lib/pangea/controllers/message_data_controller.dart b/lib/pangea/controllers/message_data_controller.dart index b0759b108..e22791969 100644 --- a/lib/pangea/controllers/message_data_controller.dart +++ b/lib/pangea/controllers/message_data_controller.dart @@ -18,8 +18,7 @@ class MessageDataController extends BaseController { late PangeaController _pangeaController; final List _cache = []; - - final Map _messageDataToSave = {}; + final List _representationCache = []; MessageDataController(PangeaController pangeaController) { _pangeaController = pangeaController; @@ -31,6 +30,14 @@ class MessageDataController extends BaseController { e.parentId == parentId && e.type == type && e.langCode == langCode, ); + RepresentationCacheItem? getRepresentationCacheItem( + String parentId, + String langCode, + ) => + _representationCache.firstWhereOrNull( + (e) => e.parentId == parentId && e.langCode == langCode, + ); + Future _getTokens( TokensRequestModel req, ) async { @@ -141,6 +148,32 @@ class MessageDataController extends BaseController { required String? source, required String target, required Room room, + }) async { + final RepresentationCacheItem? item = + getRepresentationCacheItem(text, target); + if (item != null) return item.data; + + _representationCache.add( + RepresentationCacheItem( + text, + target, + _getPangeaRepresentation( + text: text, + source: source, + target: target, + room: room, + ), + ), + ); + + return _representationCache.last.data; + } + + Future _getPangeaRepresentation({ + required String text, + required String? source, + required String target, + required Room room, }) async { final req = FullTextTranslationRequestModel( text: text, @@ -235,3 +268,11 @@ class CacheItem { CacheItem(this.parentId, this.type, this.langCode, this.data); } + +class RepresentationCacheItem { + String parentId; + String langCode; + Future data; + + RepresentationCacheItem(this.parentId, this.langCode, this.data); +} diff --git a/lib/pangea/utils/get_chat_list_item_subtitle.dart b/lib/pangea/utils/get_chat_list_item_subtitle.dart index cddf31435..e5b1388a9 100644 --- a/lib/pangea/utils/get_chat_list_item_subtitle.dart +++ b/lib/pangea/utils/get_chat_list_item_subtitle.dart @@ -43,6 +43,7 @@ class GetChatListItemSubtitle { } if (event.type != EventTypes.Message || + event.messageType != MessageTypes.Text || !pangeaController.permissionsController .isToolEnabled(ToolSetting.immersionMode, event.room)) { return event.calcLocalizedBody( From 40fbdb2ec751448e3b2f36cecb04f331ff537068 Mon Sep 17 00:00:00 2001 From: Gabby Gurdin Date: Fri, 19 Apr 2024 10:48:33 -0400 Subject: [PATCH 7/8] fix for audio messages not starting from beginning, switched record package to version fluffychat uses --- lib/pages/chat/events/audio_player.dart | 54 ++++++++++++++++++++- lib/pages/chat/recording_dialog.dart | 28 ++--------- lib/pangea/models/pangea_message_event.dart | 3 +- pubspec.yaml | 10 +--- 4 files changed, 59 insertions(+), 36 deletions(-) diff --git a/lib/pages/chat/events/audio_player.dart b/lib/pages/chat/events/audio_player.dart index 56b005d4b..8ca40cb47 100644 --- a/lib/pages/chat/events/audio_player.dart +++ b/lib/pages/chat/events/audio_player.dart @@ -31,9 +31,9 @@ class AudioPlayerWidget extends StatefulWidget { this.color = Colors.black, // #Pangea this.matrixFile, - super.key, this.autoplay = false, // Pangea# + super.key, }); @override @@ -236,6 +236,27 @@ class AudioPlayerState extends State { late final List waveform; + void _toggleSpeed() async { + final audioPlayer = this.audioPlayer; + if (audioPlayer == null) return; + switch (audioPlayer.speed) { + case 1.0: + await audioPlayer.setSpeed(1.5); + break; + case 1.5: + await audioPlayer.setSpeed(2.0); + break; + case 2.0: + await audioPlayer.setSpeed(0.5); + break; + case 0.5: + default: + await audioPlayer.setSpeed(1.0); + break; + } + setState(() {}); + } + // #Pangea Future _downloadMatrixFile() async { if (kIsWeb) return; @@ -272,12 +293,12 @@ class AudioPlayerState extends State { @override Widget build(BuildContext context) { final statusText = this.statusText ??= _durationString ?? '00:00'; + final audioPlayer = this.audioPlayer; return Padding( padding: const EdgeInsets.all(16), child: Row( mainAxisSize: MainAxisSize.min, children: [ - const SizedBox(width: 4), SizedBox( width: buttonSize, height: buttonSize, @@ -354,6 +375,35 @@ class AudioPlayerState extends State { ), ), ), + const SizedBox(width: 4), + Stack( + children: [ + SizedBox( + width: buttonSize, + height: buttonSize, + child: InkWell( + splashColor: widget.color.withAlpha(128), + borderRadius: BorderRadius.circular(64), + onTap: audioPlayer == null ? null : _toggleSpeed, + child: Icon(Icons.mic_none_outlined, color: widget.color), + ), + ), + if (audioPlayer != null) + Positioned( + bottom: 0, + left: 0, + right: 0, + child: Text( + '${audioPlayer.speed.toString()}x', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 9.0, + color: widget.color, + ), + ), + ), + ], + ), ], ), ); diff --git a/lib/pages/chat/recording_dialog.dart b/lib/pages/chat/recording_dialog.dart index a0ba712d3..2fdc1e07b 100644 --- a/lib/pages/chat/recording_dialog.dart +++ b/lib/pages/chat/recording_dialog.dart @@ -27,10 +27,7 @@ class RecordingDialogState extends State { bool error = false; String? _recordedPath; - // #Pangea - // final _audioRecorder = Record(); - final _audioRecorder = AudioRecorder(); - // Pangea# + final _audioRecorder = Record(); final List amplitudeTimeline = []; static const int bitRate = 64000; @@ -48,28 +45,11 @@ class RecordingDialogState extends State { return; } await WakelockPlus.enable(); - - // We try to pick Opus where supported, since that is a codec optimized - // for speech as well as what the voice messages MSC uses. - final audioCodec = - (await _audioRecorder.isEncoderSupported(AudioEncoder.opus)) - ? AudioEncoder.opus - : AudioEncoder.aacLc; - // #Pangea - // await _audioRecorder.start( - // path: _recordedPath, - // bitRate: bitRate, - // samplingRate: samplingRate, - // ); await _audioRecorder.start( - RecordConfig( - encoder: audioCodec, - bitRate: bitRate, - // samplingRate: samplingRate, - ), - path: _recordedPath!, + path: _recordedPath, + bitRate: bitRate, + samplingRate: samplingRate, ); - // Pangea# setState(() => _duration = Duration.zero); _recorderSubscription?.cancel(); _recorderSubscription = diff --git a/lib/pangea/models/pangea_message_event.dart b/lib/pangea/models/pangea_message_event.dart index b8eb99a0a..fa6b0951c 100644 --- a/lib/pangea/models/pangea_message_event.dart +++ b/lib/pangea/models/pangea_message_event.dart @@ -2,7 +2,6 @@ import 'dart:convert'; import 'package:collection/collection.dart'; import 'package:fluffychat/pangea/constants/model_keys.dart'; -import 'package:fluffychat/pangea/constants/pangea_message_types.dart'; import 'package:fluffychat/pangea/controllers/text_to_speech_controller.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; import 'package:fluffychat/pangea/models/choreo_record.dart'; @@ -462,7 +461,7 @@ class PangeaMessageEvent { _event.room.isSpaceAdmin && _event.senderId != BotName.byEnvironment && !room.isUserSpaceAdmin(_event.senderId) && - _event.messageType != PangeaMessageTypes.report; + _event.messageType == MessageTypes.Text; String get messageDisplayLangCode { final bool immersionMode = MatrixState diff --git a/pubspec.yaml b/pubspec.yaml index 4c9fde2ea..42565d1d3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -63,10 +63,7 @@ dependencies: http: ^0.13.6 image_picker: ^1.0.0 intl: any - # #Pangea - # just_audio: ^0.9.0 - just_audio: ^0.9.36 - # Pangea# + just_audio: ^0.9.37 keyboard_shortcuts: ^0.1.4 latlong2: ^0.8.1 linkify: ^5.0.0 @@ -85,10 +82,7 @@ dependencies: qr_code_scanner: ^1.0.0 qr_flutter: ^4.0.0 receive_sharing_intent: ^1.4.5 - # #Pangea - # record: 4.4.4 # Upgrade to 5 currently breaks playing on iOS - record: ^5.0.4 - # Pangea# + record: 4.4.4 # Upgrade to 5 currently breaks playing on iOS scroll_to_index: ^3.0.1 share_plus: ^7.2.1 shared_preferences: ^2.2.0 # Pinned because https://github.com/flutter/flutter/issues/118401 From abb59d16ed8ff492b59c6fef49d6cd47a9c5f6bb Mon Sep 17 00:00:00 2001 From: Gabby Gurdin Date: Fri, 19 Apr 2024 12:16:41 -0400 Subject: [PATCH 8/8] Change description in link preview --- web/index.html | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/web/index.html b/web/index.html index 4e6f28e70..a4447d488 100644 --- a/web/index.html +++ b/web/index.html @@ -19,7 +19,10 @@ - + + + +