ffi: Add RoomInfo

This commit is contained in:
Jonas Platte
2023-08-16 09:27:17 +02:00
committed by Jonas Platte
parent 9b803eda12
commit 47e7360b04
5 changed files with 92 additions and 7 deletions

View File

@@ -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;

View File

@@ -56,6 +56,16 @@ pub enum Membership {
Left,
}
impl From<RoomState> 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<RwLock<Option<Arc<Timeline>>>>;
#[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<Arc<RoomMember>> {

View File

@@ -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<String>,
topic: Option<String>,
avatar_url: Option<String>,
is_direct: bool,
/// Whether the room is encrypted.
///
/// Currently always `None` (unknown) for invited rooms.
is_encrypted: Option<bool>,
is_public: bool,
is_space: bool,
is_tombstoned: bool,
canonical_alias: Option<String>,
alternative_aliases: Vec<String>,
membership: Membership,
latest_event: Option<Arc<EventTimelineItem>>,
inviter: Option<Arc<RoomMember>>,
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<Self> {
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,
})
}
}

View File

@@ -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<RoomInfo, ClientError> {
Ok(RoomInfo::new(&self.inner).await?)
}
/// Building a `Room`.
///
/// Be careful that building a `Room` builds its entire `Timeline` at the

View File

@@ -44,7 +44,7 @@ impl From<matrix_sdk::ruma::events::room::member::MembershipState> for Membershi
#[derive(uniffi::Object)]
pub struct RoomMember {
inner: SdkRoomMember,
pub(crate) inner: SdkRoomMember,
}
#[uniffi::export]