Add reset tunnel option on ios
This commit is contained in:
@@ -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",
|
||||||
|
|||||||
@@ -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": {
|
||||||
|
|||||||
@@ -172,7 +172,8 @@
|
|||||||
"debugMode": "دیباگ مود",
|
"debugMode": "دیباگ مود",
|
||||||
"debugModeMsg": "برای اعمال این تغییر اپ را ریاستارت کنید",
|
"debugModeMsg": "برای اعمال این تغییر اپ را ریاستارت کنید",
|
||||||
"memoryLimit": "محدودیت مموری",
|
"memoryLimit": "محدودیت مموری",
|
||||||
"memoryLimitMsg": "اگر با خطاهای کمبود حافظه یا خرابی مکرر برنامه مواجه شدید، فعال کنید"
|
"memoryLimitMsg": "اگر با خطاهای کمبود حافظه یا خرابی مکرر برنامه مواجه شدید، فعال کنید",
|
||||||
|
"resetTunnel": "بازنشانی نمایه VPN"
|
||||||
},
|
},
|
||||||
"network": {
|
"network": {
|
||||||
"perAppProxyPageTitle": "پراکسی برنامهها",
|
"perAppProxyPageTitle": "پراکسی برنامهها",
|
||||||
|
|||||||
@@ -172,7 +172,8 @@
|
|||||||
"debugMode": "Режим отладки",
|
"debugMode": "Режим отладки",
|
||||||
"debugModeMsg": "Чтобы применить изменения, перезапустите приложение.",
|
"debugModeMsg": "Чтобы применить изменения, перезапустите приложение.",
|
||||||
"memoryLimit": "Ограничение памяти",
|
"memoryLimit": "Ограничение памяти",
|
||||||
"memoryLimitMsg": "Включите, если у вас возникают ошибки нехватки памяти или частые сбои приложения."
|
"memoryLimitMsg": "Включите, если у вас возникают ошибки нехватки памяти или частые сбои приложения.",
|
||||||
|
"resetTunnel": "Сбросить профиль VPN"
|
||||||
},
|
},
|
||||||
"network": {
|
"network": {
|
||||||
"perAppProxyPageTitle": "Раздельное проксирование",
|
"perAppProxyPageTitle": "Раздельное проксирование",
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -172,7 +172,8 @@
|
|||||||
"debugMode": "调试模式",
|
"debugMode": "调试模式",
|
||||||
"debugModeMsg": "重新启动应用程序以应用此更改",
|
"debugModeMsg": "重新启动应用程序以应用此更改",
|
||||||
"memoryLimit": "内存限制",
|
"memoryLimit": "内存限制",
|
||||||
"memoryLimitMsg": "如果您遇到内存不足错误或频繁应用程序崩溃,请启用"
|
"memoryLimitMsg": "如果您遇到内存不足错误或频繁应用程序崩溃,请启用",
|
||||||
|
"resetTunnel": "重置 VPN 配置文件"
|
||||||
},
|
},
|
||||||
"network": {
|
"network": {
|
||||||
"perAppProxyPageTitle": "分应用代理",
|
"perAppProxyPageTitle": "分应用代理",
|
||||||
|
|||||||
@@ -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?]
|
||||||
|
|||||||
@@ -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(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user