From 702895f09d4e6b7cbca2ced8cc776989e7e46724 Mon Sep 17 00:00:00 2001 From: Sorunome Date: Sat, 19 Dec 2020 12:34:13 +0100 Subject: [PATCH] fix: Respect hidden events when calculating read receipt message --- lib/components/list_items/state_message.dart | 5 --- lib/views/chat.dart | 37 +++++++++++++------- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/lib/components/list_items/state_message.dart b/lib/components/list_items/state_message.dart index b939a275..ade3ee02 100644 --- a/lib/components/list_items/state_message.dart +++ b/lib/components/list_items/state_message.dart @@ -3,17 +3,12 @@ import 'package:fluffychat/utils/matrix_locals.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import '../../app_config.dart'; - class StateMessage extends StatelessWidget { final Event event; const StateMessage(this.event); @override Widget build(BuildContext context) { - if (event.type == EventTypes.Redaction || AppConfig.hideAllStateEvents) { - return Container(); - } return Padding( padding: const EdgeInsets.only( left: 8.0, diff --git a/lib/views/chat.dart b/lib/views/chat.dart index 5aaba85e..ec835645 100644 --- a/lib/views/chat.dart +++ b/lib/views/chat.dart @@ -153,20 +153,28 @@ class _ChatState extends State<_Chat> { var seenByText = ''; if (timeline.events.isNotEmpty) { - var lastReceipts = List.from(timeline.events.first.receipts); - lastReceipts.removeWhere((r) => - r.user.id == room.client.userID || - r.user.id == timeline.events.first.senderId); + final filteredEvents = getFilteredEvents(); + final lastReceipts = {}; + // now we iterate the timeline events until we hit the first rendered event + for (final event in timeline.events) { + lastReceipts.addAll(event.receipts.map((r) => r.user)); + if (event.eventId == filteredEvents.first.eventId) { + break; + } + } + lastReceipts.removeWhere((user) => + user.id == room.client.userID || + user.id == filteredEvents.first.senderId); if (lastReceipts.length == 1) { - seenByText = L10n.of(context) - .seenByUser(lastReceipts.first.user.calcDisplayname()); + seenByText = + L10n.of(context).seenByUser(lastReceipts.first.calcDisplayname()); } else if (lastReceipts.length == 2) { seenByText = seenByText = L10n.of(context).seenByUserAndUser( - lastReceipts.first.user.calcDisplayname(), - lastReceipts[1].user.calcDisplayname()); + lastReceipts.first.calcDisplayname(), + lastReceipts.last.calcDisplayname()); } else if (lastReceipts.length > 2) { seenByText = L10n.of(context).seenByUserAndCountOthers( - lastReceipts.first.user.calcDisplayname(), + lastReceipts.first.calcDisplayname(), (lastReceipts.length - 1).toString()); } } @@ -437,12 +445,17 @@ class _ChatState extends State<_Chat> { .contains(e.relationshipType) && // always filter out m.key.* events !e.type.startsWith('m.key.verification.') && - // if a reaction has been redacted we also want it to appear in the timeline - e.type != EventTypes.Reaction && + // event types to hide: redaction and reaction events + // if a reaction has been redacted we also want it to be hidden in the timeline + !{EventTypes.Reaction, EventTypes.Redaction}.contains(e.type) && // if we enabled to hide all redacted events, don't show those (!AppConfig.hideRedactedEvents || !e.redacted) && // if we enabled to hide all unknown events, don't show those - (!AppConfig.hideUnknownEvents || e.isEventTypeKnown)) + (!AppConfig.hideUnknownEvents || e.isEventTypeKnown) && + // remove state events that we don't want to render + (!{EventTypes.Message, EventTypes.Sticker, EventTypes.Encrypted} + .contains(e.type) || + !AppConfig.hideAllStateEvents)) .toList(); // Hide state events from the room creater right after the room created event