From 900a6d138223a1e91c1d2053df1ec8748e6ff396 Mon Sep 17 00:00:00 2001 From: Ivan Enderlin Date: Mon, 19 Feb 2024 11:55:21 +0100 Subject: [PATCH 1/4] feat(ui): Add the `favourite` filter. This patch adds the `favourite` filter, to filter out rooms that are not marked as favourite. --- .../room_list_service/filters/favourite.rs | 82 +++++++++++++++++++ .../src/room_list_service/filters/mod.rs | 2 + 2 files changed, 84 insertions(+) create mode 100644 crates/matrix-sdk-ui/src/room_list_service/filters/favourite.rs diff --git a/crates/matrix-sdk-ui/src/room_list_service/filters/favourite.rs b/crates/matrix-sdk-ui/src/room_list_service/filters/favourite.rs new file mode 100644 index 000000000..2e3df57ab --- /dev/null +++ b/crates/matrix-sdk-ui/src/room_list_service/filters/favourite.rs @@ -0,0 +1,82 @@ +use matrix_sdk::{Client, RoomListEntry}; + +use super::Filter; + +struct FavouriteRoomMatcher +where + F: Fn(&RoomListEntry) -> Option, +{ + is_favourite: F, +} + +impl FavouriteRoomMatcher +where + F: Fn(&RoomListEntry) -> Option, +{ + fn matches(&self, room_list_entry: &RoomListEntry) -> bool { + if !matches!(room_list_entry, RoomListEntry::Filled(_) | RoomListEntry::Invalidated(_)) { + return false; + } + + (self.is_favourite)(room_list_entry).unwrap_or(false) + } +} + +/// Create a new filter that will accept all filled or invalidated entries, but +/// filters out rooms that are not marked as favourite (see +/// [`matrix_sdk_base::Room::is_favourite`]). +pub fn new_filter(client: &Client) -> impl Filter { + let client = client.clone(); + + let matcher = FavouriteRoomMatcher { + is_favourite: move |room| { + let room_id = room.as_room_id()?; + let room = client.get_room(room_id)?; + + Some(room.is_favourite()) + }, + }; + + move |room_list_entry| -> bool { matcher.matches(room_list_entry) } +} + +#[cfg(test)] +mod tests { + use std::ops::Not; + + use matrix_sdk::RoomListEntry; + use ruma::room_id; + + use super::FavouriteRoomMatcher; + + #[test] + fn test_is_favourite() { + let matcher = FavouriteRoomMatcher { is_favourite: |_| Some(true) }; + + assert!(matcher.matches(&RoomListEntry::Empty).not()); + assert!(matcher.matches(&RoomListEntry::Filled(room_id!("!r0:bar.org").to_owned()))); + assert!(matcher.matches(&RoomListEntry::Invalidated(room_id!("!r0:bar.org").to_owned()))); + } + + #[test] + fn test_is_not_favourite() { + let matcher = FavouriteRoomMatcher { is_favourite: |_| Some(false) }; + + assert!(matcher.matches(&RoomListEntry::Empty).not()); + assert!(matcher.matches(&RoomListEntry::Filled(room_id!("!r0:bar.org").to_owned())).not()); + assert!(matcher + .matches(&RoomListEntry::Invalidated(room_id!("!r0:bar.org").to_owned())) + .not()); + } + + #[test] + fn test_favourite_state_cannot_be_found() { + let matcher = FavouriteRoomMatcher { is_favourite: |_| None }; + + assert!(matcher.matches(&RoomListEntry::Empty).not()); + assert!(matcher.matches(&RoomListEntry::Filled(room_id!("!r0:bar.org").to_owned())).not()); + assert!(matcher + .matches(&RoomListEntry::Invalidated(room_id!("!r0:bar.org").to_owned())) + .not()); + } +} diff --git a/crates/matrix-sdk-ui/src/room_list_service/filters/mod.rs b/crates/matrix-sdk-ui/src/room_list_service/filters/mod.rs index 794a2ddff..720b7a7ba 100644 --- a/crates/matrix-sdk-ui/src/room_list_service/filters/mod.rs +++ b/crates/matrix-sdk-ui/src/room_list_service/filters/mod.rs @@ -1,6 +1,7 @@ mod all; mod any; mod category; +mod favourite; mod fuzzy_match_room_name; mod non_left; mod none; @@ -11,6 +12,7 @@ mod unread; pub use all::new_filter as new_filter_all; pub use any::new_filter as new_filter_any; pub use category::{new_filter as new_filter_category, RoomCategory}; +pub use favourite::new_filter as new_filter_favourite; pub use fuzzy_match_room_name::new_filter as new_filter_fuzzy_match_room_name; use matrix_sdk::RoomListEntry; pub use non_left::new_filter as new_filter_non_left; From c7d34bd65e37b1c0516e040e103ad5a25a303587 Mon Sep 17 00:00:00 2001 From: Ivan Enderlin Date: Mon, 19 Feb 2024 11:55:58 +0100 Subject: [PATCH 2/4] doc(ui): Add documentation for `matrix_sdk_ui::room_list_service::filters`. This patch adds missing documentation for the `filters` module. --- .../src/room_list_service/filters/mod.rs | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/crates/matrix-sdk-ui/src/room_list_service/filters/mod.rs b/crates/matrix-sdk-ui/src/room_list_service/filters/mod.rs index 720b7a7ba..439e048a1 100644 --- a/crates/matrix-sdk-ui/src/room_list_service/filters/mod.rs +++ b/crates/matrix-sdk-ui/src/room_list_service/filters/mod.rs @@ -1,3 +1,45 @@ +//! A collection of room filters. +//! +//! The room list can provide an access to the rooms per list, like with +//! [`super::RoomList::entries_with_dynamic_adapters`]. The provided collection +//! of rooms can be filtered with these filters. A classical usage would be the +//! following: +//! +//! ```rust +//! use matrix_sdk::Client; +//! use matrix_sdk_ui::room_list_service::{ +//! filters, RoomListDynamicEntriesController, +//! }; +//! +//! fn configure_room_list( +//! client: &Client, +//! entries_controller: &RoomListDynamicEntriesController, +//! ) { +//! // _All_ non-left rooms +//! // _and_ that fall in the “People” category, +//! // _and_ that are marked as favourite, +//! // _and_ that are _not_ unread. +//! entries_controller.set_filter(Box::new( +//! // All +//! filters::new_filter_all(vec![ +//! // Non-left +//! Box::new(filters::new_filter_non_left(&client)), +//! // People +//! Box::new(filters::new_filter_category( +//! client, +//! filters::RoomCategory::People, +//! )), +//! // Favourite +//! Box::new(filters::new_filter_favourite(client)), +//! // Not Unread +//! Box::new(filters::new_filter_not(Box::new( +//! filters::new_filter_unread(client), +//! ))), +//! ]), +//! )); +//! } +//! ``` + mod all; mod any; mod category; From 12d5f5105191c930b9cfdf9a68da7a70e51b9d72 Mon Sep 17 00:00:00 2001 From: Ivan Enderlin Date: Mon, 19 Feb 2024 13:18:51 +0100 Subject: [PATCH 3/4] feat(ffi): Add the `favourite` room list filter. This patch implements the `RoomListEntriesDynamicFilterKind::Favourite` variant. --- bindings/matrix-sdk-ffi/src/room_list.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/bindings/matrix-sdk-ffi/src/room_list.rs b/bindings/matrix-sdk-ffi/src/room_list.rs index ea9ca3b53..d37774b88 100644 --- a/bindings/matrix-sdk-ffi/src/room_list.rs +++ b/bindings/matrix-sdk-ffi/src/room_list.rs @@ -15,9 +15,9 @@ use matrix_sdk::{ use matrix_sdk_ui::{ room_list_service::{ filters::{ - new_filter_all, new_filter_any, new_filter_category, new_filter_fuzzy_match_room_name, - new_filter_non_left, new_filter_none, new_filter_normalized_match_room_name, - new_filter_unread, RoomCategory, + new_filter_all, new_filter_any, new_filter_category, new_filter_favourite, + new_filter_fuzzy_match_room_name, new_filter_non_left, new_filter_none, + new_filter_normalized_match_room_name, new_filter_unread, RoomCategory, }, BoxedFilterFn, }, @@ -417,6 +417,7 @@ pub enum RoomListEntriesDynamicFilterKind { Any { filters: Vec }, NonLeft, Unread, + Favourite, Category { expect: RoomListFilterCategory }, None, NormalizedMatchRoomName { pattern: String }, @@ -455,6 +456,7 @@ impl FilterWrapper { ))), Kind::NonLeft => Self(Box::new(new_filter_non_left(client))), Kind::Unread => Self(Box::new(new_filter_unread(client))), + Kind::Favourite => Self(Box::new(new_filter_favourite(client))), Kind::Category { expect } => Self(Box::new(new_filter_category(client, expect.into()))), Kind::None => Self(Box::new(new_filter_none())), Kind::NormalizedMatchRoomName { pattern } => { From 9e6252cb2d8e082aaba1ad7b671a8d1a9da68969 Mon Sep 17 00:00:00 2001 From: Ivan Enderlin Date: Mon, 19 Feb 2024 13:33:11 +0100 Subject: [PATCH 4/4] doc(ui): Add missing copyright headers. --- .../src/room_list_service/filters/all.rs | 14 ++++++++++++++ .../src/room_list_service/filters/any.rs | 14 ++++++++++++++ .../src/room_list_service/filters/category.rs | 14 ++++++++++++++ .../src/room_list_service/filters/favourite.rs | 14 ++++++++++++++ .../filters/fuzzy_match_room_name.rs | 14 ++++++++++++++ .../src/room_list_service/filters/mod.rs | 14 ++++++++++++++ .../src/room_list_service/filters/non_left.rs | 14 ++++++++++++++ .../src/room_list_service/filters/none.rs | 14 ++++++++++++++ .../filters/normalized_match_room_name.rs | 14 ++++++++++++++ .../src/room_list_service/filters/not.rs | 14 ++++++++++++++ .../src/room_list_service/filters/unread.rs | 14 ++++++++++++++ 11 files changed, 154 insertions(+) diff --git a/crates/matrix-sdk-ui/src/room_list_service/filters/all.rs b/crates/matrix-sdk-ui/src/room_list_service/filters/all.rs index 8470e6c98..a0e4e03ff 100644 --- a/crates/matrix-sdk-ui/src/room_list_service/filters/all.rs +++ b/crates/matrix-sdk-ui/src/room_list_service/filters/all.rs @@ -1,3 +1,17 @@ +// Copyright 2024 The Matrix.org Foundation C.I.C. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + use super::{super::room_list::BoxedFilterFn, Filter}; /// Create a new filter that will run multiple filters. It returns `false` if at diff --git a/crates/matrix-sdk-ui/src/room_list_service/filters/any.rs b/crates/matrix-sdk-ui/src/room_list_service/filters/any.rs index dd92ddf73..a0751901d 100644 --- a/crates/matrix-sdk-ui/src/room_list_service/filters/any.rs +++ b/crates/matrix-sdk-ui/src/room_list_service/filters/any.rs @@ -1,3 +1,17 @@ +// Copyright 2024 The Matrix.org Foundation C.I.C. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + use super::{super::room_list::BoxedFilterFn, Filter}; /// Create a new filter that will run multiple filters. It returns `true` if at diff --git a/crates/matrix-sdk-ui/src/room_list_service/filters/category.rs b/crates/matrix-sdk-ui/src/room_list_service/filters/category.rs index f7041ca14..cc73ad51a 100644 --- a/crates/matrix-sdk-ui/src/room_list_service/filters/category.rs +++ b/crates/matrix-sdk-ui/src/room_list_service/filters/category.rs @@ -1,3 +1,17 @@ +// Copyright 2024 The Matrix.org Foundation C.I.C. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + use matrix_sdk::{Client, RoomListEntry}; use super::Filter; diff --git a/crates/matrix-sdk-ui/src/room_list_service/filters/favourite.rs b/crates/matrix-sdk-ui/src/room_list_service/filters/favourite.rs index 2e3df57ab..257f686a5 100644 --- a/crates/matrix-sdk-ui/src/room_list_service/filters/favourite.rs +++ b/crates/matrix-sdk-ui/src/room_list_service/filters/favourite.rs @@ -1,3 +1,17 @@ +// Copyright 2024 The Matrix.org Foundation C.I.C. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + use matrix_sdk::{Client, RoomListEntry}; use super::Filter; diff --git a/crates/matrix-sdk-ui/src/room_list_service/filters/fuzzy_match_room_name.rs b/crates/matrix-sdk-ui/src/room_list_service/filters/fuzzy_match_room_name.rs index 9e8e672fd..4b476035f 100644 --- a/crates/matrix-sdk-ui/src/room_list_service/filters/fuzzy_match_room_name.rs +++ b/crates/matrix-sdk-ui/src/room_list_service/filters/fuzzy_match_room_name.rs @@ -1,3 +1,17 @@ +// Copyright 2024 The Matrix.org Foundation C.I.C. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + pub use fuzzy_matcher::{skim::SkimMatcherV2, FuzzyMatcher as _}; use matrix_sdk::Client; diff --git a/crates/matrix-sdk-ui/src/room_list_service/filters/mod.rs b/crates/matrix-sdk-ui/src/room_list_service/filters/mod.rs index 439e048a1..012b5f32f 100644 --- a/crates/matrix-sdk-ui/src/room_list_service/filters/mod.rs +++ b/crates/matrix-sdk-ui/src/room_list_service/filters/mod.rs @@ -1,3 +1,17 @@ +// Copyright 2024 The Matrix.org Foundation C.I.C. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + //! A collection of room filters. //! //! The room list can provide an access to the rooms per list, like with diff --git a/crates/matrix-sdk-ui/src/room_list_service/filters/non_left.rs b/crates/matrix-sdk-ui/src/room_list_service/filters/non_left.rs index b31750772..c2e8c7fbb 100644 --- a/crates/matrix-sdk-ui/src/room_list_service/filters/non_left.rs +++ b/crates/matrix-sdk-ui/src/room_list_service/filters/non_left.rs @@ -1,3 +1,17 @@ +// Copyright 2024 The Matrix.org Foundation C.I.C. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + use matrix_sdk::{Client, RoomListEntry}; use matrix_sdk_base::RoomState; diff --git a/crates/matrix-sdk-ui/src/room_list_service/filters/none.rs b/crates/matrix-sdk-ui/src/room_list_service/filters/none.rs index 99e97be9c..d94645c62 100644 --- a/crates/matrix-sdk-ui/src/room_list_service/filters/none.rs +++ b/crates/matrix-sdk-ui/src/room_list_service/filters/none.rs @@ -1,3 +1,17 @@ +// Copyright 2024 The Matrix.org Foundation C.I.C. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + use super::Filter; /// Create a new filter that will reject all entries. diff --git a/crates/matrix-sdk-ui/src/room_list_service/filters/normalized_match_room_name.rs b/crates/matrix-sdk-ui/src/room_list_service/filters/normalized_match_room_name.rs index c0a49602d..184404bd7 100644 --- a/crates/matrix-sdk-ui/src/room_list_service/filters/normalized_match_room_name.rs +++ b/crates/matrix-sdk-ui/src/room_list_service/filters/normalized_match_room_name.rs @@ -1,3 +1,17 @@ +// Copyright 2024 The Matrix.org Foundation C.I.C. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + use matrix_sdk::Client; use super::{normalize_string, Filter}; diff --git a/crates/matrix-sdk-ui/src/room_list_service/filters/not.rs b/crates/matrix-sdk-ui/src/room_list_service/filters/not.rs index b0a63d736..4e7713147 100644 --- a/crates/matrix-sdk-ui/src/room_list_service/filters/not.rs +++ b/crates/matrix-sdk-ui/src/room_list_service/filters/not.rs @@ -1,3 +1,17 @@ +// Copyright 2024 The Matrix.org Foundation C.I.C. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + use std::ops::Not; use super::{super::room_list::BoxedFilterFn, Filter}; diff --git a/crates/matrix-sdk-ui/src/room_list_service/filters/unread.rs b/crates/matrix-sdk-ui/src/room_list_service/filters/unread.rs index d78911bc8..6a5c3d23d 100644 --- a/crates/matrix-sdk-ui/src/room_list_service/filters/unread.rs +++ b/crates/matrix-sdk-ui/src/room_list_service/filters/unread.rs @@ -1,3 +1,17 @@ +// Copyright 2024 The Matrix.org Foundation C.I.C. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + use matrix_sdk::{Client, RoomListEntry}; use matrix_sdk_base::read_receipts::RoomReadReceipts;