mirror of
https://github.com/matrix-org/matrix-rust-sdk.git
synced 2026-05-08 07:56:55 -04:00
refactor(ui): Reduce the size of NotificationEvent.
This patch reduces the size of `NotificationEvent` from 576 bytes to 16 bytes.
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
use std::ops::Deref;
|
||||
|
||||
use anyhow::{bail, Context};
|
||||
use matrix_sdk::IdParseError;
|
||||
use matrix_sdk_ui::timeline::TimelineEventItemId;
|
||||
@@ -22,7 +24,7 @@ use crate::{
|
||||
};
|
||||
|
||||
#[derive(uniffi::Object)]
|
||||
pub struct TimelineEvent(pub(crate) AnySyncTimelineEvent);
|
||||
pub struct TimelineEvent(pub(crate) Box<AnySyncTimelineEvent>);
|
||||
|
||||
#[matrix_sdk_ffi_macros::export]
|
||||
impl TimelineEvent {
|
||||
@@ -39,7 +41,7 @@ impl TimelineEvent {
|
||||
}
|
||||
|
||||
pub fn event_type(&self) -> Result<TimelineEventType, ClientError> {
|
||||
let event_type = match &self.0 {
|
||||
let event_type = match self.0.deref() {
|
||||
AnySyncTimelineEvent::MessageLike(event) => {
|
||||
TimelineEventType::MessageLike { content: event.clone().try_into()? }
|
||||
}
|
||||
@@ -53,7 +55,7 @@ impl TimelineEvent {
|
||||
|
||||
impl From<AnyTimelineEvent> for TimelineEvent {
|
||||
fn from(event: AnyTimelineEvent) -> Self {
|
||||
Self(event.into())
|
||||
Self(Box::new(event.into()))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -835,9 +835,9 @@ pub enum RawNotificationEvent {
|
||||
#[derive(Debug)]
|
||||
pub enum NotificationEvent {
|
||||
/// The Notification was for a TimelineEvent
|
||||
Timeline(AnySyncTimelineEvent),
|
||||
Timeline(Box<AnySyncTimelineEvent>),
|
||||
/// The Notification is an invite with the given stripped room event data
|
||||
Invite(StrippedRoomMemberEvent),
|
||||
Invite(Box<StrippedRoomMemberEvent>),
|
||||
}
|
||||
|
||||
impl NotificationEvent {
|
||||
@@ -851,7 +851,10 @@ impl NotificationEvent {
|
||||
/// Returns the root event id of the thread the notification event is in, if
|
||||
/// any.
|
||||
fn thread_id(&self) -> Option<OwnedEventId> {
|
||||
let NotificationEvent::Timeline(AnySyncTimelineEvent::MessageLike(event)) = &self else {
|
||||
let NotificationEvent::Timeline(sync_timeline_event) = &self else {
|
||||
return None;
|
||||
};
|
||||
let AnySyncTimelineEvent::MessageLike(event) = sync_timeline_event.as_ref() else {
|
||||
return None;
|
||||
};
|
||||
let content = event.original_content()?;
|
||||
@@ -923,11 +926,11 @@ impl NotificationItem {
|
||||
{
|
||||
ev.content.sanitize(DEFAULT_SANITIZER_MODE, RemoveReplyFallback::Yes);
|
||||
}
|
||||
NotificationEvent::Timeline(event)
|
||||
NotificationEvent::Timeline(Box::new(event))
|
||||
}
|
||||
RawNotificationEvent::Invite(raw_event) => NotificationEvent::Invite(
|
||||
RawNotificationEvent::Invite(raw_event) => NotificationEvent::Invite(Box::new(
|
||||
raw_event.deserialize().map_err(|_| Error::InvalidRumaEvent)?,
|
||||
),
|
||||
)),
|
||||
};
|
||||
|
||||
let sender = match room.state() {
|
||||
|
||||
@@ -389,17 +389,17 @@ impl NotificationClientWrapper {
|
||||
.expect("Failed to get_notification");
|
||||
|
||||
if let Some(item) = item {
|
||||
if let NotificationEvent::Timeline(AnySyncTimelineEvent::MessageLike(e)) =
|
||||
item.event
|
||||
{
|
||||
if let AnyMessageLikeEventContent::RoomMessage(c) =
|
||||
e.original_content().expect("Empty original content")
|
||||
{
|
||||
self.events
|
||||
.lock()
|
||||
.unwrap()
|
||||
.push((event_info.0.clone(), c.body().to_owned()));
|
||||
return;
|
||||
if let NotificationEvent::Timeline(sync_timeline_event) = item.event {
|
||||
if let AnySyncTimelineEvent::MessageLike(event) = sync_timeline_event.as_ref() {
|
||||
if let AnyMessageLikeEventContent::RoomMessage(event_content) =
|
||||
event.original_content().expect("Empty original content")
|
||||
{
|
||||
self.events
|
||||
.lock()
|
||||
.unwrap()
|
||||
.push((event_info.0.clone(), event_content.body().to_owned()));
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -183,19 +183,25 @@ async fn test_notification() -> Result<()> {
|
||||
assert_matches!(
|
||||
notification.event,
|
||||
NotificationEvent::Timeline(
|
||||
matrix_sdk::ruma::events::AnySyncTimelineEvent::MessageLike(
|
||||
matrix_sdk::ruma::events::AnySyncMessageLikeEvent::RoomMessage(
|
||||
SyncMessageLikeEvent::Original(event)
|
||||
)
|
||||
)
|
||||
sync_timeline_event
|
||||
) => {
|
||||
assert_matches!(event.content.msgtype,
|
||||
matrix_sdk::ruma::events::room::message::MessageType::Text(text) => {
|
||||
assert_eq!(text.body, "Hello world!");
|
||||
});
|
||||
}
|
||||
assert_matches!(
|
||||
sync_timeline_event.as_ref(),
|
||||
matrix_sdk::ruma::events::AnySyncTimelineEvent::MessageLike(
|
||||
matrix_sdk::ruma::events::AnySyncMessageLikeEvent::RoomMessage(
|
||||
SyncMessageLikeEvent::Original(event)
|
||||
)
|
||||
) => {
|
||||
assert_matches!(
|
||||
&event.content.msgtype,
|
||||
matrix_sdk::ruma::events::room::message::MessageType::Text(text) => {
|
||||
assert_eq!(text.body, "Hello world!");
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
assert_eq!(notification.sender_display_name.as_deref(), Some(ALICE_NAME));
|
||||
assert_eq!(notification.room_computed_display_name, ROOM_NAME);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user