diff --git a/crates/matrix-sdk/src/room/timeline/inner.rs b/crates/matrix-sdk/src/room/timeline/inner.rs index 386784330..02a069d00 100644 --- a/crates/matrix-sdk/src/room/timeline/inner.rs +++ b/crates/matrix-sdk/src/room/timeline/inner.rs @@ -3,7 +3,7 @@ use std::{ sync::Arc, }; -use futures_signals::signal_vec::{MutableVec, MutableVecLockMut}; +use futures_signals::signal_vec::{MutableVec, MutableVecLockMut, MutableVecLockRef, SignalVec}; use matrix_sdk_base::{ crypto::OlmMachine, deserialized_responses::{EncryptionInfo, SyncTimelineEvent, TimelineEvent}, @@ -33,8 +33,8 @@ use crate::events::SyncTimelineEventWithoutContent; #[derive(Debug, Default)] pub(super) struct TimelineInner { - pub(super) items: MutableVec>, - pub(super) metadata: Mutex, + items: MutableVec>, + metadata: Mutex, } /// Non-signalling parts of `TimelineInner`. @@ -47,6 +47,14 @@ pub(super) struct TimelineInnerMetadata { } impl TimelineInner { + pub(super) fn items(&self) -> MutableVecLockRef<'_, Arc> { + self.items.lock_ref() + } + + pub(super) fn items_signal(&self) -> impl SignalVec> { + self.items.signal_vec_cloned() + } + pub(super) fn add_initial_events( &mut self, events: Vec, diff --git a/crates/matrix-sdk/src/room/timeline/mod.rs b/crates/matrix-sdk/src/room/timeline/mod.rs index af7211941..4aa5a1d83 100644 --- a/crates/matrix-sdk/src/room/timeline/mod.rs +++ b/crates/matrix-sdk/src/room/timeline/mod.rs @@ -178,7 +178,7 @@ impl Timeline { pub async fn paginate_backwards(&self, mut opts: PaginationOptions<'_>) -> Result<()> { let mut start_lock = self.start_token.lock().await; if start_lock.is_none() - && self.inner.items.lock_ref().first().map_or(false, |item| item.is_timeline_start()) + && self.inner.items().first().map_or(false, |item| item.is_timeline_start()) { warn!("Start of timeline reached, ignoring backwards-pagination request"); return Ok(()); @@ -282,7 +282,7 @@ impl Timeline { /// Get the latest of the timeline's event items. pub fn latest_event(&self) -> Option { - self.inner.items.lock_ref().last()?.as_event().cloned() + self.inner.items().last()?.as_event().cloned() } /// Get a signal of the timeline's items. @@ -293,7 +293,7 @@ impl Timeline { /// See [`SignalVecExt`](futures_signals::signal_vec::SignalVecExt) for a /// high-level API on top of [`SignalVec`]. pub fn signal(&self) -> impl SignalVec> { - self.inner.items.signal_vec_cloned() + self.inner.items_signal() } /// Get a stream of timeline changes. diff --git a/crates/matrix-sdk/src/room/timeline/tests.rs b/crates/matrix-sdk/src/room/timeline/tests.rs index e6c8e56a9..e1801d158 100644 --- a/crates/matrix-sdk/src/room/timeline/tests.rs +++ b/crates/matrix-sdk/src/room/timeline/tests.rs @@ -110,7 +110,7 @@ async fn invalid_edit() { // Can't easily test the non-arrival of an item using the stream. Instead // just assert that there is still just a couple items in the timeline. - assert_eq!(timeline.inner.items.lock_ref().len(), 2); + assert_eq!(timeline.inner.items().len(), 2); } #[async_test] @@ -151,7 +151,7 @@ async fn edit_redacted() { }); timeline.handle_live_message_event(&ALICE, edit).await; - assert_eq!(timeline.inner.items.lock_ref().len(), 2); + assert_eq!(timeline.inner.items().len(), 2); } #[cfg(not(target_arch = "wasm32"))] @@ -204,7 +204,7 @@ async fn unable_to_decrypt() { ) .await; - assert_eq!(timeline.inner.items.lock_ref().len(), 2); + assert_eq!(timeline.inner.items().len(), 2); let _day_divider = assert_matches!(stream.next().await, Some(VecDiff::Push { value }) => value); let item = assert_matches!(stream.next().await, Some(VecDiff::Push { value }) => value); @@ -233,7 +233,7 @@ async fn unable_to_decrypt() { ) .await; - assert_eq!(timeline.inner.items.lock_ref().len(), 2); + assert_eq!(timeline.inner.items().len(), 2); let item = assert_matches!(stream.next().await, Some(VecDiff::UpdateAt { index: 1, value }) => value); @@ -361,7 +361,7 @@ async fn invalid_event() { "type": "m.room.message", })) .await; - assert_eq!(timeline.inner.items.lock_ref().len(), 0); + assert_eq!(timeline.inner.items().len(), 0); } #[async_test] @@ -568,7 +568,7 @@ impl TestTimeline { } fn stream(&self) -> impl Stream>> { - self.inner.items.signal_vec_cloned().to_stream() + self.inner.items_signal().to_stream() } async fn handle_live_message_event(&self, sender: &UserId, content: C)