| 
									
										
										
										
											2022-09-19 18:38:19 +08:00
										 |  |  | // main window right pane
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-25 16:23:45 +08:00
										 |  |  | import 'dart:async'; | 
					
						
							| 
									
										
										
										
											2022-07-22 23:12:31 +08:00
										 |  |  | import 'dart:convert'; | 
					
						
							| 
									
										
										
										
											2022-10-22 21:55:36 +08:00
										 |  |  | import 'dart:io'; | 
					
						
							| 
									
										
										
										
											2022-07-22 23:12:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-23 09:41:05 +08:00
										 |  |  | import 'package:auto_size_text/auto_size_text.dart'; | 
					
						
							| 
									
										
										
										
											2022-05-29 04:39:12 +08:00
										 |  |  | import 'package:flutter/material.dart'; | 
					
						
							| 
									
										
										
										
											2022-09-23 15:12:50 +08:00
										 |  |  | import 'package:flutter_hbb/consts.dart'; | 
					
						
							| 
									
										
										
										
											2022-09-28 11:20:57 +08:00
										 |  |  | import 'package:flutter_hbb/desktop/widgets/scroll_wrapper.dart'; | 
					
						
							| 
									
										
										
										
											2023-01-30 21:42:58 +08:00
										 |  |  | import 'package:flutter_hbb/models/state_model.dart'; | 
					
						
							| 
									
										
										
										
											2022-07-14 12:32:01 +08:00
										 |  |  | import 'package:get/get.dart'; | 
					
						
							| 
									
										
										
										
											2022-07-25 16:23:45 +08:00
										 |  |  | import 'package:url_launcher/url_launcher_string.dart'; | 
					
						
							| 
									
										
										
										
											2022-10-22 21:55:36 +08:00
										 |  |  | import 'package:window_manager/window_manager.dart'; | 
					
						
							| 
									
										
										
										
											2022-05-29 17:19:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-29 04:39:12 +08:00
										 |  |  | import '../../common.dart'; | 
					
						
							| 
									
										
										
										
											2022-09-02 17:19:44 +08:00
										 |  |  | import '../../common/formatter/id_formatter.dart'; | 
					
						
							| 
									
										
										
										
											2022-09-19 20:26:39 +08:00
										 |  |  | import '../../common/widgets/peer_tab_page.dart'; | 
					
						
							| 
									
										
										
										
											2022-08-03 22:03:31 +08:00
										 |  |  | import '../../models/platform_model.dart'; | 
					
						
							| 
									
										
										
										
											2022-09-23 17:28:22 +08:00
										 |  |  | import '../widgets/button.dart'; | 
					
						
							| 
									
										
										
										
											2022-05-29 04:39:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /// Connection page for connecting to a remote peer.
 | 
					
						
							| 
									
										
										
										
											2022-08-09 20:36:52 +08:00
										 |  |  | class ConnectionPage extends StatefulWidget { | 
					
						
							| 
									
										
										
										
											2022-09-06 02:08:59 -07:00
										 |  |  |   const ConnectionPage({Key? key}) : super(key: key); | 
					
						
							| 
									
										
										
										
											2022-05-29 04:39:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							| 
									
										
										
										
											2022-09-06 02:08:59 -07:00
										 |  |  |   State<ConnectionPage> createState() => _ConnectionPageState(); | 
					
						
							| 
									
										
										
										
											2022-05-29 04:39:12 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /// State for the connection page.
 | 
					
						
							| 
									
										
										
										
											2022-09-28 11:20:57 +08:00
										 |  |  | class _ConnectionPageState extends State<ConnectionPage> | 
					
						
							| 
									
										
										
										
											2022-10-22 21:55:36 +08:00
										 |  |  |     with SingleTickerProviderStateMixin, WindowListener { | 
					
						
							| 
									
										
										
										
											2022-05-29 04:39:12 +08:00
										 |  |  |   /// Controller for the id input bar.
 | 
					
						
							| 
									
										
										
										
											2022-09-02 17:19:44 +08:00
										 |  |  |   final _idController = IDTextEditingController(); | 
					
						
							| 
									
										
										
										
											2022-05-29 04:39:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-28 11:20:57 +08:00
										 |  |  |   /// Nested scroll controller
 | 
					
						
							|  |  |  |   final _scrollController = ScrollController(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-25 16:23:45 +08:00
										 |  |  |   Timer? _updateTimer; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-16 12:32:52 +08:00
										 |  |  |   final RxBool _idInputFocused = false.obs; | 
					
						
							|  |  |  |   final FocusNode _idFocusNode = FocusNode(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-29 22:00:27 +08:00
										 |  |  |   var svcStopped = Get.find<RxBool>(tag: 'stop-service'); | 
					
						
							| 
									
										
										
										
											2022-10-20 09:21:02 +08:00
										 |  |  |   var svcStatusCode = 0.obs; | 
					
						
							|  |  |  |   var svcIsUsingPublicServer = true.obs; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-09 02:30:31 -05:00
										 |  |  |   bool isWindowMinimized = false; | 
					
						
							| 
									
										
										
										
											2022-10-22 21:55:36 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-29 04:39:12 +08:00
										 |  |  |   @override | 
					
						
							|  |  |  |   void initState() { | 
					
						
							|  |  |  |     super.initState(); | 
					
						
							| 
									
										
										
										
											2022-08-08 17:53:51 +08:00
										 |  |  |     if (_idController.text.isEmpty) { | 
					
						
							|  |  |  |       () async { | 
					
						
							|  |  |  |         final lastRemoteId = await bind.mainGetLastRemoteId(); | 
					
						
							| 
									
										
										
										
											2022-09-02 17:19:44 +08:00
										 |  |  |         if (lastRemoteId != _idController.id) { | 
					
						
							| 
									
										
										
										
											2022-08-08 17:53:51 +08:00
										 |  |  |           setState(() { | 
					
						
							| 
									
										
										
										
											2022-09-02 17:19:44 +08:00
										 |  |  |             _idController.id = lastRemoteId; | 
					
						
							| 
									
										
										
										
											2022-08-08 17:53:51 +08:00
										 |  |  |           }); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-11-29 22:36:35 +08:00
										 |  |  |     _updateTimer = periodic_immediate(Duration(seconds: 1), () async { | 
					
						
							| 
									
										
										
										
											2022-07-25 16:23:45 +08:00
										 |  |  |       updateStatus(); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2022-10-19 20:53:05 +08:00
										 |  |  |     _idFocusNode.addListener(() { | 
					
						
							|  |  |  |       _idInputFocused.value = _idFocusNode.hasFocus; | 
					
						
							| 
									
										
										
										
											2023-01-30 18:30:38 +08:00
										 |  |  |       // select all to faciliate removing text, just following the behavior of address input of chrome
 | 
					
						
							| 
									
										
										
										
											2023-02-13 16:40:24 +08:00
										 |  |  |       _idController.selection = TextSelection( | 
					
						
							|  |  |  |           baseOffset: 0, extentOffset: _idController.value.text.length); | 
					
						
							| 
									
										
										
										
											2022-10-19 20:53:05 +08:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2022-10-22 21:55:36 +08:00
										 |  |  |     windowManager.addListener(this); | 
					
						
							| 
									
										
										
										
											2022-10-20 09:21:02 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   void dispose() { | 
					
						
							|  |  |  |     _idController.dispose(); | 
					
						
							|  |  |  |     _updateTimer?.cancel(); | 
					
						
							| 
									
										
										
										
											2022-10-22 21:55:36 +08:00
										 |  |  |     windowManager.removeListener(this); | 
					
						
							| 
									
										
										
										
											2022-10-20 09:21:02 +08:00
										 |  |  |     super.dispose(); | 
					
						
							| 
									
										
										
										
											2022-05-29 04:39:12 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-22 21:55:36 +08:00
										 |  |  |   @override | 
					
						
							|  |  |  |   void onWindowEvent(String eventName) { | 
					
						
							|  |  |  |     super.onWindowEvent(eventName); | 
					
						
							|  |  |  |     if (eventName == 'minimize') { | 
					
						
							| 
									
										
										
										
											2023-01-09 02:30:31 -05:00
										 |  |  |       isWindowMinimized = true; | 
					
						
							| 
									
										
										
										
											2022-10-22 21:55:36 +08:00
										 |  |  |     } else if (eventName == 'maximize' || eventName == 'restore') { | 
					
						
							| 
									
										
										
										
											2023-01-09 02:30:31 -05:00
										 |  |  |       if (isWindowMinimized && Platform.isWindows) { | 
					
						
							|  |  |  |         // windows can't update when minimized.
 | 
					
						
							| 
									
										
										
										
											2022-10-22 21:55:36 +08:00
										 |  |  |         Get.forceAppUpdate(); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2023-01-09 02:30:31 -05:00
										 |  |  |       isWindowMinimized = false; | 
					
						
							| 
									
										
										
										
											2022-10-22 21:55:36 +08:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-30 21:42:58 +08:00
										 |  |  |   @override | 
					
						
							|  |  |  |   void onWindowEnterFullScreen() { | 
					
						
							|  |  |  |     // Remove edge border by setting the value to zero.
 | 
					
						
							|  |  |  |     stateGlobal.resizeEdgeSize.value = 0; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   void onWindowLeaveFullScreen() { | 
					
						
							|  |  |  |     // Restore edge border to default edge size.
 | 
					
						
							|  |  |  |     stateGlobal.resizeEdgeSize.value = kWindowEdgeSize; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-19 10:57:17 +08:00
										 |  |  |   @override | 
					
						
							|  |  |  |   void onWindowClose() { | 
					
						
							|  |  |  |     super.onWindowClose(); | 
					
						
							|  |  |  |     bind.mainOnMainWindowClose(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-29 04:39:12 +08:00
										 |  |  |   @override | 
					
						
							|  |  |  |   Widget build(BuildContext context) { | 
					
						
							| 
									
										
										
										
											2022-09-28 11:20:57 +08:00
										 |  |  |     return Column( | 
					
						
							|  |  |  |       children: [ | 
					
						
							|  |  |  |         Expanded( | 
					
						
							|  |  |  |           child: DesktopScrollWrapper( | 
					
						
							|  |  |  |             scrollController: _scrollController, | 
					
						
							|  |  |  |             child: CustomScrollView( | 
					
						
							|  |  |  |               controller: _scrollController, | 
					
						
							| 
									
										
										
										
											2023-02-13 16:18:46 +08:00
										 |  |  |               physics: DraggableNeverScrollableScrollPhysics(), | 
					
						
							| 
									
										
										
										
											2022-09-28 11:20:57 +08:00
										 |  |  |               slivers: [ | 
					
						
							|  |  |  |                 SliverList( | 
					
						
							|  |  |  |                     delegate: SliverChildListDelegate([ | 
					
						
							| 
									
										
										
										
											2022-08-24 11:01:58 +08:00
										 |  |  |                   Row( | 
					
						
							|  |  |  |                     children: [ | 
					
						
							| 
									
										
										
										
											2022-11-30 11:13:02 +08:00
										 |  |  |                       Flexible(child: _buildRemoteIDTextField(context)), | 
					
						
							| 
									
										
										
										
											2022-08-24 11:01:58 +08:00
										 |  |  |                     ], | 
					
						
							|  |  |  |                   ).marginOnly(top: 22), | 
					
						
							|  |  |  |                   SizedBox(height: 12), | 
					
						
							| 
									
										
										
										
											2022-09-28 21:21:54 +08:00
										 |  |  |                   Divider().paddingOnly(right: 12), | 
					
						
							| 
									
										
										
										
											2022-09-28 11:20:57 +08:00
										 |  |  |                 ])), | 
					
						
							|  |  |  |                 SliverFillRemaining( | 
					
						
							|  |  |  |                   hasScrollBody: false, | 
					
						
							| 
									
										
										
										
											2022-12-04 15:15:48 +08:00
										 |  |  |                   child: PeerTabPage().paddingOnly(right: 12.0), | 
					
						
							| 
									
										
										
										
											2022-09-28 11:20:57 +08:00
										 |  |  |                 ) | 
					
						
							|  |  |  |               ], | 
					
						
							| 
									
										
										
										
											2022-09-28 21:21:54 +08:00
										 |  |  |             ).paddingOnly(left: 12.0), | 
					
						
							| 
									
										
										
										
											2022-09-28 11:20:57 +08:00
										 |  |  |           ), | 
					
						
							|  |  |  |         ), | 
					
						
							| 
									
										
										
										
											2022-10-19 20:53:05 +08:00
										 |  |  |         const Divider(height: 1), | 
					
						
							|  |  |  |         buildStatus() | 
					
						
							| 
									
										
										
										
											2022-09-28 11:20:57 +08:00
										 |  |  |       ], | 
					
						
							| 
									
										
										
										
											2022-05-29 04:39:12 +08:00
										 |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /// Callback for the connect button.
 | 
					
						
							|  |  |  |   /// Connects to the selected peer.
 | 
					
						
							| 
									
										
										
										
											2022-05-30 13:25:06 +08:00
										 |  |  |   void onConnect({bool isFileTransfer = false}) { | 
					
						
							| 
									
										
										
										
											2023-02-13 16:40:24 +08:00
										 |  |  |     var id = _idController.id; | 
					
						
							| 
									
										
										
										
											2023-02-26 11:23:43 +08:00
										 |  |  |     connect(context, id, isFileTransfer: isFileTransfer); | 
					
						
							| 
									
										
										
										
											2022-05-29 04:39:12 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-21 17:54:47 +08:00
										 |  |  |   /// UI for the remote ID TextField.
 | 
					
						
							| 
									
										
										
										
											2022-05-29 04:39:12 +08:00
										 |  |  |   /// Search for a peer and connect to it if the id exists.
 | 
					
						
							| 
									
										
										
										
											2022-09-21 17:54:47 +08:00
										 |  |  |   Widget _buildRemoteIDTextField(BuildContext context) { | 
					
						
							| 
									
										
										
										
											2022-07-14 12:32:01 +08:00
										 |  |  |     var w = Container( | 
					
						
							| 
									
										
										
										
											2022-08-22 17:58:48 +08:00
										 |  |  |       width: 320 + 20 * 2, | 
					
						
							| 
									
										
										
										
											2022-09-03 18:19:50 +08:00
										 |  |  |       padding: const EdgeInsets.fromLTRB(20, 24, 20, 22), | 
					
						
							| 
									
										
										
										
											2022-07-14 12:32:01 +08:00
										 |  |  |       decoration: BoxDecoration( | 
					
						
							| 
									
										
										
										
											2023-02-23 16:49:31 +01:00
										 |  |  |         color: Theme.of(context).colorScheme.background, | 
					
						
							| 
									
										
										
										
											2022-07-14 12:32:01 +08:00
										 |  |  |         borderRadius: const BorderRadius.all(Radius.circular(13)), | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |       child: Ink( | 
					
						
							|  |  |  |         child: Column( | 
					
						
							|  |  |  |           children: [ | 
					
						
							|  |  |  |             Row( | 
					
						
							| 
									
										
										
										
											2022-08-23 19:55:58 +08:00
										 |  |  |               children: [ | 
					
						
							| 
									
										
										
										
											2022-11-23 09:41:05 +08:00
										 |  |  |                 Expanded( | 
					
						
							|  |  |  |                   child: AutoSizeText( | 
					
						
							|  |  |  |                     translate('Control Remote Desktop'), | 
					
						
							|  |  |  |                     maxLines: 1, | 
					
						
							|  |  |  |                     style: Theme.of(context) | 
					
						
							|  |  |  |                         .textTheme | 
					
						
							|  |  |  |                         .titleLarge | 
					
						
							|  |  |  |                         ?.merge(TextStyle(height: 1)), | 
					
						
							|  |  |  |                   ), | 
					
						
							| 
									
										
										
										
											2022-08-23 19:55:58 +08:00
										 |  |  |                 ), | 
					
						
							|  |  |  |               ], | 
					
						
							|  |  |  |             ).marginOnly(bottom: 15), | 
					
						
							|  |  |  |             Row( | 
					
						
							|  |  |  |               children: [ | 
					
						
							| 
									
										
										
										
											2022-07-14 12:32:01 +08:00
										 |  |  |                 Expanded( | 
					
						
							| 
									
										
										
										
											2022-09-02 17:19:44 +08:00
										 |  |  |                   child: Obx( | 
					
						
							|  |  |  |                     () => TextField( | 
					
						
							| 
									
										
										
										
											2023-01-06 17:10:38 +08:00
										 |  |  |                       maxLength: 90, | 
					
						
							| 
									
										
										
										
											2022-09-02 17:19:44 +08:00
										 |  |  |                       autocorrect: false, | 
					
						
							|  |  |  |                       enableSuggestions: false, | 
					
						
							|  |  |  |                       keyboardType: TextInputType.visiblePassword, | 
					
						
							| 
									
										
										
										
											2022-10-16 12:32:52 +08:00
										 |  |  |                       focusNode: _idFocusNode, | 
					
						
							| 
									
										
										
										
											2022-09-03 18:19:50 +08:00
										 |  |  |                       style: const TextStyle( | 
					
						
							| 
									
										
										
										
											2022-09-02 17:19:44 +08:00
										 |  |  |                         fontFamily: 'WorkSans', | 
					
						
							|  |  |  |                         fontSize: 22, | 
					
						
							| 
									
										
										
										
											2023-01-06 17:10:38 +08:00
										 |  |  |                         height: 1.25, | 
					
						
							| 
									
										
										
										
											2022-09-02 17:19:44 +08:00
										 |  |  |                       ), | 
					
						
							| 
									
										
										
										
											2022-09-03 18:19:50 +08:00
										 |  |  |                       maxLines: 1, | 
					
						
							| 
									
										
										
										
											2022-09-23 16:31:50 +08:00
										 |  |  |                       cursorColor: | 
					
						
							|  |  |  |                           Theme.of(context).textTheme.titleLarge?.color, | 
					
						
							| 
									
										
										
										
											2022-09-02 17:19:44 +08:00
										 |  |  |                       decoration: InputDecoration( | 
					
						
							| 
									
										
										
										
											2023-01-07 13:12:51 +08:00
										 |  |  |                           counterText: '', | 
					
						
							| 
									
										
										
										
											2022-10-16 12:32:52 +08:00
										 |  |  |                           hintText: _idInputFocused.value | 
					
						
							| 
									
										
										
										
											2022-09-02 17:19:44 +08:00
										 |  |  |                               ? null | 
					
						
							|  |  |  |                               : translate('Enter Remote ID'), | 
					
						
							|  |  |  |                           border: OutlineInputBorder( | 
					
						
							|  |  |  |                               borderRadius: BorderRadius.zero, | 
					
						
							|  |  |  |                               borderSide: BorderSide( | 
					
						
							| 
									
										
										
										
											2022-09-03 18:19:50 +08:00
										 |  |  |                                   color: MyTheme.color(context).border!)), | 
					
						
							|  |  |  |                           enabledBorder: OutlineInputBorder( | 
					
						
							|  |  |  |                               borderRadius: BorderRadius.zero, | 
					
						
							|  |  |  |                               borderSide: BorderSide( | 
					
						
							|  |  |  |                                   color: MyTheme.color(context).border!)), | 
					
						
							|  |  |  |                           focusedBorder: const OutlineInputBorder( | 
					
						
							| 
									
										
										
										
											2022-08-23 19:55:58 +08:00
										 |  |  |                             borderRadius: BorderRadius.zero, | 
					
						
							| 
									
										
										
										
											2022-09-02 17:19:44 +08:00
										 |  |  |                             borderSide: | 
					
						
							|  |  |  |                                 BorderSide(color: MyTheme.button, width: 3), | 
					
						
							|  |  |  |                           ), | 
					
						
							|  |  |  |                           isDense: true, | 
					
						
							| 
									
										
										
										
											2022-09-03 18:19:50 +08:00
										 |  |  |                           contentPadding: const EdgeInsets.symmetric( | 
					
						
							| 
									
										
										
										
											2022-09-02 17:19:44 +08:00
										 |  |  |                               horizontal: 10, vertical: 12)), | 
					
						
							|  |  |  |                       controller: _idController, | 
					
						
							|  |  |  |                       inputFormatters: [IDTextInputFormatter()], | 
					
						
							|  |  |  |                       onSubmitted: (s) { | 
					
						
							|  |  |  |                         onConnect(); | 
					
						
							|  |  |  |                       }, | 
					
						
							|  |  |  |                     ), | 
					
						
							| 
									
										
										
										
											2022-07-14 12:32:01 +08:00
										 |  |  |                   ), | 
					
						
							| 
									
										
										
										
											2022-05-29 04:39:12 +08:00
										 |  |  |                 ), | 
					
						
							| 
									
										
										
										
											2022-07-14 12:32:01 +08:00
										 |  |  |               ], | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |             Padding( | 
					
						
							| 
									
										
										
										
											2022-08-22 17:58:48 +08:00
										 |  |  |               padding: const EdgeInsets.only(top: 13.0), | 
					
						
							| 
									
										
										
										
											2022-07-14 12:32:01 +08:00
										 |  |  |               child: Row( | 
					
						
							|  |  |  |                 mainAxisAlignment: MainAxisAlignment.end, | 
					
						
							|  |  |  |                 children: [ | 
					
						
							| 
									
										
										
										
											2022-09-23 17:28:22 +08:00
										 |  |  |                   Button( | 
					
						
							|  |  |  |                     isOutline: true, | 
					
						
							|  |  |  |                     onTap: () { | 
					
						
							|  |  |  |                       onConnect(isFileTransfer: true); | 
					
						
							|  |  |  |                     }, | 
					
						
							|  |  |  |                     text: "Transfer File", | 
					
						
							|  |  |  |                   ), | 
					
						
							| 
									
										
										
										
											2022-09-03 18:19:50 +08:00
										 |  |  |                   const SizedBox( | 
					
						
							| 
									
										
										
										
											2022-08-22 17:58:48 +08:00
										 |  |  |                     width: 17, | 
					
						
							| 
									
										
										
										
											2022-07-14 12:32:01 +08:00
										 |  |  |                   ), | 
					
						
							| 
									
										
										
										
											2022-09-23 17:28:22 +08:00
										 |  |  |                   Button(onTap: onConnect, text: "Connect"), | 
					
						
							| 
									
										
										
										
											2022-07-14 12:32:01 +08:00
										 |  |  |                 ], | 
					
						
							|  |  |  |               ), | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |           ], | 
					
						
							| 
									
										
										
										
											2022-05-29 04:39:12 +08:00
										 |  |  |         ), | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |     ); | 
					
						
							| 
									
										
										
										
											2022-11-30 11:13:02 +08:00
										 |  |  |     return Container( | 
					
						
							|  |  |  |         constraints: const BoxConstraints(maxWidth: 600), child: w); | 
					
						
							| 
									
										
										
										
											2022-05-29 04:39:12 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-25 16:23:45 +08:00
										 |  |  |   Widget buildStatus() { | 
					
						
							| 
									
										
										
										
											2022-10-19 20:53:05 +08:00
										 |  |  |     final em = 14.0; | 
					
						
							|  |  |  |     return ConstrainedBox( | 
					
						
							|  |  |  |       constraints: BoxConstraints.tightFor(height: 3 * em), | 
					
						
							|  |  |  |       child: Obx(() => Row( | 
					
						
							|  |  |  |             crossAxisAlignment: CrossAxisAlignment.center, | 
					
						
							|  |  |  |             children: [ | 
					
						
							|  |  |  |               Container( | 
					
						
							|  |  |  |                 height: 8, | 
					
						
							|  |  |  |                 width: 8, | 
					
						
							|  |  |  |                 decoration: BoxDecoration( | 
					
						
							|  |  |  |                   borderRadius: BorderRadius.circular(4), | 
					
						
							|  |  |  |                   color: svcStopped.value || svcStatusCode.value == 0 | 
					
						
							|  |  |  |                       ? kColorWarn | 
					
						
							|  |  |  |                       : (svcStatusCode.value == 1 | 
					
						
							|  |  |  |                           ? Color.fromARGB(255, 50, 190, 166) | 
					
						
							|  |  |  |                           : Color.fromARGB(255, 224, 79, 95)), | 
					
						
							|  |  |  |                 ), | 
					
						
							|  |  |  |               ).marginSymmetric(horizontal: em), | 
					
						
							|  |  |  |               Text( | 
					
						
							|  |  |  |                   svcStopped.value | 
					
						
							|  |  |  |                       ? translate("Service is not running") | 
					
						
							|  |  |  |                       : svcStatusCode.value == 0 | 
					
						
							|  |  |  |                           ? translate("connecting_status") | 
					
						
							|  |  |  |                           : svcStatusCode.value == -1 | 
					
						
							|  |  |  |                               ? translate("not_ready_status") | 
					
						
							|  |  |  |                               : translate('Ready'), | 
					
						
							|  |  |  |                   style: TextStyle(fontSize: em)), | 
					
						
							|  |  |  |               // stop
 | 
					
						
							|  |  |  |               Offstage( | 
					
						
							|  |  |  |                 offstage: !svcStopped.value, | 
					
						
							| 
									
										
										
										
											2022-11-29 22:00:27 +08:00
										 |  |  |                 child: InkWell( | 
					
						
							| 
									
										
										
										
											2022-10-19 20:53:05 +08:00
										 |  |  |                         onTap: () async { | 
					
						
							| 
									
										
										
										
											2022-11-09 17:28:47 +08:00
										 |  |  |                           bool checked = !bind.mainIsInstalled() || | 
					
						
							| 
									
										
										
										
											2022-10-19 20:53:05 +08:00
										 |  |  |                               await bind.mainCheckSuperUserPermission(); | 
					
						
							|  |  |  |                           if (checked) { | 
					
						
							|  |  |  |                             bind.mainSetOption(key: "stop-service", value: ""); | 
					
						
							|  |  |  |                             bind.mainSetOption(key: "access-mode", value: ""); | 
					
						
							|  |  |  |                           } | 
					
						
							|  |  |  |                         }, | 
					
						
							|  |  |  |                         child: Text(translate("Start Service"), | 
					
						
							|  |  |  |                             style: TextStyle( | 
					
						
							|  |  |  |                                 decoration: TextDecoration.underline, | 
					
						
							|  |  |  |                                 fontSize: em))) | 
					
						
							|  |  |  |                     .marginOnly(left: em), | 
					
						
							|  |  |  |               ), | 
					
						
							|  |  |  |               // ready && public
 | 
					
						
							| 
									
										
										
										
											2022-10-22 12:03:57 +08:00
										 |  |  |               Flexible( | 
					
						
							|  |  |  |                 child: Offstage( | 
					
						
							|  |  |  |                   offstage: !(!svcStopped.value && | 
					
						
							|  |  |  |                       svcStatusCode.value == 1 && | 
					
						
							|  |  |  |                       svcIsUsingPublicServer.value), | 
					
						
							|  |  |  |                   child: Row( | 
					
						
							|  |  |  |                     crossAxisAlignment: CrossAxisAlignment.center, | 
					
						
							|  |  |  |                     children: [ | 
					
						
							|  |  |  |                       Text(', ', style: TextStyle(fontSize: em)), | 
					
						
							|  |  |  |                       Flexible( | 
					
						
							|  |  |  |                         child: InkWell( | 
					
						
							|  |  |  |                           onTap: onUsePublicServerGuide, | 
					
						
							|  |  |  |                           child: Row( | 
					
						
							|  |  |  |                             children: [ | 
					
						
							|  |  |  |                               Flexible( | 
					
						
							|  |  |  |                                 child: Text( | 
					
						
							|  |  |  |                                   translate('setup_server_tip'), | 
					
						
							|  |  |  |                                   style: TextStyle( | 
					
						
							|  |  |  |                                       decoration: TextDecoration.underline, | 
					
						
							|  |  |  |                                       fontSize: em), | 
					
						
							|  |  |  |                                 ), | 
					
						
							|  |  |  |                               ), | 
					
						
							|  |  |  |                             ], | 
					
						
							|  |  |  |                           ), | 
					
						
							|  |  |  |                         ), | 
					
						
							|  |  |  |                       ) | 
					
						
							|  |  |  |                     ], | 
					
						
							|  |  |  |                   ), | 
					
						
							| 
									
										
										
										
											2022-10-19 20:53:05 +08:00
										 |  |  |                 ), | 
					
						
							|  |  |  |               ) | 
					
						
							|  |  |  |             ], | 
					
						
							|  |  |  |           )), | 
					
						
							| 
									
										
										
										
											2022-07-25 16:23:45 +08:00
										 |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void onUsePublicServerGuide() { | 
					
						
							| 
									
										
										
										
											2022-09-13 21:36:38 +08:00
										 |  |  |     const url = "https://rustdesk.com/blog/id-relay-set/"; | 
					
						
							| 
									
										
										
										
											2022-07-25 16:23:45 +08:00
										 |  |  |     canLaunchUrlString(url).then((can) { | 
					
						
							|  |  |  |       if (can) { | 
					
						
							|  |  |  |         launchUrlString(url); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   updateStatus() async { | 
					
						
							| 
									
										
										
										
											2022-08-03 22:03:31 +08:00
										 |  |  |     final status = | 
					
						
							|  |  |  |         jsonDecode(await bind.mainGetConnectStatus()) as Map<String, dynamic>; | 
					
						
							| 
									
										
										
										
											2022-07-25 16:23:45 +08:00
										 |  |  |     svcStatusCode.value = status["status_num"]; | 
					
						
							| 
									
										
										
										
											2022-08-03 22:03:31 +08:00
										 |  |  |     svcIsUsingPublicServer.value = await bind.mainIsUsingPublicServer(); | 
					
						
							| 
									
										
										
										
											2022-07-25 16:23:45 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-08-02 13:10:09 +08:00
										 |  |  | } |