From 47e7360b046b1eeee44491a271a987e44ca25ae2 Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Wed, 16 Aug 2023 09:27:17 +0200 Subject: [PATCH] ffi: Add RoomInfo --- bindings/matrix-sdk-ffi/src/lib.rs | 1 + bindings/matrix-sdk-ffi/src/room.rs | 16 +++-- bindings/matrix-sdk-ffi/src/room_info.rs | 71 ++++++++++++++++++++++ bindings/matrix-sdk-ffi/src/room_list.rs | 9 ++- bindings/matrix-sdk-ffi/src/room_member.rs | 2 +- 5 files changed, 92 insertions(+), 7 deletions(-) create mode 100644 bindings/matrix-sdk-ffi/src/room_info.rs diff --git a/bindings/matrix-sdk-ffi/src/lib.rs b/bindings/matrix-sdk-ffi/src/lib.rs index 3d3a2592b..1a4884970 100644 --- a/bindings/matrix-sdk-ffi/src/lib.rs +++ b/bindings/matrix-sdk-ffi/src/lib.rs @@ -30,6 +30,7 @@ mod notification; mod notification_settings; mod platform; mod room; +mod room_info; mod room_list; mod room_member; mod session_verification; diff --git a/bindings/matrix-sdk-ffi/src/room.rs b/bindings/matrix-sdk-ffi/src/room.rs index 9811e8341..341116df0 100644 --- a/bindings/matrix-sdk-ffi/src/room.rs +++ b/bindings/matrix-sdk-ffi/src/room.rs @@ -56,6 +56,16 @@ pub enum Membership { Left, } +impl From for Membership { + fn from(value: RoomState) -> Self { + match value { + RoomState::Invited => Membership::Invited, + RoomState::Joined => Membership::Joined, + RoomState::Left => Membership::Left, + } + } +} + pub(crate) type TimelineLock = Arc>>>; #[derive(uniffi::Object)] @@ -117,11 +127,7 @@ impl Room { } pub fn membership(&self) -> Membership { - match self.inner.state() { - RoomState::Invited => Membership::Invited, - RoomState::Joined => Membership::Joined, - RoomState::Left => Membership::Left, - } + self.inner.state().into() } pub fn inviter(&self) -> Option> { diff --git a/bindings/matrix-sdk-ffi/src/room_info.rs b/bindings/matrix-sdk-ffi/src/room_info.rs new file mode 100644 index 000000000..5ccf11031 --- /dev/null +++ b/bindings/matrix-sdk-ffi/src/room_info.rs @@ -0,0 +1,71 @@ +use std::sync::Arc; + +use matrix_sdk::RoomState; +use matrix_sdk_ui::room_list_service::Room; + +use crate::{room::Membership, room_member::RoomMember, timeline::EventTimelineItem}; + +#[derive(uniffi::Record)] +pub struct RoomInfo { + id: String, + name: Option, + topic: Option, + avatar_url: Option, + is_direct: bool, + /// Whether the room is encrypted. + /// + /// Currently always `None` (unknown) for invited rooms. + is_encrypted: Option, + is_public: bool, + is_space: bool, + is_tombstoned: bool, + canonical_alias: Option, + alternative_aliases: Vec, + membership: Membership, + latest_event: Option>, + inviter: Option>, + active_members_count: u64, + invited_members_count: u64, + joined_members_count: u64, + highlight_count: u64, + notification_count: u64, +} + +impl RoomInfo { + pub(crate) async fn new(room: &Room) -> matrix_sdk::Result { + let inner = room.inner_room(); + let unread_notification_counts = inner.unread_notification_counts(); + + Ok(Self { + id: inner.room_id().to_string(), + name: inner.name(), + topic: inner.topic(), + avatar_url: inner.avatar_url().map(Into::into), + is_direct: inner.is_direct().await?, + is_encrypted: match inner.state() { + RoomState::Invited => None, + _ => Some(inner.is_encrypted().await?), + }, + is_public: inner.is_public(), + is_space: inner.is_space(), + is_tombstoned: inner.is_tombstoned(), + canonical_alias: inner.canonical_alias().map(Into::into), + alternative_aliases: inner.alt_aliases().into_iter().map(Into::into).collect(), + membership: inner.state().into(), + latest_event: room.latest_event().await.map(EventTimelineItem).map(Arc::new), + inviter: match inner.state() { + RoomState::Invited => inner + .invite_details() + .await? + .inviter + .map(|inner| Arc::new(RoomMember { inner })), + _ => None, + }, + active_members_count: inner.active_members_count(), + invited_members_count: inner.invited_members_count(), + joined_members_count: inner.joined_members_count(), + highlight_count: unread_notification_counts.highlight_count, + notification_count: unread_notification_counts.notification_count, + }) + } +} diff --git a/bindings/matrix-sdk-ffi/src/room_list.rs b/bindings/matrix-sdk-ffi/src/room_list.rs index e09ae46ed..52163d779 100644 --- a/bindings/matrix-sdk-ffi/src/room_list.rs +++ b/bindings/matrix-sdk-ffi/src/room_list.rs @@ -15,7 +15,10 @@ use matrix_sdk::{ use matrix_sdk_ui::room_list_service::filters::{new_filter_all, new_filter_fuzzy_match_room_name}; use tokio::sync::RwLock; -use crate::{room::Room, timeline::EventTimelineItem, TaskHandle, RUNTIME}; +use crate::{ + error::ClientError, room::Room, room_info::RoomInfo, timeline::EventTimelineItem, TaskHandle, + RUNTIME, +}; #[derive(uniffi::Error)] pub enum RoomListError { @@ -353,6 +356,10 @@ impl RoomListItem { self.inner.inner_room().canonical_alias().map(|alias| alias.to_string()) } + pub async fn room_info(&self) -> Result { + Ok(RoomInfo::new(&self.inner).await?) + } + /// Building a `Room`. /// /// Be careful that building a `Room` builds its entire `Timeline` at the diff --git a/bindings/matrix-sdk-ffi/src/room_member.rs b/bindings/matrix-sdk-ffi/src/room_member.rs index fba4076e9..87318542c 100644 --- a/bindings/matrix-sdk-ffi/src/room_member.rs +++ b/bindings/matrix-sdk-ffi/src/room_member.rs @@ -44,7 +44,7 @@ impl From for Membershi #[derive(uniffi::Object)] pub struct RoomMember { - inner: SdkRoomMember, + pub(crate) inner: SdkRoomMember, } #[uniffi::export]