Add reset tunnel option on ios

This commit is contained in:
problematicconsumer
2024-01-18 22:53:17 +03:30
parent 0d1a1147c6
commit 98fca5792a
12 changed files with 71 additions and 6 deletions

View File

@@ -172,7 +172,8 @@
"debugMode": "Debug Mode", "debugMode": "Debug Mode",
"debugModeMsg": "Restart the app for applying this change", "debugModeMsg": "Restart the app for applying this change",
"memoryLimit": "Memory Limit", "memoryLimit": "Memory Limit",
"memoryLimitMsg": "Enable if you're experiencing out of memory errors or frequent app crash" "memoryLimitMsg": "Enable if you're experiencing out of memory errors or frequent app crash",
"resetTunnel": "Reset VPN Profile"
}, },
"network": { "network": {
"perAppProxyPageTitle": "Per-app Proxy", "perAppProxyPageTitle": "Per-app Proxy",

View File

@@ -166,7 +166,8 @@
"sectionTitle": "Avanzado", "sectionTitle": "Avanzado",
"debugMode": "Modo de depuración", "debugMode": "Modo de depuración",
"memoryLimit": "Limite de memoria", "memoryLimit": "Limite de memoria",
"memoryLimitMsg": "Habilítelo si experimenta errores de falta de memoria o fallas frecuentes de la aplicación" "memoryLimitMsg": "Habilítelo si experimenta errores de falta de memoria o fallas frecuentes de la aplicación",
"resetTunnel": "Restablecer perfil VPN"
}, },
"network": { "network": {
"perAppProxyModes": { "perAppProxyModes": {

View File

@@ -172,7 +172,8 @@
"debugMode": "دیباگ مود", "debugMode": "دیباگ مود",
"debugModeMsg": "برای اعمال این تغییر اپ را ری‌استارت کنید", "debugModeMsg": "برای اعمال این تغییر اپ را ری‌استارت کنید",
"memoryLimit": "محدودیت مموری", "memoryLimit": "محدودیت مموری",
"memoryLimitMsg": "اگر با خطاهای کمبود حافظه یا خرابی مکرر برنامه مواجه شدید، فعال کنید" "memoryLimitMsg": "اگر با خطاهای کمبود حافظه یا خرابی مکرر برنامه مواجه شدید، فعال کنید",
"resetTunnel": "بازنشانی نمایه VPN"
}, },
"network": { "network": {
"perAppProxyPageTitle": "پراکسی برنامه‌ها", "perAppProxyPageTitle": "پراکسی برنامه‌ها",

View File

@@ -172,7 +172,8 @@
"debugMode": "Режим отладки", "debugMode": "Режим отладки",
"debugModeMsg": "Чтобы применить изменения, перезапустите приложение.", "debugModeMsg": "Чтобы применить изменения, перезапустите приложение.",
"memoryLimit": "Ограничение памяти", "memoryLimit": "Ограничение памяти",
"memoryLimitMsg": "Включите, если у вас возникают ошибки нехватки памяти или частые сбои приложения." "memoryLimitMsg": "Включите, если у вас возникают ошибки нехватки памяти или частые сбои приложения.",
"resetTunnel": "Сбросить профиль VPN"
}, },
"network": { "network": {
"perAppProxyPageTitle": "Раздельное проксирование", "perAppProxyPageTitle": "Раздельное проксирование",

View File

@@ -172,7 +172,8 @@
"debugMode": "Hata ayıklama modu", "debugMode": "Hata ayıklama modu",
"debugModeMsg": "Bu değişikliği uygulamak için uygulamayı yeniden başlatın", "debugModeMsg": "Bu değişikliği uygulamak için uygulamayı yeniden başlatın",
"memoryLimit": "Bellek Sınırı", "memoryLimit": "Bellek Sınırı",
"memoryLimitMsg": "Yetersiz bellek hataları veya sık sık uygulama çökmesi yaşıyorsanız etkinleştirin" "memoryLimitMsg": "Yetersiz bellek hataları veya sık sık uygulama çökmesi yaşıyorsanız etkinleştirin",
"resetTunnel": "VPN Profilini Sıfırla"
}, },
"network": { "network": {
"perAppProxyPageTitle": "Uygulama başına Proxy", "perAppProxyPageTitle": "Uygulama başına Proxy",

View File

@@ -172,7 +172,8 @@
"debugMode": "调试模式", "debugMode": "调试模式",
"debugModeMsg": "重新启动应用程序以应用此更改", "debugModeMsg": "重新启动应用程序以应用此更改",
"memoryLimit": "内存限制", "memoryLimit": "内存限制",
"memoryLimitMsg": "如果您遇到内存不足错误或频繁应用程序崩溃,请启用" "memoryLimitMsg": "如果您遇到内存不足错误或频繁应用程序崩溃,请启用",
"resetTunnel": "重置 VPN 配置文件"
}, },
"network": { "network": {
"perAppProxyPageTitle": "分应用代理", "perAppProxyPageTitle": "分应用代理",

View File

@@ -121,6 +121,9 @@ public class MethodHandler: NSObject, FlutterPlugin {
case "stop": case "stop":
VPNManager.shared.disconnect() VPNManager.shared.disconnect()
result(true) result(true)
case "reset":
VPNManager.shared.reset()
result(true)
case "url_test": case "url_test":
guard guard
let args = call.arguments as? [String:Any?] let args = call.arguments as? [String:Any?]

View File

@@ -1,4 +1,6 @@
import 'package:hiddify/features/settings/data/settings_data_providers.dart'; import 'package:hiddify/features/settings/data/settings_data_providers.dart';
import 'package:hiddify/singbox/service/singbox_service_provider.dart';
import 'package:hiddify/utils/custom_loggers.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'platform_settings_notifier.g.dart'; part 'platform_settings_notifier.g.dart';
@@ -23,3 +25,21 @@ class IgnoreBatteryOptimizations extends _$IgnoreBatteryOptimizations {
ref.invalidateSelf(); ref.invalidateSelf();
} }
} }
@riverpod
class ResetTunnel extends _$ResetTunnel with AppLogger {
@override
Future<void> build() async {}
Future<void> run() async {
state = const AsyncLoading();
state = await AsyncValue.guard(
() => ref.read(singboxServiceProvider).resetTunnel().getOrElse(
(err) {
loggy.warning("error resetting tunnel", err);
throw err;
},
).run(),
);
}
}

View File

@@ -6,6 +6,7 @@ import 'package:hiddify/core/preferences/general_preferences.dart';
import 'package:hiddify/core/router/router.dart'; import 'package:hiddify/core/router/router.dart';
import 'package:hiddify/features/common/general_pref_tiles.dart'; import 'package:hiddify/features/common/general_pref_tiles.dart';
import 'package:hiddify/features/per_app_proxy/model/per_app_proxy_mode.dart'; import 'package:hiddify/features/per_app_proxy/model/per_app_proxy_mode.dart';
import 'package:hiddify/features/settings/notifier/platform_settings_notifier.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
class AdvancedSettingTiles extends HookConsumerWidget { class AdvancedSettingTiles extends HookConsumerWidget {
@@ -72,6 +73,14 @@ class AdvancedSettingTiles extends HookConsumerWidget {
await ref.read(disableMemoryLimitProvider.notifier).update(!value); await ref.read(disableMemoryLimitProvider.notifier).update(!value);
}, },
), ),
if (Platform.isIOS)
ListTile(
title: Text(t.settings.advanced.resetTunnel),
leading: const Icon(Icons.restart_alt),
onTap: () async {
await ref.read(resetTunnelProvider.notifier).run();
},
),
SwitchListTile( SwitchListTile(
title: Text(t.settings.advanced.debugMode), title: Text(t.settings.advanced.debugMode),
value: debug, value: debug,

View File

@@ -224,6 +224,13 @@ class FFISingboxService with InfraLogger implements SingboxService {
); );
} }
@override
TaskEither<String, Unit> resetTunnel() {
throw UnimplementedError(
"reset tunnel function unavailable on platform",
);
}
@override @override
Stream<SingboxStatus> watchStatus() => _status; Stream<SingboxStatus> watchStatus() => _status;

View File

@@ -147,6 +147,24 @@ class PlatformSingboxService with InfraLogger implements SingboxService {
); );
} }
@override
TaskEither<String, Unit> resetTunnel() {
return TaskEither(
() async {
// only available on iOS (and macOS later)
if (!Platform.isIOS) {
throw UnimplementedError(
"reset tunnel function unavailable on platform",
);
}
loggy.debug("resetting tunnel");
await _methodChannel.invokeMethod("reset");
return right(unit);
},
);
}
@override @override
Stream<List<SingboxOutboundGroup>> watchOutbounds() { Stream<List<SingboxOutboundGroup>> watchOutbounds() {
const channel = EventChannel("com.hiddify.app/groups"); const channel = EventChannel("com.hiddify.app/groups");

View File

@@ -52,6 +52,8 @@ abstract interface class SingboxService {
bool disableMemoryLimit, bool disableMemoryLimit,
); );
TaskEither<String, Unit> resetTunnel();
Stream<List<SingboxOutboundGroup>> watchOutbounds(); Stream<List<SingboxOutboundGroup>> watchOutbounds();
TaskEither<String, Unit> selectOutbound(String groupTag, String outboundTag); TaskEither<String, Unit> selectOutbound(String groupTag, String outboundTag);