diff --git a/flutter/lib/desktop/pages/desktop_home_page.dart b/flutter/lib/desktop/pages/desktop_home_page.dart index a5d38b08b..9ed485df8 100644 --- a/flutter/lib/desktop/pages/desktop_home_page.dart +++ b/flutter/lib/desktop/pages/desktop_home_page.dart @@ -1,4 +1,7 @@ import 'package:flutter/material.dart'; +import 'package:flutter_hbb/common.dart'; +import 'package:flutter_hbb/models/model.dart'; +import 'package:provider/provider.dart'; class DesktopHomePage extends StatefulWidget { DesktopHomePage({Key? key}) : super(key: key); @@ -10,6 +13,75 @@ class DesktopHomePage extends StatefulWidget { class _DesktopHomePageState extends State { @override Widget build(BuildContext context) { - return Text("Hello Desktop"); + return Scaffold( + body: Container( + child: Row( + children: [ + Flexible( + child: buildServerInfo(context), + flex: 1, + ), + Flexible( + child: buildServerBoard(context), + flex: 4, + ), + ], + ), + ), + ); + } + + buildServerInfo(BuildContext context) { + return ChangeNotifierProvider.value( + value: FFI.serverModel, + child: Column( + children: [buildIDBoard(context)], + ), + ); + } + + buildServerBoard(BuildContext context) { + return Center( + child: Text("waiting implementation"), + ); + } + + buildIDBoard(BuildContext context) { + final model = FFI.serverModel; + return Card( + elevation: 0.5, + child: Container( + margin: EdgeInsets.symmetric(vertical: 8.0, horizontal: 16.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.baseline, + textBaseline: TextBaseline.alphabetic, + children: [ + Container( + width: 4, + height: 70, + decoration: BoxDecoration(color: MyTheme.accent), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + translate("ID"), + style: + TextStyle(fontSize: 18, fontWeight: FontWeight.w500), + ), + TextFormField( + controller: model.serverId, + ), + ], + ), + ), + ), + ], + ), + ), + ); } } diff --git a/flutter/lib/main.dart b/flutter/lib/main.dart index b12f9567c..f69ab6465 100644 --- a/flutter/lib/main.dart +++ b/flutter/lib/main.dart @@ -1,16 +1,13 @@ -import 'dart:io'; - import 'package:flutter/material.dart'; import 'package:flutter_hbb/desktop/pages/desktop_home_page.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:provider/provider.dart'; -import 'package:firebase_analytics/firebase_analytics.dart'; -import 'package:firebase_core/firebase_core.dart'; + import 'common.dart'; -import 'models/model.dart'; import 'mobile/pages/home_page.dart'; import 'mobile/pages/server_page.dart'; import 'mobile/pages/settings_page.dart'; +import 'models/model.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); @@ -20,6 +17,10 @@ Future main() async { toAndroidChannelInit(); } refreshCurrentUser(); + if (isDesktop) { + print("desktop mode: starting service"); + FFI.serverModel.startService(); + } runApp(App()); } diff --git a/flutter/lib/models/native_model.dart b/flutter/lib/models/native_model.dart index ffbe7a2f3..21ecd37e3 100644 --- a/flutter/lib/models/native_model.dart +++ b/flutter/lib/models/native_model.dart @@ -1,15 +1,17 @@ import 'dart:convert'; +import 'dart:ffi'; import 'dart:io'; import 'dart:typed_data'; -import 'dart:ffi'; -import 'package:ffi/ffi.dart'; -import 'package:path_provider/path_provider.dart'; + import 'package:device_info/device_info.dart'; -import 'package:package_info/package_info.dart'; import 'package:external_path/external_path.dart'; +import 'package:ffi/ffi.dart'; import 'package:flutter/services.dart'; -import '../generated_bridge.dart'; +import 'package:package_info_plus/package_info_plus.dart'; +import 'package:path_provider/path_provider.dart'; + import '../common.dart'; +import '../generated_bridge.dart'; class RgbaFrame extends Struct { @Uint32() @@ -60,13 +62,19 @@ class PlatformFFI { isIOS = Platform.isIOS; isAndroid = Platform.isAndroid; isDesktop = Platform.isWindows || Platform.isMacOS || Platform.isLinux; - if (isDesktop) { - // TODO - return; - } + // if (isDesktop) { + // // TODO + // return; + // } final dylib = Platform.isAndroid ? DynamicLibrary.open('librustdesk.so') - : DynamicLibrary.process(); + : Platform.isLinux + ? DynamicLibrary.open("/usr/lib/rustdesk/librustdesk.so") + : Platform.isWindows + ? DynamicLibrary.open("librustdesk.dll") + : Platform.isMacOS + ? DynamicLibrary.open("librustdesk.dylib") + : DynamicLibrary.process(); print('initializing FFI'); try { _getByName = dylib.lookupFunction('get_by_name'); diff --git a/flutter/lib/models/server_model.dart b/flutter/lib/models/server_model.dart index a673a78a5..681ff3c25 100644 --- a/flutter/lib/models/server_model.dart +++ b/flutter/lib/models/server_model.dart @@ -1,7 +1,10 @@ import 'dart:async'; import 'dart:convert'; +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:wakelock/wakelock.dart'; + import '../common.dart'; import '../mobile/pages/server_page.dart'; import 'model.dart'; @@ -203,7 +206,10 @@ class ServerModel with ChangeNotifier { FFI.setByName("start_service"); getIDPasswd(); updateClientState(); - Wakelock.enable(); + if (!Platform.isLinux) { + // current linux is not supported + Wakelock.enable(); + } } Future stopService() async { @@ -212,7 +218,10 @@ class ServerModel with ChangeNotifier { await FFI.invokeMethod("stop_service"); FFI.setByName("stop_service"); notifyListeners(); - Wakelock.disable(); + if (!Platform.isLinux) { + // current linux is not supported + Wakelock.disable(); + } } Future initInput() async { diff --git a/flutter/macos/Flutter/GeneratedPluginRegistrant.swift b/flutter/macos/Flutter/GeneratedPluginRegistrant.swift index 086b7f675..a540eabec 100644 --- a/flutter/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/flutter/macos/Flutter/GeneratedPluginRegistrant.swift @@ -7,7 +7,7 @@ import Foundation import firebase_analytics import firebase_core -import package_info +import package_info_plus_macos import path_provider_macos import shared_preferences_macos import url_launcher_macos @@ -16,7 +16,7 @@ import wakelock_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FLTFirebaseAnalyticsPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAnalyticsPlugin")) FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) - FLTPackageInfoPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlugin")) + FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) diff --git a/flutter/pubspec.lock b/flutter/pubspec.lock index e927ea50c..083c4a494 100644 --- a/flutter/pubspec.lock +++ b/flutter/pubspec.lock @@ -347,13 +347,48 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.0" - package_info: + package_info_plus: dependency: "direct main" description: - name: package_info + name: package_info_plus url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "1.4.2" + package_info_plus_linux: + dependency: transitive + description: + name: package_info_plus_linux + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.5" + package_info_plus_macos: + dependency: transitive + description: + name: package_info_plus_macos + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + package_info_plus_web: + dependency: transitive + description: + name: package_info_plus_web + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.5" + package_info_plus_windows: + dependency: transitive + description: + name: package_info_plus_windows + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.5" path: dependency: transitive description: diff --git a/flutter/pubspec.yaml b/flutter/pubspec.yaml index eba7dfd12..c8d31e87e 100644 --- a/flutter/pubspec.yaml +++ b/flutter/pubspec.yaml @@ -37,7 +37,7 @@ dependencies: wakelock: ^0.5.2 device_info: ^2.0.2 firebase_analytics: ^9.1.5 - package_info: ^2.0.2 + package_info_plus: ^1.4.2 url_launcher: ^6.0.9 shared_preferences: ^2.0.6 toggle_switch: ^1.4.0 diff --git a/libs/hbb_common/src/config.rs b/libs/hbb_common/src/config.rs index ce0fc509a..e6ca46ee3 100644 --- a/libs/hbb_common/src/config.rs +++ b/libs/hbb_common/src/config.rs @@ -39,7 +39,7 @@ lazy_static::lazy_static! { pub static ref PROD_RENDEZVOUS_SERVER: Arc> = Default::default(); pub static ref APP_NAME: Arc> = Arc::new(RwLock::new("RustDesk".to_owned())); } -#[cfg(any(target_os = "android", target_os = "ios"))] +// #[cfg(any(target_os = "android", target_os = "ios"))] lazy_static::lazy_static! { pub static ref APP_DIR: Arc> = Default::default(); pub static ref APP_HOME_DIR: Arc> = Default::default(); diff --git a/src/common.rs b/src/common.rs index 2a865afbb..03e5f4f4b 100644 --- a/src/common.rs +++ b/src/common.rs @@ -12,7 +12,7 @@ use hbb_common::{ rendezvous_proto::*, sleep, socket_client, tokio, ResultType, }; -#[cfg(any(target_os = "android", target_os = "ios", feature = "cli"))] +// #[cfg(any(target_os = "android", target_os = "ios", feature = "cli"))] use hbb_common::{config::RENDEZVOUS_PORT, futures::future::join_all}; use std::sync::{Arc, Mutex}; @@ -336,7 +336,7 @@ pub async fn get_nat_type(ms_timeout: u64) -> i32 { crate::ipc::get_nat_type(ms_timeout).await } -#[cfg(any(target_os = "android", target_os = "ios", feature = "cli"))] +// #[cfg(any(target_os = "android", target_os = "ios", feature = "cli"))] #[tokio::main(flavor = "current_thread")] async fn test_rendezvous_server_() { let servers = Config::get_rendezvous_servers(); @@ -363,7 +363,7 @@ async fn test_rendezvous_server_() { join_all(futs).await; } -#[cfg(any(target_os = "android", target_os = "ios", feature = "cli"))] +// #[cfg(any(target_os = "android", target_os = "ios", feature = "cli"))] pub fn test_rendezvous_server() { std::thread::spawn(test_rendezvous_server_); } diff --git a/src/lib.rs b/src/lib.rs index 8dafb727e..556d22594 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -21,11 +21,11 @@ pub mod ipc; pub mod ui; mod version; pub use version::*; -#[cfg(any(target_os = "android", target_os = "ios"))] +// #[cfg(any(target_os = "android", target_os = "ios"))] mod bridge_generated; -#[cfg(any(target_os = "android", target_os = "ios"))] +// #[cfg(any(target_os = "android", target_os = "ios"))] pub mod mobile; -#[cfg(any(target_os = "android", target_os = "ios"))] +// #[cfg(any(target_os = "android", target_os = "ios"))] pub mod mobile_ffi; use common::*; #[cfg(feature = "cli")] diff --git a/src/mobile.rs b/src/mobile.rs index 200c0b24d..80dd1f807 100644 --- a/src/mobile.rs +++ b/src/mobile.rs @@ -1165,7 +1165,7 @@ pub fn make_fd_to_json(fd: FileDirectory) -> String { // Server Side // TODO connection_manager need use struct and trait,impl default method -#[cfg(target_os = "android")] +#[cfg(not(any(target_os = "ios")))] pub mod connection_manager { use std::{ collections::HashMap, @@ -1191,6 +1191,7 @@ pub mod connection_manager { task::spawn_blocking, }, }; + #[cfg(any(target_os = "android"))] use scrap::android::call_main_service_set_by_name; use serde_derive::Serialize; @@ -1253,6 +1254,7 @@ pub mod connection_manager { client.authorized = true; let client_json = serde_json::to_string(&client).unwrap_or("".into()); // send to Android service,active notification no matter UI is shown or not. + #[cfg(any(target_os = "android"))] if let Err(e) = call_main_service_set_by_name( "on_client_authorized", Some(&client_json), @@ -1265,6 +1267,7 @@ pub mod connection_manager { } else { let client_json = serde_json::to_string(&client).unwrap_or("".into()); // send to Android service,active notification no matter UI is shown or not. + #[cfg(any(target_os = "android"))] if let Err(e) = call_main_service_set_by_name( "try_start_without_auth", Some(&client_json), @@ -1343,6 +1346,7 @@ pub mod connection_manager { .next() .is_none() { + #[cfg(any(target_os = "android"))] if let Err(e) = call_main_service_set_by_name("stop_capture", None, None) { log::debug!("stop_capture err:{}", e); } diff --git a/src/mobile_ffi.rs b/src/mobile_ffi.rs index 2d1b90e7c..ec6ef9082 100644 --- a/src/mobile_ffi.rs +++ b/src/mobile_ffi.rs @@ -29,6 +29,7 @@ fn initialize(app_dir: &str) { use hbb_common::env_logger::*; init_from_env(Env::default().filter_or(DEFAULT_FILTER_ENV, "debug")); } + #[cfg(any(target_os = "android", target_os = "ios", feature = "cli"))] crate::common::test_rendezvous_server(); crate::common::test_nat_type(); #[cfg(target_os = "android")] @@ -182,9 +183,11 @@ unsafe extern "C" fn set_by_name(name: *const c_char, value: *const c_char) { "init" => { initialize(value); } + #[cfg(any(target_os = "android", target_os = "ios"))] "info1" => { *crate::common::MOBILE_INFO1.lock().unwrap() = value.to_owned(); } + #[cfg(any(target_os = "android", target_os = "ios"))] "info2" => { *crate::common::MOBILE_INFO2.lock().unwrap() = value.to_owned(); } @@ -293,6 +296,7 @@ unsafe extern "C" fn set_by_name(name: *const c_char, value: *const c_char) { if name == "custom-rendezvous-server" { #[cfg(target_os = "android")] crate::rendezvous_mediator::RendezvousMediator::restart(); + #[cfg(any(target_os = "android", target_os = "ios", feature = "cli"))] crate::common::test_rendezvous_server(); } }