From f2a6a8a88bdf6e54a0efb7a0547fb005f28dfcd1 Mon Sep 17 00:00:00 2001 From: fufesou Date: Fri, 2 Dec 2022 21:34:20 +0800 Subject: [PATCH] do not show privacy action if peer does not support Signed-off-by: fufesou --- flutter/lib/desktop/widgets/remote_menubar.dart | 2 +- flutter/lib/models/model.dart | 7 +++++++ src/flutter.rs | 13 ++++++++++++- src/server/video_service.rs | 12 ++++++++---- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/flutter/lib/desktop/widgets/remote_menubar.dart b/flutter/lib/desktop/widgets/remote_menubar.dart index 250910396..8385bf63c 100644 --- a/flutter/lib/desktop/widgets/remote_menubar.dart +++ b/flutter/lib/desktop/widgets/remote_menubar.dart @@ -1170,7 +1170,7 @@ class _RemoteMenubarState extends State { } displayMenu.add(_createSwitchMenuEntry( 'Lock after session end', 'lock-after-session-end', padding, true)); - if (pi.platform == 'Windows') { + if (pi.features.privacyMode) { displayMenu.add(MenuEntrySwitch2( switchType: SwitchType.scheckbox, text: translate('Privacy mode'), diff --git a/flutter/lib/models/model.dart b/flutter/lib/models/model.dart index f6bfde941..805bcde33 100644 --- a/flutter/lib/models/model.dart +++ b/flutter/lib/models/model.dart @@ -344,6 +344,8 @@ class FfiModel with ChangeNotifier { _waitForImage[peerId] = true; _reconnects = 1; } + Map features = json.decode(evt['features']); + _pi.features.privacyMode = features['privacy_mode'] == 1; } notifyListeners(); } @@ -1328,6 +1330,10 @@ class Display { } } +class Features { + bool privacyMode = false; +} + class PeerInfo { String version = ''; String username = ''; @@ -1336,6 +1342,7 @@ class PeerInfo { bool sasEnabled = false; int currentDisplay = 0; List displays = []; + Features features = Features(); } const canvasKey = 'canvas'; diff --git a/src/flutter.rs b/src/flutter.rs index b4d724286..a2c307f5a 100644 --- a/src/flutter.rs +++ b/src/flutter.rs @@ -8,7 +8,8 @@ use std::{ use flutter_rust_bridge::{StreamSink, ZeroCopyBuffer}; use hbb_common::{ - bail, config::LocalConfig, message_proto::*, rendezvous_proto::ConnType, ResultType, + bail, config::LocalConfig, get_version_number, message_proto::*, rendezvous_proto::ConnType, + ResultType, }; use serde_json::json; @@ -299,6 +300,15 @@ impl InvokeUiSession for FlutterHandler { displays.push(h); } let displays = serde_json::ser::to_string(&displays).unwrap_or("".to_owned()); + let mut features: HashMap<&str, i32> = Default::default(); + for ref f in pi.features.iter() { + features.insert("privacy_mode", if f.privacy_mode { 1 } else { 0 }); + } + // compatible with 1.1.9 + if get_version_number(&pi.version) < get_version_number("1.2.0") { + features.insert("privacy_mode", 0); + } + let features = serde_json::ser::to_string(&features).unwrap_or("".to_owned()); self.push_event( "peer_info", vec![ @@ -308,6 +318,7 @@ impl InvokeUiSession for FlutterHandler { ("sas_enabled", &pi.sas_enabled.to_string()), ("displays", &displays), ("version", &pi.version), + ("features", &features), ("current_display", &pi.current_display.to_string()), ], ); diff --git a/src/server/video_service.rs b/src/server/video_service.rs index c8f59d60d..28b73cf7c 100644 --- a/src/server/video_service.rs +++ b/src/server/video_service.rs @@ -21,9 +21,12 @@ use super::{video_qos::VideoQoS, *}; #[cfg(windows)] use crate::portable_service::client::PORTABLE_SERVICE_RUNNING; -use hbb_common::tokio::sync::{ - mpsc::{unbounded_channel, UnboundedReceiver, UnboundedSender}, - Mutex as TokioMutex, +use hbb_common::{ + get_version_number, + tokio::sync::{ + mpsc::{unbounded_channel, UnboundedReceiver, UnboundedSender}, + Mutex as TokioMutex, + }, }; #[cfg(not(windows))] use scrap::Capturer; @@ -92,7 +95,8 @@ pub fn get_privacy_mode_conn_id() -> i32 { pub fn is_privacy_mode_supported() -> bool { #[cfg(windows)] - return *IS_CAPTURER_MAGNIFIER_SUPPORTED; + return *IS_CAPTURER_MAGNIFIER_SUPPORTED + && get_version_number(&crate::VERSION) > get_version_number("1.1.9"); #[cfg(not(windows))] return false; }