| 
									
										
										
										
											2022-07-27 14:29:47 +08:00
										 |  |  | import 'dart:async'; | 
					
						
							| 
									
										
										
										
											2022-06-02 16:23:20 +08:00
										 |  |  | import 'dart:io'; | 
					
						
							| 
									
										
										
										
											2022-10-09 19:27:30 +08:00
										 |  |  | import 'dart:convert'; | 
					
						
							| 
									
										
										
										
											2022-06-02 16:23:20 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-21 14:06:32 +08:00
										 |  |  | import 'package:auto_size_text/auto_size_text.dart'; | 
					
						
							| 
									
										
										
										
											2023-03-04 14:28:43 +08:00
										 |  |  | import 'package:flutter/material.dart'; | 
					
						
							| 
									
										
										
										
											2022-07-14 12:32:01 +08:00
										 |  |  | import 'package:flutter/services.dart'; | 
					
						
							| 
									
										
										
										
											2022-05-25 00:28:59 +08:00
										 |  |  | import 'package:flutter_hbb/common.dart'; | 
					
						
							| 
									
										
										
										
											2023-06-21 11:51:35 +08:00
										 |  |  | import 'package:flutter_hbb/common/widgets/animated_rotation_widget.dart'; | 
					
						
							| 
									
										
										
										
											2023-01-16 19:47:58 +08:00
										 |  |  | import 'package:flutter_hbb/common/widgets/custom_password.dart'; | 
					
						
							| 
									
										
										
										
											2022-10-26 14:39:13 +08:00
										 |  |  | import 'package:flutter_hbb/consts.dart'; | 
					
						
							| 
									
										
										
										
											2022-05-29 04:39:12 +08:00
										 |  |  | import 'package:flutter_hbb/desktop/pages/connection_page.dart'; | 
					
						
							| 
									
										
										
										
											2022-09-23 18:28:40 +08:00
										 |  |  | import 'package:flutter_hbb/desktop/pages/desktop_setting_page.dart'; | 
					
						
							|  |  |  | import 'package:flutter_hbb/desktop/pages/desktop_tab_page.dart'; | 
					
						
							| 
									
										
										
										
											2022-09-28 11:20:57 +08:00
										 |  |  | import 'package:flutter_hbb/desktop/widgets/scroll_wrapper.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-03 22:03:31 +08:00
										 |  |  | import 'package:flutter_hbb/models/platform_model.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-01 20:42:30 +08:00
										 |  |  | import 'package:flutter_hbb/models/server_model.dart'; | 
					
						
							| 
									
										
										
										
											2023-05-08 13:10:39 +08:00
										 |  |  | import 'package:flutter_hbb/plugin/ui_manager.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-09 09:01:06 +08:00
										 |  |  | import 'package:flutter_hbb/utils/multi_window_manager.dart'; | 
					
						
							| 
									
										
										
										
											2022-07-14 12:32:01 +08:00
										 |  |  | import 'package:get/get.dart'; | 
					
						
							| 
									
										
										
										
											2022-05-25 00:28:59 +08:00
										 |  |  | import 'package:provider/provider.dart'; | 
					
						
							| 
									
										
										
										
											2022-09-25 21:45:37 +08:00
										 |  |  | import 'package:url_launcher/url_launcher.dart'; | 
					
						
							| 
									
										
										
										
											2022-10-09 19:27:30 +08:00
										 |  |  | import 'package:window_size/window_size.dart' as window_size; | 
					
						
							| 
									
										
										
										
											2022-05-23 16:44:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-23 20:18:11 +08:00
										 |  |  | import '../widgets/button.dart'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-23 16:44:23 +08:00
										 |  |  | class DesktopHomePage extends StatefulWidget { | 
					
						
							| 
									
										
										
										
											2022-09-06 02:08:59 -07:00
										 |  |  |   const DesktopHomePage({Key? key}) : super(key: key); | 
					
						
							| 
									
										
										
										
											2022-05-23 16:44:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							| 
									
										
										
										
											2022-09-06 21:20:53 -07:00
										 |  |  |   State<DesktopHomePage> createState() => _DesktopHomePageState(); | 
					
						
							| 
									
										
										
										
											2022-05-23 16:44:23 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-29 19:55:50 +08:00
										 |  |  | const borderColor = Color(0xFF2F65BA); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-09 20:36:52 +08:00
										 |  |  | class _DesktopHomePageState extends State<DesktopHomePage> | 
					
						
							| 
									
										
										
										
											2022-12-01 11:19:51 +08:00
										 |  |  |     with AutomaticKeepAliveClientMixin { | 
					
						
							| 
									
										
										
										
											2022-09-28 11:20:57 +08:00
										 |  |  |   final _leftPaneScrollController = ScrollController(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-13 12:43:35 +08:00
										 |  |  |   @override | 
					
						
							|  |  |  |   bool get wantKeepAlive => true; | 
					
						
							| 
									
										
										
										
											2022-09-23 17:28:22 +08:00
										 |  |  |   var updateUrl = ''; | 
					
						
							| 
									
										
										
										
											2022-11-29 22:00:27 +08:00
										 |  |  |   var systemError = ''; | 
					
						
							| 
									
										
										
										
											2022-10-18 10:29:33 +08:00
										 |  |  |   StreamSubscription? _uniLinksSubscription; | 
					
						
							| 
									
										
										
										
											2022-11-29 22:00:27 +08:00
										 |  |  |   var svcStopped = false.obs; | 
					
						
							|  |  |  |   var watchIsCanScreenRecording = false; | 
					
						
							|  |  |  |   var watchIsProcessTrust = false; | 
					
						
							| 
									
										
										
										
											2023-01-06 13:19:08 +08:00
										 |  |  |   var watchIsInputMonitoring = false; | 
					
						
							| 
									
										
										
										
											2023-01-31 13:32:10 +08:00
										 |  |  |   var watchIsCanRecordAudio = false; | 
					
						
							| 
									
										
										
										
											2022-11-29 22:00:27 +08:00
										 |  |  |   Timer? _updateTimer; | 
					
						
							| 
									
										
										
										
											2022-08-13 12:43:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-23 16:44:23 +08:00
										 |  |  |   @override | 
					
						
							|  |  |  |   Widget build(BuildContext context) { | 
					
						
							| 
									
										
										
										
											2022-08-20 19:57:16 +08:00
										 |  |  |     super.build(context); | 
					
						
							| 
									
										
										
										
											2022-08-11 16:03:04 +08:00
										 |  |  |     return Row( | 
					
						
							| 
									
										
										
										
											2022-09-28 11:20:57 +08:00
										 |  |  |       crossAxisAlignment: CrossAxisAlignment.start, | 
					
						
							| 
									
										
										
										
											2022-08-11 16:03:04 +08:00
										 |  |  |       children: [ | 
					
						
							| 
									
										
										
										
											2022-09-19 18:38:19 +08:00
										 |  |  |         buildLeftPane(context), | 
					
						
							| 
									
										
										
										
											2023-03-04 14:28:43 +08:00
										 |  |  |         const VerticalDivider(width: 1), | 
					
						
							| 
									
										
										
										
											2022-08-20 19:57:16 +08:00
										 |  |  |         Expanded( | 
					
						
							| 
									
										
										
										
											2022-09-19 18:38:19 +08:00
										 |  |  |           child: buildRightPane(context), | 
					
						
							| 
									
										
										
										
											2022-08-11 16:03:04 +08:00
										 |  |  |         ), | 
					
						
							|  |  |  |       ], | 
					
						
							| 
									
										
										
										
											2022-05-25 00:28:59 +08:00
										 |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-28 11:20:57 +08:00
										 |  |  |   Widget buildLeftPane(BuildContext context) { | 
					
						
							| 
									
										
										
										
											2022-05-25 00:28:59 +08:00
										 |  |  |     return ChangeNotifierProvider.value( | 
					
						
							| 
									
										
										
										
											2022-06-13 21:07:26 +08:00
										 |  |  |       value: gFFI.serverModel, | 
					
						
							| 
									
										
										
										
											2022-05-29 10:25:36 +08:00
										 |  |  |       child: Container( | 
					
						
							| 
									
										
										
										
											2022-08-20 19:57:16 +08:00
										 |  |  |         width: 200, | 
					
						
							| 
									
										
										
										
											2023-02-23 16:49:31 +01:00
										 |  |  |         color: Theme.of(context).colorScheme.background, | 
					
						
							| 
									
										
										
										
											2022-09-28 11:20:57 +08:00
										 |  |  |         child: DesktopScrollWrapper( | 
					
						
							|  |  |  |           scrollController: _leftPaneScrollController, | 
					
						
							|  |  |  |           child: SingleChildScrollView( | 
					
						
							|  |  |  |             controller: _leftPaneScrollController, | 
					
						
							| 
									
										
										
										
											2023-02-13 16:18:46 +08:00
										 |  |  |             physics: DraggableNeverScrollableScrollPhysics(), | 
					
						
							| 
									
										
										
										
											2022-09-28 11:20:57 +08:00
										 |  |  |             child: Column( | 
					
						
							|  |  |  |               children: [ | 
					
						
							|  |  |  |                 buildTip(context), | 
					
						
							|  |  |  |                 buildIDBoard(context), | 
					
						
							|  |  |  |                 buildPasswordBoard(context), | 
					
						
							| 
									
										
										
										
											2023-01-31 13:32:10 +08:00
										 |  |  |                 FutureBuilder<Widget>( | 
					
						
							|  |  |  |                   future: buildHelpCards(), | 
					
						
							|  |  |  |                   builder: (_, data) { | 
					
						
							|  |  |  |                     if (data.hasData) { | 
					
						
							|  |  |  |                       return data.data!; | 
					
						
							|  |  |  |                     } else { | 
					
						
							|  |  |  |                       return const Offstage(); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                   }, | 
					
						
							|  |  |  |                 ), | 
					
						
							| 
									
										
										
										
											2023-05-08 13:10:39 +08:00
										 |  |  |                 buildPluginEntry() | 
					
						
							| 
									
										
										
										
											2022-09-28 11:20:57 +08:00
										 |  |  |               ], | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |           ), | 
					
						
							| 
									
										
										
										
											2022-05-29 10:25:36 +08:00
										 |  |  |         ), | 
					
						
							| 
									
										
										
										
											2022-05-25 00:28:59 +08:00
										 |  |  |       ), | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-19 18:38:19 +08:00
										 |  |  |   buildRightPane(BuildContext context) { | 
					
						
							| 
									
										
										
										
											2022-08-20 19:57:16 +08:00
										 |  |  |     return Container( | 
					
						
							| 
									
										
										
										
											2022-09-23 16:31:50 +08:00
										 |  |  |       color: Theme.of(context).scaffoldBackgroundColor, | 
					
						
							| 
									
										
										
										
											2022-09-06 21:20:53 -07:00
										 |  |  |       child: ConnectionPage(), | 
					
						
							| 
									
										
										
										
											2022-05-25 00:28:59 +08:00
										 |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   buildIDBoard(BuildContext context) { | 
					
						
							| 
									
										
										
										
											2022-06-13 21:07:26 +08:00
										 |  |  |     final model = gFFI.serverModel; | 
					
						
							| 
									
										
										
										
											2022-05-29 10:25:36 +08:00
										 |  |  |     return Container( | 
					
						
							| 
									
										
										
										
											2022-09-04 20:57:57 +08:00
										 |  |  |       margin: const EdgeInsets.only(left: 20, right: 11), | 
					
						
							|  |  |  |       height: 57, | 
					
						
							| 
									
										
										
										
											2022-05-29 10:25:36 +08:00
										 |  |  |       child: Row( | 
					
						
							|  |  |  |         crossAxisAlignment: CrossAxisAlignment.baseline, | 
					
						
							|  |  |  |         textBaseline: TextBaseline.alphabetic, | 
					
						
							|  |  |  |         children: [ | 
					
						
							|  |  |  |           Container( | 
					
						
							| 
									
										
										
										
											2022-08-20 19:57:16 +08:00
										 |  |  |             width: 2, | 
					
						
							| 
									
										
										
										
											2022-09-03 18:19:50 +08:00
										 |  |  |             decoration: const BoxDecoration(color: MyTheme.accent), | 
					
						
							| 
									
										
										
										
											2022-09-04 20:57:57 +08:00
										 |  |  |           ).marginOnly(top: 5), | 
					
						
							| 
									
										
										
										
											2022-05-29 10:25:36 +08:00
										 |  |  |           Expanded( | 
					
						
							|  |  |  |             child: Padding( | 
					
						
							| 
									
										
										
										
											2022-09-04 20:57:57 +08:00
										 |  |  |               padding: const EdgeInsets.only(left: 7), | 
					
						
							| 
									
										
										
										
											2022-05-29 10:25:36 +08:00
										 |  |  |               child: Column( | 
					
						
							|  |  |  |                 crossAxisAlignment: CrossAxisAlignment.start, | 
					
						
							|  |  |  |                 children: [ | 
					
						
							| 
									
										
										
										
											2022-09-06 21:20:53 -07:00
										 |  |  |                   Container( | 
					
						
							| 
									
										
										
										
											2022-08-24 11:01:58 +08:00
										 |  |  |                     height: 25, | 
					
						
							| 
									
										
										
										
											2022-08-20 19:57:16 +08:00
										 |  |  |                     child: Row( | 
					
						
							|  |  |  |                       mainAxisAlignment: MainAxisAlignment.spaceBetween, | 
					
						
							| 
									
										
										
										
											2022-08-24 11:01:58 +08:00
										 |  |  |                       crossAxisAlignment: CrossAxisAlignment.start, | 
					
						
							| 
									
										
										
										
											2022-08-20 19:57:16 +08:00
										 |  |  |                       children: [ | 
					
						
							|  |  |  |                         Text( | 
					
						
							|  |  |  |                           translate("ID"), | 
					
						
							|  |  |  |                           style: TextStyle( | 
					
						
							|  |  |  |                               fontSize: 14, | 
					
						
							| 
									
										
										
										
											2022-09-23 16:31:50 +08:00
										 |  |  |                               color: Theme.of(context) | 
					
						
							|  |  |  |                                   .textTheme | 
					
						
							|  |  |  |                                   .titleLarge | 
					
						
							|  |  |  |                                   ?.color | 
					
						
							|  |  |  |                                   ?.withOpacity(0.5)), | 
					
						
							| 
									
										
										
										
											2022-09-04 20:57:57 +08:00
										 |  |  |                         ).marginOnly(top: 5), | 
					
						
							| 
									
										
										
										
											2022-08-20 19:57:16 +08:00
										 |  |  |                         buildPopupMenu(context) | 
					
						
							|  |  |  |                       ], | 
					
						
							|  |  |  |                     ), | 
					
						
							| 
									
										
										
										
											2022-05-29 10:25:36 +08:00
										 |  |  |                   ), | 
					
						
							| 
									
										
										
										
											2022-08-20 19:57:16 +08:00
										 |  |  |                   Flexible( | 
					
						
							|  |  |  |                     child: GestureDetector( | 
					
						
							| 
									
										
										
										
											2022-08-03 09:08:10 +08:00
										 |  |  |                       onDoubleTap: () { | 
					
						
							|  |  |  |                         Clipboard.setData( | 
					
						
							|  |  |  |                             ClipboardData(text: model.serverId.text)); | 
					
						
							| 
									
										
										
										
											2022-08-15 14:39:31 +08:00
										 |  |  |                         showToast(translate("Copied")); | 
					
						
							| 
									
										
										
										
											2022-08-03 09:08:10 +08:00
										 |  |  |                       }, | 
					
						
							|  |  |  |                       child: TextFormField( | 
					
						
							|  |  |  |                         controller: model.serverId, | 
					
						
							|  |  |  |                         readOnly: true, | 
					
						
							| 
									
										
										
										
											2022-09-06 21:20:53 -07:00
										 |  |  |                         decoration: InputDecoration( | 
					
						
							| 
									
										
										
										
											2022-08-20 19:57:16 +08:00
										 |  |  |                           border: InputBorder.none, | 
					
						
							| 
									
										
										
										
											2023-03-03 16:50:45 +08:00
										 |  |  |                           contentPadding: EdgeInsets.only(top: 10, bottom: 10), | 
					
						
							| 
									
										
										
										
											2022-08-20 19:57:16 +08:00
										 |  |  |                         ), | 
					
						
							| 
									
										
										
										
											2022-09-06 21:20:53 -07:00
										 |  |  |                         style: TextStyle( | 
					
						
							| 
									
										
										
										
											2022-08-20 19:57:16 +08:00
										 |  |  |                           fontSize: 22, | 
					
						
							|  |  |  |                         ), | 
					
						
							| 
									
										
										
										
											2022-08-22 17:58:48 +08:00
										 |  |  |                       ), | 
					
						
							| 
									
										
										
										
											2022-08-20 19:57:16 +08:00
										 |  |  |                     ), | 
					
						
							|  |  |  |                   ) | 
					
						
							| 
									
										
										
										
											2022-05-29 10:25:36 +08:00
										 |  |  |                 ], | 
					
						
							|  |  |  |               ), | 
					
						
							| 
									
										
										
										
											2022-05-25 00:28:59 +08:00
										 |  |  |             ), | 
					
						
							| 
									
										
										
										
											2022-05-29 10:25:36 +08:00
										 |  |  |           ), | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-09 20:36:52 +08:00
										 |  |  |   Widget buildPopupMenu(BuildContext context) { | 
					
						
							| 
									
										
										
										
											2022-09-23 16:31:50 +08:00
										 |  |  |     final textColor = Theme.of(context).textTheme.titleLarge?.color; | 
					
						
							| 
									
										
										
										
											2022-08-20 19:57:16 +08:00
										 |  |  |     RxBool hover = false.obs; | 
					
						
							|  |  |  |     return InkWell( | 
					
						
							| 
									
										
										
										
											2022-09-23 18:28:40 +08:00
										 |  |  |       onTap: DesktopTabPage.onAddSetting, | 
					
						
							| 
									
										
										
										
											2022-08-20 19:57:16 +08:00
										 |  |  |       child: Obx( | 
					
						
							| 
									
										
										
										
											2022-08-24 11:01:58 +08:00
										 |  |  |         () => CircleAvatar( | 
					
						
							| 
									
										
										
										
											2022-09-04 20:57:57 +08:00
										 |  |  |           radius: 15, | 
					
						
							| 
									
										
										
										
											2022-08-24 11:01:58 +08:00
										 |  |  |           backgroundColor: hover.value | 
					
						
							| 
									
										
										
										
											2022-09-23 16:31:50 +08:00
										 |  |  |               ? Theme.of(context).scaffoldBackgroundColor | 
					
						
							| 
									
										
										
										
											2023-02-23 16:49:31 +01:00
										 |  |  |               : Theme.of(context).colorScheme.background, | 
					
						
							| 
									
										
										
										
											2022-08-24 11:01:58 +08:00
										 |  |  |           child: Icon( | 
					
						
							|  |  |  |             Icons.more_vert_outlined, | 
					
						
							|  |  |  |             size: 20, | 
					
						
							| 
									
										
										
										
											2022-09-23 16:31:50 +08:00
										 |  |  |             color: hover.value ? textColor : textColor?.withOpacity(0.5), | 
					
						
							| 
									
										
										
										
											2022-08-20 19:57:16 +08:00
										 |  |  |           ), | 
					
						
							|  |  |  |         ), | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |       onHover: (value) => hover.value = value, | 
					
						
							|  |  |  |     ); | 
					
						
							| 
									
										
										
										
											2022-07-27 14:29:47 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-29 10:25:36 +08:00
										 |  |  |   buildPasswordBoard(BuildContext context) { | 
					
						
							| 
									
										
										
										
											2022-06-13 21:07:26 +08:00
										 |  |  |     final model = gFFI.serverModel; | 
					
						
							| 
									
										
										
										
											2022-08-20 19:57:16 +08:00
										 |  |  |     RxBool refreshHover = false.obs; | 
					
						
							| 
									
										
										
										
											2022-09-19 18:38:19 +08:00
										 |  |  |     RxBool editHover = false.obs; | 
					
						
							| 
									
										
										
										
											2022-09-23 16:31:50 +08:00
										 |  |  |     final textColor = Theme.of(context).textTheme.titleLarge?.color; | 
					
						
							| 
									
										
										
										
											2022-05-29 10:25:36 +08:00
										 |  |  |     return Container( | 
					
						
							| 
									
										
										
										
											2022-08-22 17:58:48 +08:00
										 |  |  |       margin: EdgeInsets.only(left: 20.0, right: 16, top: 13, bottom: 13), | 
					
						
							| 
									
										
										
										
											2022-05-29 10:25:36 +08:00
										 |  |  |       child: Row( | 
					
						
							|  |  |  |         crossAxisAlignment: CrossAxisAlignment.baseline, | 
					
						
							|  |  |  |         textBaseline: TextBaseline.alphabetic, | 
					
						
							|  |  |  |         children: [ | 
					
						
							|  |  |  |           Container( | 
					
						
							| 
									
										
										
										
											2022-08-20 19:57:16 +08:00
										 |  |  |             width: 2, | 
					
						
							|  |  |  |             height: 52, | 
					
						
							| 
									
										
										
										
											2022-05-29 10:25:36 +08:00
										 |  |  |             decoration: BoxDecoration(color: MyTheme.accent), | 
					
						
							|  |  |  |           ), | 
					
						
							|  |  |  |           Expanded( | 
					
						
							|  |  |  |             child: Padding( | 
					
						
							| 
									
										
										
										
											2022-09-04 20:57:57 +08:00
										 |  |  |               padding: const EdgeInsets.only(left: 7), | 
					
						
							| 
									
										
										
										
											2022-05-29 10:25:36 +08:00
										 |  |  |               child: Column( | 
					
						
							|  |  |  |                 crossAxisAlignment: CrossAxisAlignment.start, | 
					
						
							|  |  |  |                 children: [ | 
					
						
							| 
									
										
										
										
											2022-11-21 14:06:32 +08:00
										 |  |  |                   AutoSizeText( | 
					
						
							|  |  |  |                     translate("One-time Password"), | 
					
						
							| 
									
										
										
										
											2022-08-20 19:57:16 +08:00
										 |  |  |                     style: TextStyle( | 
					
						
							| 
									
										
										
										
											2022-09-23 16:31:50 +08:00
										 |  |  |                         fontSize: 14, color: textColor?.withOpacity(0.5)), | 
					
						
							| 
									
										
										
										
											2022-11-21 14:06:32 +08:00
										 |  |  |                     maxLines: 1, | 
					
						
							| 
									
										
										
										
											2022-05-29 10:25:36 +08:00
										 |  |  |                   ), | 
					
						
							| 
									
										
										
										
											2022-08-01 20:42:30 +08:00
										 |  |  |                   Row( | 
					
						
							|  |  |  |                     children: [ | 
					
						
							|  |  |  |                       Expanded( | 
					
						
							| 
									
										
										
										
											2022-08-03 09:08:10 +08:00
										 |  |  |                         child: GestureDetector( | 
					
						
							|  |  |  |                           onDoubleTap: () { | 
					
						
							| 
									
										
										
										
											2022-08-11 21:29:43 +08:00
										 |  |  |                             if (model.verificationMethod != | 
					
						
							|  |  |  |                                 kUsePermanentPassword) { | 
					
						
							|  |  |  |                               Clipboard.setData( | 
					
						
							|  |  |  |                                   ClipboardData(text: model.serverPasswd.text)); | 
					
						
							| 
									
										
										
										
											2022-08-15 14:39:31 +08:00
										 |  |  |                               showToast(translate("Copied")); | 
					
						
							| 
									
										
										
										
											2022-08-11 21:29:43 +08:00
										 |  |  |                             } | 
					
						
							| 
									
										
										
										
											2022-08-03 09:08:10 +08:00
										 |  |  |                           }, | 
					
						
							|  |  |  |                           child: TextFormField( | 
					
						
							|  |  |  |                             controller: model.serverPasswd, | 
					
						
							|  |  |  |                             readOnly: true, | 
					
						
							| 
									
										
										
										
											2022-08-20 19:57:16 +08:00
										 |  |  |                             decoration: InputDecoration( | 
					
						
							|  |  |  |                               border: InputBorder.none, | 
					
						
							| 
									
										
										
										
											2023-03-03 16:50:45 +08:00
										 |  |  |                               contentPadding: | 
					
						
							|  |  |  |                                   EdgeInsets.only(top: 14, bottom: 10), | 
					
						
							| 
									
										
										
										
											2022-08-20 19:57:16 +08:00
										 |  |  |                             ), | 
					
						
							|  |  |  |                             style: TextStyle(fontSize: 15), | 
					
						
							| 
									
										
										
										
											2022-08-03 09:08:10 +08:00
										 |  |  |                           ), | 
					
						
							| 
									
										
										
										
											2022-08-01 20:42:30 +08:00
										 |  |  |                         ), | 
					
						
							|  |  |  |                       ), | 
					
						
							| 
									
										
										
										
											2023-06-21 11:51:35 +08:00
										 |  |  |                       AnimatedRotationWidget( | 
					
						
							|  |  |  |                         onPressed: () => bind.mainUpdateTemporaryPassword(), | 
					
						
							|  |  |  |                         child: Obx(() => RotatedBox( | 
					
						
							|  |  |  |                             quarterTurns: 2, | 
					
						
							|  |  |  |                             child: Icon( | 
					
						
							|  |  |  |                               Icons.refresh, | 
					
						
							|  |  |  |                               color: refreshHover.value | 
					
						
							|  |  |  |                                   ? textColor | 
					
						
							|  |  |  |                                   : Color(0xFFDDDDDD), | 
					
						
							|  |  |  |                               size: 22, | 
					
						
							|  |  |  |                             ))), | 
					
						
							| 
									
										
										
										
											2022-08-20 19:57:16 +08:00
										 |  |  |                         onHover: (value) => refreshHover.value = value, | 
					
						
							| 
									
										
										
										
											2023-06-21 11:51:35 +08:00
										 |  |  |                       ).marginOnly(right: 8, top: 4), | 
					
						
							| 
									
										
										
										
											2022-09-19 18:38:19 +08:00
										 |  |  |                       InkWell( | 
					
						
							|  |  |  |                         child: Obx( | 
					
						
							|  |  |  |                           () => Icon( | 
					
						
							|  |  |  |                             Icons.edit, | 
					
						
							| 
									
										
										
										
											2023-03-03 16:50:45 +08:00
										 |  |  |                             color: | 
					
						
							|  |  |  |                                 editHover.value ? textColor : Color(0xFFDDDDDD), | 
					
						
							| 
									
										
										
										
											2022-09-19 18:38:19 +08:00
										 |  |  |                             size: 22, | 
					
						
							| 
									
										
										
										
											2023-03-03 16:50:45 +08:00
										 |  |  |                           ).marginOnly(right: 8, top: 4), | 
					
						
							| 
									
										
										
										
											2022-09-19 18:38:19 +08:00
										 |  |  |                         ), | 
					
						
							| 
									
										
										
										
											2022-09-23 18:28:40 +08:00
										 |  |  |                         onTap: () => DesktopSettingPage.switch2page(1), | 
					
						
							| 
									
										
										
										
											2022-09-19 18:38:19 +08:00
										 |  |  |                         onHover: (value) => editHover.value = value, | 
					
						
							|  |  |  |                       ), | 
					
						
							| 
									
										
										
										
											2022-08-01 20:42:30 +08:00
										 |  |  |                     ], | 
					
						
							| 
									
										
										
										
											2022-08-22 17:58:48 +08:00
										 |  |  |                   ), | 
					
						
							| 
									
										
										
										
											2022-05-29 10:25:36 +08:00
										 |  |  |                 ], | 
					
						
							| 
									
										
										
										
											2022-05-25 00:28:59 +08:00
										 |  |  |               ), | 
					
						
							|  |  |  |             ), | 
					
						
							| 
									
										
										
										
											2022-05-29 10:25:36 +08:00
										 |  |  |           ), | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   buildTip(BuildContext context) { | 
					
						
							|  |  |  |     return Padding( | 
					
						
							| 
									
										
										
										
											2022-08-22 17:58:48 +08:00
										 |  |  |       padding: | 
					
						
							| 
									
										
										
										
											2022-09-04 20:57:57 +08:00
										 |  |  |           const EdgeInsets.only(left: 20.0, right: 16, top: 16.0, bottom: 5), | 
					
						
							| 
									
										
										
										
											2022-05-29 10:25:36 +08:00
										 |  |  |       child: Column( | 
					
						
							|  |  |  |         mainAxisAlignment: MainAxisAlignment.start, | 
					
						
							|  |  |  |         crossAxisAlignment: CrossAxisAlignment.start, | 
					
						
							|  |  |  |         children: [ | 
					
						
							|  |  |  |           Text( | 
					
						
							|  |  |  |             translate("Your Desktop"), | 
					
						
							| 
									
										
										
										
											2022-09-23 16:31:50 +08:00
										 |  |  |             style: Theme.of(context).textTheme.titleLarge, | 
					
						
							|  |  |  |             // style: TextStyle(
 | 
					
						
							|  |  |  |             //     // color: MyTheme.color(context).text,
 | 
					
						
							|  |  |  |             //     fontWeight: FontWeight.normal,
 | 
					
						
							|  |  |  |             //     fontSize: 19),
 | 
					
						
							| 
									
										
										
										
											2022-05-29 10:25:36 +08:00
										 |  |  |           ), | 
					
						
							|  |  |  |           SizedBox( | 
					
						
							| 
									
										
										
										
											2022-08-22 17:58:48 +08:00
										 |  |  |             height: 10.0, | 
					
						
							| 
									
										
										
										
											2022-05-29 10:25:36 +08:00
										 |  |  |           ), | 
					
						
							|  |  |  |           Text( | 
					
						
							|  |  |  |             translate("desk_tip"), | 
					
						
							|  |  |  |             overflow: TextOverflow.clip, | 
					
						
							| 
									
										
										
										
											2022-09-23 16:31:50 +08:00
										 |  |  |             style: Theme.of(context).textTheme.bodySmall, | 
					
						
							| 
									
										
										
										
											2022-05-29 10:25:36 +08:00
										 |  |  |           ) | 
					
						
							|  |  |  |         ], | 
					
						
							| 
									
										
										
										
											2022-05-25 00:28:59 +08:00
										 |  |  |       ), | 
					
						
							|  |  |  |     ); | 
					
						
							| 
									
										
										
										
											2022-05-23 16:44:23 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-06-02 16:23:20 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-31 13:32:10 +08:00
										 |  |  |   Future<Widget> buildHelpCards() async { | 
					
						
							| 
									
										
										
										
											2022-09-23 17:28:22 +08:00
										 |  |  |     if (updateUrl.isNotEmpty) { | 
					
						
							| 
									
										
										
										
											2022-09-25 21:45:37 +08:00
										 |  |  |       return buildInstallCard( | 
					
						
							|  |  |  |           "Status", | 
					
						
							|  |  |  |           "There is a newer version of ${bind.mainGetAppNameSync()} ${bind.mainGetNewVersion()} available.", | 
					
						
							|  |  |  |           "Click to download", () async { | 
					
						
							|  |  |  |         final Uri url = Uri.parse('https://rustdesk.com'); | 
					
						
							|  |  |  |         await launchUrl(url); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2022-09-23 17:28:22 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-11-29 22:00:27 +08:00
										 |  |  |     if (systemError.isNotEmpty) { | 
					
						
							|  |  |  |       return buildInstallCard("", systemError, "", () {}); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-12-04 18:39:59 +08:00
										 |  |  |     if (Platform.isWindows) { | 
					
						
							|  |  |  |       if (!bind.mainIsInstalled()) { | 
					
						
							|  |  |  |         return buildInstallCard( | 
					
						
							|  |  |  |             "", "install_tip", "Install", bind.mainGotoInstall); | 
					
						
							|  |  |  |       } else if (bind.mainIsInstalledLowerVersion()) { | 
					
						
							|  |  |  |         return buildInstallCard("Status", "Your installation is lower version.", | 
					
						
							|  |  |  |             "Click to upgrade", bind.mainUpdateMe); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } else if (Platform.isMacOS) { | 
					
						
							| 
									
										
										
										
											2022-11-29 22:00:27 +08:00
										 |  |  |       if (!bind.mainIsCanScreenRecording(prompt: false)) { | 
					
						
							|  |  |  |         return buildInstallCard("Permissions", "config_screen", "Configure", | 
					
						
							|  |  |  |             () async { | 
					
						
							|  |  |  |           bind.mainIsCanScreenRecording(prompt: true); | 
					
						
							|  |  |  |           watchIsCanScreenRecording = true; | 
					
						
							|  |  |  |         }, help: 'Help', link: translate("doc_mac_permission")); | 
					
						
							|  |  |  |       } else if (!bind.mainIsProcessTrusted(prompt: false)) { | 
					
						
							|  |  |  |         return buildInstallCard("Permissions", "config_acc", "Configure", | 
					
						
							|  |  |  |             () async { | 
					
						
							|  |  |  |           bind.mainIsProcessTrusted(prompt: true); | 
					
						
							|  |  |  |           watchIsProcessTrust = true; | 
					
						
							|  |  |  |         }, help: 'Help', link: translate("doc_mac_permission")); | 
					
						
							| 
									
										
										
										
											2023-01-06 13:19:08 +08:00
										 |  |  |       } else if (!bind.mainIsCanInputMonitoring(prompt: false)) { | 
					
						
							|  |  |  |         return buildInstallCard("Permissions", "config_input", "Configure", | 
					
						
							|  |  |  |             () async { | 
					
						
							|  |  |  |           bind.mainIsCanInputMonitoring(prompt: true); | 
					
						
							|  |  |  |           watchIsInputMonitoring = true; | 
					
						
							|  |  |  |         }, help: 'Help', link: translate("doc_mac_permission")); | 
					
						
							| 
									
										
										
										
											2022-11-29 22:00:27 +08:00
										 |  |  |       } else if (!svcStopped.value && | 
					
						
							|  |  |  |           bind.mainIsInstalled() && | 
					
						
							|  |  |  |           !bind.mainIsInstalledDaemon(prompt: false)) { | 
					
						
							|  |  |  |         return buildInstallCard("", "install_daemon_tip", "Install", () async { | 
					
						
							|  |  |  |           bind.mainIsInstalledDaemon(prompt: true); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2023-02-07 20:38:27 +08:00
										 |  |  |       //// Disable microphone configuration for macOS. We will request the permission when needed.
 | 
					
						
							|  |  |  |       // else if ((await osxCanRecordAudio() !=
 | 
					
						
							|  |  |  |       //     PermissionAuthorizeType.authorized)) {
 | 
					
						
							|  |  |  |       //   return buildInstallCard("Permissions", "config_microphone", "Configure",
 | 
					
						
							|  |  |  |       //       () async {
 | 
					
						
							|  |  |  |       //     osxRequestAudio();
 | 
					
						
							|  |  |  |       //     watchIsCanRecordAudio = true;
 | 
					
						
							|  |  |  |       //   });
 | 
					
						
							|  |  |  |       // }
 | 
					
						
							| 
									
										
										
										
											2022-12-04 18:39:59 +08:00
										 |  |  |     } else if (Platform.isLinux) { | 
					
						
							|  |  |  |       if (bind.mainCurrentIsWayland()) { | 
					
						
							|  |  |  |         return buildInstallCard( | 
					
						
							|  |  |  |             "Warning", translate("wayland_experiment_tip"), "", () async {}, | 
					
						
							|  |  |  |             help: 'Help', | 
					
						
							|  |  |  |             link: 'https://rustdesk.com/docs/en/manual/linux/#x11-required'); | 
					
						
							|  |  |  |       } else if (bind.mainIsLoginWayland()) { | 
					
						
							|  |  |  |         return buildInstallCard("Warning", | 
					
						
							|  |  |  |             "Login screen using Wayland is not supported", "", () async {}, | 
					
						
							|  |  |  |             help: 'Help', | 
					
						
							|  |  |  |             link: 'https://rustdesk.com/docs/en/manual/linux/#login-screen'); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2022-11-29 22:00:27 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-09-23 17:28:22 +08:00
										 |  |  |     return Container(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-25 21:45:37 +08:00
										 |  |  |   Widget buildInstallCard(String title, String content, String btnText, | 
					
						
							| 
									
										
										
										
											2022-11-29 22:00:27 +08:00
										 |  |  |       GestureTapCallback onPressed, | 
					
						
							|  |  |  |       {String? help, String? link}) { | 
					
						
							| 
									
										
										
										
											2022-09-23 17:28:22 +08:00
										 |  |  |     return Container( | 
					
						
							|  |  |  |       margin: EdgeInsets.only(top: 20), | 
					
						
							| 
									
										
										
										
											2022-09-23 20:18:11 +08:00
										 |  |  |       child: Container( | 
					
						
							|  |  |  |           decoration: BoxDecoration( | 
					
						
							|  |  |  |               gradient: LinearGradient( | 
					
						
							|  |  |  |             begin: Alignment.centerLeft, | 
					
						
							|  |  |  |             end: Alignment.centerRight, | 
					
						
							|  |  |  |             colors: [ | 
					
						
							|  |  |  |               Color.fromARGB(255, 226, 66, 188), | 
					
						
							|  |  |  |               Color.fromARGB(255, 244, 114, 124), | 
					
						
							|  |  |  |             ], | 
					
						
							|  |  |  |           )), | 
					
						
							|  |  |  |           padding: EdgeInsets.all(20), | 
					
						
							|  |  |  |           child: Column( | 
					
						
							| 
									
										
										
										
											2022-11-29 22:00:27 +08:00
										 |  |  |               mainAxisAlignment: MainAxisAlignment.start, | 
					
						
							|  |  |  |               crossAxisAlignment: CrossAxisAlignment.start, | 
					
						
							|  |  |  |               children: (title.isNotEmpty | 
					
						
							|  |  |  |                       ? <Widget>[ | 
					
						
							|  |  |  |                           Center( | 
					
						
							|  |  |  |                               child: Text( | 
					
						
							|  |  |  |                             translate(title), | 
					
						
							|  |  |  |                             style: TextStyle( | 
					
						
							|  |  |  |                                 color: Colors.white, | 
					
						
							|  |  |  |                                 fontWeight: FontWeight.bold, | 
					
						
							|  |  |  |                                 fontSize: 15), | 
					
						
							|  |  |  |                           ).marginOnly(bottom: 6)), | 
					
						
							|  |  |  |                         ] | 
					
						
							|  |  |  |                       : <Widget>[]) + | 
					
						
							|  |  |  |                   <Widget>[ | 
					
						
							|  |  |  |                     Text( | 
					
						
							|  |  |  |                       translate(content), | 
					
						
							|  |  |  |                       style: TextStyle( | 
					
						
							|  |  |  |                           height: 1.5, | 
					
						
							|  |  |  |                           color: Colors.white, | 
					
						
							|  |  |  |                           fontWeight: FontWeight.normal, | 
					
						
							|  |  |  |                           fontSize: 13), | 
					
						
							|  |  |  |                     ).marginOnly(bottom: 20) | 
					
						
							|  |  |  |                   ] + | 
					
						
							|  |  |  |                   (btnText.isNotEmpty | 
					
						
							|  |  |  |                       ? <Widget>[ | 
					
						
							|  |  |  |                           Row( | 
					
						
							|  |  |  |                               mainAxisAlignment: MainAxisAlignment.center, | 
					
						
							|  |  |  |                               children: [ | 
					
						
							|  |  |  |                                 FixedWidthButton( | 
					
						
							|  |  |  |                                   width: 150, | 
					
						
							|  |  |  |                                   padding: 8, | 
					
						
							|  |  |  |                                   isOutline: true, | 
					
						
							|  |  |  |                                   text: translate(btnText), | 
					
						
							|  |  |  |                                   textColor: Colors.white, | 
					
						
							|  |  |  |                                   borderColor: Colors.white, | 
					
						
							|  |  |  |                                   textSize: 20, | 
					
						
							|  |  |  |                                   radius: 10, | 
					
						
							|  |  |  |                                   onTap: onPressed, | 
					
						
							|  |  |  |                                 ) | 
					
						
							|  |  |  |                               ]) | 
					
						
							|  |  |  |                         ] | 
					
						
							|  |  |  |                       : <Widget>[]) + | 
					
						
							|  |  |  |                   (help != null | 
					
						
							|  |  |  |                       ? <Widget>[ | 
					
						
							|  |  |  |                           Center( | 
					
						
							|  |  |  |                               child: InkWell( | 
					
						
							|  |  |  |                                   onTap: () async => | 
					
						
							|  |  |  |                                       await launchUrl(Uri.parse(link!)), | 
					
						
							|  |  |  |                                   child: Text( | 
					
						
							|  |  |  |                                     translate(help), | 
					
						
							|  |  |  |                                     style: TextStyle( | 
					
						
							|  |  |  |                                         decoration: TextDecoration.underline, | 
					
						
							|  |  |  |                                         color: Colors.white, | 
					
						
							|  |  |  |                                         fontSize: 12), | 
					
						
							|  |  |  |                                   )).marginOnly(top: 6)), | 
					
						
							|  |  |  |                         ] | 
					
						
							|  |  |  |                       : <Widget>[]))), | 
					
						
							| 
									
										
										
										
											2022-09-23 17:28:22 +08:00
										 |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-02 16:23:20 +08:00
										 |  |  |   @override | 
					
						
							|  |  |  |   void initState() { | 
					
						
							|  |  |  |     super.initState(); | 
					
						
							| 
									
										
										
										
											2022-11-29 22:36:35 +08:00
										 |  |  |     _updateTimer = periodic_immediate(const Duration(seconds: 1), () async { | 
					
						
							|  |  |  |       await gFFI.serverModel.fetchID(); | 
					
						
							| 
									
										
										
										
											2022-11-29 22:00:27 +08:00
										 |  |  |       final url = await bind.mainGetSoftwareUpdateUrl(); | 
					
						
							|  |  |  |       if (updateUrl != url) { | 
					
						
							|  |  |  |         updateUrl = url; | 
					
						
							|  |  |  |         setState(() {}); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       final error = await bind.mainGetError(); | 
					
						
							|  |  |  |       if (systemError != error) { | 
					
						
							|  |  |  |         systemError = error; | 
					
						
							|  |  |  |         setState(() {}); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       final v = await bind.mainGetOption(key: "stop-service") == "Y"; | 
					
						
							|  |  |  |       if (v != svcStopped.value) { | 
					
						
							|  |  |  |         svcStopped.value = v; | 
					
						
							|  |  |  |         setState(() {}); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       if (watchIsCanScreenRecording) { | 
					
						
							|  |  |  |         if (bind.mainIsCanScreenRecording(prompt: false)) { | 
					
						
							|  |  |  |           watchIsCanScreenRecording = false; | 
					
						
							|  |  |  |           setState(() {}); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       if (watchIsProcessTrust) { | 
					
						
							|  |  |  |         if (bind.mainIsProcessTrusted(prompt: false)) { | 
					
						
							|  |  |  |           watchIsProcessTrust = false; | 
					
						
							|  |  |  |           setState(() {}); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2023-01-06 13:19:08 +08:00
										 |  |  |       if (watchIsInputMonitoring) { | 
					
						
							|  |  |  |         if (bind.mainIsCanInputMonitoring(prompt: false)) { | 
					
						
							|  |  |  |           watchIsInputMonitoring = false; | 
					
						
							| 
									
										
										
										
											2023-02-21 18:43:43 +08:00
										 |  |  |           // Do not notify for now.
 | 
					
						
							|  |  |  |           // Monitoring may not take effect until the process is restarted.
 | 
					
						
							|  |  |  |           // rustDeskWinManager.call(
 | 
					
						
							|  |  |  |           //     WindowType.RemoteDesktop, kWindowDisableGrabKeyboard, '');
 | 
					
						
							| 
									
										
										
										
											2023-01-06 13:19:08 +08:00
										 |  |  |           setState(() {}); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2023-01-31 13:32:10 +08:00
										 |  |  |       if (watchIsCanRecordAudio) { | 
					
						
							|  |  |  |         if (Platform.isMacOS) { | 
					
						
							|  |  |  |           Future.microtask(() async { | 
					
						
							|  |  |  |             if ((await osxCanRecordAudio() == | 
					
						
							|  |  |  |                 PermissionAuthorizeType.authorized)) { | 
					
						
							|  |  |  |               watchIsCanRecordAudio = false; | 
					
						
							|  |  |  |               setState(() {}); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |           watchIsCanRecordAudio = false; | 
					
						
							|  |  |  |           setState(() {}); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2022-09-23 17:28:22 +08:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2022-11-29 22:00:27 +08:00
										 |  |  |     Get.put<RxBool>(svcStopped, tag: 'stop-service'); | 
					
						
							| 
									
										
										
										
											2022-11-05 23:41:22 +08:00
										 |  |  |     rustDeskWinManager.registerActiveWindowListener(onActiveWindowChanged); | 
					
						
							| 
									
										
										
										
											2022-11-26 11:40:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-09 09:01:06 +08:00
										 |  |  |     rustDeskWinManager.setMethodHandler((call, fromWindowId) async { | 
					
						
							| 
									
										
										
										
											2022-09-20 19:31:32 +08:00
										 |  |  |       debugPrint( | 
					
						
							| 
									
										
										
										
											2022-11-05 23:41:22 +08:00
										 |  |  |           "[Main] call ${call.method} with args ${call.arguments} from window $fromWindowId"); | 
					
						
							| 
									
										
										
										
											2022-12-01 13:52:12 +08:00
										 |  |  |       if (call.method == kWindowMainWindowOnTop) { | 
					
						
							| 
									
										
										
										
											2022-08-09 19:32:19 +08:00
										 |  |  |         window_on_top(null); | 
					
						
							| 
									
										
										
										
											2022-12-01 13:52:12 +08:00
										 |  |  |       } else if (call.method == kWindowGetWindowInfo) { | 
					
						
							| 
									
										
										
										
											2022-10-09 19:27:30 +08:00
										 |  |  |         final screen = (await window_size.getWindowInfo()).screen; | 
					
						
							|  |  |  |         if (screen == null) { | 
					
						
							|  |  |  |           return ""; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |           return jsonEncode({ | 
					
						
							|  |  |  |             'frame': { | 
					
						
							|  |  |  |               'l': screen.frame.left, | 
					
						
							|  |  |  |               't': screen.frame.top, | 
					
						
							|  |  |  |               'r': screen.frame.right, | 
					
						
							|  |  |  |               'b': screen.frame.bottom, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             'visibleFrame': { | 
					
						
							|  |  |  |               'l': screen.visibleFrame.left, | 
					
						
							|  |  |  |               't': screen.visibleFrame.top, | 
					
						
							|  |  |  |               'r': screen.visibleFrame.right, | 
					
						
							|  |  |  |               'b': screen.visibleFrame.bottom, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             'scaleFactor': screen.scaleFactor, | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-10-26 14:39:13 +08:00
										 |  |  |       } else if (call.method == kWindowActionRebuild) { | 
					
						
							|  |  |  |         reloadCurrentWindow(); | 
					
						
							| 
									
										
										
										
											2022-11-05 23:41:22 +08:00
										 |  |  |       } else if (call.method == kWindowEventShow) { | 
					
						
							| 
									
										
										
										
											2023-01-06 20:40:29 -08:00
										 |  |  |         await rustDeskWinManager.registerActiveWindow(call.arguments["id"]); | 
					
						
							| 
									
										
										
										
											2022-11-05 23:41:22 +08:00
										 |  |  |       } else if (call.method == kWindowEventHide) { | 
					
						
							| 
									
										
										
										
											2023-01-06 20:40:29 -08:00
										 |  |  |         await rustDeskWinManager.unregisterActiveWindow(call.arguments["id"]); | 
					
						
							| 
									
										
										
										
											2022-12-01 13:52:12 +08:00
										 |  |  |       } else if (call.method == kWindowConnect) { | 
					
						
							|  |  |  |         await connectMainDesktop( | 
					
						
							|  |  |  |           call.arguments['id'], | 
					
						
							|  |  |  |           isFileTransfer: call.arguments['isFileTransfer'], | 
					
						
							|  |  |  |           isTcpTunneling: call.arguments['isTcpTunneling'], | 
					
						
							|  |  |  |           isRDP: call.arguments['isRDP'], | 
					
						
							| 
									
										
										
										
											2023-02-13 16:40:24 +08:00
										 |  |  |           forceRelay: call.arguments['forceRelay'], | 
					
						
							| 
									
										
										
										
											2022-12-01 13:52:12 +08:00
										 |  |  |         ); | 
					
						
							| 
									
										
										
										
											2022-08-09 09:01:06 +08:00
										 |  |  |       } | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2022-10-18 10:29:33 +08:00
										 |  |  |     _uniLinksSubscription = listenUniLinks(); | 
					
						
							| 
									
										
										
										
											2022-06-02 16:23:20 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   void dispose() { | 
					
						
							| 
									
										
										
										
											2022-10-18 10:29:33 +08:00
										 |  |  |     _uniLinksSubscription?.cancel(); | 
					
						
							| 
									
										
										
										
											2022-11-29 22:00:27 +08:00
										 |  |  |     Get.delete<RxBool>(tag: 'stop-service'); | 
					
						
							|  |  |  |     _updateTimer?.cancel(); | 
					
						
							| 
									
										
										
										
											2022-06-02 16:23:20 +08:00
										 |  |  |     super.dispose(); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2023-06-21 11:51:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-08 13:10:39 +08:00
										 |  |  |   Widget buildPluginEntry() { | 
					
						
							|  |  |  |     final entries = PluginUiManager.instance.entries.entries; | 
					
						
							|  |  |  |     return Offstage( | 
					
						
							|  |  |  |       offstage: entries.isEmpty, | 
					
						
							|  |  |  |       child: Column( | 
					
						
							|  |  |  |         crossAxisAlignment: CrossAxisAlignment.start, | 
					
						
							|  |  |  |         children: [ | 
					
						
							| 
									
										
										
										
											2023-06-21 11:51:35 +08:00
										 |  |  |           ...entries.map((entry) { | 
					
						
							| 
									
										
										
										
											2023-05-08 13:10:39 +08:00
										 |  |  |             return entry.value; | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-05-23 16:44:23 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2022-07-27 14:29:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-08 22:27:27 +08:00
										 |  |  | void setPasswordDialog() async { | 
					
						
							|  |  |  |   final pw = await bind.mainGetPermanentPassword(); | 
					
						
							| 
									
										
										
										
											2022-08-01 20:42:30 +08:00
										 |  |  |   final p0 = TextEditingController(text: pw); | 
					
						
							|  |  |  |   final p1 = TextEditingController(text: pw); | 
					
						
							|  |  |  |   var errMsg0 = ""; | 
					
						
							|  |  |  |   var errMsg1 = ""; | 
					
						
							| 
									
										
										
										
											2023-01-18 13:54:56 +08:00
										 |  |  |   final RxString rxPass = pw.trim().obs; | 
					
						
							| 
									
										
										
										
											2023-01-16 19:47:58 +08:00
										 |  |  |   final rules = [ | 
					
						
							|  |  |  |     DigitValidationRule(), | 
					
						
							|  |  |  |     UppercaseValidationRule(), | 
					
						
							|  |  |  |     LowercaseValidationRule(), | 
					
						
							|  |  |  |     // SpecialCharacterValidationRule(),
 | 
					
						
							|  |  |  |     MinCharactersValidationRule(8), | 
					
						
							|  |  |  |   ]; | 
					
						
							| 
									
										
										
										
											2022-08-01 20:42:30 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-08 12:34:19 +08:00
										 |  |  |   gFFI.dialogManager.show((setState, close, context) { | 
					
						
							| 
									
										
										
										
											2022-09-03 18:19:50 +08:00
										 |  |  |     submit() { | 
					
						
							|  |  |  |       setState(() { | 
					
						
							|  |  |  |         errMsg0 = ""; | 
					
						
							|  |  |  |         errMsg1 = ""; | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |       final pass = p0.text.trim(); | 
					
						
							| 
									
										
										
										
											2023-01-16 19:47:58 +08:00
										 |  |  |       if (pass.isNotEmpty) { | 
					
						
							| 
									
										
										
										
											2023-02-16 19:20:26 +01:00
										 |  |  |         final Iterable violations = rules.where((r) => !r.validate(pass)); | 
					
						
							|  |  |  |         if (violations.isNotEmpty) { | 
					
						
							|  |  |  |           setState(() { | 
					
						
							|  |  |  |             errMsg0 = | 
					
						
							|  |  |  |                 '${translate('Prompt')}: ${violations.map((r) => r.name).join(', ')}'; | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |           return; | 
					
						
							| 
									
										
										
										
											2023-01-16 19:47:58 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-09-03 18:19:50 +08:00
										 |  |  |       } | 
					
						
							|  |  |  |       if (p1.text.trim() != pass) { | 
					
						
							|  |  |  |         setState(() { | 
					
						
							| 
									
										
										
										
											2023-01-16 19:47:58 +08:00
										 |  |  |           errMsg1 = | 
					
						
							|  |  |  |               '${translate('Prompt')}: ${translate("The confirmation is not identical.")}'; | 
					
						
							| 
									
										
										
										
											2022-09-03 18:19:50 +08:00
										 |  |  |         }); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       bind.mainSetPermanentPassword(password: pass); | 
					
						
							|  |  |  |       close(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-01 20:42:30 +08:00
										 |  |  |     return CustomAlertDialog( | 
					
						
							|  |  |  |       title: Text(translate("Set Password")), | 
					
						
							|  |  |  |       content: ConstrainedBox( | 
					
						
							| 
									
										
										
										
											2022-09-03 18:19:50 +08:00
										 |  |  |         constraints: const BoxConstraints(minWidth: 500), | 
					
						
							| 
									
										
										
										
											2022-08-01 20:42:30 +08:00
										 |  |  |         child: Column( | 
					
						
							|  |  |  |           crossAxisAlignment: CrossAxisAlignment.start, | 
					
						
							|  |  |  |           children: [ | 
					
						
							| 
									
										
										
										
											2022-09-03 18:19:50 +08:00
										 |  |  |             const SizedBox( | 
					
						
							| 
									
										
										
										
											2022-08-01 20:42:30 +08:00
										 |  |  |               height: 8.0, | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |             Row( | 
					
						
							|  |  |  |               children: [ | 
					
						
							|  |  |  |                 Expanded( | 
					
						
							|  |  |  |                   child: TextField( | 
					
						
							|  |  |  |                     obscureText: true, | 
					
						
							|  |  |  |                     decoration: InputDecoration( | 
					
						
							| 
									
										
										
										
											2023-01-16 19:47:58 +08:00
										 |  |  |                         labelText: translate('Password'), | 
					
						
							| 
									
										
										
										
											2022-08-01 20:42:30 +08:00
										 |  |  |                         errorText: errMsg0.isNotEmpty ? errMsg0 : null), | 
					
						
							|  |  |  |                     controller: p0, | 
					
						
							| 
									
										
										
										
											2023-02-12 09:03:13 +08:00
										 |  |  |                     autofocus: true, | 
					
						
							| 
									
										
										
										
											2023-01-16 19:47:58 +08:00
										 |  |  |                     onChanged: (value) { | 
					
						
							| 
									
										
										
										
											2023-01-18 13:54:56 +08:00
										 |  |  |                       rxPass.value = value.trim(); | 
					
						
							| 
									
										
										
										
											2023-02-16 19:20:26 +01:00
										 |  |  |                       setState(() { | 
					
						
							|  |  |  |                         errMsg0 = ''; | 
					
						
							|  |  |  |                       }); | 
					
						
							| 
									
										
										
										
											2023-01-16 19:47:58 +08:00
										 |  |  |                     }, | 
					
						
							| 
									
										
										
										
											2022-08-01 20:42:30 +08:00
										 |  |  |                   ), | 
					
						
							|  |  |  |                 ), | 
					
						
							|  |  |  |               ], | 
					
						
							|  |  |  |             ), | 
					
						
							| 
									
										
										
										
											2023-01-16 19:47:58 +08:00
										 |  |  |             Row( | 
					
						
							|  |  |  |               children: [ | 
					
						
							|  |  |  |                 Expanded(child: PasswordStrengthIndicator(password: rxPass)), | 
					
						
							|  |  |  |               ], | 
					
						
							|  |  |  |             ).marginSymmetric(vertical: 8), | 
					
						
							| 
									
										
										
										
											2022-09-03 18:19:50 +08:00
										 |  |  |             const SizedBox( | 
					
						
							| 
									
										
										
										
											2022-08-01 20:42:30 +08:00
										 |  |  |               height: 8.0, | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |             Row( | 
					
						
							|  |  |  |               children: [ | 
					
						
							|  |  |  |                 Expanded( | 
					
						
							|  |  |  |                   child: TextField( | 
					
						
							|  |  |  |                     obscureText: true, | 
					
						
							|  |  |  |                     decoration: InputDecoration( | 
					
						
							| 
									
										
										
										
											2023-01-16 19:47:58 +08:00
										 |  |  |                         labelText: translate('Confirmation'), | 
					
						
							| 
									
										
										
										
											2022-08-01 20:42:30 +08:00
										 |  |  |                         errorText: errMsg1.isNotEmpty ? errMsg1 : null), | 
					
						
							|  |  |  |                     controller: p1, | 
					
						
							| 
									
										
										
										
											2023-02-16 19:20:26 +01:00
										 |  |  |                     onChanged: (value) { | 
					
						
							|  |  |  |                       setState(() { | 
					
						
							|  |  |  |                         errMsg1 = ''; | 
					
						
							|  |  |  |                       }); | 
					
						
							|  |  |  |                     }, | 
					
						
							| 
									
										
										
										
											2022-08-01 20:42:30 +08:00
										 |  |  |                   ), | 
					
						
							|  |  |  |                 ), | 
					
						
							|  |  |  |               ], | 
					
						
							|  |  |  |             ), | 
					
						
							| 
									
										
										
										
											2023-01-16 19:47:58 +08:00
										 |  |  |             const SizedBox( | 
					
						
							|  |  |  |               height: 8.0, | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |             Obx(() => Wrap( | 
					
						
							|  |  |  |                   runSpacing: 8, | 
					
						
							|  |  |  |                   spacing: 4, | 
					
						
							|  |  |  |                   children: rules.map((e) { | 
					
						
							|  |  |  |                     var checked = e.validate(rxPass.value.trim()); | 
					
						
							|  |  |  |                     return Chip( | 
					
						
							|  |  |  |                         label: Text( | 
					
						
							|  |  |  |                           e.name, | 
					
						
							|  |  |  |                           style: TextStyle( | 
					
						
							|  |  |  |                               color: checked | 
					
						
							|  |  |  |                                   ? const Color(0xFF0A9471) | 
					
						
							|  |  |  |                                   : Color.fromARGB(255, 198, 86, 157)), | 
					
						
							|  |  |  |                         ), | 
					
						
							|  |  |  |                         backgroundColor: checked | 
					
						
							|  |  |  |                             ? const Color(0xFFD0F7ED) | 
					
						
							|  |  |  |                             : Color.fromARGB(255, 247, 205, 232)); | 
					
						
							|  |  |  |                   }).toList(), | 
					
						
							|  |  |  |                 )) | 
					
						
							| 
									
										
										
										
											2022-08-01 20:42:30 +08:00
										 |  |  |           ], | 
					
						
							|  |  |  |         ), | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |       actions: [ | 
					
						
							| 
									
										
										
										
											2023-01-15 19:46:16 +08:00
										 |  |  |         dialogButton("Cancel", onPressed: close, isOutline: true), | 
					
						
							|  |  |  |         dialogButton("OK", onPressed: submit), | 
					
						
							| 
									
										
										
										
											2022-08-01 20:42:30 +08:00
										 |  |  |       ], | 
					
						
							| 
									
										
										
										
											2022-09-03 18:19:50 +08:00
										 |  |  |       onSubmit: submit, | 
					
						
							|  |  |  |       onCancel: close, | 
					
						
							| 
									
										
										
										
											2022-08-01 20:42:30 +08:00
										 |  |  |     ); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } |