From e2f7e24fb44216c2061bf461d37062e7fa782b2a Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Wed, 1 Nov 2023 22:01:43 +0330 Subject: [PATCH] Add core mode --- lib/data/repository/config_options_store.dart | 68 +++++++++++++------ lib/domain/singbox/config_options.dart | 8 +-- lib/domain/singbox/core_mode.dart | 13 ++++ lib/domain/singbox/singbox.dart | 1 + 4 files changed, 62 insertions(+), 28 deletions(-) create mode 100644 lib/domain/singbox/core_mode.dart diff --git a/lib/data/repository/config_options_store.dart b/lib/data/repository/config_options_store.dart index fb7b9432..4b279920 100644 --- a/lib/data/repository/config_options_store.dart +++ b/lib/data/repository/config_options_store.dart @@ -1,7 +1,9 @@ // ignore_for_file: avoid_manual_providers_as_generated_provider_dependency import 'package:hiddify/core/prefs/prefs.dart'; +import 'package:hiddify/data/data_providers.dart'; import 'package:hiddify/domain/singbox/singbox.dart'; import 'package:hiddify/utils/pref_notifier.dart'; +import 'package:hiddify/utils/utils.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'config_options_store.g.dart'; @@ -11,6 +13,25 @@ final _default = ConfigOptions.initial; final executeConfigAsIs = PrefNotifier.provider("execute-config-as-is", _default.executeConfigAsIs); +@Riverpod(keepAlive: true) +class CoreModeStore extends _$CoreModeStore { + late final _pref = Pref( + ref.watch(sharedPreferencesProvider), + "mode", + PlatformUtils.isDesktop ? CoreMode.proxy : CoreMode.tun, + mapFrom: CoreMode.values.byName, + mapTo: (value) => value.name, + ); + + @override + CoreMode build() => _pref.getValue(); + + Future update(CoreMode value) { + state = value; + return _pref.update(value); + } +} + final logLevelStore = PrefNotifier.provider( "log-level", _default.logLevel, @@ -104,25 +125,28 @@ List rules(RulesRef ref) => switch (ref.watch(regionNotifierProvider)) { }; @riverpod -ConfigOptions configOptions(ConfigOptionsRef ref) => ConfigOptions( - executeConfigAsIs: - ref.watch(debugModeNotifierProvider) && ref.watch(executeConfigAsIs), - logLevel: ref.watch(logLevelStore), - resolveDestination: ref.watch(resolveDestinationStore), - ipv6Mode: ref.watch(ipv6ModeStore), - remoteDnsAddress: ref.watch(remoteDnsAddressStore), - remoteDnsDomainStrategy: ref.watch(remoteDnsDomainStrategyStore), - directDnsAddress: ref.watch(directDnsAddressStore), - directDnsDomainStrategy: ref.watch(directDnsDomainStrategyStore), - mixedPort: ref.watch(mixedPortStore), - localDnsPort: ref.watch(localDnsPortStore), - tunImplementation: ref.watch(tunImplementationStore), - mtu: ref.watch(mtuStore), - connectionTestUrl: ref.watch(connectionTestUrlStore), - urlTestInterval: ref.watch(urlTestIntervalStore), - enableClashApi: ref.watch(enableClashApiStore), - clashApiPort: ref.watch(clashApiPortStore), - enableTun: ref.watch(enableTunStore), - setSystemProxy: ref.watch(setSystemProxyStore), - rules: ref.watch(rulesProvider), - ); +ConfigOptions configOptions(ConfigOptionsRef ref) { + final mode = ref.watch(coreModeStoreProvider); + return ConfigOptions( + executeConfigAsIs: + ref.watch(debugModeNotifierProvider) && ref.watch(executeConfigAsIs), + logLevel: ref.watch(logLevelStore), + resolveDestination: ref.watch(resolveDestinationStore), + ipv6Mode: ref.watch(ipv6ModeStore), + remoteDnsAddress: ref.watch(remoteDnsAddressStore), + remoteDnsDomainStrategy: ref.watch(remoteDnsDomainStrategyStore), + directDnsAddress: ref.watch(directDnsAddressStore), + directDnsDomainStrategy: ref.watch(directDnsDomainStrategyStore), + mixedPort: ref.watch(mixedPortStore), + localDnsPort: ref.watch(localDnsPortStore), + tunImplementation: ref.watch(tunImplementationStore), + mtu: ref.watch(mtuStore), + connectionTestUrl: ref.watch(connectionTestUrlStore), + urlTestInterval: ref.watch(urlTestIntervalStore), + enableClashApi: ref.watch(enableClashApiStore), + clashApiPort: ref.watch(clashApiPortStore), + enableTun: mode == CoreMode.tun || ref.watch(enableTunStore), + setSystemProxy: mode == CoreMode.proxy || ref.watch(setSystemProxyStore), + rules: ref.watch(rulesProvider), + ); +} diff --git a/lib/domain/singbox/config_options.dart b/lib/domain/singbox/config_options.dart index 4206a840..ca51fe22 100644 --- a/lib/domain/singbox/config_options.dart +++ b/lib/domain/singbox/config_options.dart @@ -4,7 +4,6 @@ import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:hiddify/core/prefs/prefs.dart'; import 'package:hiddify/domain/singbox/box_log.dart'; import 'package:hiddify/domain/singbox/rules.dart'; -import 'package:hiddify/utils/platform_utils.dart'; part 'config_options.freezed.dart'; part 'config_options.g.dart'; @@ -34,16 +33,13 @@ class ConfigOptions with _$ConfigOptions { @Default(true) bool enableClashApi, @Default(6756) int clashApiPort, @Default(false) bool enableTun, - @Default(true) bool setSystemProxy, + @Default(false) bool setSystemProxy, @Default(false) bool bypassLan, @Default(false) bool enableFakeDns, List? rules, }) = _ConfigOptions; - static ConfigOptions initial = ConfigOptions( - enableTun: !PlatformUtils.isDesktop, - setSystemProxy: PlatformUtils.isDesktop, - ); + static ConfigOptions initial = const ConfigOptions(); String format() { const encoder = JsonEncoder.withIndent(' '); diff --git a/lib/domain/singbox/core_mode.dart b/lib/domain/singbox/core_mode.dart new file mode 100644 index 00000000..53386892 --- /dev/null +++ b/lib/domain/singbox/core_mode.dart @@ -0,0 +1,13 @@ +import 'package:hiddify/core/prefs/locale_prefs.dart'; + +enum CoreMode { + none, + proxy, + tun; + + String present(TranslationsEn t) => switch (this) { + none => t.settings.config.modes.none, + proxy => t.settings.config.modes.proxy, + tun => t.settings.config.modes.tun, + }; +} diff --git a/lib/domain/singbox/singbox.dart b/lib/domain/singbox/singbox.dart index ea665c8f..06924b10 100644 --- a/lib/domain/singbox/singbox.dart +++ b/lib/domain/singbox/singbox.dart @@ -1,5 +1,6 @@ export 'box_log.dart'; export 'config_options.dart'; +export 'core_mode.dart'; export 'core_status.dart'; export 'outbounds.dart'; export 'proxy_type.dart';