From b97dde60ffcfb4f1f71ae89f83c1401006b6c614 Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Sat, 26 Aug 2023 23:35:17 +0330 Subject: [PATCH] Add singbox deeplink --- android/app/src/main/AndroidManifest.xml | 12 +++++++++--- lib/services/deep_link_service.dart | 4 +--- lib/utils/link_parsers.dart | 23 ++++++++++++++++------- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 162c4740..239b237b 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -44,9 +44,15 @@ - - - + + + build() async { if (Platform.isLinux) return null; loggy.debug("initializing"); - for (final protocol in _protocols) { + for (final protocol in LinkParser.protocols) { await protocolHandler.register(protocol); } protocolHandler.addListener(this); @@ -32,8 +32,6 @@ class DeepLinkService extends _$DeepLinkService return null; } - static const _protocols = ['clash', 'clashmeta']; - @override void onProtocolUrlReceived(String url) { super.onProtocolUrlReceived(url); diff --git a/lib/utils/link_parsers.dart b/lib/utils/link_parsers.dart index c361038b..9aca5633 100644 --- a/lib/utils/link_parsers.dart +++ b/lib/utils/link_parsers.dart @@ -5,7 +5,7 @@ typedef ProfileLink = ({String url, String name}); // TODO: test and improve abstract class LinkParser { - static const protocols = ['clash', 'clashmeta']; + static const protocols = ['clash', 'clashmeta', 'sing-box']; static ProfileLink? simple(String link) { if (!isUrl(link)) return null; @@ -23,11 +23,20 @@ abstract class LinkParser { } static ProfileLink? deep(String link) { - final uri = Uri.parse(link.trim()); - if (protocols.none((e) => uri.scheme == e)) return null; - if (uri.authority != 'install-config') return null; - final params = uri.queryParameters; - if (params['url'] == null) return null; - return (url: params['url']!, name: params['name'] ?? ''); + final uri = Uri.tryParse(link.trim()); + if (uri == null || !uri.hasScheme || !uri.hasAuthority) return null; + final queryParams = uri.queryParameters; + switch (uri.scheme) { + case 'clash' || 'clashmeta': + if (uri.authority != 'install-config' || + !queryParams.containsKey('url')) return null; + return (url: queryParams['url']!, name: queryParams['name'] ?? ''); + case 'sing-box': + if (uri.authority != 'import-remote-profile' || + !queryParams.containsKey('url')) return null; + return (url: queryParams['url']!, name: queryParams['name'] ?? ''); + default: + return null; + } } }