diff --git a/bindings/matrix-sdk-ffi/src/room_list.rs b/bindings/matrix-sdk-ffi/src/room_list.rs index d87005715..5eae181a6 100644 --- a/bindings/matrix-sdk-ffi/src/room_list.rs +++ b/bindings/matrix-sdk-ffi/src/room_list.rs @@ -2,12 +2,9 @@ use std::{fmt::Debug, mem::MaybeUninit, ptr::addr_of_mut, sync::Arc, time::Durat use eyeball_im::VectorDiff; use futures_util::{pin_mut, StreamExt, TryFutureExt}; -use matrix_sdk::{ - ruma::{ - api::client::sync::sync_events::UnreadNotificationsCount as RumaUnreadNotificationsCount, - assign, RoomId, - }, - sliding_sync::http, +use matrix_sdk::ruma::{ + api::client::sync::sync_events::UnreadNotificationsCount as RumaUnreadNotificationsCount, + RoomId, }; use matrix_sdk_ui::{ room_list_service::filters::{ @@ -135,11 +132,7 @@ impl RoomListService { }))) } - fn subscribe_to_rooms( - &self, - room_ids: Vec, - settings: Option, - ) -> Result<(), RoomListError> { + fn subscribe_to_rooms(&self, room_ids: Vec) -> Result<(), RoomListError> { let room_ids = room_ids .into_iter() .map(|room_id| { @@ -147,10 +140,7 @@ impl RoomListService { }) .collect::, _>>()?; - self.inner.subscribe_to_rooms( - &room_ids.iter().map(AsRef::as_ref).collect::>(), - settings.map(Into::into), - ); + self.inner.subscribe_to_rooms(&room_ids.iter().map(AsRef::as_ref).collect::>()); Ok(()) } @@ -680,31 +670,6 @@ impl RoomListItem { } } -#[derive(uniffi::Record)] -pub struct RequiredState { - pub key: String, - pub value: String, -} - -#[derive(uniffi::Record)] -pub struct RoomSubscription { - pub required_state: Option>, - pub timeline_limit: u32, - pub include_heroes: Option, -} - -impl From for http::request::RoomSubscription { - fn from(val: RoomSubscription) -> Self { - assign!(http::request::RoomSubscription::default(), { - required_state: val.required_state.map(|r| - r.into_iter().map(|s| (s.key.into(), s.value)).collect() - ).unwrap_or_default(), - timeline_limit: val.timeline_limit.into(), - include_heroes: val.include_heroes, - }) - } -} - #[derive(uniffi::Object)] pub struct UnreadNotificationsCount { highlight_count: u32, diff --git a/crates/matrix-sdk-ui/src/room_list_service/mod.rs b/crates/matrix-sdk-ui/src/room_list_service/mod.rs index 08237d6bd..327e51475 100644 --- a/crates/matrix-sdk-ui/src/room_list_service/mod.rs +++ b/crates/matrix-sdk-ui/src/room_list_service/mod.rs @@ -57,7 +57,7 @@ mod room_list; pub mod sorters; mod state; -use std::{sync::Arc, time::Duration}; +use std::{iter::once, sync::Arc, time::Duration}; use async_stream::stream; use eyeball::Subscriber; @@ -69,7 +69,7 @@ use matrix_sdk::{ use matrix_sdk_base::sliding_sync::http; pub use room::*; pub use room_list::*; -use ruma::{assign, directory::RoomTypeFilter, events::StateEventType, OwnedRoomId, RoomId}; +use ruma::{assign, directory::RoomTypeFilter, events::StateEventType, OwnedRoomId, RoomId, UInt}; pub use state::*; use thiserror::Error; use tokio::time::timeout; @@ -77,6 +77,22 @@ use tracing::debug; use crate::timeline; +/// The default `required_state` constant value for sliding sync lists and +/// sliding sync room subscriptions. +const DEFAULT_REQUIRED_STATE: &[(StateEventType, &str)] = &[ + (StateEventType::RoomName, ""), + (StateEventType::RoomEncryption, ""), + (StateEventType::RoomMember, "$LAZY"), + (StateEventType::RoomMember, "$ME"), + (StateEventType::RoomTopic, ""), + (StateEventType::RoomCanonicalAlias, ""), + (StateEventType::RoomPowerLevels, ""), + (StateEventType::CallMember, ""), +]; + +/// The default `timeline_limit` value when used with room subscriptions. +const DEFAULT_ROOM_SUBSCRIPTION_TIMELINE_LIMIT: u32 = 20; + /// The [`RoomListService`] type. See the module's documentation to learn more. #[derive(Debug)] pub struct RoomListService { @@ -145,17 +161,12 @@ impl RoomListService { .add_range(ALL_ROOMS_DEFAULT_SELECTIVE_RANGE), ) .timeline_limit(1) - .required_state(vec![ - (StateEventType::RoomName, "".to_owned()), - (StateEventType::RoomEncryption, "".to_owned()), - (StateEventType::RoomMember, "$LAZY".to_owned()), - (StateEventType::RoomMember, "$ME".to_owned()), - (StateEventType::RoomTopic, "".to_owned()), - (StateEventType::RoomCanonicalAlias, "".to_owned()), - (StateEventType::RoomPowerLevels, "".to_owned()), - (StateEventType::RoomPinnedEvents, "".to_owned()), - (StateEventType::CallMember, "".to_owned()), - ]) + .required_state( + DEFAULT_REQUIRED_STATE + .iter() + .map(|(state_event, value)| (state_event.clone(), (*value).to_owned())) + .collect(), + ) .include_heroes(Some(true)) .filters(Some(assign!(http::request::ListFilters::default(), { // As defined in the [SlidingSync MSC](https://github.com/matrix-org/matrix-spec-proposals/blob/9450ced7fb9cf5ea9077d029b3adf36aebfa8709/proposals/3575-sync.md?plain=1#L444) @@ -382,22 +393,16 @@ impl RoomListService { /// /// It means that all events from these rooms will be received every time, /// no matter how the `RoomList` is configured. - pub fn subscribe_to_rooms( - &self, - room_ids: &[&RoomId], - settings: Option, - ) { - let mut settings = settings.unwrap_or_default(); - - // Make sure to always include the room creation event in the required state - // events, to know what the room version is. - if !settings - .required_state - .iter() - .any(|(event_type, _state_key)| *event_type == StateEventType::RoomCreate) - { - settings.required_state.push((StateEventType::RoomCreate, "".to_owned())); - } + pub fn subscribe_to_rooms(&self, room_ids: &[&RoomId]) { + let settings = assign!(http::request::RoomSubscription::default(), { + required_state: DEFAULT_REQUIRED_STATE.iter().map(|(state_event, value)| { + (state_event.clone(), (*value).to_owned()) + }) + .chain(once((StateEventType::RoomCreate, "".to_owned()))) + .chain(once((StateEventType::RoomPinnedEvents, "".to_owned()))) + .collect(), + timeline_limit: UInt::from(DEFAULT_ROOM_SUBSCRIPTION_TIMELINE_LIMIT), + }); let cancel_in_flight_request = match self.state_machine.get() { State::Init | State::Recovering | State::Error { .. } | State::Terminated { .. } => { diff --git a/crates/matrix-sdk-ui/tests/integration/room_list_service.rs b/crates/matrix-sdk-ui/tests/integration/room_list_service.rs index efde3a3bf..3fd0c52f9 100644 --- a/crates/matrix-sdk-ui/tests/integration/room_list_service.rs +++ b/crates/matrix-sdk-ui/tests/integration/room_list_service.rs @@ -7,9 +7,7 @@ use assert_matches::assert_matches; use eyeball_im::VectorDiff; use futures_util::{pin_mut, FutureExt, StreamExt}; use matrix_sdk::{test_utils::logged_in_client_with_server, Client}; -use matrix_sdk_base::{ - sliding_sync::http::request::RoomSubscription, sync::UnreadNotificationsCount, -}; +use matrix_sdk_base::sync::UnreadNotificationsCount; use matrix_sdk_test::{async_test, mocks::mock_encryption_state}; use matrix_sdk_ui::{ room_list_service::{ @@ -20,10 +18,8 @@ use matrix_sdk_ui::{ RoomListService, }; use ruma::{ - api::client::room::create_room::v3::Request as CreateRoomRequest, - assign, event_id, - events::{room::message::RoomMessageEventContent, StateEventType}, - mxc_uri, room_id, uint, + api::client::room::create_room::v3::Request as CreateRoomRequest, event_id, + events::room::message::RoomMessageEventContent, mxc_uri, room_id, }; use serde_json::json; use stream_assert::{assert_next_matches, assert_pending}; @@ -334,7 +330,6 @@ async fn test_sync_all_states() -> Result<(), Error> { ["m.room.topic", ""], ["m.room.canonical_alias", ""], ["m.room.power_levels", ""], - ["m.room.pinned_events", ""], ["org.matrix.msc3401.call.member", ""], ], "include_heroes": true, @@ -2083,18 +2078,7 @@ async fn test_room_subscription() -> Result<(), Error> { // Subscribe. - room_list.subscribe_to_rooms( - &[room_id_1], - Some(assign!(RoomSubscription::default(), { - required_state: vec![ - (StateEventType::RoomName, "".to_owned()), - (StateEventType::RoomTopic, "".to_owned()), - (StateEventType::RoomAvatar, "".to_owned()), - (StateEventType::RoomCanonicalAlias, "".to_owned()), - ], - timeline_limit: uint!(30), - })), - ); + room_list.subscribe_to_rooms(&[room_id_1]); sync_then_assert_request_and_fake_response! { [server, room_list, sync] @@ -2109,12 +2093,17 @@ async fn test_room_subscription() -> Result<(), Error> { room_id_1: { "required_state": [ ["m.room.name", ""], + ["m.room.encryption", ""], + ["m.room.member", "$LAZY"], + ["m.room.member", "$ME"], ["m.room.topic", ""], - ["m.room.avatar", ""], ["m.room.canonical_alias", ""], + ["m.room.power_levels", ""], + ["org.matrix.msc3401.call.member", ""], ["m.room.create", ""], + ["m.room.pinned_events", ""], ], - "timeline_limit": 30, + "timeline_limit": 20, }, }, }, @@ -2127,18 +2116,7 @@ async fn test_room_subscription() -> Result<(), Error> { // Subscribe to another room. - room_list.subscribe_to_rooms( - &[room_id_2], - Some(assign!(RoomSubscription::default(), { - required_state: vec![ - (StateEventType::RoomName, "".to_owned()), - (StateEventType::RoomTopic, "".to_owned()), - (StateEventType::RoomAvatar, "".to_owned()), - (StateEventType::RoomCanonicalAlias, "".to_owned()), - ], - timeline_limit: uint!(30), - })), - ); + room_list.subscribe_to_rooms(&[room_id_2]); sync_then_assert_request_and_fake_response! { [server, room_list, sync] @@ -2153,12 +2131,17 @@ async fn test_room_subscription() -> Result<(), Error> { room_id_2: { "required_state": [ ["m.room.name", ""], + ["m.room.encryption", ""], + ["m.room.member", "$LAZY"], + ["m.room.member", "$ME"], ["m.room.topic", ""], - ["m.room.avatar", ""], ["m.room.canonical_alias", ""], + ["m.room.power_levels", ""], + ["org.matrix.msc3401.call.member", ""], ["m.room.create", ""], + ["m.room.pinned_events", ""], ], - "timeline_limit": 30, + "timeline_limit": 20, }, }, }, @@ -2171,18 +2154,7 @@ async fn test_room_subscription() -> Result<(), Error> { // Subscribe to an already subscribed room. Nothing happens. - room_list.subscribe_to_rooms( - &[room_id_1], - Some(assign!(RoomSubscription::default(), { - required_state: vec![ - (StateEventType::RoomName, "".to_owned()), - (StateEventType::RoomTopic, "".to_owned()), - (StateEventType::RoomAvatar, "".to_owned()), - (StateEventType::RoomCanonicalAlias, "".to_owned()), - ], - timeline_limit: uint!(30), - })), - ); + room_list.subscribe_to_rooms(&[room_id_1]); sync_then_assert_request_and_fake_response! { [server, room_list, sync] diff --git a/labs/multiverse/src/main.rs b/labs/multiverse/src/main.rs index e844449ce..810766fa7 100644 --- a/labs/multiverse/src/main.rs +++ b/labs/multiverse/src/main.rs @@ -23,9 +23,8 @@ use matrix_sdk::{ ruma::{ api::client::receipt::create_receipt::v3::ReceiptType, events::room::message::{MessageType, RoomMessageEventContent}, - uint, MilliSecondsSinceUnixEpoch, OwnedRoomId, RoomId, + MilliSecondsSinceUnixEpoch, OwnedRoomId, RoomId, }, - sliding_sync::http::request::RoomSubscription, AuthSession, Client, ServerName, SqliteCryptoStore, SqliteStateStore, }; use matrix_sdk_ui::{ @@ -445,10 +444,7 @@ impl App { .get_selected_room_id(Some(selected)) .and_then(|room_id| self.ui_rooms.lock().unwrap().get(&room_id).cloned()) { - let mut sub = RoomSubscription::default(); - sub.timeline_limit = uint!(30); - - self.sync_service.room_list_service().subscribe_to_rooms(&[room.room_id()], Some(sub)); + self.sync_service.room_list_service().subscribe_to_rooms(&[room.room_id()]); self.current_room_subscription = Some(room); } }