Add reset tunnel option on ios
This commit is contained in:
@@ -172,7 +172,8 @@
|
||||
"debugMode": "Debug Mode",
|
||||
"debugModeMsg": "Restart the app for applying this change",
|
||||
"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": {
|
||||
"perAppProxyPageTitle": "Per-app Proxy",
|
||||
|
||||
@@ -166,7 +166,8 @@
|
||||
"sectionTitle": "Avanzado",
|
||||
"debugMode": "Modo de depuración",
|
||||
"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": {
|
||||
"perAppProxyModes": {
|
||||
|
||||
@@ -172,7 +172,8 @@
|
||||
"debugMode": "دیباگ مود",
|
||||
"debugModeMsg": "برای اعمال این تغییر اپ را ریاستارت کنید",
|
||||
"memoryLimit": "محدودیت مموری",
|
||||
"memoryLimitMsg": "اگر با خطاهای کمبود حافظه یا خرابی مکرر برنامه مواجه شدید، فعال کنید"
|
||||
"memoryLimitMsg": "اگر با خطاهای کمبود حافظه یا خرابی مکرر برنامه مواجه شدید، فعال کنید",
|
||||
"resetTunnel": "بازنشانی نمایه VPN"
|
||||
},
|
||||
"network": {
|
||||
"perAppProxyPageTitle": "پراکسی برنامهها",
|
||||
|
||||
@@ -172,7 +172,8 @@
|
||||
"debugMode": "Режим отладки",
|
||||
"debugModeMsg": "Чтобы применить изменения, перезапустите приложение.",
|
||||
"memoryLimit": "Ограничение памяти",
|
||||
"memoryLimitMsg": "Включите, если у вас возникают ошибки нехватки памяти или частые сбои приложения."
|
||||
"memoryLimitMsg": "Включите, если у вас возникают ошибки нехватки памяти или частые сбои приложения.",
|
||||
"resetTunnel": "Сбросить профиль VPN"
|
||||
},
|
||||
"network": {
|
||||
"perAppProxyPageTitle": "Раздельное проксирование",
|
||||
|
||||
@@ -172,7 +172,8 @@
|
||||
"debugMode": "Hata ayıklama modu",
|
||||
"debugModeMsg": "Bu değişikliği uygulamak için uygulamayı yeniden başlatın",
|
||||
"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": {
|
||||
"perAppProxyPageTitle": "Uygulama başına Proxy",
|
||||
|
||||
@@ -172,7 +172,8 @@
|
||||
"debugMode": "调试模式",
|
||||
"debugModeMsg": "重新启动应用程序以应用此更改",
|
||||
"memoryLimit": "内存限制",
|
||||
"memoryLimitMsg": "如果您遇到内存不足错误或频繁应用程序崩溃,请启用"
|
||||
"memoryLimitMsg": "如果您遇到内存不足错误或频繁应用程序崩溃,请启用",
|
||||
"resetTunnel": "重置 VPN 配置文件"
|
||||
},
|
||||
"network": {
|
||||
"perAppProxyPageTitle": "分应用代理",
|
||||
|
||||
@@ -121,6 +121,9 @@ public class MethodHandler: NSObject, FlutterPlugin {
|
||||
case "stop":
|
||||
VPNManager.shared.disconnect()
|
||||
result(true)
|
||||
case "reset":
|
||||
VPNManager.shared.reset()
|
||||
result(true)
|
||||
case "url_test":
|
||||
guard
|
||||
let args = call.arguments as? [String:Any?]
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
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';
|
||||
|
||||
part 'platform_settings_notifier.g.dart';
|
||||
@@ -23,3 +25,21 @@ class IgnoreBatteryOptimizations extends _$IgnoreBatteryOptimizations {
|
||||
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(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import 'package:hiddify/core/preferences/general_preferences.dart';
|
||||
import 'package:hiddify/core/router/router.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/settings/notifier/platform_settings_notifier.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
|
||||
class AdvancedSettingTiles extends HookConsumerWidget {
|
||||
@@ -72,6 +73,14 @@ class AdvancedSettingTiles extends HookConsumerWidget {
|
||||
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(
|
||||
title: Text(t.settings.advanced.debugMode),
|
||||
value: debug,
|
||||
|
||||
@@ -224,6 +224,13 @@ class FFISingboxService with InfraLogger implements SingboxService {
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
TaskEither<String, Unit> resetTunnel() {
|
||||
throw UnimplementedError(
|
||||
"reset tunnel function unavailable on platform",
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Stream<SingboxStatus> watchStatus() => _status;
|
||||
|
||||
|
||||
@@ -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
|
||||
Stream<List<SingboxOutboundGroup>> watchOutbounds() {
|
||||
const channel = EventChannel("com.hiddify.app/groups");
|
||||
|
||||
@@ -52,6 +52,8 @@ abstract interface class SingboxService {
|
||||
bool disableMemoryLimit,
|
||||
);
|
||||
|
||||
TaskEither<String, Unit> resetTunnel();
|
||||
|
||||
Stream<List<SingboxOutboundGroup>> watchOutbounds();
|
||||
|
||||
TaskEither<String, Unit> selectOutbound(String groupTag, String outboundTag);
|
||||
|
||||
Reference in New Issue
Block a user