Add hiddify deeplink

This commit is contained in:
problematicconsumer
2023-08-27 10:49:34 +03:30
parent 5acd5889f3
commit 4f5c6c12a5
4 changed files with 24 additions and 14 deletions

View File

@@ -44,15 +44,13 @@
<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 <data android:scheme="sing-box"/>
android:host="import-remote-profile" <data android:host="import-remote-profile"/>
android:scheme="sing-box" /> <data android:scheme="clash"/>
<data <data android:host="install-config"/>
android:host="install-config" <data android:scheme="clashmeta"/>
android:scheme="clash" /> <data android:scheme="hiddify"/>
<data <data android:host="install-sub"/>
android:host="install-config"
android:scheme="clashmeta" />
</intent-filter> </intent-filter>
</activity> </activity>
<service <service

View File

@@ -105,7 +105,7 @@ class AddProfileModal extends HookConsumerWidget {
final captureResult = final captureResult =
await Clipboard.getData(Clipboard.kTextPlain); await Clipboard.getData(Clipboard.kTextPlain);
final link = final link =
LinkParser.simple(captureResult?.text ?? ''); LinkParser.parse(captureResult?.text ?? '');
if (link != null && context.mounted) { if (link != null && context.mounted) {
if (addProfileMutation.state.isInProgress) return; if (addProfileMutation.state.isInProgress) return;
mutationTriggered.value = true; mutationTriggered.value = true;
@@ -115,9 +115,11 @@ class AddProfileModal extends HookConsumerWidget {
.addProfile(link.url), .addProfile(link.url),
); );
} else { } else {
CustomToast.error( if (context.mounted) {
t.profile.add.invalidUrlMsg.sentenceCase, CustomToast.error(
).show(context); t.profile.add.invalidUrlMsg.sentenceCase,
).show(context);
}
} }
}, },
), ),

View File

@@ -5,7 +5,11 @@ 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', 'sing-box']; static const protocols = ['clash', 'clashmeta', 'sing-box', 'hiddify'];
static ProfileLink? parse(String link) {
return simple(link) ?? deep(link);
}
static ProfileLink? simple(String link) { static ProfileLink? simple(String link) {
if (!isUrl(link)) return null; if (!isUrl(link)) return null;
@@ -35,6 +39,11 @@ abstract class LinkParser {
if (uri.authority != 'import-remote-profile' || if (uri.authority != 'import-remote-profile' ||
!queryParams.containsKey('url')) return null; !queryParams.containsKey('url')) return null;
return (url: queryParams['url']!, name: queryParams['name'] ?? ''); return (url: queryParams['url']!, name: queryParams['name'] ?? '');
case 'hiddify':
if ((uri.authority != 'install-config' &&
uri.authority != 'install-sub') ||
!queryParams.containsKey('url')) return null;
return (url: queryParams['url']!, name: queryParams['name'] ?? '');
default: default:
return null; return null;
} }

View File

@@ -38,6 +38,7 @@
<string>clash</string> <string>clash</string>
<string>clashmeta</string> <string>clashmeta</string>
<string>sing-box</string> <string>sing-box</string>
<string>hiddify</string>
</array> </array>
</dict> </dict>
</array> </array>