From e3ced48c9e7729a30624b024daa78a4b43e48e49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Commaille?= Date: Tue, 7 Oct 2025 11:50:55 +0200 Subject: [PATCH] session: Remove model module And move submodules directly under session, to reduce nesting. --- po/POTFILES.in | 18 +- src/account_chooser_dialog/account_row.rs | 2 +- .../import_export_keys_subpage.rs | 2 +- src/account_settings/encryption_page/mod.rs | 4 +- .../general_page/change_password_subpage.rs | 2 +- .../deactivate_account_subpage.rs | 2 +- .../general_page/log_out_subpage.rs | 2 +- src/account_settings/general_page/mod.rs | 2 +- src/account_settings/mod.rs | 2 +- src/account_settings/notifications_page.rs | 2 +- .../ignored_users_subpage/ignored_user_row.rs | 2 +- .../safety_page/ignored_users_subpage/mod.rs | 2 +- src/account_settings/safety_page/mod.rs | 2 +- .../user_session/user_session_list_subpage.rs | 2 +- .../user_session/user_session_row.rs | 2 +- .../user_session/user_session_subpage.rs | 2 +- src/account_switcher/session_item.rs | 2 +- src/application.rs | 2 +- src/components/avatar/image.rs | 2 +- src/components/avatar/mod.rs | 2 +- src/components/crypto/identity_setup_view.rs | 2 +- src/components/crypto/recovery_setup_view.rs | 2 +- src/components/dialogs/auth/mod.rs | 2 +- src/components/dialogs/message_dialogs.rs | 2 +- src/components/dialogs/room_preview.rs | 2 +- src/components/dialogs/user_profile.rs | 2 +- src/components/media/audio_player/mod.rs | 2 +- src/components/offline_banner.rs | 2 +- src/components/pill/at_room.rs | 2 +- src/components/pill/mod.rs | 2 +- src/components/pill/source.rs | 2 +- src/components/pill/source_row.rs | 2 +- .../power_level_selection/combo_box.rs | 2 +- .../power_level_selection/popover.rs | 2 +- src/components/power_level_selection/row.rs | 2 +- src/components/role_badge.rs | 2 +- src/components/user_page.rs | 2 +- .../accept_request_page.rs | 2 +- .../cancelled_page.rs | 2 +- .../choose_method_page.rs | 2 +- .../completed_page.rs | 2 +- .../confirm_qr_code_page.rs | 2 +- src/identity_verification_view/mod.rs | 2 +- .../no_supported_methods_page.rs | 2 +- .../qr_code_scanned_page.rs | 2 +- .../room_left_page.rs | 2 +- src/identity_verification_view/sas_page.rs | 2 +- .../scan_qr_code_page.rs | 2 +- .../wait_for_other_page.rs | 2 +- src/intent.rs | 2 +- src/login/mod.rs | 4 +- src/login/session_setup_view.rs | 2 +- src/prelude.rs | 2 +- .../{model => }/global_account_data.rs | 2 +- src/session/{model => }/ignored_users.rs | 0 src/session/mod.rs | 868 +++++++++++++++++- src/session/model/mod.rs | 34 - src/session/model/session.rs | 853 ----------------- src/session/{model => }/notifications/mod.rs | 0 .../notifications/notifications_settings.rs | 2 +- src/session/{model => }/remote/cache.rs | 2 +- src/session/{model => }/remote/mod.rs | 0 src/session/{model => }/remote/room.rs | 2 +- src/session/{model => }/remote/user.rs | 2 +- src/session/{model => }/room/aliases.rs | 0 src/session/{model => }/room/category.rs | 2 +- .../{model => }/room/highlight_flags.rs | 0 src/session/{model => }/room/join_rule.rs | 0 src/session/{model => }/room/member.rs | 2 +- src/session/{model => }/room/member_list.rs | 0 src/session/{model => }/room/mod.rs | 0 src/session/{model => }/room/permissions.rs | 0 .../{model => }/room/timeline/event/mod.rs | 2 +- .../room/timeline/event/reaction_group.rs | 2 +- .../room/timeline/event/reaction_list.rs | 2 +- src/session/{model => }/room/timeline/mod.rs | 0 .../timeline/timeline_diff_minimizer/mod.rs | 0 .../timeline/timeline_diff_minimizer/tests.rs | 0 .../room/timeline/timeline_item.rs | 2 +- .../{model => }/room/timeline/virtual_item.rs | 0 src/session/{model => }/room/typing_list.rs | 0 src/session/{model => }/room_list/metainfo.rs | 2 +- src/session/{model => }/room_list/mod.rs | 2 +- .../{model => }/room_list/room_info.rs | 2 +- src/session/{model => }/security.rs | 0 src/session/{model => }/session_settings.rs | 0 .../{model => }/sidebar_data/icon_item.rs | 2 +- src/session/{model => }/sidebar_data/item.rs | 2 +- .../{model => }/sidebar_data/item_list.rs | 2 +- .../{model => }/sidebar_data/list_model.rs | 2 +- src/session/{model => }/sidebar_data/mod.rs | 0 .../{model => }/sidebar_data/section/mod.rs | 2 +- .../{model => }/sidebar_data/section/name.rs | 2 +- .../section/room_category_filter.rs | 2 +- src/session/{model => }/user.rs | 0 .../{model => }/user_sessions_list/mod.rs | 0 .../user_sessions_list/other_sessions_list.rs | 2 +- .../user_sessions_list/user_session.rs | 2 +- .../verification/identity_verification.rs | 2 +- src/session/{model => }/verification/mod.rs | 0 .../verification/verification_list.rs | 2 +- src/session_list/mod.rs | 2 +- src/session_list/session_list_settings.rs | 2 +- src/session_view/content/explore/mod.rs | 2 +- .../content/explore/public_room_row.rs | 2 +- src/session_view/content/explore/search.rs | 2 +- .../content/explore/server_list.rs | 2 +- .../content/explore/servers_popover.rs | 2 +- src/session_view/content/invite.rs | 2 +- src/session_view/content/invite_request.rs | 2 +- src/session_view/content/mod.rs | 2 +- .../room_details/addresses_subpage/mod.rs | 2 +- .../room_details/edit_details_subpage.rs | 2 +- .../content/room_details/general_page.rs | 2 +- .../room_details/history_viewer/event.rs | 2 +- .../room_details/history_viewer/timeline.rs | 2 +- .../history_viewer/visual_media_item.rs | 2 +- .../history_visibility_subpage.rs | 2 +- .../room_details/invite_subpage/item.rs | 2 +- .../room_details/invite_subpage/list.rs | 2 +- .../room_details/invite_subpage/mod.rs | 2 +- .../content/room_details/join_rule_subpage.rs | 2 +- .../content/room_details/member_row.rs | 2 +- .../members_list_view/item_row.rs | 2 +- .../membership_subpage_row.rs | 2 +- .../members_page/members_list_view/mod.rs | 2 +- .../content/room_details/members_page/mod.rs | 2 +- .../room_details/membership_subpage_item.rs | 2 +- src/session_view/content/room_details/mod.rs | 2 +- .../permissions/add_members_subpage.rs | 2 +- .../permissions/member_power_level.rs | 2 +- .../room_details/permissions/member_row.rs | 2 +- .../permissions/members_subpage.rs | 2 +- .../permissions/permissions_subpage.rs | 2 +- .../permissions/privileged_members.rs | 2 +- .../permissions/select_member_row.rs | 2 +- .../room_details/upgrade_dialog/mod.rs | 2 +- .../content/room_history/divider_row.rs | 2 +- .../event_actions/context_menu.rs | 4 +- .../room_history/event_actions/group.rs | 2 +- .../event_actions/properties_dialog.rs | 2 +- .../event_actions/quick_reaction_chooser.rs | 2 +- .../content/room_history/event_row.rs | 2 +- .../room_history/member_timestamp/mod.rs | 2 +- .../room_history/message_row/caption.rs | 2 +- .../room_history/message_row/content.rs | 2 +- .../message_row/message_state_stack.rs | 2 +- .../content/room_history/message_row/mod.rs | 2 +- .../room_history/message_row/reaction/mod.rs | 2 +- .../room_history/message_row/reaction_list.rs | 2 +- .../content/room_history/message_row/reply.rs | 2 +- .../room_history/message_row/sender_name.rs | 2 +- .../message_row/text/inline_html.rs | 2 +- .../room_history/message_row/text/mod.rs | 2 +- .../room_history/message_row/text/widgets.rs | 2 +- .../room_history/message_row/visual_media.rs | 2 +- .../completion/completion_popover.rs | 2 +- .../message_toolbar/completion/member_list.rs | 2 +- .../message_toolbar/completion/room_list.rs | 2 +- .../message_toolbar/composer_parser.rs | 2 +- .../message_toolbar/composer_state.rs | 2 +- .../room_history/message_toolbar/mod.rs | 2 +- src/session_view/content/room_history/mod.rs | 2 +- .../room_history/read_receipts_list/mod.rs | 2 +- .../content/room_history/state/content.rs | 2 +- .../room_history/state/group_item_row.rs | 2 +- .../content/room_history/state/group_row.rs | 2 +- .../content/room_history/state/row.rs | 2 +- .../content/room_history/title.rs | 2 +- .../content/room_history/typing_row.rs | 2 +- .../room_history/verification_info_bar.rs | 2 +- .../create_direct_chat_dialog/mod.rs | 2 +- .../create_direct_chat_dialog/user.rs | 2 +- .../create_direct_chat_dialog/user_list.rs | 2 +- src/session_view/create_room_dialog.rs | 2 +- src/session_view/media_viewer.rs | 2 +- src/session_view/mod.rs | 2 +- src/session_view/sidebar/icon_item_row.rs | 2 +- src/session_view/sidebar/mod.rs | 2 +- src/session_view/sidebar/room_row.rs | 2 +- src/session_view/sidebar/row.rs | 2 +- src/session_view/sidebar/section_row.rs | 2 +- src/session_view/sidebar/verification_row.rs | 2 +- src/utils/matrix/mod.rs | 2 +- src/utils/media/mod.rs | 2 +- src/utils/string/mod.rs | 2 +- src/utils/toast.rs | 2 +- src/window.rs | 2 +- 188 files changed, 1042 insertions(+), 1065 deletions(-) rename src/session/{model => }/global_account_data.rs (99%) rename src/session/{model => }/ignored_users.rs (100%) delete mode 100644 src/session/model/mod.rs delete mode 100644 src/session/model/session.rs rename src/session/{model => }/notifications/mod.rs (100%) rename src/session/{model => }/notifications/notifications_settings.rs (99%) rename src/session/{model => }/remote/cache.rs (97%) rename src/session/{model => }/remote/mod.rs (100%) rename src/session/{model => }/remote/room.rs (99%) rename src/session/{model => }/remote/user.rs (99%) rename src/session/{model => }/room/aliases.rs (100%) rename src/session/{model => }/room/category.rs (99%) rename src/session/{model => }/room/highlight_flags.rs (100%) rename src/session/{model => }/room/join_rule.rs (100%) rename src/session/{model => }/room/member.rs (99%) rename src/session/{model => }/room/member_list.rs (100%) rename src/session/{model => }/room/mod.rs (100%) rename src/session/{model => }/room/permissions.rs (100%) rename src/session/{model => }/room/timeline/event/mod.rs (99%) rename src/session/{model => }/room/timeline/event/reaction_group.rs (99%) rename src/session/{model => }/room/timeline/event/reaction_list.rs (99%) rename src/session/{model => }/room/timeline/mod.rs (100%) rename src/session/{model => }/room/timeline/timeline_diff_minimizer/mod.rs (100%) rename src/session/{model => }/room/timeline/timeline_diff_minimizer/tests.rs (100%) rename src/session/{model => }/room/timeline/timeline_item.rs (99%) rename src/session/{model => }/room/timeline/virtual_item.rs (100%) rename src/session/{model => }/room/typing_list.rs (100%) rename src/session/{model => }/room_list/metainfo.rs (99%) rename src/session/{model => }/room_list/mod.rs (99%) rename src/session/{model => }/room_list/room_info.rs (98%) rename src/session/{model => }/security.rs (100%) rename src/session/{model => }/session_settings.rs (100%) rename src/session/{model => }/sidebar_data/icon_item.rs (98%) rename src/session/{model => }/sidebar_data/item.rs (99%) rename src/session/{model => }/sidebar_data/item_list.rs (99%) rename src/session/{model => }/sidebar_data/list_model.rs (99%) rename src/session/{model => }/sidebar_data/mod.rs (100%) rename src/session/{model => }/sidebar_data/section/mod.rs (99%) rename src/session/{model => }/sidebar_data/section/name.rs (98%) rename src/session/{model => }/sidebar_data/section/room_category_filter.rs (98%) rename src/session/{model => }/user.rs (100%) rename src/session/{model => }/user_sessions_list/mod.rs (100%) rename src/session/{model => }/user_sessions_list/other_sessions_list.rs (99%) rename src/session/{model => }/user_sessions_list/user_session.rs (99%) rename src/session/{model => }/verification/identity_verification.rs (99%) rename src/session/{model => }/verification/mod.rs (100%) rename src/session/{model => }/verification/verification_list.rs (99%) diff --git a/po/POTFILES.in b/po/POTFILES.in index 52781eca..7a74c2d8 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -100,15 +100,15 @@ src/login/mod.blp src/login/session_setup_view.blp src/login/sso_idp_button.rs src/secret/linux.rs -src/session/model/session.rs -src/session/model/notifications/mod.rs -src/session/model/room/join_rule.rs -src/session/model/room/mod.rs -src/session/model/room/permissions.rs -src/session/model/room_list/mod.rs -src/session/model/sidebar_data/section/name.rs -src/session/model/sidebar_data/icon_item.rs -src/session/model/user_sessions_list/user_session.rs +src/session/mod.rs +src/session/notifications/mod.rs +src/session/room/join_rule.rs +src/session/room/mod.rs +src/session/room/permissions.rs +src/session/room_list/mod.rs +src/session/sidebar_data/section/name.rs +src/session/sidebar_data/icon_item.rs +src/session/user_sessions_list/user_session.rs src/session_view/content/explore/mod.blp src/session_view/content/explore/public_room_row.rs src/session_view/content/explore/servers_popover.blp diff --git a/src/account_chooser_dialog/account_row.rs b/src/account_chooser_dialog/account_row.rs index 647692c1..a5a339a8 100644 --- a/src/account_chooser_dialog/account_row.rs +++ b/src/account_chooser_dialog/account_row.rs @@ -3,7 +3,7 @@ use gtk::{glib, prelude::*, subclass::prelude::*}; use crate::{ components::{Avatar, AvatarData}, prelude::*, - session::model::Session, + session::Session, session_list::{FailedSession, SessionInfo}, }; diff --git a/src/account_settings/encryption_page/import_export_keys_subpage.rs b/src/account_settings/encryption_page/import_export_keys_subpage.rs index b1a1088a..ffdddc94 100644 --- a/src/account_settings/encryption_page/import_export_keys_subpage.rs +++ b/src/account_settings/encryption_page/import_export_keys_subpage.rs @@ -4,7 +4,7 @@ use gtk::{gio, glib}; use matrix_sdk::encryption::{KeyExportError, RoomKeyImportError}; use tracing::{debug, error}; -use crate::{components::LoadingButtonRow, session::model::Session, spawn_tokio, toast}; +use crate::{components::LoadingButtonRow, session::Session, spawn_tokio, toast}; #[derive(Debug, Default, Hash, Eq, PartialEq, Clone, Copy, glib::Enum)] #[repr(u32)] diff --git a/src/account_settings/encryption_page/mod.rs b/src/account_settings/encryption_page/mod.rs index 8f38b15c..ba172675 100644 --- a/src/account_settings/encryption_page/mod.rs +++ b/src/account_settings/encryption_page/mod.rs @@ -7,9 +7,7 @@ mod import_export_keys_subpage; pub(super) use self::import_export_keys_subpage::{ ImportExportKeysSubpage, ImportExportKeysSubpageMode, }; -use crate::session::model::{ - CryptoIdentityState, RecoveryState, Session, SessionVerificationState, -}; +use crate::session::{CryptoIdentityState, RecoveryState, Session, SessionVerificationState}; mod imp { use std::cell::RefCell; diff --git a/src/account_settings/general_page/change_password_subpage.rs b/src/account_settings/general_page/change_password_subpage.rs index 3c15fc91..3bb85b93 100644 --- a/src/account_settings/general_page/change_password_subpage.rs +++ b/src/account_settings/general_page/change_password_subpage.rs @@ -6,7 +6,7 @@ use tracing::error; use crate::{ components::{AuthDialog, AuthError, LoadingButtonRow}, - session::model::Session, + session::Session, toast, utils::matrix::validate_password, }; diff --git a/src/account_settings/general_page/deactivate_account_subpage.rs b/src/account_settings/general_page/deactivate_account_subpage.rs index f2d9b839..5106afc0 100644 --- a/src/account_settings/general_page/deactivate_account_subpage.rs +++ b/src/account_settings/general_page/deactivate_account_subpage.rs @@ -8,7 +8,7 @@ use super::AccountSettings; use crate::{ components::{AuthDialog, LoadingButtonRow}, prelude::*, - session::model::Session, + session::Session, toast, }; diff --git a/src/account_settings/general_page/log_out_subpage.rs b/src/account_settings/general_page/log_out_subpage.rs index 0a99868a..5e0cb434 100644 --- a/src/account_settings/general_page/log_out_subpage.rs +++ b/src/account_settings/general_page/log_out_subpage.rs @@ -5,7 +5,7 @@ use gtk::glib; use crate::{ account_settings::AccountSettings, components::LoadingButtonRow, - session::model::{CryptoIdentityState, RecoveryState, Session, SessionVerificationState}, + session::{CryptoIdentityState, RecoveryState, Session, SessionVerificationState}, toast, }; diff --git a/src/account_settings/general_page/mod.rs b/src/account_settings/general_page/mod.rs index 18ad6a23..846f5781 100644 --- a/src/account_settings/general_page/mod.rs +++ b/src/account_settings/general_page/mod.rs @@ -17,7 +17,7 @@ use super::AccountSettings; use crate::{ components::{ActionButton, ActionState, ButtonCountRow, CopyableRow, EditableAvatar}, prelude::*, - session::model::Session, + session::Session, spawn, spawn_tokio, toast, utils::{OngoingAsyncAction, TemplateCallbacks, media::FileInfo}, }; diff --git a/src/account_settings/mod.rs b/src/account_settings/mod.rs index f5333d77..ff79f277 100644 --- a/src/account_settings/mod.rs +++ b/src/account_settings/mod.rs @@ -23,7 +23,7 @@ use self::{ }; use crate::{ components::crypto::{CryptoIdentitySetupView, CryptoRecoverySetupView}, - session::model::Session, + session::Session, spawn, spawn_tokio, utils::BoundObjectWeakRef, }; diff --git a/src/account_settings/notifications_page.rs b/src/account_settings/notifications_page.rs index a53850bf..fd3c40c7 100644 --- a/src/account_settings/notifications_page.rs +++ b/src/account_settings/notifications_page.rs @@ -6,7 +6,7 @@ use tracing::error; use crate::{ components::{CheckLoadingRow, EntryAddRow, RemovableRow, SwitchLoadingRow}, i18n::gettext_f, - session::model::{NotificationsGlobalSetting, NotificationsSettings}, + session::{NotificationsGlobalSetting, NotificationsSettings}, spawn, toast, utils::{BoundObjectWeakRef, PlaceholderObject, SingleItemListModel}, }; diff --git a/src/account_settings/safety_page/ignored_users_subpage/ignored_user_row.rs b/src/account_settings/safety_page/ignored_users_subpage/ignored_user_row.rs index c45eedcf..787d7257 100644 --- a/src/account_settings/safety_page/ignored_users_subpage/ignored_user_row.rs +++ b/src/account_settings/safety_page/ignored_users_subpage/ignored_user_row.rs @@ -2,7 +2,7 @@ use gettextrs::gettext; use gtk::{glib, prelude::*, subclass::prelude::*}; use ruma::UserId; -use crate::{components::LoadingButton, session::model::IgnoredUsers, toast}; +use crate::{components::LoadingButton, session::IgnoredUsers, toast}; mod imp { use std::cell::RefCell; diff --git a/src/account_settings/safety_page/ignored_users_subpage/mod.rs b/src/account_settings/safety_page/ignored_users_subpage/mod.rs index f9eebf86..a159119c 100644 --- a/src/account_settings/safety_page/ignored_users_subpage/mod.rs +++ b/src/account_settings/safety_page/ignored_users_subpage/mod.rs @@ -5,7 +5,7 @@ use tracing::error; mod ignored_user_row; use self::ignored_user_row::IgnoredUserRow; -use crate::session::model::Session; +use crate::session::Session; mod imp { use std::cell::RefCell; diff --git a/src/account_settings/safety_page/mod.rs b/src/account_settings/safety_page/mod.rs index 8138f3c7..4a5708b5 100644 --- a/src/account_settings/safety_page/mod.rs +++ b/src/account_settings/safety_page/mod.rs @@ -9,7 +9,7 @@ mod ignored_users_subpage; pub(super) use self::ignored_users_subpage::IgnoredUsersSubpage; use crate::{ components::{ButtonCountRow, CheckLoadingRow, SwitchLoadingRow}, - session::model::Session, + session::Session, spawn, toast, }; diff --git a/src/account_settings/user_session/user_session_list_subpage.rs b/src/account_settings/user_session/user_session_list_subpage.rs index 355b1a66..10c5b7b4 100644 --- a/src/account_settings/user_session/user_session_list_subpage.rs +++ b/src/account_settings/user_session/user_session_list_subpage.rs @@ -4,7 +4,7 @@ use tracing::error; use super::UserSessionRow; use crate::{ - session::model::{Session, UserSession, UserSessionsList}, + session::{Session, UserSession, UserSessionsList}, utils::{BoundObject, LoadingState}, }; diff --git a/src/account_settings/user_session/user_session_row.rs b/src/account_settings/user_session/user_session_row.rs index ab44df27..aba28989 100644 --- a/src/account_settings/user_session/user_session_row.rs +++ b/src/account_settings/user_session/user_session_row.rs @@ -1,7 +1,7 @@ use adw::{prelude::*, subclass::prelude::*}; use gtk::glib; -use crate::{session::model::UserSession, utils::TemplateCallbacks}; +use crate::{session::UserSession, utils::TemplateCallbacks}; mod imp { use std::cell::RefCell; diff --git a/src/account_settings/user_session/user_session_subpage.rs b/src/account_settings/user_session/user_session_subpage.rs index b6cb8a53..81c4927e 100644 --- a/src/account_settings/user_session/user_session_subpage.rs +++ b/src/account_settings/user_session/user_session_subpage.rs @@ -9,7 +9,7 @@ use crate::{ components::{ActionButton, ActionState, AuthError, LoadingButtonRow}, gettext_f, prelude::*, - session::model::UserSession, + session::UserSession, toast, utils::{BoundConstructOnlyObject, BoundObject, TemplateCallbacks}, }; diff --git a/src/account_switcher/session_item.rs b/src/account_switcher/session_item.rs index 0b6e3c8e..8ef155ea 100644 --- a/src/account_switcher/session_item.rs +++ b/src/account_switcher/session_item.rs @@ -4,7 +4,7 @@ use super::avatar_with_selection::AvatarWithSelection; use crate::{ components::AvatarData, prelude::*, - session::model::Session, + session::Session, session_list::{FailedSession, SessionInfo}, }; diff --git a/src/application.rs b/src/application.rs index 63b51f0c..4c6c236c 100644 --- a/src/application.rs +++ b/src/application.rs @@ -9,7 +9,7 @@ use crate::{ GETTEXT_PACKAGE, Window, config, intent::SessionIntent, prelude::*, - session::model::{Session, SessionState}, + session::{Session, SessionState}, session_list::{FailedSession, SessionInfo, SessionList}, spawn, system_settings::SystemSettings, diff --git a/src/components/avatar/image.rs b/src/components/avatar/image.rs index c1013607..ce4d9089 100644 --- a/src/components/avatar/image.rs +++ b/src/components/avatar/image.rs @@ -10,7 +10,7 @@ use ruma::{ }; use crate::{ - session::model::Session, + session::Session, spawn, utils::{ CountedRef, diff --git a/src/components/avatar/mod.rs b/src/components/avatar/mod.rs index 90a6364b..2a053883 100644 --- a/src/components/avatar/mod.rs +++ b/src/components/avatar/mod.rs @@ -16,7 +16,7 @@ pub use self::{ }; use crate::{ components::AnimatedImagePaintable, - session::model::Room, + session::Room, utils::{BoundObject, BoundObjectWeakRef, CountedRef}, }; diff --git a/src/components/crypto/identity_setup_view.rs b/src/components/crypto/identity_setup_view.rs index 490f3122..6d765150 100644 --- a/src/components/crypto/identity_setup_view.rs +++ b/src/components/crypto/identity_setup_view.rs @@ -10,7 +10,7 @@ use super::{CryptoRecoverySetupInitialPage, CryptoRecoverySetupView}; use crate::{ components::{AuthDialog, AuthError, LoadingButton}, identity_verification_view::IdentityVerificationView, - session::model::{ + session::{ CryptoIdentityState, IdentityVerification, RecoveryState, Session, SessionVerificationState, }, spawn, toast, diff --git a/src/components/crypto/recovery_setup_view.rs b/src/components/crypto/recovery_setup_view.rs index 87934375..9698b83c 100644 --- a/src/components/crypto/recovery_setup_view.rs +++ b/src/components/crypto/recovery_setup_view.rs @@ -9,7 +9,7 @@ use tracing::{debug, error, warn}; use crate::{ components::{AuthDialog, AuthError, LoadingButton, SwitchLoadingRow}, - session::model::{RecoveryState, Session}, + session::{RecoveryState, Session}, spawn_tokio, toast, }; diff --git a/src/components/dialogs/auth/mod.rs b/src/components/dialogs/auth/mod.rs index 34f36492..cf77d6c8 100644 --- a/src/components/dialogs/auth/mod.rs +++ b/src/components/dialogs/auth/mod.rs @@ -22,7 +22,7 @@ mod password_page; use self::{in_browser_page::AuthDialogInBrowserPage, password_page::AuthDialogPasswordPage}; use crate::{ - components::ToastableDialog, prelude::*, session::model::Session, spawn_tokio, toast, + components::ToastableDialog, prelude::*, session::Session, spawn_tokio, toast, utils::OneshotNotifier, }; diff --git a/src/components/dialogs/message_dialogs.rs b/src/components/dialogs/message_dialogs.rs index 8c7f9494..dcf9a8d5 100644 --- a/src/components/dialogs/message_dialogs.rs +++ b/src/components/dialogs/message_dialogs.rs @@ -7,7 +7,7 @@ use crate::{ i18n::gettext_f, ngettext_f, prelude::*, - session::model::{Member, Membership, Room, RoomCategory, User}, + session::{Member, Membership, Room, RoomCategory, User}, }; /// Show a dialog to confirm leaving a room. diff --git a/src/components/dialogs/room_preview.rs b/src/components/dialogs/room_preview.rs index ad2aacd6..623cfe6c 100644 --- a/src/components/dialogs/room_preview.rs +++ b/src/components/dialogs/room_preview.rs @@ -8,7 +8,7 @@ use crate::{ components::{Avatar, LoadingButton}, i18n::ngettext_f, prelude::*, - session::model::{RemoteRoom, Session}, + session::{RemoteRoom, Session}, toast, utils::{ LoadingState, diff --git a/src/components/dialogs/user_profile.rs b/src/components/dialogs/user_profile.rs index 94bbd404..ab29cf30 100644 --- a/src/components/dialogs/user_profile.rs +++ b/src/components/dialogs/user_profile.rs @@ -6,7 +6,7 @@ use super::ToastableDialog; use crate::{ components::UserPage, prelude::*, - session::model::{Member, Session, User}, + session::{Member, Session, User}, utils::LoadingState, }; diff --git a/src/components/media/audio_player/mod.rs b/src/components/media/audio_player/mod.rs index 85485c94..a461ab80 100644 --- a/src/components/media/audio_player/mod.rs +++ b/src/components/media/audio_player/mod.rs @@ -11,7 +11,7 @@ mod waveform_paintable; use self::waveform::Waveform; use crate::{ MEDIA_FILE_NOTIFIER, - session::model::Session, + session::Session, spawn, utils::{ File, LoadingState, OneshotNotifier, diff --git a/src/components/offline_banner.rs b/src/components/offline_banner.rs index 4e5b2faf..9cbbefcb 100644 --- a/src/components/offline_banner.rs +++ b/src/components/offline_banner.rs @@ -1,7 +1,7 @@ use adw::{prelude::*, subclass::prelude::*}; use gtk::{gio, glib, glib::clone}; -use crate::{session::model::Session, utils::BoundObjectWeakRef}; +use crate::{session::Session, utils::BoundObjectWeakRef}; mod imp { use std::cell::RefCell; diff --git a/src/components/pill/at_room.rs b/src/components/pill/at_room.rs index 4df29c0d..c03ba133 100644 --- a/src/components/pill/at_room.rs +++ b/src/components/pill/at_room.rs @@ -2,7 +2,7 @@ use gettextrs::gettext; use gtk::{glib, prelude::*, subclass::prelude::*}; use ruma::RoomId; -use crate::{components::PillSource, prelude::*, session::model::Room}; +use crate::{components::PillSource, prelude::*, session::Room}; mod imp { use std::cell::OnceCell; diff --git a/src/components/pill/mod.rs b/src/components/pill/mod.rs index 192bd77e..3ba85ac2 100644 --- a/src/components/pill/mod.rs +++ b/src/components/pill/mod.rs @@ -15,7 +15,7 @@ pub use self::{ use super::{Avatar, AvatarImageSafetySetting, RoomPreviewDialog, UserProfileDialog}; use crate::{ prelude::*, - session::model::{Member, RemoteRoom, Room}, + session::{Member, RemoteRoom, Room}, session_view::SessionView, utils::{BoundObject, key_bindings}, }; diff --git a/src/components/pill/source.rs b/src/components/pill/source.rs index 77e1ca35..a1b2846b 100644 --- a/src/components/pill/source.rs +++ b/src/components/pill/source.rs @@ -3,7 +3,7 @@ use gtk::{glib, prelude::*, subclass::prelude::*}; use super::Pill; use crate::{ components::{AvatarData, AvatarImageSafetySetting}, - session::model::Room, + session::Room, }; mod imp { diff --git a/src/components/pill/source_row.rs b/src/components/pill/source_row.rs index 1692cc00..34a7ff14 100644 --- a/src/components/pill/source_row.rs +++ b/src/components/pill/source_row.rs @@ -1,7 +1,7 @@ use gtk::{glib, prelude::*, subclass::prelude::*}; use super::{AtRoom, Avatar, AvatarImageSafetySetting, PillSource}; -use crate::session::model::Room; +use crate::session::Room; mod imp { use std::cell::RefCell; diff --git a/src/components/power_level_selection/combo_box.rs b/src/components/power_level_selection/combo_box.rs index ddd0b4c4..bb7cc756 100644 --- a/src/components/power_level_selection/combo_box.rs +++ b/src/components/power_level_selection/combo_box.rs @@ -3,7 +3,7 @@ use gtk::{gdk, glib}; use ruma::{Int, events::room::power_levels::UserPowerLevel}; use super::PowerLevelSelectionPopover; -use crate::{components::RoleBadge, session::model::Permissions}; +use crate::{components::RoleBadge, session::Permissions}; mod imp { use std::cell::{Cell, RefCell}; diff --git a/src/components/power_level_selection/popover.rs b/src/components/power_level_selection/popover.rs index de024c84..37be2f7e 100644 --- a/src/components/power_level_selection/popover.rs +++ b/src/components/power_level_selection/popover.rs @@ -3,7 +3,7 @@ use gtk::{glib, glib::clone}; use ruma::events::room::power_levels::UserPowerLevel; use crate::{ - session::model::{POWER_LEVEL_ADMIN, POWER_LEVEL_MAX, POWER_LEVEL_MOD, Permissions}, + session::{POWER_LEVEL_ADMIN, POWER_LEVEL_MAX, POWER_LEVEL_MOD, Permissions}, utils::BoundObject, }; diff --git a/src/components/power_level_selection/row.rs b/src/components/power_level_selection/row.rs index 8fcc0a81..bb781961 100644 --- a/src/components/power_level_selection/row.rs +++ b/src/components/power_level_selection/row.rs @@ -5,7 +5,7 @@ use ruma::{Int, events::room::power_levels::UserPowerLevel, int}; use super::PowerLevelSelectionPopover; use crate::{ components::{LoadingBin, RoleBadge}, - session::model::Permissions, + session::Permissions, }; mod imp { diff --git a/src/components/role_badge.rs b/src/components/role_badge.rs index b074c36f..cd148c43 100644 --- a/src/components/role_badge.rs +++ b/src/components/role_badge.rs @@ -1,7 +1,7 @@ use adw::{prelude::*, subclass::prelude::*}; use gtk::glib; -use crate::session::model::MemberRole; +use crate::session::MemberRole; mod imp { use std::cell::Cell; diff --git a/src/components/user_page.rs b/src/components/user_page.rs index d9e8e69e..d5cb2c10 100644 --- a/src/components/user_page.rs +++ b/src/components/user_page.rs @@ -21,7 +21,7 @@ use crate::{ }, gettext_f, prelude::*, - session::model::{Member, Membership, Permissions, Room, User}, + session::{Member, Membership, Permissions, Room, User}, toast, utils::BoundObject, }; diff --git a/src/identity_verification_view/accept_request_page.rs b/src/identity_verification_view/accept_request_page.rs index 757930eb..c5f5a370 100644 --- a/src/identity_verification_view/accept_request_page.rs +++ b/src/identity_verification_view/accept_request_page.rs @@ -3,7 +3,7 @@ use gettextrs::gettext; use gtk::{glib, glib::clone, prelude::*}; use crate::{ - components::LoadingButton, gettext_f, prelude::*, session::model::IdentityVerification, toast, + components::LoadingButton, gettext_f, prelude::*, session::IdentityVerification, toast, }; mod imp { diff --git a/src/identity_verification_view/cancelled_page.rs b/src/identity_verification_view/cancelled_page.rs index f044f00d..a5e0cd17 100644 --- a/src/identity_verification_view/cancelled_page.rs +++ b/src/identity_verification_view/cancelled_page.rs @@ -5,7 +5,7 @@ use matrix_sdk::crypto::CancelInfo; use ruma::events::key::verification::cancel::CancelCode; use crate::{ - components::LoadingButton, gettext_f, prelude::*, session::model::IdentityVerification, toast, + components::LoadingButton, gettext_f, prelude::*, session::IdentityVerification, toast, utils::BoundObjectWeakRef, }; diff --git a/src/identity_verification_view/choose_method_page.rs b/src/identity_verification_view/choose_method_page.rs index 7ed633a5..6d38cf38 100644 --- a/src/identity_verification_view/choose_method_page.rs +++ b/src/identity_verification_view/choose_method_page.rs @@ -7,7 +7,7 @@ use crate::{ contrib::QRCode, gettext_f, prelude::*, - session::model::{IdentityVerification, VerificationSupportedMethods}, + session::{IdentityVerification, VerificationSupportedMethods}, toast, utils::BoundObjectWeakRef, }; diff --git a/src/identity_verification_view/completed_page.rs b/src/identity_verification_view/completed_page.rs index 13d8025c..12716b38 100644 --- a/src/identity_verification_view/completed_page.rs +++ b/src/identity_verification_view/completed_page.rs @@ -2,7 +2,7 @@ use adw::{prelude::*, subclass::prelude::*}; use gettextrs::gettext; use gtk::{glib, glib::clone}; -use crate::{gettext_f, prelude::*, session::model::IdentityVerification}; +use crate::{gettext_f, prelude::*, session::IdentityVerification}; mod imp { use std::cell::RefCell; diff --git a/src/identity_verification_view/confirm_qr_code_page.rs b/src/identity_verification_view/confirm_qr_code_page.rs index 61f92ec5..be917d29 100644 --- a/src/identity_verification_view/confirm_qr_code_page.rs +++ b/src/identity_verification_view/confirm_qr_code_page.rs @@ -3,7 +3,7 @@ use gettextrs::gettext; use gtk::{glib, glib::clone}; use crate::{ - components::LoadingButton, gettext_f, prelude::*, session::model::IdentityVerification, toast, + components::LoadingButton, gettext_f, prelude::*, session::IdentityVerification, toast, }; mod imp { diff --git a/src/identity_verification_view/mod.rs b/src/identity_verification_view/mod.rs index 5be6b706..53f44c79 100644 --- a/src/identity_verification_view/mod.rs +++ b/src/identity_verification_view/mod.rs @@ -23,7 +23,7 @@ use self::{ scan_qr_code_page::ScanQrCodePage, wait_for_other_page::WaitForOtherPage, }; use crate::{ - session::model::{IdentityVerification, VerificationState}, + session::{IdentityVerification, VerificationState}, utils::BoundObject, }; diff --git a/src/identity_verification_view/no_supported_methods_page.rs b/src/identity_verification_view/no_supported_methods_page.rs index 23fb3a90..0fbc4712 100644 --- a/src/identity_verification_view/no_supported_methods_page.rs +++ b/src/identity_verification_view/no_supported_methods_page.rs @@ -3,7 +3,7 @@ use gettextrs::gettext; use gtk::{glib, glib::clone}; use crate::{ - components::LoadingButton, gettext_f, prelude::*, session::model::IdentityVerification, toast, + components::LoadingButton, gettext_f, prelude::*, session::IdentityVerification, toast, utils::BoundObjectWeakRef, }; diff --git a/src/identity_verification_view/qr_code_scanned_page.rs b/src/identity_verification_view/qr_code_scanned_page.rs index 7102e44d..5072ee3f 100644 --- a/src/identity_verification_view/qr_code_scanned_page.rs +++ b/src/identity_verification_view/qr_code_scanned_page.rs @@ -3,7 +3,7 @@ use gettextrs::gettext; use gtk::{glib, glib::clone}; use crate::{ - components::LoadingButton, gettext_f, prelude::*, session::model::IdentityVerification, toast, + components::LoadingButton, gettext_f, prelude::*, session::IdentityVerification, toast, }; mod imp { diff --git a/src/identity_verification_view/room_left_page.rs b/src/identity_verification_view/room_left_page.rs index 613684e8..aa43a543 100644 --- a/src/identity_verification_view/room_left_page.rs +++ b/src/identity_verification_view/room_left_page.rs @@ -1,7 +1,7 @@ use adw::{prelude::*, subclass::prelude::*}; use gtk::glib; -use crate::session::model::IdentityVerification; +use crate::session::IdentityVerification; mod imp { use glib::subclass::InitializingObject; diff --git a/src/identity_verification_view/sas_page.rs b/src/identity_verification_view/sas_page.rs index ff2aead0..30acf2f5 100644 --- a/src/identity_verification_view/sas_page.rs +++ b/src/identity_verification_view/sas_page.rs @@ -6,7 +6,7 @@ use gtk::{gio, glib, glib::clone}; use super::sas_emoji::SasEmoji; use crate::{ - components::LoadingButton, gettext_f, prelude::*, session::model::IdentityVerification, toast, + components::LoadingButton, gettext_f, prelude::*, session::IdentityVerification, toast, utils::BoundObjectWeakRef, }; diff --git a/src/identity_verification_view/scan_qr_code_page.rs b/src/identity_verification_view/scan_qr_code_page.rs index 73230081..e1ffa646 100644 --- a/src/identity_verification_view/scan_qr_code_page.rs +++ b/src/identity_verification_view/scan_qr_code_page.rs @@ -8,7 +8,7 @@ use crate::{ components::{LoadingButton, QrCodeScanner}, gettext_f, prelude::*, - session::model::{IdentityVerification, VerificationSupportedMethods}, + session::{IdentityVerification, VerificationSupportedMethods}, spawn, toast, utils::BoundConstructOnlyObject, }; diff --git a/src/identity_verification_view/wait_for_other_page.rs b/src/identity_verification_view/wait_for_other_page.rs index 28e570d5..93ad951e 100644 --- a/src/identity_verification_view/wait_for_other_page.rs +++ b/src/identity_verification_view/wait_for_other_page.rs @@ -3,7 +3,7 @@ use gettextrs::gettext; use gtk::{glib, glib::clone}; use crate::{ - components::LoadingButton, gettext_f, prelude::*, session::model::IdentityVerification, toast, + components::LoadingButton, gettext_f, prelude::*, session::IdentityVerification, toast, }; mod imp { diff --git a/src/intent.rs b/src/intent.rs index 4df8be4d..74704f31 100644 --- a/src/intent.rs +++ b/src/intent.rs @@ -2,7 +2,7 @@ use std::borrow::Cow; use gtk::{glib, prelude::*}; -use crate::{session::model::VerificationKey, utils::matrix::MatrixIdUri}; +use crate::{session::VerificationKey, utils::matrix::MatrixIdUri}; /// Intents that can be handled by a session. /// diff --git a/src/login/mod.rs b/src/login/mod.rs index 76ea55ec..77c3d7ce 100644 --- a/src/login/mod.rs +++ b/src/login/mod.rs @@ -34,8 +34,8 @@ use self::{ }; use crate::{ APP_HOMEPAGE_URL, APP_NAME, Application, RUNTIME, SETTINGS_KEY_CURRENT_SESSION, Window, - components::OfflineBanner, prelude::*, secret::Secret, session::model::Session, spawn, - spawn_tokio, toast, + components::OfflineBanner, prelude::*, secret::Secret, session::Session, spawn, spawn_tokio, + toast, }; /// A page of the login stack. diff --git a/src/login/session_setup_view.rs b/src/login/session_setup_view.rs index 65973503..45508983 100644 --- a/src/login/session_setup_view.rs +++ b/src/login/session_setup_view.rs @@ -8,7 +8,7 @@ use crate::{ components::crypto::{ CryptoIdentitySetupNextStep, CryptoIdentitySetupView, CryptoRecoverySetupView, }, - session::model::{CryptoIdentityState, RecoveryState, Session, SessionVerificationState}, + session::{CryptoIdentityState, RecoveryState, Session, SessionVerificationState}, spawn, spawn_tokio, }; diff --git a/src/prelude.rs b/src/prelude.rs index 914b539e..0a23ceae 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -4,7 +4,7 @@ pub(crate) use crate::{ ToastableDialogExt, ToastableDialogImpl, }, secret::SecretExt, - session::model::{TimelineItemExt, UserExt}, + session::{TimelineItemExt, UserExt}, session_list::SessionInfoExt, user_facing_error::UserFacingError, utils::{ diff --git a/src/session/model/global_account_data.rs b/src/session/global_account_data.rs similarity index 99% rename from src/session/model/global_account_data.rs rename to src/session/global_account_data.rs index 2214c9de..ed62d9be 100644 --- a/src/session/model/global_account_data.rs +++ b/src/session/global_account_data.rs @@ -12,7 +12,7 @@ use tokio::task::AbortHandle; use tracing::error; use super::{Room, Session}; -use crate::{session::model::JoinRuleValue, spawn, spawn_tokio}; +use crate::{session::JoinRuleValue, spawn, spawn_tokio}; /// We default the media previews setting to private. const DEFAULT_MEDIA_PREVIEWS: MediaPreviews = MediaPreviews::Private; diff --git a/src/session/model/ignored_users.rs b/src/session/ignored_users.rs similarity index 100% rename from src/session/model/ignored_users.rs rename to src/session/ignored_users.rs diff --git a/src/session/mod.rs b/src/session/mod.rs index 65880be0..78df3f06 100644 --- a/src/session/mod.rs +++ b/src/session/mod.rs @@ -1 +1,867 @@ -pub mod model; +use std::time::Duration; + +use futures_util::{StreamExt, lock::Mutex}; +use gettextrs::gettext; +use gtk::{gio, glib, glib::clone, prelude::*, subclass::prelude::*}; +use matrix_sdk::{ + Client, SessionChange, config::SyncSettings, media::MediaRetentionPolicy, sync::SyncResponse, +}; +use ruma::{ + api::client::{ + filter::{FilterDefinition, RoomFilter}, + profile::{AvatarUrl, DisplayName}, + search::search_events::v3::UserProfile, + }, + assign, +}; +use tokio::{task::AbortHandle, time::sleep}; +use tokio_stream::wrappers::BroadcastStream; +use tracing::{debug, error, info}; + +mod global_account_data; +mod ignored_users; +mod notifications; +mod remote; +mod room; +mod room_list; +mod security; +mod session_settings; +mod sidebar_data; +mod user; +mod user_sessions_list; +mod verification; + +pub(crate) use self::{ + global_account_data::*, ignored_users::*, notifications::*, remote::*, room::*, room_list::*, + security::*, session_settings::*, sidebar_data::*, user::*, user_sessions_list::*, + verification::*, +}; +use crate::{ + Application, + components::AvatarData, + prelude::*, + secret::StoredSession, + session_list::{SessionInfo, SessionInfoImpl}, + spawn, spawn_tokio, + utils::{ + TokioDrop, + matrix::{self, ClientSetupError}, + }, +}; + +/// The database key for persisting the session's profile. +const SESSION_PROFILE_KEY: &str = "session_profile"; +/// The number of consecutive missed synchronizations before the session is +/// marked as offline. +/// +/// Note that this is set to `2`, but the count begins at `0` so this would +/// match the third missed synchronization. +const MISSED_SYNC_OFFLINE_COUNT: usize = 2; +/// The delays in seconds to wait for when a sync fails, depending on the number +/// of missed attempts. +const MISSED_SYNC_DELAYS: &[u64] = &[1, 5, 10, 20, 30]; + +/// The state of the session. +#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, glib::Enum)] +#[repr(i32)] +#[enum_type(name = "SessionState")] +pub enum SessionState { + LoggedOut = -1, + #[default] + Init = 0, + InitialSync = 1, + Ready = 2, +} + +mod imp { + use std::cell::{Cell, OnceCell, RefCell}; + + use super::*; + + #[derive(Debug, Default, glib::Properties)] + #[properties(wrapper_type = super::Session)] + pub struct Session { + /// The Matrix client for this session. + client: OnceCell>, + /// The list model of the sidebar. + #[property(get = Self::sidebar_list_model)] + sidebar_list_model: OnceCell, + /// The user of this session. + #[property(get = Self::user)] + user: OnceCell, + /// The current state of the session. + #[property(get, builder(SessionState::default()))] + state: Cell, + /// Whether this session has a connection to the homeserver. + #[property(get)] + is_homeserver_reachable: Cell, + /// Whether this session is synchronized with the homeserver. + #[property(get)] + is_offline: Cell, + /// The current settings for this session. + #[property(get, construct_only)] + settings: OnceCell, + /// The settings in the global account data for this session. + #[property(get = Self::global_account_data_owned)] + global_account_data: OnceCell, + /// The notifications API for this session. + #[property(get)] + notifications: Notifications, + /// The ignored users API for this session. + #[property(get)] + ignored_users: IgnoredUsers, + /// The list of sessions for this session's user. + #[property(get)] + user_sessions: UserSessionsList, + /// Information about security for this session. + #[property(get)] + security: SessionSecurity, + /// The cache for remote data. + remote_cache: OnceCell, + session_changes_handle: RefCell>, + sync_handle: RefCell>, + network_monitor_handler_id: RefCell>, + homeserver_reachable_lock: Mutex<()>, + homeserver_reachable_source: RefCell>, + /// The number of missed synchronizations in a row. + /// + /// Capped at `MISSED_SYNC_DELAYS.len() - 1`. + missed_sync_count: Cell, + } + + #[glib::object_subclass] + impl ObjectSubclass for Session { + const NAME: &'static str = "Session"; + type Type = super::Session; + type ParentType = SessionInfo; + } + + #[glib::derived_properties] + impl ObjectImpl for Session { + fn dispose(&self) { + // Needs to be disconnected or else it may restart the sync + if let Some(handler_id) = self.network_monitor_handler_id.take() { + gio::NetworkMonitor::default().disconnect(handler_id); + } + + if let Some(source) = self.homeserver_reachable_source.take() { + source.remove(); + } + + if let Some(handle) = self.session_changes_handle.take() { + handle.abort(); + } + + if let Some(handle) = self.sync_handle.take() { + handle.abort(); + } + } + } + + impl SessionInfoImpl for Session { + fn avatar_data(&self) -> AvatarData { + self.user().avatar_data().clone() + } + } + + impl Session { + /// Set the Matrix client for this session. + pub(super) fn set_client(&self, client: Client) { + self.client + .set(TokioDrop::new(client)) + .expect("client should be uninitialized"); + + let obj = self.obj(); + + self.ignored_users.set_session(Some(obj.clone())); + self.notifications.set_session(Some(obj.clone())); + self.user_sessions.init(&obj, obj.user_id().clone()); + + let monitor = gio::NetworkMonitor::default(); + let handler_id = monitor.connect_network_changed(clone!( + #[weak(rename_to = imp)] + self, + move |_, _| { + spawn!(async move { + imp.update_homeserver_reachable().await; + }); + } + )); + self.network_monitor_handler_id.replace(Some(handler_id)); + } + + /// The Matrix client for this session. + pub(super) fn client(&self) -> &Client { + self.client.get().expect("client should be initialized") + } + + /// The list model of the sidebar. + fn sidebar_list_model(&self) -> SidebarListModel { + self.sidebar_list_model + .get_or_init(|| { + let obj = self.obj(); + let item_list = + SidebarItemList::new(&RoomList::new(&obj), &VerificationList::new(&obj)); + SidebarListModel::new(&item_list) + }) + .clone() + } + + /// The room list of this session. + pub(super) fn room_list(&self) -> RoomList { + self.sidebar_list_model().item_list().room_list() + } + + /// The verification list of this session. + pub(super) fn verification_list(&self) -> VerificationList { + self.sidebar_list_model().item_list().verification_list() + } + + /// The user of the session. + fn user(&self) -> User { + self.user + .get_or_init(|| { + let obj = self.obj(); + User::new(&obj, obj.info().user_id.clone()) + }) + .clone() + } + + /// Set the current state of the session. + fn set_state(&self, state: SessionState) { + let old_state = self.state.get(); + + if old_state == SessionState::LoggedOut || old_state == state { + // The session should be dismissed when it has been logged out, so + // we do not accept anymore state changes. + return; + } + + self.state.set(state); + self.obj().notify_state(); + } + + /// The homeserver URL as a `GNetworkAddress`. + fn homeserver_address(&self) -> gio::NetworkAddress { + let obj = self.obj(); + let homeserver = obj.homeserver(); + let default_port = if homeserver.scheme() == "http" { + 80 + } else { + 443 + }; + + gio::NetworkAddress::parse_uri(homeserver.as_str(), default_port) + .expect("url is parsed successfully") + } + + /// Check whether the homeserver is reachable. + pub(super) async fn update_homeserver_reachable(&self) { + // If there is a timeout, remove it, we will add a new one later if needed. + if let Some(source) = self.homeserver_reachable_source.take() { + source.remove(); + } + let Some(_guard) = self.homeserver_reachable_lock.try_lock() else { + // There is an ongoing check. + return; + }; + + let monitor = gio::NetworkMonitor::default(); + let is_network_available = monitor.is_network_available(); + + let is_homeserver_reachable = if is_network_available { + // Check if we can reach the homeserver. + let address = self.homeserver_address(); + + match monitor.can_reach_future(&address).await { + Ok(()) => true, + Err(error) => { + error!( + session = self.obj().session_id(), + "Homeserver is not reachable: {error}" + ); + false + } + } + } else { + false + }; + + self.set_is_homeserver_reachable(is_homeserver_reachable); + + if is_network_available && !is_homeserver_reachable { + // Check again later if the homeserver is reachable. + let source = glib::timeout_add_seconds_local_once( + 10, + clone!( + #[weak(rename_to = imp)] + self, + move || { + imp.homeserver_reachable_source.take(); + + spawn!(async move { + imp.update_homeserver_reachable().await; + }); + } + ), + ); + self.homeserver_reachable_source.replace(Some(source)); + } + } + + /// Set whether the homeserver is reachable. + fn set_is_homeserver_reachable(&self, is_reachable: bool) { + if self.is_homeserver_reachable.get() == is_reachable { + return; + } + let obj = self.obj(); + + self.is_homeserver_reachable.set(is_reachable); + + if let Some(handle) = self.sync_handle.take() { + handle.abort(); + } + + if is_reachable { + info!(session = obj.session_id(), "Homeserver is reachable"); + + // Restart the sync loop. + self.sync(); + } else { + self.set_offline(true); + } + + obj.notify_is_homeserver_reachable(); + } + + /// Set whether this session is synchronized with the homeserver. + pub(super) fn set_offline(&self, is_offline: bool) { + if self.is_offline.get() == is_offline { + return; + } + + if !is_offline { + // Restart the send queues, in case they were stopped. + let client = self.client().clone(); + spawn_tokio!(async move { + client.send_queue().set_enabled(true).await; + }); + } + + self.is_offline.set(is_offline); + self.obj().notify_is_offline(); + } + + /// The settings stored in the global account data for this session. + fn global_account_data(&self) -> &GlobalAccountData { + self.global_account_data + .get_or_init(|| GlobalAccountData::new(&self.obj())) + } + + /// The owned settings stored in the global account data for this + /// session. + fn global_account_data_owned(&self) -> GlobalAccountData { + self.global_account_data().clone() + } + + /// The cache for remote data. + pub(super) fn remote_cache(&self) -> &RemoteCache { + self.remote_cache + .get_or_init(|| RemoteCache::new(self.obj().clone())) + } + + /// Finish initialization of this session. + pub(super) async fn prepare(&self) { + spawn!( + glib::Priority::LOW, + clone!( + #[weak(rename_to = imp)] + self, + async move { + // First, load the profile from the cache, it will be quicker. + imp.init_user_profile().await; + // Then, check if the profile changed. + imp.update_user_profile().await; + } + ) + ); + + self.global_account_data(); + self.watch_session_changes(); + self.update_homeserver_reachable().await; + + self.room_list().load().await; + self.verification_list().init(); + self.security.set_session(Some(&*self.obj())); + + let client = self.client().clone(); + spawn_tokio!(async move { + client + .send_queue() + .respawn_tasks_for_rooms_with_unsent_requests() + .await; + }); + + self.set_state(SessionState::InitialSync); + self.sync(); + + debug!( + session = self.obj().session_id(), + "A new session was prepared" + ); + } + + /// Watch the changes of the session, like being logged out or the + /// tokens being refreshed. + fn watch_session_changes(&self) { + let receiver = self.client().subscribe_to_session_changes(); + let stream = BroadcastStream::new(receiver); + + let obj_weak = glib::SendWeakRef::from(self.obj().downgrade()); + let fut = stream.for_each(move |change| { + let obj_weak = obj_weak.clone(); + async move { + let Ok(change) = change else { + return; + }; + + let ctx = glib::MainContext::default(); + ctx.spawn(async move { + spawn!(async move { + if let Some(obj) = obj_weak.upgrade() { + match change { + SessionChange::UnknownToken { .. } => { + info!( + session = obj.session_id(), + "The access token is invalid, cleaning up the session…" + ); + obj.imp().clean_up().await; + } + SessionChange::TokensRefreshed => { + obj.imp().store_tokens().await; + } + } + } + }); + }); + } + }); + + let handle = spawn_tokio!(fut).abort_handle(); + self.session_changes_handle.replace(Some(handle)); + } + + /// Start syncing the Matrix client. + fn sync(&self) { + if self.state.get() < SessionState::InitialSync || !self.is_homeserver_reachable.get() { + return; + } + + let client = self.client().clone(); + let obj_weak = glib::SendWeakRef::from(self.obj().downgrade()); + + let handle = spawn_tokio!(async move { + // Make sure that the event cache is subscribed to sync responses to benefit + // from it. + if let Err(error) = client.event_cache().subscribe() { + error!("Could not subscribe event cache to sync responses: {error}"); + } + + // TODO: only create the filter once and reuse it in the future + let filter = assign!(FilterDefinition::default(), { + room: assign!(RoomFilter::with_lazy_loading(), { + include_leave: true, + }), + }); + + let sync_settings = SyncSettings::new() + .timeout(Duration::from_secs(30)) + .ignore_timeout_on_first_sync(true) + .filter(filter.into()); + + let mut sync_stream = Box::pin(client.sync_stream(sync_settings).await); + while let Some(response) = sync_stream.next().await { + let obj_weak = obj_weak.clone(); + let ctx = glib::MainContext::default(); + let delay = ctx + .spawn(async move { + spawn!(async move { + if let Some(obj) = obj_weak.upgrade() { + obj.imp().handle_sync_response(response) + } else { + None + } + }) + .await + .expect("task was not aborted") + }) + .await + .expect("task was not aborted"); + + if let Some(delay) = delay { + sleep(delay).await; + } + } + }) + .abort_handle(); + + self.sync_handle.replace(Some(handle)); + } + + /// Handle the response received via sync. + /// + /// Returns the delay to wait for before making the next sync, if + /// necessary. + fn handle_sync_response( + &self, + response: Result, + ) -> Option { + let obj = self.obj(); + let session_id = obj.session_id(); + debug!(session = session_id, "Received sync response"); + + match response { + Ok(response) => { + self.room_list().handle_room_updates(response.rooms); + + if self.state.get() < SessionState::Ready { + self.set_state(SessionState::Ready); + self.init_notifications(); + } + + self.set_offline(false); + self.missed_sync_count.set(0); + + None + } + Err(error) => { + let missed_sync_count = self.missed_sync_count.get(); + + // If there are too many failed attempts, mark the session as offline. + if missed_sync_count == MISSED_SYNC_OFFLINE_COUNT { + self.set_offline(true); + } + + // Increase the count of missed syncs, if we have not reached the maximum value. + if missed_sync_count < 4 { + self.missed_sync_count.set(missed_sync_count + 1); + } + + error!(session = session_id, "Could not perform sync: {error}"); + + // Sleep a little between attempts. + let delay = MISSED_SYNC_DELAYS[missed_sync_count]; + Some(Duration::from_secs(delay)) + } + } + } + + /// Load the cached profile of the user of this session. + async fn init_user_profile(&self) { + let client = self.client().clone(); + let handle = spawn_tokio!(async move { + client + .state_store() + .get_custom_value(SESSION_PROFILE_KEY.as_bytes()) + .await + }); + + let profile = match handle.await.expect("task was not aborted") { + Ok(Some(bytes)) => match serde_json::from_slice::(&bytes) { + Ok(profile) => profile, + Err(error) => { + error!( + session = self.obj().session_id(), + "Could not deserialize session profile: {error}" + ); + return; + } + }, + Ok(None) => return, + Err(error) => { + error!( + session = self.obj().session_id(), + "Could not load cached session profile: {error}" + ); + return; + } + }; + + let user = self.user(); + user.set_name(profile.displayname); + user.set_avatar_url(profile.avatar_url); + } + + /// Update the profile of this session’s user. + /// + /// Fetches the updated profile and updates the local data. + async fn update_user_profile(&self) { + let client = self.client().clone(); + let client_clone = client.clone(); + let handle = + spawn_tokio!(async move { client_clone.account().fetch_user_profile().await }); + + let profile = match handle + .await + .expect("task was not aborted") + .and_then(|response| { + let mut profile = UserProfile::new(); + profile.displayname = response.get_static::()?; + profile.avatar_url = response.get_static::()?; + + Ok(profile) + }) { + Ok(profile) => profile, + Err(error) => { + error!( + session = self.obj().session_id(), + "Could not fetch session profile: {error}" + ); + return; + } + }; + + let user = self.user(); + + if Some(user.display_name()) == profile.displayname + && user + .avatar_data() + .image() + .is_some_and(|i| i.uri() == profile.avatar_url) + { + // Nothing to update. + return; + } + + // Serialize first for caching to avoid a clone. + let value = serde_json::to_vec(&profile); + + // Update the profile for the UI. + user.set_name(profile.displayname); + user.set_avatar_url(profile.avatar_url); + + // Update the cache. + let value = match value { + Ok(value) => value, + Err(error) => { + error!( + session = self.obj().session_id(), + "Could not serialize session profile: {error}" + ); + return; + } + }; + + let handle = spawn_tokio!(async move { + client + .state_store() + .set_custom_value(SESSION_PROFILE_KEY.as_bytes(), value) + .await + }); + + if let Err(error) = handle.await.expect("task was not aborted") { + error!( + session = self.obj().session_id(), + "Could not cache session profile: {error}" + ); + } + } + + /// Start listening to notifications. + fn init_notifications(&self) { + let obj_weak = glib::SendWeakRef::from(self.obj().downgrade()); + let client = self.client().clone(); + + spawn_tokio!(async move { + client + .register_notification_handler(move |notification, room, _| { + let obj_weak = obj_weak.clone(); + async move { + let ctx = glib::MainContext::default(); + ctx.spawn(async move { + spawn!(async move { + if let Some(obj) = obj_weak.upgrade() { + obj.notifications().show_push(notification, room).await; + } + }); + }); + } + }) + .await; + }); + } + + /// Update the stored session tokens. + async fn store_tokens(&self) { + let Some(session_tokens) = self.client().session_tokens() else { + return; + }; + + debug!( + session = self.obj().session_id(), + "Storing updated session tokens…" + ); + self.obj().info().store_tokens(session_tokens).await; + } + + /// Clean up this session after it was logged out. + /// + /// This should only be called if the session has been logged out + /// without calling `Session::log_out`. + pub(super) async fn clean_up(&self) { + let obj = self.obj(); + self.set_state(SessionState::LoggedOut); + + if let Some(handle) = self.sync_handle.take() { + handle.abort(); + } + + if let Some(settings) = self.settings.get() { + settings.delete(); + } + + obj.info().clone().delete().await; + + self.notifications.clear(); + + debug!( + session = obj.session_id(), + "The logged out session was cleaned up" + ); + } + } +} + +glib::wrapper! { + /// A Matrix user session. + pub struct Session(ObjectSubclass) + @extends SessionInfo; +} + +impl Session { + /// Construct an existing session. + pub(crate) async fn new( + stored_session: StoredSession, + settings: SessionSettings, + ) -> Result { + let tokens = stored_session + .load_tokens() + .await + .ok_or(ClientSetupError::NoSessionTokens)?; + + let stored_session_clone = stored_session.clone(); + let client = spawn_tokio!(async move { + let client = matrix::client_with_stored_session(stored_session_clone, tokens).await?; + + // Make sure that we use the proper retention policy. + let media = client.media(); + let used_media_retention_policy = media.media_retention_policy().await?; + let wanted_media_retention_policy = MediaRetentionPolicy::default(); + + if used_media_retention_policy != wanted_media_retention_policy { + media + .set_media_retention_policy(wanted_media_retention_policy) + .await?; + } + + Ok::<_, ClientSetupError>(client) + }) + .await + .expect("task was not aborted")?; + + let obj = glib::Object::builder::() + .property("info", stored_session) + .property("settings", settings) + .build(); + obj.imp().set_client(client); + + Ok(obj) + } + + /// Create a new session from the session of the given Matrix client. + pub(crate) async fn create(client: &Client) -> Result { + let stored_session = StoredSession::new(client).await?; + let settings = Application::default() + .session_list() + .settings() + .get_or_create(&stored_session.id); + + Self::new(stored_session, settings).await + } + + /// Finish initialization of this session. + pub(crate) async fn prepare(&self) { + self.imp().prepare().await; + } + + /// The room list of this session. + pub(crate) fn room_list(&self) -> RoomList { + self.imp().room_list() + } + + /// The verification list of this session. + pub(crate) fn verification_list(&self) -> VerificationList { + self.imp().verification_list() + } + + /// The Matrix client. + pub(crate) fn client(&self) -> Client { + self.imp().client().clone() + } + + /// The cache for remote data. + pub(crate) fn remote_cache(&self) -> &RemoteCache { + self.imp().remote_cache() + } + + /// Log out of this session. + pub(crate) async fn log_out(&self) -> Result<(), String> { + debug!( + session = self.session_id(), + "The session is about to be logged out" + ); + + let client = self.client(); + let handle = spawn_tokio!(async move { client.logout().await }); + + match handle.await.expect("task was not aborted") { + Ok(()) => { + self.imp().clean_up().await; + Ok(()) + } + Err(error) => { + error!( + session = self.session_id(), + "Could not log the session out: {error}" + ); + Err(gettext("Could not log the session out")) + } + } + } + + /// Clean up this session after it was logged out. + /// + /// This should only be called if the session has been logged out without + /// calling `Session::log_out`. + pub(crate) async fn clean_up(&self) { + self.imp().clean_up().await; + } + + /// Connect to the signal emitted when this session is logged out. + pub(crate) fn connect_logged_out(&self, f: F) -> glib::SignalHandlerId { + self.connect_state_notify(move |obj| { + if obj.state() == SessionState::LoggedOut { + f(obj); + } + }) + } + + /// Connect to the signal emitted when this session is ready. + pub(crate) fn connect_ready(&self, f: F) -> glib::SignalHandlerId { + self.connect_state_notify(move |obj| { + if obj.state() == SessionState::Ready { + f(obj); + } + }) + } +} diff --git a/src/session/model/mod.rs b/src/session/model/mod.rs deleted file mode 100644 index 50b11ca6..00000000 --- a/src/session/model/mod.rs +++ /dev/null @@ -1,34 +0,0 @@ -mod global_account_data; -mod ignored_users; -mod notifications; -mod remote; -mod room; -mod room_list; -mod security; -mod session; -mod session_settings; -mod sidebar_data; -mod user; -mod user_sessions_list; -mod verification; - -pub(crate) use self::{ - global_account_data::*, - ignored_users::IgnoredUsers, - notifications::{ - Notifications, NotificationsGlobalSetting, NotificationsRoomSetting, NotificationsSettings, - }, - remote::*, - room::*, - room_list::*, - security::*, - session::*, - session_settings::*, - sidebar_data::{ - SidebarIconItem, SidebarIconItemType, SidebarItemList, SidebarListModel, SidebarSection, - SidebarSectionName, - }, - user::{User, UserExt}, - user_sessions_list::{UserSession, UserSessionsList}, - verification::*, -}; diff --git a/src/session/model/session.rs b/src/session/model/session.rs deleted file mode 100644 index 63ae799e..00000000 --- a/src/session/model/session.rs +++ /dev/null @@ -1,853 +0,0 @@ -use std::time::Duration; - -use futures_util::{StreamExt, lock::Mutex}; -use gettextrs::gettext; -use gtk::{gio, glib, glib::clone, prelude::*, subclass::prelude::*}; -use matrix_sdk::{ - Client, SessionChange, config::SyncSettings, media::MediaRetentionPolicy, sync::SyncResponse, -}; -use ruma::{ - api::client::{ - filter::{FilterDefinition, RoomFilter}, - profile::{AvatarUrl, DisplayName}, - search::search_events::v3::UserProfile, - }, - assign, -}; -use tokio::{task::AbortHandle, time::sleep}; -use tokio_stream::wrappers::BroadcastStream; -use tracing::{debug, error, info}; - -use super::{ - GlobalAccountData, IgnoredUsers, Notifications, RemoteCache, RoomList, SessionSecurity, - SessionSettings, SidebarItemList, SidebarListModel, User, UserSessionsList, VerificationList, -}; -use crate::{ - Application, - components::AvatarData, - prelude::*, - secret::StoredSession, - session_list::{SessionInfo, SessionInfoImpl}, - spawn, spawn_tokio, - utils::{ - TokioDrop, - matrix::{self, ClientSetupError}, - }, -}; - -/// The database key for persisting the session's profile. -const SESSION_PROFILE_KEY: &str = "session_profile"; -/// The number of consecutive missed synchronizations before the session is -/// marked as offline. -/// -/// Note that this is set to `2`, but the count begins at `0` so this would -/// match the third missed synchronization. -const MISSED_SYNC_OFFLINE_COUNT: usize = 2; -/// The delays in seconds to wait for when a sync fails, depending on the number -/// of missed attempts. -const MISSED_SYNC_DELAYS: &[u64] = &[1, 5, 10, 20, 30]; - -/// The state of the session. -#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, glib::Enum)] -#[repr(i32)] -#[enum_type(name = "SessionState")] -pub enum SessionState { - LoggedOut = -1, - #[default] - Init = 0, - InitialSync = 1, - Ready = 2, -} - -mod imp { - use std::cell::{Cell, OnceCell, RefCell}; - - use super::*; - - #[derive(Debug, Default, glib::Properties)] - #[properties(wrapper_type = super::Session)] - pub struct Session { - /// The Matrix client for this session. - client: OnceCell>, - /// The list model of the sidebar. - #[property(get = Self::sidebar_list_model)] - sidebar_list_model: OnceCell, - /// The user of this session. - #[property(get = Self::user)] - user: OnceCell, - /// The current state of the session. - #[property(get, builder(SessionState::default()))] - state: Cell, - /// Whether this session has a connection to the homeserver. - #[property(get)] - is_homeserver_reachable: Cell, - /// Whether this session is synchronized with the homeserver. - #[property(get)] - is_offline: Cell, - /// The current settings for this session. - #[property(get, construct_only)] - settings: OnceCell, - /// The settings in the global account data for this session. - #[property(get = Self::global_account_data_owned)] - global_account_data: OnceCell, - /// The notifications API for this session. - #[property(get)] - notifications: Notifications, - /// The ignored users API for this session. - #[property(get)] - ignored_users: IgnoredUsers, - /// The list of sessions for this session's user. - #[property(get)] - user_sessions: UserSessionsList, - /// Information about security for this session. - #[property(get)] - security: SessionSecurity, - /// The cache for remote data. - remote_cache: OnceCell, - session_changes_handle: RefCell>, - sync_handle: RefCell>, - network_monitor_handler_id: RefCell>, - homeserver_reachable_lock: Mutex<()>, - homeserver_reachable_source: RefCell>, - /// The number of missed synchonizations in a row. - /// - /// Capped at `MISSED_SYNC_DELAYS.len() - 1`. - missed_sync_count: Cell, - } - - #[glib::object_subclass] - impl ObjectSubclass for Session { - const NAME: &'static str = "Session"; - type Type = super::Session; - type ParentType = SessionInfo; - } - - #[glib::derived_properties] - impl ObjectImpl for Session { - fn dispose(&self) { - // Needs to be disconnected or else it may restart the sync - if let Some(handler_id) = self.network_monitor_handler_id.take() { - gio::NetworkMonitor::default().disconnect(handler_id); - } - - if let Some(source) = self.homeserver_reachable_source.take() { - source.remove(); - } - - if let Some(handle) = self.session_changes_handle.take() { - handle.abort(); - } - - if let Some(handle) = self.sync_handle.take() { - handle.abort(); - } - } - } - - impl SessionInfoImpl for Session { - fn avatar_data(&self) -> AvatarData { - self.user().avatar_data().clone() - } - } - - impl Session { - /// Set the Matrix client for this session. - pub(super) fn set_client(&self, client: Client) { - self.client - .set(TokioDrop::new(client)) - .expect("client should be uninitialized"); - - let obj = self.obj(); - - self.ignored_users.set_session(Some(obj.clone())); - self.notifications.set_session(Some(obj.clone())); - self.user_sessions.init(&obj, obj.user_id().clone()); - - let monitor = gio::NetworkMonitor::default(); - let handler_id = monitor.connect_network_changed(clone!( - #[weak(rename_to = imp)] - self, - move |_, _| { - spawn!(async move { - imp.update_homeserver_reachable().await; - }); - } - )); - self.network_monitor_handler_id.replace(Some(handler_id)); - } - - /// The Matrix client for this session. - pub(super) fn client(&self) -> &Client { - self.client.get().expect("client should be initialized") - } - - /// The list model of the sidebar. - fn sidebar_list_model(&self) -> SidebarListModel { - self.sidebar_list_model - .get_or_init(|| { - let obj = self.obj(); - let item_list = - SidebarItemList::new(&RoomList::new(&obj), &VerificationList::new(&obj)); - SidebarListModel::new(&item_list) - }) - .clone() - } - - /// The room list of this session. - pub(super) fn room_list(&self) -> RoomList { - self.sidebar_list_model().item_list().room_list() - } - - /// The verification list of this session. - pub(super) fn verification_list(&self) -> VerificationList { - self.sidebar_list_model().item_list().verification_list() - } - - /// The user of the session. - fn user(&self) -> User { - self.user - .get_or_init(|| { - let obj = self.obj(); - User::new(&obj, obj.info().user_id.clone()) - }) - .clone() - } - - /// Set the current state of the session. - fn set_state(&self, state: SessionState) { - let old_state = self.state.get(); - - if old_state == SessionState::LoggedOut || old_state == state { - // The session should be dismissed when it has been logged out, so - // we do not accept anymore state changes. - return; - } - - self.state.set(state); - self.obj().notify_state(); - } - - /// The homeserver URL as a `GNetworkAddress`. - fn homeserver_address(&self) -> gio::NetworkAddress { - let obj = self.obj(); - let homeserver = obj.homeserver(); - let default_port = if homeserver.scheme() == "http" { - 80 - } else { - 443 - }; - - gio::NetworkAddress::parse_uri(homeserver.as_str(), default_port) - .expect("url is parsed successfully") - } - - /// Check whether the homeserver is reachable. - pub(super) async fn update_homeserver_reachable(&self) { - // If there is a timeout, remove it, we will add a new one later if needed. - if let Some(source) = self.homeserver_reachable_source.take() { - source.remove(); - } - let Some(_guard) = self.homeserver_reachable_lock.try_lock() else { - // There is an ongoing check. - return; - }; - - let monitor = gio::NetworkMonitor::default(); - let is_network_available = monitor.is_network_available(); - - let is_homeserver_reachable = if is_network_available { - // Check if we can reach the homeserver. - let address = self.homeserver_address(); - - match monitor.can_reach_future(&address).await { - Ok(()) => true, - Err(error) => { - error!( - session = self.obj().session_id(), - "Homeserver is not reachable: {error}" - ); - false - } - } - } else { - false - }; - - self.set_is_homeserver_reachable(is_homeserver_reachable); - - if is_network_available && !is_homeserver_reachable { - // Check again later if the homeserver is reachable. - let source = glib::timeout_add_seconds_local_once( - 10, - clone!( - #[weak(rename_to = imp)] - self, - move || { - imp.homeserver_reachable_source.take(); - - spawn!(async move { - imp.update_homeserver_reachable().await; - }); - } - ), - ); - self.homeserver_reachable_source.replace(Some(source)); - } - } - - /// Set whether the homeserver is reachable. - fn set_is_homeserver_reachable(&self, is_reachable: bool) { - if self.is_homeserver_reachable.get() == is_reachable { - return; - } - let obj = self.obj(); - - self.is_homeserver_reachable.set(is_reachable); - - if let Some(handle) = self.sync_handle.take() { - handle.abort(); - } - - if is_reachable { - info!(session = obj.session_id(), "Homeserver is reachable"); - - // Restart the sync loop. - self.sync(); - } else { - self.set_offline(true); - } - - obj.notify_is_homeserver_reachable(); - } - - /// Set whether this session is synchronized with the homeserver. - pub(super) fn set_offline(&self, is_offline: bool) { - if self.is_offline.get() == is_offline { - return; - } - - if !is_offline { - // Restart the send queues, in case they were stopped. - let client = self.client().clone(); - spawn_tokio!(async move { - client.send_queue().set_enabled(true).await; - }); - } - - self.is_offline.set(is_offline); - self.obj().notify_is_offline(); - } - - /// The settings stored in the global account data for this session. - fn global_account_data(&self) -> &GlobalAccountData { - self.global_account_data - .get_or_init(|| GlobalAccountData::new(&self.obj())) - } - - /// The owned settings stored in the global account data for this - /// session. - fn global_account_data_owned(&self) -> GlobalAccountData { - self.global_account_data().clone() - } - - /// The cache for remote data. - pub(super) fn remote_cache(&self) -> &RemoteCache { - self.remote_cache - .get_or_init(|| RemoteCache::new(self.obj().clone())) - } - - /// Finish initialization of this session. - pub(super) async fn prepare(&self) { - spawn!( - glib::Priority::LOW, - clone!( - #[weak(rename_to = imp)] - self, - async move { - // First, load the profile from the cache, it will be quicker. - imp.init_user_profile().await; - // Then, check if the profile changed. - imp.update_user_profile().await; - } - ) - ); - - self.global_account_data(); - self.watch_session_changes(); - self.update_homeserver_reachable().await; - - self.room_list().load().await; - self.verification_list().init(); - self.security.set_session(Some(&*self.obj())); - - let client = self.client().clone(); - spawn_tokio!(async move { - client - .send_queue() - .respawn_tasks_for_rooms_with_unsent_requests() - .await; - }); - - self.set_state(SessionState::InitialSync); - self.sync(); - - debug!( - session = self.obj().session_id(), - "A new session was prepared" - ); - } - - /// Watch the changes of the session, like being logged out or the - /// tokens being refreshed. - fn watch_session_changes(&self) { - let receiver = self.client().subscribe_to_session_changes(); - let stream = BroadcastStream::new(receiver); - - let obj_weak = glib::SendWeakRef::from(self.obj().downgrade()); - let fut = stream.for_each(move |change| { - let obj_weak = obj_weak.clone(); - async move { - let Ok(change) = change else { - return; - }; - - let ctx = glib::MainContext::default(); - ctx.spawn(async move { - spawn!(async move { - if let Some(obj) = obj_weak.upgrade() { - match change { - SessionChange::UnknownToken { .. } => { - info!( - session = obj.session_id(), - "The access token is invalid, cleaning up the session…" - ); - obj.imp().clean_up().await; - } - SessionChange::TokensRefreshed => { - obj.imp().store_tokens().await; - } - } - } - }); - }); - } - }); - - let handle = spawn_tokio!(fut).abort_handle(); - self.session_changes_handle.replace(Some(handle)); - } - - /// Start syncing the Matrix client. - fn sync(&self) { - if self.state.get() < SessionState::InitialSync || !self.is_homeserver_reachable.get() { - return; - } - - let client = self.client().clone(); - let obj_weak = glib::SendWeakRef::from(self.obj().downgrade()); - - let handle = spawn_tokio!(async move { - // Make sure that the event cache is subscribed to sync responses to benefit - // from it. - if let Err(error) = client.event_cache().subscribe() { - error!("Could not subscribe event cache to sync responses: {error}"); - } - - // TODO: only create the filter once and reuse it in the future - let filter = assign!(FilterDefinition::default(), { - room: assign!(RoomFilter::with_lazy_loading(), { - include_leave: true, - }), - }); - - let sync_settings = SyncSettings::new() - .timeout(Duration::from_secs(30)) - .ignore_timeout_on_first_sync(true) - .filter(filter.into()); - - let mut sync_stream = Box::pin(client.sync_stream(sync_settings).await); - while let Some(response) = sync_stream.next().await { - let obj_weak = obj_weak.clone(); - let ctx = glib::MainContext::default(); - let delay = ctx - .spawn(async move { - spawn!(async move { - if let Some(obj) = obj_weak.upgrade() { - obj.imp().handle_sync_response(response) - } else { - None - } - }) - .await - .expect("task was not aborted") - }) - .await - .expect("task was not aborted"); - - if let Some(delay) = delay { - sleep(delay).await; - } - } - }) - .abort_handle(); - - self.sync_handle.replace(Some(handle)); - } - - /// Handle the response received via sync. - /// - /// Returns the delay to wait for before making the next sync, if - /// necessary. - fn handle_sync_response( - &self, - response: Result, - ) -> Option { - let obj = self.obj(); - let session_id = obj.session_id(); - debug!(session = session_id, "Received sync response"); - - match response { - Ok(response) => { - self.room_list().handle_room_updates(response.rooms); - - if self.state.get() < SessionState::Ready { - self.set_state(SessionState::Ready); - self.init_notifications(); - } - - self.set_offline(false); - self.missed_sync_count.set(0); - - None - } - Err(error) => { - let missed_sync_count = self.missed_sync_count.get(); - - // If there are too many failed attempts, mark the session as offline. - if missed_sync_count == MISSED_SYNC_OFFLINE_COUNT { - self.set_offline(true); - } - - // Increase the count of missed syncs, if we have not reached the maximum value. - if missed_sync_count < 4 { - self.missed_sync_count.set(missed_sync_count + 1); - } - - error!(session = session_id, "Could not perform sync: {error}"); - - // Sleep a little between attempts. - let delay = MISSED_SYNC_DELAYS[missed_sync_count]; - Some(Duration::from_secs(delay)) - } - } - } - - /// Load the cached profile of the user of this session. - async fn init_user_profile(&self) { - let client = self.client().clone(); - let handle = spawn_tokio!(async move { - client - .state_store() - .get_custom_value(SESSION_PROFILE_KEY.as_bytes()) - .await - }); - - let profile = match handle.await.expect("task was not aborted") { - Ok(Some(bytes)) => match serde_json::from_slice::(&bytes) { - Ok(profile) => profile, - Err(error) => { - error!( - session = self.obj().session_id(), - "Could not deserialize session profile: {error}" - ); - return; - } - }, - Ok(None) => return, - Err(error) => { - error!( - session = self.obj().session_id(), - "Could not load cached session profile: {error}" - ); - return; - } - }; - - let user = self.user(); - user.set_name(profile.displayname); - user.set_avatar_url(profile.avatar_url); - } - - /// Update the profile of this session’s user. - /// - /// Fetches the updated profile and updates the local data. - async fn update_user_profile(&self) { - let client = self.client().clone(); - let client_clone = client.clone(); - let handle = - spawn_tokio!(async move { client_clone.account().fetch_user_profile().await }); - - let profile = match handle - .await - .expect("task was not aborted") - .and_then(|response| { - let mut profile = UserProfile::new(); - profile.displayname = response.get_static::()?; - profile.avatar_url = response.get_static::()?; - - Ok(profile) - }) { - Ok(profile) => profile, - Err(error) => { - error!( - session = self.obj().session_id(), - "Could not fetch session profile: {error}" - ); - return; - } - }; - - let user = self.user(); - - if Some(user.display_name()) == profile.displayname - && user - .avatar_data() - .image() - .is_some_and(|i| i.uri() == profile.avatar_url) - { - // Nothing to update. - return; - } - - // Serialize first for caching to avoid a clone. - let value = serde_json::to_vec(&profile); - - // Update the profile for the UI. - user.set_name(profile.displayname); - user.set_avatar_url(profile.avatar_url); - - // Update the cache. - let value = match value { - Ok(value) => value, - Err(error) => { - error!( - session = self.obj().session_id(), - "Could not serialize session profile: {error}" - ); - return; - } - }; - - let handle = spawn_tokio!(async move { - client - .state_store() - .set_custom_value(SESSION_PROFILE_KEY.as_bytes(), value) - .await - }); - - if let Err(error) = handle.await.expect("task was not aborted") { - error!( - session = self.obj().session_id(), - "Could not cache session profile: {error}" - ); - } - } - - /// Start listening to notifications. - fn init_notifications(&self) { - let obj_weak = glib::SendWeakRef::from(self.obj().downgrade()); - let client = self.client().clone(); - - spawn_tokio!(async move { - client - .register_notification_handler(move |notification, room, _| { - let obj_weak = obj_weak.clone(); - async move { - let ctx = glib::MainContext::default(); - ctx.spawn(async move { - spawn!(async move { - if let Some(obj) = obj_weak.upgrade() { - obj.notifications().show_push(notification, room).await; - } - }); - }); - } - }) - .await; - }); - } - - /// Update the stored session tokens. - async fn store_tokens(&self) { - let Some(session_tokens) = self.client().session_tokens() else { - return; - }; - - debug!( - session = self.obj().session_id(), - "Storing updated session tokens…" - ); - self.obj().info().store_tokens(session_tokens).await; - } - - /// Clean up this session after it was logged out. - /// - /// This should only be called if the session has been logged out - /// without calling `Session::log_out`. - pub(super) async fn clean_up(&self) { - let obj = self.obj(); - self.set_state(SessionState::LoggedOut); - - if let Some(handle) = self.sync_handle.take() { - handle.abort(); - } - - if let Some(settings) = self.settings.get() { - settings.delete(); - } - - obj.info().clone().delete().await; - - self.notifications.clear(); - - debug!( - session = obj.session_id(), - "The logged out session was cleaned up" - ); - } - } -} - -glib::wrapper! { - /// A Matrix user session. - pub struct Session(ObjectSubclass) - @extends SessionInfo; -} - -impl Session { - /// Construct an existing session. - pub(crate) async fn new( - stored_session: StoredSession, - settings: SessionSettings, - ) -> Result { - let tokens = stored_session - .load_tokens() - .await - .ok_or(ClientSetupError::NoSessionTokens)?; - - let stored_session_clone = stored_session.clone(); - let client = spawn_tokio!(async move { - let client = matrix::client_with_stored_session(stored_session_clone, tokens).await?; - - // Make sure that we use the proper retention policy. - let media = client.media(); - let used_media_retention_policy = media.media_retention_policy().await?; - let wanted_media_retention_policy = MediaRetentionPolicy::default(); - - if used_media_retention_policy != wanted_media_retention_policy { - media - .set_media_retention_policy(wanted_media_retention_policy) - .await?; - } - - Ok::<_, ClientSetupError>(client) - }) - .await - .expect("task was not aborted")?; - - let obj = glib::Object::builder::() - .property("info", stored_session) - .property("settings", settings) - .build(); - obj.imp().set_client(client); - - Ok(obj) - } - - /// Create a new session from the session of the given Matrix client. - pub(crate) async fn create(client: &Client) -> Result { - let stored_session = StoredSession::new(client).await?; - let settings = Application::default() - .session_list() - .settings() - .get_or_create(&stored_session.id); - - Self::new(stored_session, settings).await - } - - /// Finish initialization of this session. - pub(crate) async fn prepare(&self) { - self.imp().prepare().await; - } - - /// The room list of this session. - pub(crate) fn room_list(&self) -> RoomList { - self.imp().room_list() - } - - /// The verification list of this session. - pub(crate) fn verification_list(&self) -> VerificationList { - self.imp().verification_list() - } - - /// The Matrix client. - pub(crate) fn client(&self) -> Client { - self.imp().client().clone() - } - - /// The cache for remote data. - pub(crate) fn remote_cache(&self) -> &RemoteCache { - self.imp().remote_cache() - } - - /// Log out of this session. - pub(crate) async fn log_out(&self) -> Result<(), String> { - debug!( - session = self.session_id(), - "The session is about to be logged out" - ); - - let client = self.client(); - let handle = spawn_tokio!(async move { client.logout().await }); - - match handle.await.expect("task was not aborted") { - Ok(()) => { - self.imp().clean_up().await; - Ok(()) - } - Err(error) => { - error!( - session = self.session_id(), - "Could not log the session out: {error}" - ); - Err(gettext("Could not log the session out")) - } - } - } - - /// Clean up this session after it was logged out. - /// - /// This should only be called if the session has been logged out without - /// calling `Session::log_out`. - pub(crate) async fn clean_up(&self) { - self.imp().clean_up().await; - } - - /// Connect to the signal emitted when this session is logged out. - pub(crate) fn connect_logged_out(&self, f: F) -> glib::SignalHandlerId { - self.connect_state_notify(move |obj| { - if obj.state() == SessionState::LoggedOut { - f(obj); - } - }) - } - - /// Connect to the signal emitted when this session is ready. - pub(crate) fn connect_ready(&self, f: F) -> glib::SignalHandlerId { - self.connect_state_notify(move |obj| { - if obj.state() == SessionState::Ready { - f(obj); - } - }) - } -} diff --git a/src/session/model/notifications/mod.rs b/src/session/notifications/mod.rs similarity index 100% rename from src/session/model/notifications/mod.rs rename to src/session/notifications/mod.rs diff --git a/src/session/model/notifications/notifications_settings.rs b/src/session/notifications/notifications_settings.rs similarity index 99% rename from src/session/model/notifications/notifications_settings.rs rename to src/session/notifications/notifications_settings.rs index 01b136b6..70bf0457 100644 --- a/src/session/model/notifications/notifications_settings.rs +++ b/src/session/notifications/notifications_settings.rs @@ -17,7 +17,7 @@ use tokio_stream::wrappers::BroadcastStream; use tracing::error; use crate::{ - session::model::{Room, Session, SessionState}, + session::{Room, Session, SessionState}, spawn, spawn_tokio, }; diff --git a/src/session/model/remote/cache.rs b/src/session/remote/cache.rs similarity index 97% rename from src/session/model/remote/cache.rs rename to src/session/remote/cache.rs index 58d01db7..ff4d71a5 100644 --- a/src/session/model/remote/cache.rs +++ b/src/session/remote/cache.rs @@ -4,7 +4,7 @@ use ruma::{OwnedRoomOrAliasId, OwnedUserId, RoomId}; use wtinylfu::WTinyLfuCache; use super::{RemoteRoom, RemoteUser}; -use crate::{session::model::Session, utils::matrix::MatrixRoomIdUri}; +use crate::{session::Session, utils::matrix::MatrixRoomIdUri}; /// The data of the [`RemoteCache`]. struct RemoteCacheData { diff --git a/src/session/model/remote/mod.rs b/src/session/remote/mod.rs similarity index 100% rename from src/session/model/remote/mod.rs rename to src/session/remote/mod.rs diff --git a/src/session/model/remote/room.rs b/src/session/remote/room.rs similarity index 99% rename from src/session/model/remote/room.rs rename to src/session/remote/room.rs index 96cdbe07..551c8678 100644 --- a/src/session/model/remote/room.rs +++ b/src/session/remote/room.rs @@ -14,7 +14,7 @@ use tracing::{debug, warn}; use crate::{ components::{AvatarImage, AvatarUriSource, PillSource}, prelude::*, - session::model::{RoomListRoomInfo, Session}, + session::{RoomListRoomInfo, Session}, spawn, spawn_tokio, utils::{AbortableHandle, LoadingState, matrix::MatrixRoomIdUri, string::linkify}, }; diff --git a/src/session/model/remote/user.rs b/src/session/remote/user.rs similarity index 99% rename from src/session/model/remote/user.rs rename to src/session/remote/user.rs index d815b5ea..4e4cfba2 100644 --- a/src/session/model/remote/user.rs +++ b/src/session/remote/user.rs @@ -6,7 +6,7 @@ use matrix_sdk::ruma::OwnedUserId; use crate::{ components::PillSource, prelude::*, - session::model::{Session, User}, + session::{Session, User}, spawn, utils::LoadingState, }; diff --git a/src/session/model/room/aliases.rs b/src/session/room/aliases.rs similarity index 100% rename from src/session/model/room/aliases.rs rename to src/session/room/aliases.rs diff --git a/src/session/model/room/category.rs b/src/session/room/category.rs similarity index 99% rename from src/session/model/room/category.rs rename to src/session/room/category.rs index 9b523f0a..62256061 100644 --- a/src/session/model/room/category.rs +++ b/src/session/room/category.rs @@ -3,7 +3,7 @@ use std::fmt; use gtk::glib; use matrix_sdk::RoomState; -use crate::session::model::SidebarSectionName; +use crate::session::SidebarSectionName; /// The category of a room. #[derive(Debug, Default, Hash, Eq, PartialEq, Clone, Copy, glib::Enum)] diff --git a/src/session/model/room/highlight_flags.rs b/src/session/room/highlight_flags.rs similarity index 100% rename from src/session/model/room/highlight_flags.rs rename to src/session/room/highlight_flags.rs diff --git a/src/session/model/room/join_rule.rs b/src/session/room/join_rule.rs similarity index 100% rename from src/session/model/room/join_rule.rs rename to src/session/room/join_rule.rs diff --git a/src/session/model/room/member.rs b/src/session/room/member.rs similarity index 99% rename from src/session/model/room/member.rs rename to src/session/room/member.rs index 72115116..40a793d5 100644 --- a/src/session/model/room/member.rs +++ b/src/session/room/member.rs @@ -16,7 +16,7 @@ use ruma::{ use tracing::{debug, error}; use super::{MemberRole, Room}; -use crate::{components::PillSource, prelude::*, session::model::User, spawn, spawn_tokio}; +use crate::{components::PillSource, prelude::*, session::User, spawn, spawn_tokio}; /// The possible states of membership of a user in a room. #[derive(Debug, Default, Eq, PartialEq, Clone, Copy, glib::Enum)] diff --git a/src/session/model/room/member_list.rs b/src/session/room/member_list.rs similarity index 100% rename from src/session/model/room/member_list.rs rename to src/session/room/member_list.rs diff --git a/src/session/model/room/mod.rs b/src/session/room/mod.rs similarity index 100% rename from src/session/model/room/mod.rs rename to src/session/room/mod.rs diff --git a/src/session/model/room/permissions.rs b/src/session/room/permissions.rs similarity index 100% rename from src/session/model/room/permissions.rs rename to src/session/room/permissions.rs diff --git a/src/session/model/room/timeline/event/mod.rs b/src/session/room/timeline/event/mod.rs similarity index 99% rename from src/session/model/room/timeline/event/mod.rs rename to src/session/room/timeline/event/mod.rs index 0dc36151..6c6b7c2b 100644 --- a/src/session/model/room/timeline/event/mod.rs +++ b/src/session/room/timeline/event/mod.rs @@ -25,7 +25,7 @@ pub(crate) use self::{ use super::{Timeline, TimelineItem, TimelineItemImpl}; use crate::{ prelude::*, - session::model::Member, + session::Member, spawn_tokio, utils::matrix::{MediaMessage, raw_eq, timestamp_to_date}, }; diff --git a/src/session/model/room/timeline/event/reaction_group.rs b/src/session/room/timeline/event/reaction_group.rs similarity index 99% rename from src/session/model/room/timeline/event/reaction_group.rs rename to src/session/room/timeline/event/reaction_group.rs index cf94c0bd..1fb1d183 100644 --- a/src/session/model/room/timeline/event/reaction_group.rs +++ b/src/session/room/timeline/event/reaction_group.rs @@ -3,7 +3,7 @@ use indexmap::IndexMap; use matrix_sdk_ui::timeline::ReactionInfo; use ruma::{MilliSecondsSinceUnixEpoch, OwnedUserId}; -use crate::{prelude::*, session::model::User}; +use crate::{prelude::*, session::User}; /// A map of user ID to reaction info. type ReactionsMap = IndexMap; diff --git a/src/session/model/room/timeline/event/reaction_list.rs b/src/session/room/timeline/event/reaction_list.rs similarity index 99% rename from src/session/model/room/timeline/event/reaction_list.rs rename to src/session/room/timeline/event/reaction_list.rs index 2c9db040..09457d27 100644 --- a/src/session/model/room/timeline/event/reaction_list.rs +++ b/src/session/room/timeline/event/reaction_list.rs @@ -2,7 +2,7 @@ use gtk::{gio, glib, prelude::*, subclass::prelude::*}; use matrix_sdk_ui::timeline::ReactionsByKeyBySender; use super::ReactionGroup; -use crate::session::model::User; +use crate::session::User; mod imp { use std::cell::{OnceCell, RefCell}; diff --git a/src/session/model/room/timeline/mod.rs b/src/session/room/timeline/mod.rs similarity index 100% rename from src/session/model/room/timeline/mod.rs rename to src/session/room/timeline/mod.rs diff --git a/src/session/model/room/timeline/timeline_diff_minimizer/mod.rs b/src/session/room/timeline/timeline_diff_minimizer/mod.rs similarity index 100% rename from src/session/model/room/timeline/timeline_diff_minimizer/mod.rs rename to src/session/room/timeline/timeline_diff_minimizer/mod.rs diff --git a/src/session/model/room/timeline/timeline_diff_minimizer/tests.rs b/src/session/room/timeline/timeline_diff_minimizer/tests.rs similarity index 100% rename from src/session/model/room/timeline/timeline_diff_minimizer/tests.rs rename to src/session/room/timeline/timeline_diff_minimizer/tests.rs diff --git a/src/session/model/room/timeline/timeline_item.rs b/src/session/room/timeline/timeline_item.rs similarity index 99% rename from src/session/model/room/timeline/timeline_item.rs rename to src/session/room/timeline/timeline_item.rs index 9bad9245..2d372253 100644 --- a/src/session/model/room/timeline/timeline_item.rs +++ b/src/session/room/timeline/timeline_item.rs @@ -3,7 +3,7 @@ use matrix_sdk_ui::timeline::{TimelineItem as SdkTimelineItem, TimelineItemKind} use tracing::error; use super::{Event, Timeline, VirtualItem}; -use crate::session::model::Room; +use crate::session::Room; mod imp { use std::cell::{OnceCell, RefCell}; diff --git a/src/session/model/room/timeline/virtual_item.rs b/src/session/room/timeline/virtual_item.rs similarity index 100% rename from src/session/model/room/timeline/virtual_item.rs rename to src/session/room/timeline/virtual_item.rs diff --git a/src/session/model/room/typing_list.rs b/src/session/room/typing_list.rs similarity index 100% rename from src/session/model/room/typing_list.rs rename to src/session/room/typing_list.rs diff --git a/src/session/model/room_list/metainfo.rs b/src/session/room_list/metainfo.rs similarity index 99% rename from src/session/model/room_list/metainfo.rs rename to src/session/room_list/metainfo.rs index 8bcb450e..60415278 100644 --- a/src/session/model/room_list/metainfo.rs +++ b/src/session/room_list/metainfo.rs @@ -13,7 +13,7 @@ use serde::{Deserialize, Serialize}; use tracing::error; use super::RoomList; -use crate::{session::model::Room, spawn, spawn_tokio}; +use crate::{session::Room, spawn, spawn_tokio}; const ROOMS_METAINFO_KEY: &str = "rooms_metainfo"; diff --git a/src/session/model/room_list/mod.rs b/src/session/room_list/mod.rs similarity index 99% rename from src/session/model/room_list/mod.rs rename to src/session/room_list/mod.rs index eb87d094..8dc66799 100644 --- a/src/session/model/room_list/mod.rs +++ b/src/session/room_list/mod.rs @@ -24,7 +24,7 @@ pub use self::{metainfo::RoomMetainfo, room_info::RoomListRoomInfo}; use crate::{ gettext_f, prelude::*, - session::model::{Room, Session}, + session::{Room, Session}, spawn_tokio, }; diff --git a/src/session/model/room_list/room_info.rs b/src/session/room_list/room_info.rs similarity index 98% rename from src/session/model/room_list/room_info.rs rename to src/session/room_list/room_info.rs index 64f4c125..4d75e3b0 100644 --- a/src/session/model/room_list/room_info.rs +++ b/src/session/room_list/room_info.rs @@ -2,7 +2,7 @@ use gtk::{glib, glib::clone, prelude::*, subclass::prelude::*}; use ruma::OwnedRoomOrAliasId; use super::RoomList; -use crate::{session::model::Room, utils::BoundObject}; +use crate::{session::Room, utils::BoundObject}; mod imp { use std::cell::{Cell, RefCell}; diff --git a/src/session/model/security.rs b/src/session/security.rs similarity index 100% rename from src/session/model/security.rs rename to src/session/security.rs diff --git a/src/session/model/session_settings.rs b/src/session/session_settings.rs similarity index 100% rename from src/session/model/session_settings.rs rename to src/session/session_settings.rs diff --git a/src/session/model/sidebar_data/icon_item.rs b/src/session/sidebar_data/icon_item.rs similarity index 98% rename from src/session/model/sidebar_data/icon_item.rs rename to src/session/sidebar_data/icon_item.rs index 5d12ba0a..fc2af1d4 100644 --- a/src/session/model/sidebar_data/icon_item.rs +++ b/src/session/sidebar_data/icon_item.rs @@ -3,7 +3,7 @@ use std::fmt; use gettextrs::gettext; use gtk::{glib, prelude::*, subclass::prelude::*}; -use crate::session::model::RoomCategory; +use crate::session::RoomCategory; #[derive(Debug, Default, Hash, Eq, PartialEq, Clone, Copy, glib::Enum)] #[enum_type(name = "SidebarIconItemType")] diff --git a/src/session/model/sidebar_data/item.rs b/src/session/sidebar_data/item.rs similarity index 99% rename from src/session/model/sidebar_data/item.rs rename to src/session/sidebar_data/item.rs index dac6b11c..6506a7f5 100644 --- a/src/session/model/sidebar_data/item.rs +++ b/src/session/sidebar_data/item.rs @@ -2,7 +2,7 @@ use gtk::{gio, glib, glib::clone, prelude::*, subclass::prelude::*}; use super::{SidebarIconItem, SidebarSection}; use crate::{ - session::model::RoomCategory, + session::RoomCategory, utils::{BoundConstructOnlyObject, SingleItemListModel}, }; diff --git a/src/session/model/sidebar_data/item_list.rs b/src/session/sidebar_data/item_list.rs similarity index 99% rename from src/session/model/sidebar_data/item_list.rs rename to src/session/sidebar_data/item_list.rs index 88e0fa3d..666d6e1b 100644 --- a/src/session/model/sidebar_data/item_list.rs +++ b/src/session/sidebar_data/item_list.rs @@ -5,7 +5,7 @@ use gtk::{gio, glib, glib::clone, prelude::*, subclass::prelude::*}; use super::{ SidebarIconItem, SidebarIconItemType, SidebarItem, SidebarSection, SidebarSectionName, }; -use crate::session::model::{RoomCategory, RoomList, VerificationList}; +use crate::session::{RoomCategory, RoomList, VerificationList}; /// The number of top-level items in the sidebar. const TOP_LEVEL_ITEMS_COUNT: usize = 9; diff --git a/src/session/model/sidebar_data/list_model.rs b/src/session/sidebar_data/list_model.rs similarity index 99% rename from src/session/model/sidebar_data/list_model.rs rename to src/session/sidebar_data/list_model.rs index ca4b6f07..0d177817 100644 --- a/src/session/model/sidebar_data/list_model.rs +++ b/src/session/sidebar_data/list_model.rs @@ -2,7 +2,7 @@ use gtk::{glib, glib::clone, prelude::*, subclass::prelude::*}; use super::SidebarItemList; use crate::{ - session::model::{IdentityVerification, Room}, + session::{IdentityVerification, Room}, utils::{BoundObjectWeakRef, FixedSelection, expression}, }; diff --git a/src/session/model/sidebar_data/mod.rs b/src/session/sidebar_data/mod.rs similarity index 100% rename from src/session/model/sidebar_data/mod.rs rename to src/session/sidebar_data/mod.rs diff --git a/src/session/model/sidebar_data/section/mod.rs b/src/session/sidebar_data/section/mod.rs similarity index 99% rename from src/session/model/sidebar_data/section/mod.rs rename to src/session/sidebar_data/section/mod.rs index e5cd5213..f253c9a4 100644 --- a/src/session/model/sidebar_data/section/mod.rs +++ b/src/session/sidebar_data/section/mod.rs @@ -6,7 +6,7 @@ mod room_category_filter; pub use self::name::SidebarSectionName; use self::room_category_filter::RoomCategoryFilter; use crate::{ - session::model::{ + session::{ Room, RoomCategory, RoomList, SessionSettings, VerificationList, room::HighlightFlags, }, utils::ExpressionListModel, diff --git a/src/session/model/sidebar_data/section/name.rs b/src/session/sidebar_data/section/name.rs similarity index 98% rename from src/session/model/sidebar_data/section/name.rs rename to src/session/sidebar_data/section/name.rs index 42d6347a..7c8cdd0f 100644 --- a/src/session/model/sidebar_data/section/name.rs +++ b/src/session/sidebar_data/section/name.rs @@ -4,7 +4,7 @@ use gettextrs::gettext; use gtk::glib; use serde::{Deserialize, Serialize}; -use crate::session::model::{RoomCategory, TargetRoomCategory}; +use crate::session::{RoomCategory, TargetRoomCategory}; /// The possible names of the sections in the sidebar. #[derive( diff --git a/src/session/model/sidebar_data/section/room_category_filter.rs b/src/session/sidebar_data/section/room_category_filter.rs similarity index 98% rename from src/session/model/sidebar_data/section/room_category_filter.rs rename to src/session/sidebar_data/section/room_category_filter.rs index 116d2f8d..4d5bf07a 100644 --- a/src/session/model/sidebar_data/section/room_category_filter.rs +++ b/src/session/sidebar_data/section/room_category_filter.rs @@ -1,6 +1,6 @@ use gtk::{glib, prelude::*, subclass::prelude::*}; -use crate::session::model::RoomCategory; +use crate::session::RoomCategory; mod imp { use std::cell::{Cell, RefCell}; diff --git a/src/session/model/user.rs b/src/session/user.rs similarity index 100% rename from src/session/model/user.rs rename to src/session/user.rs diff --git a/src/session/model/user_sessions_list/mod.rs b/src/session/user_sessions_list/mod.rs similarity index 100% rename from src/session/model/user_sessions_list/mod.rs rename to src/session/user_sessions_list/mod.rs diff --git a/src/session/model/user_sessions_list/other_sessions_list.rs b/src/session/user_sessions_list/other_sessions_list.rs similarity index 99% rename from src/session/model/user_sessions_list/other_sessions_list.rs rename to src/session/user_sessions_list/other_sessions_list.rs index b31f97a4..75a766e2 100644 --- a/src/session/model/user_sessions_list/other_sessions_list.rs +++ b/src/session/user_sessions_list/other_sessions_list.rs @@ -2,7 +2,7 @@ use gtk::{gio, glib, prelude::*, subclass::prelude::*}; use ruma::OwnedDeviceId; use super::{UserSession, UserSessionData}; -use crate::session::model::Session; +use crate::session::Session; mod imp { use std::{cell::RefCell, collections::HashSet}; diff --git a/src/session/model/user_sessions_list/user_session.rs b/src/session/user_sessions_list/user_session.rs similarity index 99% rename from src/session/model/user_sessions_list/user_session.rs rename to src/session/user_sessions_list/user_session.rs index da92b323..e830d4fc 100644 --- a/src/session/model/user_sessions_list/user_session.rs +++ b/src/session/user_sessions_list/user_session.rs @@ -13,7 +13,7 @@ use crate::{ Application, components::{AuthDialog, AuthError}, prelude::*, - session::model::Session, + session::Session, spawn_tokio, system_settings::ClockFormat, utils::matrix::timestamp_to_date, diff --git a/src/session/model/verification/identity_verification.rs b/src/session/verification/identity_verification.rs similarity index 99% rename from src/session/model/verification/identity_verification.rs rename to src/session/verification/identity_verification.rs index 8484bd14..855b4612 100644 --- a/src/session/model/verification/identity_verification.rs +++ b/src/session/verification/identity_verification.rs @@ -20,7 +20,7 @@ use super::{VerificationKey, load_supported_verification_methods}; use crate::{ components::QrCodeScanner, prelude::*, - session::model::{Member, Membership, Room, User}, + session::{Member, Membership, Room, User}, spawn, spawn_tokio, utils::BoundConstructOnlyObject, }; diff --git a/src/session/model/verification/mod.rs b/src/session/verification/mod.rs similarity index 100% rename from src/session/model/verification/mod.rs rename to src/session/verification/mod.rs diff --git a/src/session/model/verification/verification_list.rs b/src/session/verification/verification_list.rs similarity index 99% rename from src/session/model/verification/verification_list.rs rename to src/session/verification/verification_list.rs index b935830e..2aabfac0 100644 --- a/src/session/model/verification/verification_list.rs +++ b/src/session/verification/verification_list.rs @@ -13,7 +13,7 @@ use tracing::{debug, error}; use super::{VerificationKey, VerificationState, load_supported_verification_methods}; use crate::{ - session::model::{IdentityVerification, Member, Membership, Session, User}, + session::{IdentityVerification, Member, Membership, Session, User}, spawn, spawn_tokio, }; diff --git a/src/session_list/mod.rs b/src/session_list/mod.rs index 1cf50dc5..ce52a4cf 100644 --- a/src/session_list/mod.rs +++ b/src/session_list/mod.rs @@ -16,7 +16,7 @@ pub(crate) use self::{ use crate::{ prelude::*, secret::{Secret, StoredSession}, - session::model::{Session, SessionState}, + session::{Session, SessionState}, spawn, spawn_tokio, utils::{DataType, LoadingState}, }; diff --git a/src/session_list/session_list_settings.rs b/src/session_list/session_list_settings.rs index 84d78d4f..bbb965e1 100644 --- a/src/session_list/session_list_settings.rs +++ b/src/session_list/session_list_settings.rs @@ -5,7 +5,7 @@ use tracing::error; use crate::{ Application, secret::SESSION_ID_LENGTH, - session::model::{SessionSettings, StoredSessionSettings}, + session::{SessionSettings, StoredSessionSettings}, }; mod imp { diff --git a/src/session_view/content/explore/mod.rs b/src/session_view/content/explore/mod.rs index 489e9bd8..8bab0168 100644 --- a/src/session_view/content/explore/mod.rs +++ b/src/session_view/content/explore/mod.rs @@ -17,7 +17,7 @@ use self::{ use crate::{ components::LoadingRow, prelude::*, - session::model::{RemoteRoom, Session}, + session::{RemoteRoom, Session}, utils::{LoadingState, SingleItemListModel}, }; diff --git a/src/session_view/content/explore/public_room_row.rs b/src/session_view/content/explore/public_room_row.rs index 1d5ca37a..faf2656c 100644 --- a/src/session_view/content/explore/public_room_row.rs +++ b/src/session_view/content/explore/public_room_row.rs @@ -7,7 +7,7 @@ use crate::{ components::{Avatar, LoadingButton}, gettext_f, ngettext_f, prelude::*, - session::model::RemoteRoom, + session::RemoteRoom, toast, utils::{matrix::MatrixIdUri, string::linkify}, }; diff --git a/src/session_view/content/explore/search.rs b/src/session_view/content/explore/search.rs index 68be7c85..32ec2603 100644 --- a/src/session_view/content/explore/search.rs +++ b/src/session_view/content/explore/search.rs @@ -10,7 +10,7 @@ use tracing::error; use super::ExploreServer; use crate::{ - session::model::{RemoteRoom, Session}, + session::{RemoteRoom, Session}, spawn, spawn_tokio, utils::{LoadingState, matrix::MatrixRoomIdUri}, }; diff --git a/src/session_view/content/explore/server_list.rs b/src/session_view/content/explore/server_list.rs index 4cc03f7b..09d9991f 100644 --- a/src/session_view/content/explore/server_list.rs +++ b/src/session_view/content/explore/server_list.rs @@ -3,7 +3,7 @@ use ruma::{OwnedServerName, ServerName, api::client::thirdparty::get_protocols}; use tracing::error; use super::ExploreServer; -use crate::{prelude::*, session::model::Session, spawn, spawn_tokio}; +use crate::{prelude::*, session::Session, spawn, spawn_tokio}; mod imp { use std::cell::RefCell; diff --git a/src/session_view/content/explore/servers_popover.rs b/src/session_view/content/explore/servers_popover.rs index 0822a969..513185a3 100644 --- a/src/session_view/content/explore/servers_popover.rs +++ b/src/session_view/content/explore/servers_popover.rs @@ -4,7 +4,7 @@ use ruma::ServerName; use tracing::error; use super::{ExploreServer, ExploreServerList, ExploreServerRow}; -use crate::session::model::Session; +use crate::session::Session; mod imp { use std::marker::PhantomData; diff --git a/src/session_view/content/invite.rs b/src/session_view/content/invite.rs index d8da7225..ee335bda 100644 --- a/src/session_view/content/invite.rs +++ b/src/session_view/content/invite.rs @@ -9,7 +9,7 @@ use crate::{ }, gettext_f, prelude::*, - session::model::{MemberList, Room, RoomCategory, TargetRoomCategory, User}, + session::{MemberList, Room, RoomCategory, TargetRoomCategory, User}, toast, utils::matrix::MatrixIdUri, }; diff --git a/src/session_view/content/invite_request.rs b/src/session_view/content/invite_request.rs index 94ea177e..b779f03b 100644 --- a/src/session_view/content/invite_request.rs +++ b/src/session_view/content/invite_request.rs @@ -4,7 +4,7 @@ use gtk::{glib, glib::clone}; use crate::{ components::{Avatar, LoadingButton}, - session::model::{Room, RoomCategory, TargetRoomCategory}, + session::{Room, RoomCategory, TargetRoomCategory}, toast, utils::matrix::MatrixIdUri, }; diff --git a/src/session_view/content/mod.rs b/src/session_view/content/mod.rs index 68126cc3..30c44f3f 100644 --- a/src/session_view/content/mod.rs +++ b/src/session_view/content/mod.rs @@ -13,7 +13,7 @@ use self::{ }; use crate::{ identity_verification_view::IdentityVerificationView, - session::model::{ + session::{ IdentityVerification, Room, RoomCategory, Session, SidebarIconItem, SidebarIconItemType, }, utils::BoundObject, diff --git a/src/session_view/content/room_details/addresses_subpage/mod.rs b/src/session_view/content/room_details/addresses_subpage/mod.rs index 4f5656c7..b620208c 100644 --- a/src/session_view/content/room_details/addresses_subpage/mod.rs +++ b/src/session_view/content/room_details/addresses_subpage/mod.rs @@ -12,7 +12,7 @@ use crate::{ components::{EntryAddRow, LoadingButton, RemovableRow, SubstringEntryRow}, gettext_f, prelude::*, - session::model::{AddAltAliasError, RegisterLocalAliasError, Room}, + session::{AddAltAliasError, RegisterLocalAliasError, Room}, spawn, toast, utils::{PlaceholderObject, SingleItemListModel}, }; diff --git a/src/session_view/content/room_details/edit_details_subpage.rs b/src/session_view/content/room_details/edit_details_subpage.rs index 7299f0e7..3b0a54e8 100644 --- a/src/session_view/content/room_details/edit_details_subpage.rs +++ b/src/session_view/content/room_details/edit_details_subpage.rs @@ -11,7 +11,7 @@ use crate::{ UnsavedChangesResponse, unsaved_changes_dialog, }, prelude::*, - session::model::Room, + session::Room, spawn_tokio, toast, utils::{ BoundObjectWeakRef, OngoingAsyncAction, TemplateCallbacks, diff --git a/src/session_view/content/room_details/general_page.rs b/src/session_view/content/room_details/general_page.rs index c328a56b..6595317c 100644 --- a/src/session_view/content/room_details/general_page.rs +++ b/src/session_view/content/room_details/general_page.rs @@ -29,7 +29,7 @@ use crate::{ }, gettext_f, prelude::*, - session::model::{ + session::{ HistoryVisibilityValue, Member, MemberList, MembershipListKind, NotificationsRoomSetting, Room, RoomCategory, }, diff --git a/src/session_view/content/room_details/history_viewer/event.rs b/src/session_view/content/room_details/history_viewer/event.rs index 26591fb6..7aa25888 100644 --- a/src/session_view/content/room_details/history_viewer/event.rs +++ b/src/session_view/content/room_details/history_viewer/event.rs @@ -9,7 +9,7 @@ use ruma::{ }; use crate::{ - session::model::Room, + session::Room, utils::matrix::{MediaMessage, VisualMediaMessage, timestamp_to_date}, }; diff --git a/src/session_view/content/room_details/history_viewer/timeline.rs b/src/session_view/content/room_details/history_viewer/timeline.rs index 96f96fbf..9ea3bb6b 100644 --- a/src/session_view/content/room_details/history_viewer/timeline.rs +++ b/src/session_view/content/room_details/history_viewer/timeline.rs @@ -15,7 +15,7 @@ use tracing::error; use super::HistoryViewerEvent; use crate::{ components::LoadingRow, - session::model::Room, + session::Room, spawn_tokio, utils::{LoadingState, SingleItemListModel}, }; diff --git a/src/session_view/content/room_details/history_viewer/visual_media_item.rs b/src/session_view/content/room_details/history_viewer/visual_media_item.rs index 81a45af1..15e27b9c 100644 --- a/src/session_view/content/room_details/history_viewer/visual_media_item.rs +++ b/src/session_view/content/room_details/history_viewer/visual_media_item.rs @@ -3,7 +3,7 @@ use ruma::api::client::media::get_content_thumbnail::v3::Method; use super::{HistoryViewerEvent, VisualMediaHistoryViewer}; use crate::{ - session::model::Session, + session::Session, spawn, utils::{ key_bindings, diff --git a/src/session_view/content/room_details/history_visibility_subpage.rs b/src/session_view/content/room_details/history_visibility_subpage.rs index 99e7bd30..9a03555e 100644 --- a/src/session_view/content/room_details/history_visibility_subpage.rs +++ b/src/session_view/content/room_details/history_visibility_subpage.rs @@ -9,7 +9,7 @@ use tracing::error; use crate::{ components::{CheckLoadingRow, LoadingButton, UnsavedChangesResponse, unsaved_changes_dialog}, - session::model::{HistoryVisibilityValue, Room}, + session::{HistoryVisibilityValue, Room}, spawn_tokio, toast, utils::BoundObjectWeakRef, }; diff --git a/src/session_view/content/room_details/invite_subpage/item.rs b/src/session_view/content/room_details/invite_subpage/item.rs index 75de745a..8d1c400b 100644 --- a/src/session_view/content/room_details/invite_subpage/item.rs +++ b/src/session_view/content/room_details/invite_subpage/item.rs @@ -1,6 +1,6 @@ use gtk::{glib, prelude::*, subclass::prelude::*}; -use crate::session::model::User; +use crate::session::User; mod imp { use std::{ diff --git a/src/session_view/content/room_details/invite_subpage/list.rs b/src/session_view/content/room_details/invite_subpage/list.rs index 365892e3..d05ce5e7 100644 --- a/src/session_view/content/room_details/invite_subpage/list.rs +++ b/src/session_view/content/room_details/invite_subpage/list.rs @@ -13,7 +13,7 @@ use tracing::error; use super::InviteItem; use crate::{ prelude::*, - session::model::{Member, Membership, Room, User}, + session::{Member, Membership, Room, User}, spawn, spawn_tokio, }; diff --git a/src/session_view/content/room_details/invite_subpage/mod.rs b/src/session_view/content/room_details/invite_subpage/mod.rs index 8c4a48e8..0ad5a077 100644 --- a/src/session_view/content/room_details/invite_subpage/mod.rs +++ b/src/session_view/content/room_details/invite_subpage/mod.rs @@ -15,7 +15,7 @@ use self::{ use crate::{ components::{LoadingButton, PillSearchEntry, PillSource}, prelude::*, - session::model::{Room, User}, + session::{Room, User}, toast, }; diff --git a/src/session_view/content/room_details/join_rule_subpage.rs b/src/session_view/content/room_details/join_rule_subpage.rs index ab8ec654..e1253909 100644 --- a/src/session_view/content/room_details/join_rule_subpage.rs +++ b/src/session_view/content/room_details/join_rule_subpage.rs @@ -8,7 +8,7 @@ use ruma::events::{ use crate::{ components::{CheckLoadingRow, LoadingButton, UnsavedChangesResponse, unsaved_changes_dialog}, - session::model::{JoinRuleValue, Room}, + session::{JoinRuleValue, Room}, toast, }; diff --git a/src/session_view/content/room_details/member_row.rs b/src/session_view/content/room_details/member_row.rs index 8bfd0554..82b63fa5 100644 --- a/src/session_view/content/room_details/member_row.rs +++ b/src/session_view/content/room_details/member_row.rs @@ -2,7 +2,7 @@ use gtk::{glib, prelude::*, subclass::prelude::*}; use crate::{ components::{Avatar, RoleBadge}, - session::model::Member, + session::Member, utils::expression, }; diff --git a/src/session_view/content/room_details/members_page/members_list_view/item_row.rs b/src/session_view/content/room_details/members_page/members_list_view/item_row.rs index 67358c93..efbf8ffd 100644 --- a/src/session_view/content/room_details/members_page/members_list_view/item_row.rs +++ b/src/session_view/content/room_details/members_page/members_list_view/item_row.rs @@ -4,7 +4,7 @@ use gtk::glib; use super::MembershipSubpageRow; use crate::{ prelude::*, - session::model::Member, + session::Member, session_view::content::room_details::{MemberRow, MembershipSubpageItem}, }; diff --git a/src/session_view/content/room_details/members_page/members_list_view/membership_subpage_row.rs b/src/session_view/content/room_details/members_page/members_list_view/membership_subpage_row.rs index 9281958c..d82d3b73 100644 --- a/src/session_view/content/room_details/members_page/members_list_view/membership_subpage_row.rs +++ b/src/session_view/content/room_details/members_page/members_list_view/membership_subpage_row.rs @@ -2,7 +2,7 @@ use gettextrs::npgettext; use gtk::{glib, glib::clone, prelude::*, subclass::prelude::*}; use crate::{ - session::model::MembershipListKind, + session::MembershipListKind, session_view::content::room_details::membership_subpage_item::MembershipSubpageItem, }; diff --git a/src/session_view/content/room_details/members_page/members_list_view/mod.rs b/src/session_view/content/room_details/members_page/members_list_view/mod.rs index 8bc7a89b..6a419ad8 100644 --- a/src/session_view/content/room_details/members_page/members_list_view/mod.rs +++ b/src/session_view/content/room_details/members_page/members_list_view/mod.rs @@ -12,7 +12,7 @@ use self::{item_row::ItemRow, membership_subpage_row::MembershipSubpageRow}; use crate::{ components::LoadingRow, prelude::*, - session::model::{Member, MemberList, MembershipListKind, Room}, + session::{Member, MemberList, MembershipListKind, Room}, session_view::content::room_details::MembershipSubpageItem, utils::{BoundObjectWeakRef, ExpressionListModel, LoadingState, expression}, }; diff --git a/src/session_view/content/room_details/members_page/mod.rs b/src/session_view/content/room_details/members_page/mod.rs index 886a19b0..e7d1990d 100644 --- a/src/session_view/content/room_details/members_page/mod.rs +++ b/src/session_view/content/room_details/members_page/mod.rs @@ -4,7 +4,7 @@ use gtk::glib; mod members_list_view; use self::members_list_view::MembersListView; -use crate::session::model::{MemberList, MembershipListKind, Room}; +use crate::session::{MemberList, MembershipListKind, Room}; mod imp { use glib::subclass::InitializingObject; diff --git a/src/session_view/content/room_details/membership_subpage_item.rs b/src/session_view/content/room_details/membership_subpage_item.rs index f07e54d6..ecb7da04 100644 --- a/src/session_view/content/room_details/membership_subpage_item.rs +++ b/src/session_view/content/room_details/membership_subpage_item.rs @@ -3,7 +3,7 @@ use gtk::{ glib::{prelude::*, subclass::prelude::*}, }; -use crate::session::model::MembershipListKind; +use crate::session::MembershipListKind; mod imp { use std::cell::{Cell, OnceCell}; diff --git a/src/session_view/content/room_details/mod.rs b/src/session_view/content/room_details/mod.rs index 94deec34..dd60826a 100644 --- a/src/session_view/content/room_details/mod.rs +++ b/src/session_view/content/room_details/mod.rs @@ -38,7 +38,7 @@ use self::{ }; use crate::{ components::UserPage, - session::model::{MemberList, MembershipListKind, Room}, + session::{MemberList, MembershipListKind, Room}, toast, }; diff --git a/src/session_view/content/room_details/permissions/add_members_subpage.rs b/src/session_view/content/room_details/permissions/add_members_subpage.rs index 3911c405..0ce06fa5 100644 --- a/src/session_view/content/room_details/permissions/add_members_subpage.rs +++ b/src/session_view/content/room_details/permissions/add_members_subpage.rs @@ -13,7 +13,7 @@ use crate::{ confirm_set_room_member_power_level_same_as_own_dialog, }, prelude::*, - session::model::{Member, Permissions}, + session::{Member, Permissions}, utils::expression, }; diff --git a/src/session_view/content/room_details/permissions/member_power_level.rs b/src/session_view/content/room_details/permissions/member_power_level.rs index be590dad..8e41c430 100644 --- a/src/session_view/content/room_details/permissions/member_power_level.rs +++ b/src/session_view/content/room_details/permissions/member_power_level.rs @@ -13,7 +13,7 @@ use tracing::error; use crate::{ prelude::*, - session::model::{MemberRole, Permissions, User}, + session::{MemberRole, Permissions, User}, utils::BoundObjectWeakRef, }; diff --git a/src/session_view/content/room_details/permissions/member_row.rs b/src/session_view/content/room_details/permissions/member_row.rs index 9274fd68..1c2683f3 100644 --- a/src/session_view/content/room_details/permissions/member_row.rs +++ b/src/session_view/content/room_details/permissions/member_row.rs @@ -10,7 +10,7 @@ use crate::{ confirm_own_demotion_dialog, confirm_set_room_member_power_level_same_as_own_dialog, }, prelude::*, - session::model::Permissions, + session::Permissions, utils::{BoundObject, key_bindings}, }; diff --git a/src/session_view/content/room_details/permissions/members_subpage.rs b/src/session_view/content/room_details/permissions/members_subpage.rs index 0a978d47..2458e683 100644 --- a/src/session_view/content/room_details/permissions/members_subpage.rs +++ b/src/session_view/content/room_details/permissions/members_subpage.rs @@ -7,7 +7,7 @@ use gtk::{ use tracing::error; use super::{MemberPowerLevel, PermissionsMemberRow, PrivilegedMembers}; -use crate::{session::model::User, utils::expression}; +use crate::{session::User, utils::expression}; mod imp { use std::{cell::Cell, marker::PhantomData}; diff --git a/src/session_view/content/room_details/permissions/permissions_subpage.rs b/src/session_view/content/room_details/permissions/permissions_subpage.rs index 4ff40fa2..ca668caf 100644 --- a/src/session_view/content/room_details/permissions/permissions_subpage.rs +++ b/src/session_view/content/room_details/permissions/permissions_subpage.rs @@ -16,7 +16,7 @@ use crate::{ ButtonCountRow, LoadingButton, PowerLevelSelectionRow, UnsavedChangesResponse, unsaved_changes_dialog, }, - session::model::{POWER_LEVEL_MAX, Permissions}, + session::{POWER_LEVEL_MAX, Permissions}, toast, utils::BoundObjectWeakRef, }; diff --git a/src/session_view/content/room_details/permissions/privileged_members.rs b/src/session_view/content/room_details/permissions/privileged_members.rs index 45f874a7..26eb4f38 100644 --- a/src/session_view/content/room_details/permissions/privileged_members.rs +++ b/src/session_view/content/room_details/permissions/privileged_members.rs @@ -7,7 +7,7 @@ use ruma::{Int, OwnedUserId}; use super::MemberPowerLevel; use crate::{ - session::model::{Permissions, User}, + session::{Permissions, User}, utils::BoundObjectWeakRef, }; diff --git a/src/session_view/content/room_details/permissions/select_member_row.rs b/src/session_view/content/room_details/permissions/select_member_row.rs index 93ef74cb..2b6679b2 100644 --- a/src/session_view/content/room_details/permissions/select_member_row.rs +++ b/src/session_view/content/room_details/permissions/select_member_row.rs @@ -1,7 +1,7 @@ use adw::{prelude::*, subclass::prelude::*}; use gtk::glib; -use crate::{session::model::Member, utils::bool_to_accessible_tristate}; +use crate::{session::Member, utils::bool_to_accessible_tristate}; mod imp { use std::cell::{Cell, RefCell}; diff --git a/src/session_view/content/room_details/upgrade_dialog/mod.rs b/src/session_view/content/room_details/upgrade_dialog/mod.rs index c01946e6..12621025 100644 --- a/src/session_view/content/room_details/upgrade_dialog/mod.rs +++ b/src/session_view/content/room_details/upgrade_dialog/mod.rs @@ -12,7 +12,7 @@ use tracing::error; mod room_version; use self::room_version::RoomVersion; -use crate::{session::model::JoinRuleValue, utils::OneshotNotifier}; +use crate::{session::JoinRuleValue, utils::OneshotNotifier}; mod imp { use std::cell::OnceCell; diff --git a/src/session_view/content/room_history/divider_row.rs b/src/session_view/content/room_history/divider_row.rs index 456290e8..afed1dbf 100644 --- a/src/session_view/content/room_history/divider_row.rs +++ b/src/session_view/content/room_history/divider_row.rs @@ -3,7 +3,7 @@ use gettextrs::gettext; use gtk::{glib, glib::clone}; use crate::{ - session::model::{VirtualItem, VirtualItemKind}, + session::{VirtualItem, VirtualItemKind}, utils::BoundObject, }; diff --git a/src/session_view/content/room_history/event_actions/context_menu.rs b/src/session_view/content/room_history/event_actions/context_menu.rs index c9743370..ea6697dc 100644 --- a/src/session_view/content/room_history/event_actions/context_menu.rs +++ b/src/session_view/content/room_history/event_actions/context_menu.rs @@ -2,11 +2,11 @@ use gettextrs::gettext; use gtk::{gio, prelude::*}; use super::QuickReactionChooser; -use crate::session::model::ReactionList; +use crate::session::ReactionList; /// Helper struct for the context menu of a row presenting an [`Event`]. /// -/// [`Event`]: crate::session::model::Event +/// [`Event`]: crate::session::Event #[derive(Debug)] pub(crate) struct EventActionsContextMenu { /// The popover of the context menu. diff --git a/src/session_view/content/room_history/event_actions/group.rs b/src/session_view/content/room_history/event_actions/group.rs index d2f2ca3a..254f0758 100644 --- a/src/session_view/content/room_history/event_actions/group.rs +++ b/src/session_view/content/room_history/event_actions/group.rs @@ -11,7 +11,7 @@ use super::EventPropertiesDialog; use crate::{ components::{RoomMemberDestructiveAction, confirm_room_member_destructive_action_dialog}, prelude::*, - session::model::{Event, Membership, MessageState, Room}, + session::{Event, Membership, MessageState, Room}, spawn, spawn_tokio, toast, }; diff --git a/src/session_view/content/room_history/event_actions/properties_dialog.rs b/src/session_view/content/room_history/event_actions/properties_dialog.rs index 03855378..d16975dd 100644 --- a/src/session_view/content/room_history/event_actions/properties_dialog.rs +++ b/src/session_view/content/room_history/event_actions/properties_dialog.rs @@ -6,7 +6,7 @@ use sourceview::prelude::*; use crate::{ components::{CopyableRow, ToastableDialog, UserProfileDialog}, prelude::*, - session::model::Event, + session::Event, toast, utils, utils::TemplateCallbacks, }; diff --git a/src/session_view/content/room_history/event_actions/quick_reaction_chooser.rs b/src/session_view/content/room_history/event_actions/quick_reaction_chooser.rs index 15b6a3df..a8ec249e 100644 --- a/src/session_view/content/room_history/event_actions/quick_reaction_chooser.rs +++ b/src/session_view/content/room_history/event_actions/quick_reaction_chooser.rs @@ -4,7 +4,7 @@ use gtk::{ glib::{clone, closure_local}, }; -use crate::{session::model::ReactionList, utils::BoundObject}; +use crate::{session::ReactionList, utils::BoundObject}; /// A quick reaction. #[derive(Debug, Clone, Copy)] diff --git a/src/session_view/content/room_history/event_row.rs b/src/session_view/content/room_history/event_row.rs index 514be85d..f4ea7d0a 100644 --- a/src/session_view/content/room_history/event_row.rs +++ b/src/session_view/content/room_history/event_row.rs @@ -6,7 +6,7 @@ use super::{EventActionsGroup, MessageRow, RoomHistory, StateRow}; use crate::{ components::ContextMenuBin, prelude::*, - session::model::Event, + session::Event, session_view::content::room_history::message_toolbar::ComposerState, utils::{BoundObject, BoundObjectWeakRef}, }; diff --git a/src/session_view/content/room_history/member_timestamp/mod.rs b/src/session_view/content/room_history/member_timestamp/mod.rs index a87a0b65..ce9a7097 100644 --- a/src/session_view/content/room_history/member_timestamp/mod.rs +++ b/src/session_view/content/room_history/member_timestamp/mod.rs @@ -3,7 +3,7 @@ use gtk::{glib, prelude::*}; pub mod row; -use crate::session::model::Member; +use crate::session::Member; mod imp { use std::cell::Cell; diff --git a/src/session_view/content/room_history/message_row/caption.rs b/src/session_view/content/room_history/message_row/caption.rs index 4d21a9fd..3914875a 100644 --- a/src/session_view/content/room_history/message_row/caption.rs +++ b/src/session_view/content/room_history/message_row/caption.rs @@ -2,7 +2,7 @@ use gtk::{glib, prelude::*, subclass::prelude::*}; use ruma::events::room::message::FormattedBody; use super::{ContentFormat, text::MessageText}; -use crate::{prelude::*, session::model::Room}; +use crate::{prelude::*, session::Room}; mod imp { use std::marker::PhantomData; diff --git a/src/session_view/content/room_history/message_row/content.rs b/src/session_view/content/room_history/message_row/content.rs index 7d0bdd83..aba54dc6 100644 --- a/src/session_view/content/room_history/message_row/content.rs +++ b/src/session_view/content/room_history/message_row/content.rs @@ -12,7 +12,7 @@ use super::{ use crate::{ components::AudioPlayerMessage, prelude::*, - session::model::{Event, Member, Room}, + session::{Event, Member, Room}, session_view::content::room_history::message_toolbar::MessageEventSource, spawn, utils::matrix::{MediaMessage, MessageCacheKey}, diff --git a/src/session_view/content/room_history/message_row/message_state_stack.rs b/src/session_view/content/room_history/message_row/message_state_stack.rs index 6406ddd1..de86fbe9 100644 --- a/src/session_view/content/room_history/message_row/message_state_stack.rs +++ b/src/session_view/content/room_history/message_row/message_state_stack.rs @@ -1,7 +1,7 @@ use adw::subclass::prelude::*; use gtk::{glib, glib::clone, prelude::*}; -use crate::session::model::MessageState; +use crate::session::MessageState; /// The number of seconds for which we show the icon acknowledging that the /// message was sent. diff --git a/src/session_view/content/room_history/message_row/mod.rs b/src/session_view/content/room_history/message_row/mod.rs index a1ace2bb..1d910944 100644 --- a/src/session_view/content/room_history/message_row/mod.rs +++ b/src/session_view/content/room_history/message_row/mod.rs @@ -26,7 +26,7 @@ use crate::{ components::UserProfileDialog, gettext_f, prelude::*, - session::model::{Event, EventHeaderState, Member}, + session::{Event, EventHeaderState, Member}, system_settings::ClockFormat, utils::BoundObject, }; diff --git a/src/session_view/content/room_history/message_row/reaction/mod.rs b/src/session_view/content/room_history/message_row/reaction/mod.rs index 1ac1cd6b..3084f2fc 100644 --- a/src/session_view/content/room_history/message_row/reaction/mod.rs +++ b/src/session_view/content/room_history/message_row/reaction/mod.rs @@ -6,7 +6,7 @@ use self::reaction_popover::ReactionPopover; use crate::{ gettext_f, ngettext_f, prelude::*, - session::model::{Member, MemberList, ReactionData, ReactionGroup}, + session::{Member, MemberList, ReactionData, ReactionGroup}, session_view::content::room_history::member_timestamp::MemberTimestamp, utils::{BoundObjectWeakRef, EMOJI_REGEX, key_bindings}, }; diff --git a/src/session_view/content/room_history/message_row/reaction_list.rs b/src/session_view/content/room_history/message_row/reaction_list.rs index 33f12365..9e9abe88 100644 --- a/src/session_view/content/room_history/message_row/reaction_list.rs +++ b/src/session_view/content/room_history/message_row/reaction_list.rs @@ -2,7 +2,7 @@ use adw::{prelude::*, subclass::prelude::*}; use gtk::{glib, glib::clone}; use super::reaction::MessageReaction; -use crate::session::model::{MemberList, ReactionList}; +use crate::session::{MemberList, ReactionList}; mod imp { use glib::subclass::InitializingObject; diff --git a/src/session_view/content/room_history/message_row/reply.rs b/src/session_view/content/room_history/message_row/reply.rs index 36a6d4e9..30e48a07 100644 --- a/src/session_view/content/room_history/message_row/reply.rs +++ b/src/session_view/content/room_history/message_row/reply.rs @@ -1,7 +1,7 @@ use adw::{prelude::*, subclass::prelude::*}; use gtk::glib; -use crate::session::model::User; +use crate::session::User; mod imp { use std::cell::{Cell, RefCell}; diff --git a/src/session_view/content/room_history/message_row/sender_name.rs b/src/session_view/content/room_history/message_row/sender_name.rs index e1db1a40..4d669785 100644 --- a/src/session_view/content/room_history/message_row/sender_name.rs +++ b/src/session_view/content/room_history/message_row/sender_name.rs @@ -4,7 +4,7 @@ use gtk::{glib, glib::clone}; use crate::{ prelude::*, - session::model::{Member, Membership}, + session::{Member, Membership}, session_view::content::RoomHistory, utils::{BoundObject, key_bindings}, }; diff --git a/src/session_view/content/room_history/message_row/text/inline_html.rs b/src/session_view/content/room_history/message_row/text/inline_html.rs index 797cbb57..8e97f491 100644 --- a/src/session_view/content/room_history/message_row/text/inline_html.rs +++ b/src/session_view/content/room_history/message_row/text/inline_html.rs @@ -11,7 +11,7 @@ use tracing::debug; use crate::{ components::Pill, prelude::*, - session::model::Room, + session::Room, utils::string::{Linkifier, PangoStrMutExt}, }; diff --git a/src/session_view/content/room_history/message_row/text/mod.rs b/src/session_view/content/room_history/message_row/text/mod.rs index 07aa2701..7b13b289 100644 --- a/src/session_view/content/room_history/message_row/text/mod.rs +++ b/src/session_view/content/room_history/message_row/text/mod.rs @@ -18,7 +18,7 @@ use super::ContentFormat; use crate::{ components::{AtRoom, LabelWithWidgets}, prelude::*, - session::model::{Member, Room}, + session::{Member, Room}, utils::{ BoundObjectWeakRef, EMOJI_REGEX, string::{Linkifier, PangoStrMutExt}, diff --git a/src/session_view/content/room_history/message_row/text/widgets.rs b/src/session_view/content/room_history/message_row/text/widgets.rs index a29b9236..ff7e89cf 100644 --- a/src/session_view/content/room_history/message_row/text/widgets.rs +++ b/src/session_view/content/room_history/message_row/text/widgets.rs @@ -13,7 +13,7 @@ use super::{SUPPORTED_BLOCK_ELEMENTS, inline_html::InlineHtmlBuilder}; use crate::{ components::{AtRoom, LabelWithWidgets}, prelude::*, - session::model::Room, + session::Room, }; /// The immutable config fields to build a HTML widget tree. diff --git a/src/session_view/content/room_history/message_row/visual_media.rs b/src/session_view/content/room_history/message_row/visual_media.rs index ae48f275..65942ae3 100644 --- a/src/session_view/content/room_history/message_row/visual_media.rs +++ b/src/session_view/content/room_history/message_row/visual_media.rs @@ -9,7 +9,7 @@ use crate::{ Window, components::{AnimatedImagePaintable, VideoPlayer}, gettext_f, - session::model::Room, + session::Room, spawn, utils::{ CountedRef, File, LoadingState, TemplateCallbacks, key_bindings, diff --git a/src/session_view/content/room_history/message_toolbar/completion/completion_popover.rs b/src/session_view/content/room_history/message_toolbar/completion/completion_popover.rs index bd3ae3eb..98910e92 100644 --- a/src/session_view/content/room_history/message_toolbar/completion/completion_popover.rs +++ b/src/session_view/content/room_history/message_toolbar/completion/completion_popover.rs @@ -6,7 +6,7 @@ use secular::normalized_lower_lay_string; use super::{CompletionMemberList, CompletionRoomList}; use crate::{ components::{AvatarImageSafetySetting, Pill, PillSource, PillSourceRow}, - session::model::Room, + session::Room, session_view::content::room_history::message_toolbar::MessageToolbar, utils::BoundObject, }; diff --git a/src/session_view/content/room_history/message_toolbar/completion/member_list.rs b/src/session_view/content/room_history/message_toolbar/completion/member_list.rs index aede145f..45bd64e4 100644 --- a/src/session_view/content/room_history/message_toolbar/completion/member_list.rs +++ b/src/session_view/content/room_history/message_toolbar/completion/member_list.rs @@ -7,7 +7,7 @@ use gtk::{ use crate::{ components::PillSource, - session::model::{Member, MembershipListKind, Room}, + session::{Member, MembershipListKind, Room}, utils::{BoundObjectWeakRef, ExpressionListModel, SingleItemListModel, expression}, }; diff --git a/src/session_view/content/room_history/message_toolbar/completion/room_list.rs b/src/session_view/content/room_history/message_toolbar/completion/room_list.rs index 2feaa498..fd44ccce 100644 --- a/src/session_view/content/room_history/message_toolbar/completion/room_list.rs +++ b/src/session_view/content/room_history/message_toolbar/completion/room_list.rs @@ -1,7 +1,7 @@ use gtk::{glib, glib::closure, prelude::*, subclass::prelude::*}; use crate::{ - session::model::{JoinRule, Member, Membership, Room, RoomAliases, RoomCategory, RoomList}, + session::{JoinRule, Member, Membership, Room, RoomAliases, RoomCategory, RoomList}, utils::{ExpressionListModel, expression}, }; diff --git a/src/session_view/content/room_history/message_toolbar/composer_parser.rs b/src/session_view/content/room_history/message_toolbar/composer_parser.rs index 479e8d9a..d935a45e 100644 --- a/src/session_view/content/room_history/message_toolbar/composer_parser.rs +++ b/src/session_view/content/room_history/message_toolbar/composer_parser.rs @@ -20,7 +20,7 @@ use super::{ use crate::{ components::{AtRoom, Pill, PillSource}, prelude::*, - session::model::{Member, Room}, + session::{Member, Room}, utils::matrix::AT_ROOM, }; diff --git a/src/session_view/content/room_history/message_toolbar/composer_state.rs b/src/session_view/content/room_history/message_toolbar/composer_state.rs index c2912c66..0fe03a55 100644 --- a/src/session_view/content/room_history/message_toolbar/composer_state.rs +++ b/src/session_view/content/room_history/message_toolbar/composer_state.rs @@ -19,7 +19,7 @@ use tracing::{error, warn}; use super::ComposerParser; use crate::{ components::{AvatarImageSafetySetting, Pill, PillSource}, - session::model::{Event, Member, Room, Timeline}, + session::{Event, Member, Room, Timeline}, spawn, spawn_tokio, utils::matrix::{AT_ROOM, find_at_room, find_html_mentions}, }; diff --git a/src/session_view/content/room_history/message_toolbar/mod.rs b/src/session_view/content/room_history/message_toolbar/mod.rs index 15eb8403..89097c34 100644 --- a/src/session_view/content/room_history/message_toolbar/mod.rs +++ b/src/session_view/content/room_history/message_toolbar/mod.rs @@ -39,7 +39,7 @@ use crate::{ components::{AvatarImageSafetySetting, CustomEntry, LabelWithWidgets, LoadingButton}, gettext_f, prelude::*, - session::model::{Event, Member, Room, RoomListRoomInfo, Timeline}, + session::{Event, Member, Room, RoomListRoomInfo, Timeline}, spawn, spawn_tokio, toast, utils::{ Location, LocationError, TemplateCallbacks, TokioDrop, diff --git a/src/session_view/content/room_history/mod.rs b/src/session_view/content/room_history/mod.rs index 54a9b58b..593962ec 100644 --- a/src/session_view/content/room_history/mod.rs +++ b/src/session_view/content/room_history/mod.rs @@ -42,7 +42,7 @@ use crate::{ components::{DragOverlay, confirm_leave_room_dialog}, ngettext_f, prelude::*, - session::model::{ + session::{ Event, MemberList, Membership, MembershipListKind, ReceiptPosition, Room, TargetRoomCategory, Timeline, VirtualItem, VirtualItemKind, }, diff --git a/src/session_view/content/room_history/read_receipts_list/mod.rs b/src/session_view/content/room_history/read_receipts_list/mod.rs index 0e518e03..1ff20bf7 100644 --- a/src/session_view/content/room_history/read_receipts_list/mod.rs +++ b/src/session_view/content/room_history/read_receipts_list/mod.rs @@ -8,7 +8,7 @@ use crate::{ components::OverlappingAvatars, i18n::{gettext_f, ngettext_f}, prelude::*, - session::model::{Member, MemberList, UserReadReceipt}, + session::{Member, MemberList, UserReadReceipt}, utils::{BoundObjectWeakRef, key_bindings}, }; diff --git a/src/session_view/content/room_history/state/content.rs b/src/session_view/content/room_history/state/content.rs index 4190bc33..7d412c95 100644 --- a/src/session_view/content/room_history/state/content.rs +++ b/src/session_view/content/room_history/state/content.rs @@ -15,7 +15,7 @@ use super::StateCreation; use crate::{ gettext_f, prelude::*, - session::model::{Event, Member}, + session::{Event, Member}, utils::BoundObjectWeakRef, }; diff --git a/src/session_view/content/room_history/state/group_item_row.rs b/src/session_view/content/room_history/state/group_item_row.rs index 0db5ea05..b2d922fd 100644 --- a/src/session_view/content/room_history/state/group_item_row.rs +++ b/src/session_view/content/room_history/state/group_item_row.rs @@ -4,7 +4,7 @@ use tracing::error; use super::StateContent; use crate::{ prelude::*, - session::model::Event, + session::Event, session_view::content::room_history::{EventActionsGroup, RoomHistory}, utils::{BoundObject, BoundObjectWeakRef, key_bindings}, }; diff --git a/src/session_view/content/room_history/state/group_row.rs b/src/session_view/content/room_history/state/group_row.rs index 93c3d021..8ef7f57e 100644 --- a/src/session_view/content/room_history/state/group_row.rs +++ b/src/session_view/content/room_history/state/group_row.rs @@ -5,7 +5,7 @@ use super::StateGroupItemRow; use crate::{ ngettext_f, prelude::*, - session::model::{Event, Room}, + session::{Event, Room}, session_view::content::room_history::ReadReceiptsList, utils::{BoundObject, GroupingListGroup, key_bindings}, }; diff --git a/src/session_view/content/room_history/state/row.rs b/src/session_view/content/room_history/state/row.rs index 523ed4ce..01169c41 100644 --- a/src/session_view/content/room_history/state/row.rs +++ b/src/session_view/content/room_history/state/row.rs @@ -2,7 +2,7 @@ use adw::{prelude::*, subclass::prelude::*}; use gtk::glib; use super::StateContent; -use crate::{session::model::Event, session_view::content::room_history::ReadReceiptsList}; +use crate::{session::Event, session_view::content::room_history::ReadReceiptsList}; mod imp { use std::cell::RefCell; diff --git a/src/session_view/content/room_history/title.rs b/src/session_view/content/room_history/title.rs index 06c990c3..23df49b2 100644 --- a/src/session_view/content/room_history/title.rs +++ b/src/session_view/content/room_history/title.rs @@ -1,7 +1,7 @@ use adw::{prelude::*, subclass::prelude::*}; use gtk::{glib, glib::clone}; -use crate::{prelude::*, session::model::Room, utils::BoundObjectWeakRef}; +use crate::{prelude::*, session::Room, utils::BoundObjectWeakRef}; mod imp { use std::cell::RefCell; diff --git a/src/session_view/content/room_history/typing_row.rs b/src/session_view/content/room_history/typing_row.rs index 03f34418..2d57aa8a 100644 --- a/src/session_view/content/room_history/typing_row.rs +++ b/src/session_view/content/room_history/typing_row.rs @@ -5,7 +5,7 @@ use crate::{ components::OverlappingAvatars, i18n::{gettext_f, ngettext_f}, prelude::*, - session::model::{Member, TypingList}, + session::{Member, TypingList}, utils::BoundObjectWeakRef, }; diff --git a/src/session_view/content/room_history/verification_info_bar.rs b/src/session_view/content/room_history/verification_info_bar.rs index 152e8f86..d92b26ba 100644 --- a/src/session_view/content/room_history/verification_info_bar.rs +++ b/src/session_view/content/room_history/verification_info_bar.rs @@ -7,7 +7,7 @@ use crate::{ components::LoadingButton, gettext_f, prelude::*, - session::model::{IdentityVerification, VerificationState}, + session::{IdentityVerification, VerificationState}, toast, utils::BoundObjectWeakRef, }; diff --git a/src/session_view/create_direct_chat_dialog/mod.rs b/src/session_view/create_direct_chat_dialog/mod.rs index b63b4040..6308b97e 100644 --- a/src/session_view/create_direct_chat_dialog/mod.rs +++ b/src/session_view/create_direct_chat_dialog/mod.rs @@ -9,7 +9,7 @@ use crate::{ Window, components::{PillSource, PillSourceRow}, gettext, - session::model::{Session, User}, + session::{Session, User}, }; /// A page of the [`CreateDirectChatDialog`]. diff --git a/src/session_view/create_direct_chat_dialog/user.rs b/src/session_view/create_direct_chat_dialog/user.rs index 27d41cdc..64ba11d7 100644 --- a/src/session_view/create_direct_chat_dialog/user.rs +++ b/src/session_view/create_direct_chat_dialog/user.rs @@ -4,7 +4,7 @@ use matrix_sdk::ruma::{OwnedMxcUri, OwnedUserId}; use crate::{ components::PillSource, prelude::*, - session::model::{Room, Session, User}, + session::{Room, Session, User}, }; mod imp { diff --git a/src/session_view/create_direct_chat_dialog/user_list.rs b/src/session_view/create_direct_chat_dialog/user_list.rs index 4274f013..c0ef59b1 100644 --- a/src/session_view/create_direct_chat_dialog/user_list.rs +++ b/src/session_view/create_direct_chat_dialog/user_list.rs @@ -3,7 +3,7 @@ use ruma::UserId; use tracing::error; use super::DirectChatUser; -use crate::{prelude::*, session::model::Session, spawn, spawn_tokio, utils::LoadingState}; +use crate::{prelude::*, session::Session, spawn, spawn_tokio, utils::LoadingState}; mod imp { use std::cell::{Cell, RefCell}; diff --git a/src/session_view/create_room_dialog.rs b/src/session_view/create_room_dialog.rs index 7b552822..d7136e55 100644 --- a/src/session_view/create_room_dialog.rs +++ b/src/session_view/create_room_dialog.rs @@ -18,7 +18,7 @@ use crate::{ Window, components::{LoadingButton, SubstringEntryRow, ToastableDialog}, prelude::*, - session::model::Session, + session::Session, spawn_tokio, toast, }; diff --git a/src/session_view/media_viewer.rs b/src/session_view/media_viewer.rs index 404918d1..747908c1 100644 --- a/src/session_view/media_viewer.rs +++ b/src/session_view/media_viewer.rs @@ -6,7 +6,7 @@ use tracing::warn; use crate::{ components::{MediaContentViewer, ScaleRevealer}, - session::model::Room, + session::Room, spawn, toast, utils::matrix::VisualMediaMessage, }; diff --git a/src/session_view/mod.rs b/src/session_view/mod.rs index 996b56bd..4b649c26 100644 --- a/src/session_view/mod.rs +++ b/src/session_view/mod.rs @@ -18,7 +18,7 @@ use crate::{ components::{RoomPreviewDialog, UserProfileDialog}, intent::SessionIntent, prelude::*, - session::model::{ + session::{ IdentityVerification, Room, RoomCategory, RoomList, Session, SidebarItemList, SidebarListModel, VerificationKey, }, diff --git a/src/session_view/sidebar/icon_item_row.rs b/src/session_view/sidebar/icon_item_row.rs index e0db9340..46a7cb77 100644 --- a/src/session_view/sidebar/icon_item_row.rs +++ b/src/session_view/sidebar/icon_item_row.rs @@ -1,7 +1,7 @@ use adw::{prelude::*, subclass::prelude::*}; use gtk::glib; -use crate::session::model::{SidebarIconItem, SidebarIconItemType}; +use crate::session::{SidebarIconItem, SidebarIconItemType}; mod imp { use std::cell::RefCell; diff --git a/src/session_view/sidebar/mod.rs b/src/session_view/sidebar/mod.rs index 30612b61..933b605e 100644 --- a/src/session_view/sidebar/mod.rs +++ b/src/session_view/sidebar/mod.rs @@ -20,7 +20,7 @@ use crate::{ account_settings::{AccountSettings, AccountSettingsSubpage}, account_switcher::AccountSwitcherButton, components::OfflineBanner, - session::model::{ + session::{ CryptoIdentityState, RecoveryState, RoomCategory, Session, SessionVerificationState, SidebarListModel, SidebarSection, TargetRoomCategory, User, }, diff --git a/src/session_view/sidebar/room_row.rs b/src/session_view/sidebar/room_row.rs index fd00b42f..485b2667 100644 --- a/src/session_view/sidebar/room_row.rs +++ b/src/session_view/sidebar/room_row.rs @@ -6,7 +6,7 @@ use crate::{ components::Avatar, i18n::{gettext_f, ngettext_f}, prelude::*, - session::model::{HighlightFlags, Room, RoomCategory}, + session::{HighlightFlags, Room, RoomCategory}, utils::BoundObject, }; diff --git a/src/session_view/sidebar/row.rs b/src/session_view/sidebar/row.rs index 708179c7..6f849a64 100644 --- a/src/session_view/sidebar/row.rs +++ b/src/session_view/sidebar/row.rs @@ -10,7 +10,7 @@ use super::{ use crate::{ components::{ContextMenuBin, confirm_leave_room_dialog}, prelude::*, - session::model::{ + session::{ IdentityVerification, ReceiptPosition, Room, RoomCategory, SidebarIconItem, SidebarIconItemType, SidebarSection, TargetRoomCategory, User, }, diff --git a/src/session_view/sidebar/section_row.rs b/src/session_view/sidebar/section_row.rs index 6248204f..743240b0 100644 --- a/src/session_view/sidebar/section_row.rs +++ b/src/session_view/sidebar/section_row.rs @@ -3,7 +3,7 @@ use gettextrs::gettext; use gtk::{glib, glib::clone}; use crate::{ - session::model::{HighlightFlags, RoomCategory, SidebarSection, SidebarSectionName}, + session::{HighlightFlags, RoomCategory, SidebarSection, SidebarSectionName}, utils::{BoundObject, TemplateCallbacks}, }; diff --git a/src/session_view/sidebar/verification_row.rs b/src/session_view/sidebar/verification_row.rs index cc7dc0bb..e83366e4 100644 --- a/src/session_view/sidebar/verification_row.rs +++ b/src/session_view/sidebar/verification_row.rs @@ -1,7 +1,7 @@ use adw::{prelude::*, subclass::prelude::*}; use gtk::glib; -use crate::session::model::IdentityVerification; +use crate::session::IdentityVerification; mod imp { use std::cell::RefCell; diff --git a/src/utils/matrix/mod.rs b/src/utils/matrix/mod.rs index 64b09f0c..4f491c70 100644 --- a/src/utils/matrix/mod.rs +++ b/src/utils/matrix/mod.rs @@ -37,7 +37,7 @@ use crate::{ components::{AvatarImageSafetySetting, Pill}, prelude::*, secret::StoredSession, - session::model::Room, + session::Room, }; /// The result of a password validation. diff --git a/src/utils/media/mod.rs b/src/utils/media/mod.rs index bcac4fab..878937dd 100644 --- a/src/utils/media/mod.rs +++ b/src/utils/media/mod.rs @@ -128,7 +128,7 @@ pub(crate) enum MediaFileError { File(#[from] std::io::Error), /// We could not access the Matrix client via the [`Session`]. /// - /// [`Session`]: crate::session::model::Session + /// [`Session`]: crate::session::Session #[error("Could not access session")] NoSession, } diff --git a/src/utils/string/mod.rs b/src/utils/string/mod.rs index 633ae0fa..91d07d18 100644 --- a/src/utils/string/mod.rs +++ b/src/utils/string/mod.rs @@ -14,7 +14,7 @@ use super::matrix::{AT_ROOM, MatrixIdUri, find_at_room}; use crate::{ components::{AvatarImageSafetySetting, LabelWithWidgets, Pill}, prelude::*, - session::model::Room, + session::Room, }; /// The prefix for an email URI. diff --git a/src/utils/toast.rs b/src/utils/toast.rs index 4f5457b5..41748fa6 100644 --- a/src/utils/toast.rs +++ b/src/utils/toast.rs @@ -50,7 +50,7 @@ use crate::{ /// ```no_run /// use gettextts::gettext; /// use crate::toast; -/// use crate::session::model::{Room, User}; +/// use crate::session::{Room, User}; /// /// # let session = unimplemented!(); /// # let room_id = unimplemented!(); diff --git a/src/window.rs b/src/window.rs index dee7c865..2e115480 100644 --- a/src/window.rs +++ b/src/window.rs @@ -15,7 +15,7 @@ use crate::{ login::Login, prelude::*, secret::SESSION_ID_LENGTH, - session::model::{Session, SessionState}, + session::{Session, SessionState}, session_list::{FailedSession, SessionInfo}, session_view::SessionView, toast,