@@ -460,6 +460,19 @@ impl<'a, P: RoomDataProvider> TimelineStateTransaction<'a, P> {
460460 }
461461 }
462462
463+ /// Whether this event can show read receipts, or if they should be moved
464+ /// to the previous event.
465+ fn can_show_read_receipts (
466+ & self ,
467+ settings : & TimelineSettings ,
468+ event : & AnySyncTimelineEvent ,
469+ ) -> bool {
470+ match event {
471+ AnySyncTimelineEvent :: State ( _) => settings. state_events_can_show_read_receipts ,
472+ AnySyncTimelineEvent :: MessageLike ( _) => true ,
473+ }
474+ }
475+
463476 /// After a deserialization error, adds a failed-to-parse item to the
464477 /// timeline if configured to do so, or logs the error (and optionally
465478 /// save metadata) if not.
@@ -478,6 +491,7 @@ impl<'a, P: RoomDataProvider> TimelineStateTransaction<'a, P> {
478491 Option < TimelineAction > ,
479492 Option < OwnedEventId > ,
480493 bool ,
494+ bool ,
481495 ) > {
482496 let state_key: Option < String > = raw. get_field ( "state_key" ) . ok ( ) . flatten ( ) ;
483497
@@ -537,6 +551,7 @@ impl<'a, P: RoomDataProvider> TimelineStateTransaction<'a, P> {
537551 Some ( TimelineAction :: failed_to_parse ( event_type, deserialization_error) ) ,
538552 None ,
539553 true ,
554+ true ,
540555 ) )
541556 }
542557
@@ -552,7 +567,7 @@ impl<'a, P: RoomDataProvider> TimelineStateTransaction<'a, P> {
552567 // Remember the event before returning prematurely.
553568 // See [`ObservableItems::all_remote_events`].
554569 self . add_or_update_remote_event (
555- EventMeta :: new ( event_id, false , None ) ,
570+ EventMeta :: new ( event_id, false , false , None ) ,
556571 sender. as_deref ( ) ,
557572 origin_server_ts,
558573 position,
@@ -630,65 +645,74 @@ impl<'a, P: RoomDataProvider> TimelineStateTransaction<'a, P> {
630645 _ => ( event. kind . into_raw ( ) , None ) ,
631646 } ;
632647
633- let ( event_id, sender, timestamp, txn_id, timeline_action, thread_root, should_add) =
634- match raw. deserialize ( ) {
635- // Classical path: the event is valid, can be deserialized, everything is alright.
636- Ok ( event) => {
637- let ( in_reply_to, thread_root) = self . meta . process_event_relations (
638- & event,
639- & raw ,
640- bundled_edit_encryption_info,
641- & self . items ,
642- self . focus . is_thread ( ) ,
643- ) ;
648+ let (
649+ event_id,
650+ sender,
651+ timestamp,
652+ txn_id,
653+ timeline_action,
654+ thread_root,
655+ should_add,
656+ can_show_read_receipts,
657+ ) = match raw. deserialize ( ) {
658+ // Classical path: the event is valid, can be deserialized, everything is alright.
659+ Ok ( event) => {
660+ let ( in_reply_to, thread_root) = self . meta . process_event_relations (
661+ & event,
662+ & raw ,
663+ bundled_edit_encryption_info,
664+ & self . items ,
665+ self . focus . is_thread ( ) ,
666+ ) ;
644667
645- let should_add = self . should_add_event_item (
668+ let should_add = self . should_add_event_item (
669+ room_data_provider,
670+ settings,
671+ & event,
672+ thread_root. as_deref ( ) ,
673+ position,
674+ ) ;
675+
676+ let can_show_read_receipts = self . can_show_read_receipts ( settings, & event) ;
677+
678+ (
679+ event. event_id ( ) . to_owned ( ) ,
680+ event. sender ( ) . to_owned ( ) ,
681+ event. origin_server_ts ( ) ,
682+ event. transaction_id ( ) . map ( ToOwned :: to_owned) ,
683+ TimelineAction :: from_event (
684+ event,
685+ & raw ,
646686 room_data_provider,
647- settings,
648- & event,
649- thread_root. as_deref ( ) ,
650- position,
651- ) ;
652-
653- (
654- event. event_id ( ) . to_owned ( ) ,
655- event. sender ( ) . to_owned ( ) ,
656- event. origin_server_ts ( ) ,
657- event. transaction_id ( ) . map ( ToOwned :: to_owned) ,
658- TimelineAction :: from_event (
659- event,
660- & raw ,
661- room_data_provider,
662- utd_info. map ( |utd_info| {
663- ( utd_info, self . meta . unable_to_decrypt_hook . as_ref ( ) )
664- } ) ,
665- in_reply_to,
666- thread_root. clone ( ) ,
667- thread_summary,
668- )
669- . await ,
670- thread_root,
671- should_add,
687+ utd_info
688+ . map ( |utd_info| ( utd_info, self . meta . unable_to_decrypt_hook . as_ref ( ) ) ) ,
689+ in_reply_to,
690+ thread_root. clone ( ) ,
691+ thread_summary,
672692 )
673- }
693+ . await ,
694+ thread_root,
695+ should_add,
696+ can_show_read_receipts,
697+ )
698+ }
674699
675- // The event seems invalid…
676- Err ( e) => {
677- if let Some ( tuple) = self
678- . maybe_add_error_item ( position, room_data_provider, & raw , e, settings)
679- . await
680- {
681- tuple
682- } else {
683- return false ;
684- }
700+ // The event seems invalid…
701+ Err ( e) => {
702+ if let Some ( tuple) =
703+ self . maybe_add_error_item ( position, room_data_provider, & raw , e, settings) . await
704+ {
705+ tuple
706+ } else {
707+ return false ;
685708 }
686- } ;
709+ }
710+ } ;
687711
688712 // Remember the event.
689713 // See [`ObservableItems::all_remote_events`].
690714 self . add_or_update_remote_event (
691- EventMeta :: new ( event_id. clone ( ) , should_add, thread_root) ,
715+ EventMeta :: new ( event_id. clone ( ) , should_add, can_show_read_receipts , thread_root) ,
692716 Some ( & sender) ,
693717 Some ( timestamp) ,
694718 position,
@@ -711,7 +735,10 @@ impl<'a, P: RoomDataProvider> TimelineStateTransaction<'a, P> {
711735 sender,
712736 sender_profile,
713737 timestamp,
714- read_receipts : if settings. track_read_receipts && should_add {
738+ read_receipts : if settings. track_read_receipts
739+ && should_add
740+ && can_show_read_receipts
741+ {
715742 self . meta . read_receipts . compute_event_receipts (
716743 & event_id,
717744 & mut self . items ,
@@ -887,9 +914,11 @@ impl<'a, P: RoomDataProvider> TimelineStateTransaction<'a, P> {
887914 TimelineItemPosition :: UpdateAt { .. } => {
888915 if let Some ( event) =
889916 self . items . get_remote_event_by_event_id_mut ( & event_meta. event_id )
890- && event. visible != event_meta. visible
917+ && ( event. visible != event_meta. visible
918+ || event. can_show_read_receipts != event_meta. can_show_read_receipts )
891919 {
892920 event. visible = event_meta. visible ;
921+ event. can_show_read_receipts = event_meta. can_show_read_receipts ;
893922
894923 if settings. track_read_receipts {
895924 // Since the event's visibility changed, we need to update the read
0 commit comments