From d0b9dd9ae736e8152699defc25ae43bc26612ec3 Mon Sep 17 00:00:00 2001 From: Sahil Yeole Date: Thu, 2 Nov 2023 02:12:29 +0530 Subject: [PATCH 1/8] add ios uni link scheme Signed-off-by: Sahil Yeole --- flutter/ios/Runner/Info.plist | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/flutter/ios/Runner/Info.plist b/flutter/ios/Runner/Info.plist index 892561ae7..9ecbcf12d 100644 --- a/flutter/ios/Runner/Info.plist +++ b/flutter/ios/Runner/Info.plist @@ -24,6 +24,21 @@ ???? CFBundleVersion $(FLUTTER_BUILD_NUMBER) + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLIconFile + + CFBundleURLName + com.carriez.rustdesk + CFBundleURLSchemes + + rustdesk + + + LSRequiresIPhoneOS UIApplicationSupportsIndirectInputEvents From b1682d5794e539c8c8999072b84cf317e74becc0 Mon Sep 17 00:00:00 2001 From: Sahil Yeole Date: Thu, 2 Nov 2023 02:13:33 +0530 Subject: [PATCH 2/8] listen and connect to uni link mobile Signed-off-by: Sahil Yeole --- flutter/lib/common.dart | 21 +++++++++++++++---- flutter/lib/mobile/pages/connection_page.dart | 3 +++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart index 9c8404c56..084b81f1c 100644 --- a/flutter/lib/common.dart +++ b/flutter/lib/common.dart @@ -1823,10 +1823,15 @@ StreamSubscription? listenUniLinks({handleByFlutter = true}) { final sub = uriLinkStream.listen((Uri? uri) { debugPrint("A uri was received: $uri. handleByFlutter $handleByFlutter"); if (uri != null) { - if (handleByFlutter) { - handleUriLink(uri: uri); - } else { - bind.sendUrlScheme(url: uri.toString()); + if (!isMobile){ + if (handleByFlutter) { + handleUriLink(uri: uri); + } else { + bind.sendUrlScheme(url: uri.toString()); + } + } + else { + handleUriLinkMobile(uri.toString()); } } else { print("uni listen error: uri is empty."); @@ -1844,6 +1849,14 @@ enum UriLinkType { rdp, } +void handleUriLinkMobile(String uri) { + var context = Get.context; + var uri_id = uri.split("//").last; + if (context != null && uri_id.isNotEmpty){ + connect(context, uri_id); + } +} + // uri link handler bool handleUriLink({List? cmdArgs, Uri? uri, String? uriString}) { List? args; diff --git a/flutter/lib/mobile/pages/connection_page.dart b/flutter/lib/mobile/pages/connection_page.dart index a4e3c7f4d..824ceafec 100644 --- a/flutter/lib/mobile/pages/connection_page.dart +++ b/flutter/lib/mobile/pages/connection_page.dart @@ -54,10 +54,12 @@ class _ConnectionPageState extends State { } bool isPeersLoading = false; bool isPeersLoaded = false; + StreamSubscription? _uniLinksSubscription; @override void initState() { super.initState(); + _uniLinksSubscription = listenUniLinks(); if (_idController.text.isEmpty) { () async { final lastRemoteId = await bind.mainGetLastRemoteId(); @@ -312,6 +314,7 @@ class _ConnectionPageState extends State { @override void dispose() { + _uniLinksSubscription?.cancel(); _idController.dispose(); if (Get.isRegistered()) { Get.delete(); From c14c27970fbc912558b68b1882204af270b3ccf0 Mon Sep 17 00:00:00 2001 From: Sahil Yeole Date: Thu, 2 Nov 2023 02:25:01 +0530 Subject: [PATCH 3/8] cold boot uni link mobile Signed-off-by: Sahil Yeole --- flutter/lib/common.dart | 4 ++++ flutter/lib/main.dart | 1 + 2 files changed, 5 insertions(+) diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart index 084b81f1c..23e52cc49 100644 --- a/flutter/lib/common.dart +++ b/flutter/lib/common.dart @@ -1803,6 +1803,10 @@ Future initUniLinks() async { if (initialLink == null) { return false; } + if (isMobile){ + handleUriLinkMobile(initialLink); + return true; + } return handleUriLink(uriString: initialLink); } catch (err) { debugPrintStack(label: "$err"); diff --git a/flutter/lib/main.dart b/flutter/lib/main.dart index d7dd5acee..b8a7a8e45 100644 --- a/flutter/lib/main.dart +++ b/flutter/lib/main.dart @@ -156,6 +156,7 @@ void runMobileApp() async { await Future.wait([gFFI.abModel.loadCache(), gFFI.groupModel.loadCache()]); gFFI.userModel.refreshCurrentUser(); runApp(App()); + await initUniLinks(); } void runMultiWindow( From 49205b604cd13ebeae4755e120b3a642ba5495f9 Mon Sep 17 00:00:00 2001 From: Sahil Yeole Date: Thu, 2 Nov 2023 18:40:59 +0530 Subject: [PATCH 4/8] add android intent url scheme Signed-off-by: Sahil Yeole --- flutter/android/app/src/main/AndroidManifest.xml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/flutter/android/app/src/main/AndroidManifest.xml b/flutter/android/app/src/main/AndroidManifest.xml index b3c655917..1b99801bf 100644 --- a/flutter/android/app/src/main/AndroidManifest.xml +++ b/flutter/android/app/src/main/AndroidManifest.xml @@ -61,6 +61,14 @@ + + + + + + + + - \ No newline at end of file + From 284330ed5f20245637d3a60aa2b9a4ecb196cf41 Mon Sep 17 00:00:00 2001 From: Sahil Yeole Date: Fri, 3 Nov 2023 01:46:51 +0530 Subject: [PATCH 5/8] use desktop uri format for mobile Signed-off-by: Sahil Yeole --- flutter/lib/common.dart | 37 ++++++++++++++----------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart index 23e52cc49..7ac527067 100644 --- a/flutter/lib/common.dart +++ b/flutter/lib/common.dart @@ -1803,10 +1803,6 @@ Future initUniLinks() async { if (initialLink == null) { return false; } - if (isMobile){ - handleUriLinkMobile(initialLink); - return true; - } return handleUriLink(uriString: initialLink); } catch (err) { debugPrintStack(label: "$err"); @@ -1827,17 +1823,13 @@ StreamSubscription? listenUniLinks({handleByFlutter = true}) { final sub = uriLinkStream.listen((Uri? uri) { debugPrint("A uri was received: $uri. handleByFlutter $handleByFlutter"); if (uri != null) { - if (!isMobile){ - if (handleByFlutter) { - handleUriLink(uri: uri); - } else { - bind.sendUrlScheme(url: uri.toString()); - } + if (handleByFlutter) { + handleUriLink(uri: uri); + } else { + bind.sendUrlScheme(url: uri.toString()); } - else { - handleUriLinkMobile(uri.toString()); - } - } else { + } + else { print("uni listen error: uri is empty."); } }, onError: (err) { @@ -1853,14 +1845,6 @@ enum UriLinkType { rdp, } -void handleUriLinkMobile(String uri) { - var context = Get.context; - var uri_id = uri.split("//").last; - if (context != null && uri_id.isNotEmpty){ - connect(context, uri_id); - } -} - // uri link handler bool handleUriLink({List? cmdArgs, Uri? uri, String? uriString}) { List? args; @@ -1980,7 +1964,7 @@ List? urlLinkToCmdArgs(Uri uri) { command = '--connect'; id = uri.path.substring("/new/".length); } else if (['connect', "play", 'file-transfer', 'port-forward', 'rdp'] - .contains(uri.authority)) { + .contains(uri.authority) && !isMobile) { command = '--${uri.authority}'; if (uri.path.length > 1) { id = uri.path.substring(1); @@ -1991,6 +1975,13 @@ List? urlLinkToCmdArgs(Uri uri) { id = uri.authority; } + if (isMobile){ + if (id != null){ + connect(Get.context!, id); + return null; + } + } + List args = List.empty(growable: true); if (command != null && id != null) { args.add(command); From 6d264b4394d0a91d4d49d69bf2d95f908b89483c Mon Sep 17 00:00:00 2001 From: Sahil Yeole Date: Fri, 3 Nov 2023 01:51:40 +0530 Subject: [PATCH 6/8] remove extra line Signed-off-by: Sahil Yeole --- flutter/lib/common.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart index 7ac527067..1211f304b 100644 --- a/flutter/lib/common.dart +++ b/flutter/lib/common.dart @@ -1828,8 +1828,7 @@ StreamSubscription? listenUniLinks({handleByFlutter = true}) { } else { bind.sendUrlScheme(url: uri.toString()); } - } - else { + } else { print("uni listen error: uri is empty."); } }, onError: (err) { From 050759c1c29ffbbd8fa9ee2179479f850ebb7f2e Mon Sep 17 00:00:00 2001 From: Sahil Yeole Date: Fri, 3 Nov 2023 01:55:56 +0530 Subject: [PATCH 7/8] improve code format Signed-off-by: Sahil Yeole --- flutter/ios/Runner/Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flutter/ios/Runner/Info.plist b/flutter/ios/Runner/Info.plist index 9ecbcf12d..496fb17c2 100644 --- a/flutter/ios/Runner/Info.plist +++ b/flutter/ios/Runner/Info.plist @@ -34,7 +34,7 @@ CFBundleURLName com.carriez.rustdesk CFBundleURLSchemes - + rustdesk From 1365df898fd7af2eba7d5728adf1761574e6ab24 Mon Sep 17 00:00:00 2001 From: Sahil Yeole Date: Fri, 3 Nov 2023 18:31:30 +0530 Subject: [PATCH 8/8] support connect, play & file-transfer on mobile uri Signed-off-by: Sahil Yeole --- flutter/lib/common.dart | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart index 1211f304b..4d23614ca 100644 --- a/flutter/lib/common.dart +++ b/flutter/lib/common.dart @@ -1955,6 +1955,7 @@ bool handleUriLink({List? cmdArgs, Uri? uri, String? uriString}) { List? urlLinkToCmdArgs(Uri uri) { String? command; String? id; + final options = ["connect", "play", "file-transfer", "port-forward", "rdp"]; if (uri.authority.isEmpty && uri.path.split('').every((char) => char == '/')) { return []; @@ -1962,12 +1963,20 @@ List? urlLinkToCmdArgs(Uri uri) { // For compatibility command = '--connect'; id = uri.path.substring("/new/".length); - } else if (['connect', "play", 'file-transfer', 'port-forward', 'rdp'] - .contains(uri.authority) && !isMobile) { + } else if (options.contains(uri.authority)) { + final optionIndex = options.indexOf(uri.authority); command = '--${uri.authority}'; if (uri.path.length > 1) { id = uri.path.substring(1); } + if (isMobile && id != null) { + if (optionIndex == 0 || optionIndex == 1) { + connect(Get.context!, id); + } else if (optionIndex == 2) { + connect(Get.context!, id, isFileTransfer: true); + } + return null; + } } else if (uri.authority.length > 2 && uri.path.length <= 1) { // rustdesk:// command = '--connect';