Add singbox deeplink

This commit is contained in:
problematicconsumer
2023-08-26 23:35:17 +03:30
parent 2ecb781f60
commit b97dde60ff
3 changed files with 26 additions and 13 deletions

View File

@@ -44,9 +44,15 @@
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="clash" /> <data
<data android:scheme="clashmeta" /> android:host="import-remote-profile"
<data android:host="install-config"/> android:scheme="sing-box" />
<data
android:host="install-config"
android:scheme="clash" />
<data
android:host="install-config"
android:scheme="clashmeta" />
</intent-filter> </intent-filter>
</activity> </activity>
<service <service

View File

@@ -15,7 +15,7 @@ class DeepLinkService extends _$DeepLinkService
Future<NewProfileLink?> build() async { Future<NewProfileLink?> build() async {
if (Platform.isLinux) return null; if (Platform.isLinux) return null;
loggy.debug("initializing"); loggy.debug("initializing");
for (final protocol in _protocols) { for (final protocol in LinkParser.protocols) {
await protocolHandler.register(protocol); await protocolHandler.register(protocol);
} }
protocolHandler.addListener(this); protocolHandler.addListener(this);
@@ -32,8 +32,6 @@ class DeepLinkService extends _$DeepLinkService
return null; return null;
} }
static const _protocols = ['clash', 'clashmeta'];
@override @override
void onProtocolUrlReceived(String url) { void onProtocolUrlReceived(String url) {
super.onProtocolUrlReceived(url); super.onProtocolUrlReceived(url);

View File

@@ -5,7 +5,7 @@ typedef ProfileLink = ({String url, String name});
// TODO: test and improve // TODO: test and improve
abstract class LinkParser { abstract class LinkParser {
static const protocols = ['clash', 'clashmeta']; static const protocols = ['clash', 'clashmeta', 'sing-box'];
static ProfileLink? simple(String link) { static ProfileLink? simple(String link) {
if (!isUrl(link)) return null; if (!isUrl(link)) return null;
@@ -23,11 +23,20 @@ abstract class LinkParser {
} }
static ProfileLink? deep(String link) { static ProfileLink? deep(String link) {
final uri = Uri.parse(link.trim()); final uri = Uri.tryParse(link.trim());
if (protocols.none((e) => uri.scheme == e)) return null; if (uri == null || !uri.hasScheme || !uri.hasAuthority) return null;
if (uri.authority != 'install-config') return null; final queryParams = uri.queryParameters;
final params = uri.queryParameters; switch (uri.scheme) {
if (params['url'] == null) return null; case 'clash' || 'clashmeta':
return (url: params['url']!, name: params['name'] ?? ''); 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;
}
} }
} }