From abd26dd86b66b599c23bb274446abd7c2249dbb7 Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Thu, 24 Aug 2023 14:48:19 +0330 Subject: [PATCH] Add misc preferences --- lib/core/prefs/misc_prefs.dart | 10 +++++ lib/data/repository/core_facade_impl.dart | 2 +- lib/domain/clash/clash_facade.dart | 2 +- lib/domain/constants.dart | 3 +- .../notifier/proxies_delay_notifier.dart | 17 ++++++-- lib/utils/pref_notifier.dart | 41 +++++++++++++++++++ 6 files changed, 68 insertions(+), 7 deletions(-) create mode 100644 lib/core/prefs/misc_prefs.dart create mode 100644 lib/utils/pref_notifier.dart diff --git a/lib/core/prefs/misc_prefs.dart b/lib/core/prefs/misc_prefs.dart new file mode 100644 index 00000000..7d27a50f --- /dev/null +++ b/lib/core/prefs/misc_prefs.dart @@ -0,0 +1,10 @@ +import 'package:hiddify/domain/constants.dart'; +import 'package:hiddify/utils/pref_notifier.dart'; + +final connectionTestUrlProvider = + PrefNotifier.provider("connection_test_url", Defaults.connectionTestUrl); + +final concurrentTestCountProvider = PrefNotifier.provider( + "concurrent_test_count", + Defaults.concurrentTestCount, +); diff --git a/lib/data/repository/core_facade_impl.dart b/lib/data/repository/core_facade_impl.dart index 2564dedc..80e30aec 100644 --- a/lib/data/repository/core_facade_impl.dart +++ b/lib/data/repository/core_facade_impl.dart @@ -149,7 +149,7 @@ class CoreFacadeImpl with ExceptionHandler, InfraLogger implements CoreFacade { @override TaskEither testDelay( String proxyName, { - String testUrl = Defaults.delayTestUrl, + String testUrl = Defaults.connectionTestUrl, }) { return exceptionHandler( () async { diff --git a/lib/domain/clash/clash_facade.dart b/lib/domain/clash/clash_facade.dart index 2c5f2091..2a2443ee 100644 --- a/lib/domain/clash/clash_facade.dart +++ b/lib/domain/clash/clash_facade.dart @@ -17,7 +17,7 @@ abstract class ClashFacade { TaskEither testDelay( String proxyName, { - String testUrl = Defaults.delayTestUrl, + String testUrl = Defaults.connectionTestUrl, }); Stream> watchTraffic(); diff --git a/lib/domain/constants.dart b/lib/domain/constants.dart index 334aa4ba..c84ec8c5 100644 --- a/lib/domain/constants.dart +++ b/lib/domain/constants.dart @@ -14,5 +14,6 @@ abstract class Constants { abstract class Defaults { static const clashApiPort = 9090; static const mixedPort = 2334; - static const delayTestUrl = "https://www.gstatic.com/generate_204"; + static const connectionTestUrl = "https://www.gstatic.com/generate_204"; + static const concurrentTestCount = 5; } diff --git a/lib/features/proxies/notifier/proxies_delay_notifier.dart b/lib/features/proxies/notifier/proxies_delay_notifier.dart index cd263a7b..4baa1ead 100644 --- a/lib/features/proxies/notifier/proxies_delay_notifier.dart +++ b/lib/features/proxies/notifier/proxies_delay_notifier.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:dartx/dartx.dart'; +import 'package:hiddify/core/prefs/misc_prefs.dart'; import 'package:hiddify/data/data_providers.dart'; import 'package:hiddify/domain/clash/clash.dart'; import 'package:hiddify/features/common/active_profile/active_profile_notifier.dart'; @@ -36,7 +37,12 @@ class ProxiesDelayNotifier extends _$ProxiesDelayNotifier with AppLogger { StreamSubscription? _currentTest; Future testDelay(Iterable proxies) async { - loggy.debug('testing delay for [${proxies.length}] proxies'); + final testUrl = ref.read(connectionTestUrlProvider); + final concurrent = ref.read(concurrentTestCountProvider); + + loggy.debug( + 'testing delay for [${proxies.length}] proxies with [$testUrl], [$concurrent] at a time', + ); // cancel possible running test await _currentTest?.cancel(); @@ -51,18 +57,21 @@ class ProxiesDelayNotifier extends _$ProxiesDelayNotifier with AppLogger { name, (_) => delay, ifAbsent: () => delay, - ) + ), }; } _currentTest = Stream.fromIterable(proxies) - .bufferCount(5) + .bufferCount(concurrent) .asyncMap( (chunk) => Future.wait( chunk.map( (e) async => setDelay( e, - await _clash.testDelay(e).getOrElse((l) => -1).run(), + await _clash + .testDelay(e, testUrl: testUrl) + .getOrElse((l) => -1) + .run(), ), ), ), diff --git a/lib/utils/pref_notifier.dart b/lib/utils/pref_notifier.dart new file mode 100644 index 00000000..a3063bd0 --- /dev/null +++ b/lib/utils/pref_notifier.dart @@ -0,0 +1,41 @@ +import 'package:hiddify/data/data_providers.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class PrefNotifier extends AutoDisposeNotifier { + PrefNotifier(this._key, this._defaultValue); + + final String _key; + final T _defaultValue; + + static AutoDisposeNotifierProvider, T> provider( + String key, + T defaultValue, + ) => + NotifierProvider.autoDispose( + () => PrefNotifier(key, defaultValue), + ); + + SharedPreferences get _prefs => ref.read(sharedPreferencesProvider); + + /// Updates the value asynchronously. + Future update(T value) async { + if (value is String) { + await _prefs.setString(_key, value); + } else if (value is bool) { + await _prefs.setBool(_key, value); + } else if (value is int) { + await _prefs.setInt(_key, value); + } else if (value is double) { + await _prefs.setDouble(_key, value); + } else if (value is List) { + await _prefs.setStringList(_key, value); + } + super.state = value; + } + + @override + T build() { + return _prefs.get(_key) as T? ?? _defaultValue; + } +}