Skip to content

Commit

Permalink
feat(ffi): expose a custom timeline builder that can be configured to…
Browse files Browse the repository at this point in the history
… show only media, images and videos or files and audios

Instances of these timelines will be used to power the 2 different tabs shown on the new media browser. The client will be responsible for interacting with it similar to a normal timeline and transforming its data into something renderable e.g. section by date separators (which will be made configurable in a follow up PR)
  • Loading branch information
stefanceriu committed Dec 2, 2024
1 parent ad3d1fb commit b4dca4e
Showing 1 changed file with 47 additions and 3 deletions.
50 changes: 47 additions & 3 deletions bindings/matrix-sdk-ffi/src/room.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,11 @@ use ruma::{
call::notify,
room::{
avatar::ImageInfo as RumaAvatarImageInfo,
message::RoomMessageEventContentWithoutRelation,
power_levels::RoomPowerLevels as RumaPowerLevels, MediaSource,
message::{MessageType, RoomMessageEventContentWithoutRelation},
power_levels::RoomPowerLevels as RumaPowerLevels,
MediaSource,
},
TimelineEventType,
AnyMessageLikeEventContent, AnySyncTimelineEvent, TimelineEventType,
},
EventId, Int, OwnedDeviceId, OwnedUserId, RoomAliasId, UserId,
};
Expand Down Expand Up @@ -52,6 +53,12 @@ pub enum Membership {
Knocked,
}

#[derive(Debug, Clone, uniffi::Enum)]
pub enum MediaEventsTimelineFilter {
ImageAndVideo,
FileAndAudio,
}

impl From<RoomState> for Membership {
fn from(value: RoomState) -> Self {
match value {
Expand Down Expand Up @@ -260,6 +267,43 @@ impl Room {
Ok(Timeline::new(timeline))
}

pub async fn media_events_timeline(
&self,
filter: MediaEventsTimelineFilter,
) -> Result<Arc<Timeline>, ClientError> {
let room = &self.inner;

let mut builder = matrix_sdk_ui::timeline::Timeline::builder(room);

match filter {
MediaEventsTimelineFilter::ImageAndVideo => {
builder = builder.event_filter(move |event, _| match event {
AnySyncTimelineEvent::MessageLike(msg) => match msg.original_content() {
Some(AnyMessageLikeEventContent::RoomMessage(content)) => {
matches!(content.msgtype, MessageType::Image(_) | MessageType::Video(_))
}
_ => false,
},
_ => false,
});
}
MediaEventsTimelineFilter::FileAndAudio => {
builder = builder.event_filter(move |event, _| match event {
AnySyncTimelineEvent::MessageLike(msg) => match msg.original_content() {
Some(AnyMessageLikeEventContent::RoomMessage(content)) => {
matches!(content.msgtype, MessageType::Audio(_) | MessageType::File(_))
}
_ => false,
},
_ => false,
});
}
}

let timeline = builder.build().await?;
Ok(Timeline::new(timeline))
}

pub fn is_encrypted(&self) -> Result<bool, ClientError> {
Ok(RUNTIME.block_on(self.inner.is_encrypted())?)
}
Expand Down

0 comments on commit b4dca4e

Please sign in to comment.