change(ffi): pass the client utd manager down into the timeline builder

This commit is contained in:
Stefan Ceriu
2025-05-19 10:22:46 +03:00
committed by Stefan Ceriu
parent 195ee35eea
commit e6dc203c4d
3 changed files with 30 additions and 15 deletions

View File

@@ -221,7 +221,7 @@ impl From<matrix_sdk::TransmissionProgress> for TransmissionProgress {
pub struct Client {
pub(crate) inner: AsyncRuntimeDropped<MatrixClient>,
delegate: RwLock<Option<Arc<dyn ClientDelegate>>>,
utd_hook_manager: Option<Arc<UtdHookManager>>,
utd_hook: Option<Arc<UtdHookManager>>,
session_verification_controller:
Arc<tokio::sync::RwLock<Option<SessionVerificationController>>>,
}
@@ -267,7 +267,7 @@ impl Client {
let mut client = Client {
inner: AsyncRuntimeDropped::new(sdk_client.clone()),
delegate: RwLock::new(None),
utd_hook_manager: None,
utd_hook: None,
session_verification_controller,
};
@@ -319,7 +319,7 @@ impl Client {
// because the UTD hook failed to load its data.
}
client.utd_hook_manager = Some(Arc::new(utd_hook));
client.utd_hook = Some(Arc::new(utd_hook));
}
Ok(client)
@@ -1053,7 +1053,11 @@ impl Client {
}
pub fn rooms(&self) -> Vec<Arc<Room>> {
self.inner.rooms().into_iter().map(|room| Arc::new(Room::new(room))).collect()
self.inner
.rooms()
.into_iter()
.map(|room| Arc::new(Room::new(room, self.utd_hook.clone())))
.collect()
}
/// Get a room by its ID.
@@ -1070,14 +1074,14 @@ impl Client {
pub fn get_room(&self, room_id: String) -> Result<Option<Arc<Room>>, ClientError> {
let room_id = RoomId::parse(room_id)?;
let sdk_room = self.inner.get_room(&room_id);
let room = sdk_room.map(|room| Arc::new(Room::new(room)));
let room = sdk_room.map(|room| Arc::new(Room::new(room, self.utd_hook.clone())));
Ok(room)
}
pub fn get_dm_room(&self, user_id: String) -> Result<Option<Arc<Room>>, ClientError> {
let user_id = UserId::parse(user_id)?;
let sdk_room = self.inner.get_dm_room(&user_id);
let dm = sdk_room.map(|room| Arc::new(Room::new(room)));
let dm = sdk_room.map(|room| Arc::new(Room::new(room, self.utd_hook.clone())));
Ok(dm)
}
@@ -1184,7 +1188,7 @@ impl Client {
pub async fn join_room_by_id(&self, room_id: String) -> Result<Arc<Room>, ClientError> {
let room_id = RoomId::parse(room_id)?;
let room = self.inner.join_room_by_id(room_id.as_ref()).await?;
Ok(Arc::new(Room::new(room)))
Ok(Arc::new(Room::new(room, self.utd_hook.clone())))
}
/// Join a room by its ID or alias.
@@ -1205,7 +1209,7 @@ impl Client {
.collect::<Result<Vec<_>, _>>()?;
let room =
self.inner.join_room_by_id_or_alias(room_id.as_ref(), server_names.as_ref()).await?;
Ok(Arc::new(Room::new(room)))
Ok(Arc::new(Room::new(room, self.utd_hook.clone())))
}
/// Knock on a room to join it using its ID or alias.
@@ -1219,7 +1223,7 @@ impl Client {
let server_names =
server_names.iter().map(ServerName::parse).collect::<Result<Vec<_>, _>>()?;
let room = self.inner.knock(room_id, reason, server_names).await?;
Ok(Arc::new(Room::new(room)))
Ok(Arc::new(Room::new(room, self.utd_hook.clone())))
}
pub async fn get_recently_visited_rooms(&self) -> Result<Vec<String>, ClientError> {
@@ -1313,7 +1317,10 @@ impl Client {
/// or an externally set timeout happens.**
pub async fn await_room_remote_echo(&self, room_id: String) -> Result<Arc<Room>, ClientError> {
let room_id = RoomId::parse(room_id)?;
Ok(Arc::new(Room::new(self.inner.await_room_remote_echo(&room_id).await)))
Ok(Arc::new(Room::new(
self.inner.await_room_remote_echo(&room_id).await,
self.utd_hook.clone(),
)))
}
/// Lets the user know whether this is an `m.login.password` based

View File

@@ -108,7 +108,7 @@ impl NotificationClient {
pub fn get_room(&self, room_id: String) -> Result<Option<Arc<Room>>, ClientError> {
let room_id = RoomId::parse(room_id)?;
let sdk_room = self.inner.get_room(&room_id);
let room = sdk_room.map(|room| Arc::new(Room::new(room)));
let room = sdk_room.map(|room| Arc::new(Room::new(room, None)));
Ok(room)
}

View File

@@ -12,7 +12,10 @@ use matrix_sdk::{
ComposerDraft as SdkComposerDraft, ComposerDraftType as SdkComposerDraftType, EncryptionState,
RoomHero as SdkRoomHero, RoomMemberships, RoomState,
};
use matrix_sdk_ui::timeline::{default_event_filter, RoomExt, TimelineBuilder};
use matrix_sdk_ui::{
timeline::{default_event_filter, RoomExt, TimelineBuilder},
unable_to_decrypt_hook::UtdHookManager,
};
use mime::Mime;
use ruma::{
assign,
@@ -75,16 +78,17 @@ pub(crate) type TimelineLock = Arc<RwLock<Option<Arc<Timeline>>>>;
#[derive(uniffi::Object)]
pub struct Room {
pub(super) inner: SdkRoom,
utd_hook: Option<Arc<UtdHookManager>>,
timeline: TimelineLock,
}
impl Room {
pub(crate) fn new(inner: SdkRoom) -> Self {
Room { inner, timeline: Default::default() }
pub(crate) fn new(inner: SdkRoom, utd_hook: Option<Arc<UtdHookManager>>) -> Self {
Room { inner, timeline: Default::default(), utd_hook }
}
pub(crate) fn with_timeline(inner: SdkRoom, timeline: TimelineLock) -> Self {
Room { inner, timeline }
Room { inner, timeline, utd_hook: None }
}
}
@@ -233,6 +237,10 @@ impl Room {
builder = builder.with_internal_id_prefix(internal_id_prefix);
}
if let Some(utd_hook) = self.utd_hook.clone() {
builder = builder.with_unable_to_decrypt_hook(utd_hook);
}
let timeline = builder.build().await?;
Ok(Timeline::new(timeline))