Add hiddify deeplink
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user