base: Store the notification counts.

This commit is contained in:
Damir Jelić 2020-12-07 15:11:18 +01:00
parent ab832da03e
commit e38f0762ee
3 changed files with 45 additions and 5 deletions

View file

@ -624,6 +624,9 @@ impl BaseClient {
summary.mark_members_missing();
}
let notification_count = room_info.unread_notifications.into();
summary.update_notification_count(notification_count);
// TODO should we store this?
let ephemeral = Ephemeral {
events: room_info
@ -636,7 +639,13 @@ impl BaseClient {
rooms.join.insert(
room_id,
JoinedRoom::new(timeline, state, account_data, ephemeral),
JoinedRoom::new(
timeline,
state,
account_data,
ephemeral,
notification_count,
),
);
changes.add_room(summary);

View file

@ -2,7 +2,9 @@ use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
use matrix_sdk_common::{
api::r0::sync::sync_events::DeviceLists,
api::r0::sync::sync_events::{
DeviceLists, UnreadNotificationsCount as RumaUnreadNotificationsCount,
},
events::{
presence::PresenceEvent, AnyBasicEvent, AnySyncEphemeralRoomEvent, AnySyncRoomEvent,
AnySyncStateEvent, AnyToDeviceEvent,
@ -74,8 +76,8 @@ pub struct Rooms {
/// Updates to joined rooms.
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct JoinedRoom {
// /// Counts of unread notifications for this room.
// pub unread_notifications: UnreadNotificationsCount,
/// Counts of unread notifications for this room.
pub unread_notifications: UnreadNotificationsCount,
/// The timeline of messages and state changes in the room.
pub timeline: Timeline,
/// Updates to the state, between the time indicated by the `since` parameter, and the start
@ -95,12 +97,35 @@ impl JoinedRoom {
state: State,
account_data: AccountData,
ephemeral: Ephemeral,
unread_notifications: UnreadNotificationsCount,
) -> Self {
Self {
timeline,
state,
account_data,
ephemeral,
unread_notifications,
}
}
}
/// Counts of unread notifications for a room.
#[derive(Copy, Clone, Debug, Default, Deserialize, Serialize)]
pub struct UnreadNotificationsCount {
/// The number of unread notifications for this room with the highlight flag set.
highlight_count: u64,
/// The total number of unread notifications for this room.
notification_count: u64,
}
impl From<RumaUnreadNotificationsCount> for UnreadNotificationsCount {
fn from(notifications: RumaUnreadNotificationsCount) -> Self {
Self {
highlight_count: notifications.highlight_count.map(|c| c.into()).unwrap_or(0),
notification_count: notifications
.notification_count
.map(|c| c.into())
.unwrap_or(0),
}
}
}

View file

@ -39,7 +39,7 @@ pub struct Store {
presence: Tree,
}
use crate::Session;
use crate::{responses::UnreadNotificationsCount, Session};
#[derive(Debug, Default)]
pub struct StateChanges {
@ -171,6 +171,7 @@ impl Room {
canonical_alias: None,
avatar_url: None,
topic: None,
notification_counts: Default::default(),
})),
}
}
@ -402,6 +403,7 @@ pub struct InnerSummary {
avatar_url: Option<String>,
topic: Option<String>,
notification_counts: UnreadNotificationsCount,
summary: SomeSummary,
members_synced: bool,
@ -462,6 +464,10 @@ impl InnerSummary {
self.encryption.is_some()
}
pub fn update_notification_count(&mut self, notification_counts: UnreadNotificationsCount) {
self.notification_counts = notification_counts;
}
pub(crate) fn update(&mut self, summary: &RumaSummary) -> bool {
let mut changed = false;