diff --git a/locales/en.yml b/locales/en.yml index 20d7fbc..2619f46 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -143,6 +143,7 @@ network: available: Available not_available: Not available availability_check: Availability check + android_warning: Attention to Android users. To synchronize integrated node successfully, you must allow access to notifications and remove battery usage restrictions for the Grim application at system settings of your phone. This is necessary operation for correct work of application in the background. sync_status: node_restarting: Node is restarting node_down: Node is down diff --git a/locales/ru.yml b/locales/ru.yml index df821e9..6007c82 100644 --- a/locales/ru.yml +++ b/locales/ru.yml @@ -143,6 +143,7 @@ network: available: Доступно not_available: Недоступно availability_check: Проверка доступности + android_warning: Вниманию пользователей Android. Для успешной синхронизации встроенного узла необходимо разрешить доступ к уведомлениям и снять ограничения на использование батареи для приложения Grim в настройках телефона. Это необходимая операция для корректной работы приложения в фоне. sync_status: node_restarting: Узел перезапускается node_down: Узел выключен diff --git a/src/gui/views/root.rs b/src/gui/views/root.rs index fba6d4f..bd58025 100644 --- a/src/gui/views/root.rs +++ b/src/gui/views/root.rs @@ -38,10 +38,12 @@ pub struct Root { /// Check if app exit is allowed on close event of [`eframe::App`] implementation. pub(crate) exit_allowed: bool, - /// Flag to show exit progress at [`Modal`]. show_exit_progress: bool, + /// Flag to check if first it's first draw of content. + first_draw: bool, + /// List of allowed [`Modal`] ids for this [`ModalContainer`]. allowed_modal_ids: Vec<&'static str> } @@ -56,8 +58,10 @@ impl Default for Root { wallets: WalletsContent::default(), exit_allowed, show_exit_progress: false, + first_draw: true, allowed_modal_ids: vec![ - Self::EXIT_MODAL_ID + Self::EXIT_MODAL_ID, + Self::ANDROID_INTEGRATED_NODE_WARNING_MODAL ], } } @@ -75,6 +79,7 @@ impl ModalContainer for Root { _: &dyn PlatformCallbacks) { match modal.id { Self::EXIT_MODAL_ID => self.exit_modal_content(ui, modal), + Self::ANDROID_INTEGRATED_NODE_WARNING_MODAL => self.android_warning_modal_ui(ui, modal), _ => {} } } @@ -82,7 +87,10 @@ impl ModalContainer for Root { impl Root { /// Identifier for exit confirmation [`Modal`]. - pub const EXIT_MODAL_ID: &'static str = "exit_confirmation"; + pub const EXIT_MODAL_ID: &'static str = "exit_confirmation_modal"; + + /// Identifier for integrated node warning [`Modal`] on Android. + const ANDROID_INTEGRATED_NODE_WARNING_MODAL: &'static str = "android_node_warning_modal"; /// Default width of side panel at application UI. pub const SIDE_PANEL_WIDTH: f32 = 400.0; @@ -125,6 +133,19 @@ impl Root { self.wallets.ui(ui, frame, cb); }); }); + + // Show integrated node warning on Android if needed. + if self.first_draw && OperatingSystem::from_target_os() == OperatingSystem::Android && + AppConfig::android_integrated_node_warning_needed() { + Modal::new(Self::ANDROID_INTEGRATED_NODE_WARNING_MODAL) + .title(t!("network.node")) + .show(); + } + + // Setup first draw flag. + if self.first_draw { + self.first_draw = false; + } } /// Get [`NetworkContent`] panel state and width. @@ -232,4 +253,22 @@ impl Root { } } } + + /// Draw content for integrated node warning [`Modal`] on Android. + fn android_warning_modal_ui(&mut self, ui: &mut egui::Ui, modal: &Modal) { + ui.add_space(6.0); + ui.vertical_centered(|ui| { + ui.label(RichText::new(t!("network.android_warning")) + .size(17.0) + .color(Colors::TEXT)); + }); + ui.add_space(8.0); + ui.vertical_centered_justified(|ui| { + View::button(ui, t!("continue"), Colors::WHITE, || { + AppConfig::show_android_integrated_node_warning(); + modal.close(); + }); + }); + ui.add_space(6.0); + } } \ No newline at end of file diff --git a/src/settings/config.rs b/src/settings/config.rs index f847919..a8958a7 100644 --- a/src/settings/config.rs +++ b/src/settings/config.rs @@ -26,6 +26,9 @@ pub struct AppConfig { /// Chain type for node and wallets. pub(crate) chain_type: ChainTypes, + /// Flag to check if Android integrated node warning was shown. + android_integrated_node_warning: Option, + /// Flag to show wallet list at dual panel wallets mode. show_wallets_at_dual_panel: bool, /// Flag to show all connections at network panel or integrated node info. @@ -51,6 +54,7 @@ impl Default for AppConfig { Self { auto_start_node: false, chain_type: ChainTypes::default(), + android_integrated_node_warning: None, show_wallets_at_dual_panel: false, show_connections_network_panel: false, width: DEFAULT_WIDTH, @@ -193,4 +197,17 @@ impl AppConfig { } None } + + /// Check if integrated node warning is needed for Android. + pub fn android_integrated_node_warning_needed() -> bool { + let r_config = Settings::app_config_to_read(); + r_config.android_integrated_node_warning.unwrap_or(true) + } + + /// Mark integrated node warning for Android as shown. + pub fn show_android_integrated_node_warning() { + let mut w_app_config = Settings::app_config_to_update(); + w_app_config.android_integrated_node_warning = Some(false); + w_app_config.save(); + } } \ No newline at end of file