Skip to content

Commit 7b77b19

Browse files
committed
refactor(timeline): get rid of the optional in is_room_encrypted field
The `EventTimelineItem` would get from a bool to an `Option<bool>`. If the metadata's `is_room_encrypted` was set to `None`, then it would use `false` as the value, before wrapping it again into an `Option`. Since the only reader of `EventTimelineItem::is_room_encrypted()` doesn't really care about the difference between `Some(false)` and `None`, in `EventTimelineItem::get_shield()`, we can use a plain `bool` instead of an `Option`, and not distinguish `Some(false)` from `None`. At worst, it means that sometimes we don't know the room encryption status yet, and consider the room unencrypted; as soon as we'll get an update about encryption state, all the items will be marked as encrypted anyways, if needs be.
1 parent 357b36b commit 7b77b19

File tree

9 files changed

+31
-27
lines changed

9 files changed

+31
-27
lines changed

crates/matrix-sdk-ui/src/timeline/builder.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ impl TimelineBuilder {
163163
let (_, mut event_subscriber) = room_event_cache.subscribe().await?;
164164

165165
let is_pinned_events = matches!(focus, TimelineFocus::PinnedEvents { .. });
166-
let is_room_encrypted = room.is_encrypted().await.ok();
166+
let is_room_encrypted = room.is_encrypted().await.ok().unwrap_or_default();
167167

168168
let controller = TimelineController::new(
169169
room,

crates/matrix-sdk-ui/src/timeline/controller/metadata.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,9 @@ pub(in crate::timeline) struct TimelineMetadata {
4848

4949
/// A boolean indicating whether the room the timeline is attached to is
5050
/// actually encrypted or not.
51-
pub is_room_encrypted: Option<bool>,
51+
///
52+
/// May be false until we fetch the actual room encryption state.
53+
pub is_room_encrypted: bool,
5254

5355
/// Matrix room version of the timeline's room, or a sensible default.
5456
///
@@ -104,7 +106,7 @@ impl TimelineMetadata {
104106
room_version: RoomVersionId,
105107
internal_id_prefix: Option<String>,
106108
unable_to_decrypt_hook: Option<Arc<UtdHookManager>>,
107-
is_room_encrypted: Option<bool>,
109+
is_room_encrypted: bool,
108110
) -> Self {
109111
Self {
110112
subscriber_skip_count: SkipCount::new(),

crates/matrix-sdk-ui/src/timeline/controller/mod.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ impl<P: RoomDataProvider> TimelineController<P> {
262262
focus: TimelineFocus,
263263
internal_id_prefix: Option<String>,
264264
unable_to_decrypt_hook: Option<Arc<UtdHookManager>>,
265-
is_room_encrypted: Option<bool>,
265+
is_room_encrypted: bool,
266266
) -> Self {
267267
let (focus_data, focus_kind) = match focus {
268268
TimelineFocus::Live => (TimelineFocusData::Live, TimelineFocusKind::Live),
@@ -378,17 +378,23 @@ impl<P: RoomDataProvider> TimelineController<P> {
378378
pub async fn handle_encryption_state_changes(&self) {
379379
let mut room_info = self.room_data_provider.room_info();
380380

381+
// Small function helper to help mark as encrypted.
382+
let mark_encrypted = || async {
383+
let mut state = self.state.write().await;
384+
state.meta.is_room_encrypted = true;
385+
state.mark_all_events_as_encrypted();
386+
};
387+
381388
if room_info.get().is_encrypted() {
382389
// If the room was already encrypted, it won't toggle to unencrypted, so we can
383390
// shut down this task early.
391+
mark_encrypted().await;
384392
return;
385393
}
386394

387395
while let Some(info) = room_info.next().await {
388396
if info.is_encrypted() {
389-
let mut state = self.state.write().await;
390-
state.meta.is_room_encrypted = Some(true);
391-
state.mark_all_events_as_encrypted();
397+
mark_encrypted().await;
392398
// Once the room is encrypted, it cannot switch back to unencrypted, so our work
393399
// here is done.
394400
break;

crates/matrix-sdk-ui/src/timeline/controller/state.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ impl TimelineState {
6464
room_version: RoomVersionId,
6565
internal_id_prefix: Option<String>,
6666
unable_to_decrypt_hook: Option<Arc<UtdHookManager>>,
67-
is_room_encrypted: Option<bool>,
67+
is_room_encrypted: bool,
6868
) -> Self {
6969
Self {
7070
items: ObservableItems::new(),

crates/matrix-sdk-ui/src/timeline/controller/state_transaction.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -575,8 +575,12 @@ impl<'a> TimelineStateTransaction<'a> {
575575
let item = &self.items[idx];
576576

577577
if let Some(event) = item.as_event() {
578+
if event.is_room_encrypted {
579+
continue;
580+
}
581+
578582
let mut cloned_event = event.clone();
579-
cloned_event.is_room_encrypted = Some(true);
583+
cloned_event.is_room_encrypted = true;
580584

581585
// Replace the existing item with a new version with the right encryption flag
582586
let item = item.with_kind(cloned_event);

crates/matrix-sdk-ui/src/timeline/date_dividers.rs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -672,13 +672,7 @@ mod tests {
672672
}
673673

674674
fn test_metadata() -> TimelineMetadata {
675-
TimelineMetadata::new(
676-
owned_user_id!("@a:b.c"),
677-
ruma::RoomVersionId::V11,
678-
None,
679-
None,
680-
Some(false),
681-
)
675+
TimelineMetadata::new(owned_user_id!("@a:b.c"), ruma::RoomVersionId::V11, None, None, false)
682676
}
683677

684678
#[test]

crates/matrix-sdk-ui/src/timeline/event_handler.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1021,7 +1021,7 @@ impl<'a, 'o> TimelineEventHandler<'a, 'o> {
10211021
}
10221022
};
10231023

1024-
let is_room_encrypted = self.meta.is_room_encrypted.unwrap_or_default();
1024+
let is_room_encrypted = self.meta.is_room_encrypted;
10251025

10261026
let mut item = EventTimelineItem::new(
10271027
sender,

crates/matrix-sdk-ui/src/timeline/event_item/mod.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,8 @@ pub struct EventTimelineItem {
7878
pub(super) kind: EventTimelineItemKind,
7979
/// Whether or not the event belongs to an encrypted room.
8080
///
81-
/// When `None` it is unknown if the room is encrypted and the item won't
82-
/// return a ShieldState.
83-
pub(super) is_room_encrypted: Option<bool>,
81+
/// May be false when we don't know about the room encryption status yet.
82+
pub(super) is_room_encrypted: bool,
8483
}
8584

8685
#[derive(Clone, Debug)]
@@ -120,7 +119,6 @@ impl EventTimelineItem {
120119
kind: EventTimelineItemKind,
121120
is_room_encrypted: bool,
122121
) -> Self {
123-
let is_room_encrypted = Some(is_room_encrypted);
124122
Self { sender, sender_profile, timestamp, content, kind, is_room_encrypted }
125123
}
126124

@@ -211,7 +209,7 @@ impl EventTimelineItem {
211209
TimelineDetails::Unavailable
212210
};
213211

214-
Some(Self { sender, sender_profile, timestamp, content, kind, is_room_encrypted: None })
212+
Some(Self { sender, sender_profile, timestamp, content, kind, is_room_encrypted: false })
215213
}
216214

217215
/// Check whether this item is a local echo.
@@ -398,7 +396,7 @@ impl EventTimelineItem {
398396
/// Gets the [`ShieldState`] which can be used to decorate messages in the
399397
/// recommended way.
400398
pub fn get_shield(&self, strict: bool) -> Option<ShieldState> {
401-
if self.is_room_encrypted != Some(true) || self.is_local_echo() {
399+
if !self.is_room_encrypted || self.is_local_echo() {
402400
return None;
403401
}
404402

crates/matrix-sdk-ui/src/timeline/tests/mod.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ impl TestTimeline {
104104
TimelineFocus::Live,
105105
Some(prefix),
106106
None,
107-
Some(false),
107+
false,
108108
),
109109
factory: EventFactory::new(),
110110
}
@@ -117,7 +117,7 @@ impl TestTimeline {
117117
TimelineFocus::Live,
118118
None,
119119
None,
120-
Some(false),
120+
false,
121121
),
122122
factory: EventFactory::new(),
123123
}
@@ -130,7 +130,7 @@ impl TestTimeline {
130130
TimelineFocus::Live,
131131
None,
132132
Some(hook),
133-
Some(true),
133+
true,
134134
),
135135
factory: EventFactory::new(),
136136
}
@@ -144,7 +144,7 @@ impl TestTimeline {
144144
TimelineFocus::Live,
145145
None,
146146
None,
147-
Some(encrypted),
147+
encrypted,
148148
),
149149
factory: EventFactory::new(),
150150
}

0 commit comments

Comments
 (0)