From 5b262cbf003f83b8fa980341c1928db1b4651994 Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Thu, 2 Nov 2023 12:16:13 +0330 Subject: [PATCH] Add auto connect on start --- lib/core/prefs/service_prefs.dart | 20 +++++++++++++++++++ .../connectivity/connectivity_controller.dart | 14 +++++++++++++ .../common/window/window_controller.dart | 13 ++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 lib/core/prefs/service_prefs.dart diff --git a/lib/core/prefs/service_prefs.dart b/lib/core/prefs/service_prefs.dart new file mode 100644 index 00000000..d9cc2cbb --- /dev/null +++ b/lib/core/prefs/service_prefs.dart @@ -0,0 +1,20 @@ +import 'package:hiddify/data/data_providers.dart'; +import 'package:hiddify/utils/pref_notifier.dart'; +import 'package:hiddify/utils/utils.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; + +part 'service_prefs.g.dart'; + +@Riverpod(keepAlive: true) +class StartedByUser extends _$StartedByUser with AppLogger { + late final _pref = + Pref(ref.watch(sharedPreferencesProvider), "started_by_user", false); + + @override + bool build() => _pref.getValue(); + + Future update(bool value) { + state = value; + return _pref.update(value); + } +} diff --git a/lib/features/common/connectivity/connectivity_controller.dart b/lib/features/common/connectivity/connectivity_controller.dart index 84564fac..a8bf79e3 100644 --- a/lib/features/common/connectivity/connectivity_controller.dart +++ b/lib/features/common/connectivity/connectivity_controller.dart @@ -1,4 +1,5 @@ import 'package:hiddify/core/prefs/prefs.dart'; +import 'package:hiddify/core/prefs/service_prefs.dart'; import 'package:hiddify/data/data_providers.dart'; import 'package:hiddify/domain/connectivity/connectivity.dart'; import 'package:hiddify/domain/core_facade.dart'; @@ -24,20 +25,32 @@ class ConnectivityController extends _$ConnectivityController with AppLogger { }, ); return _core.watchConnectionStatus().doOnData((event) { + if (event case Disconnected(:final connectionFailure?) + when PlatformUtils.isDesktop) { + ref.read(startedByUserProvider.notifier).update(false); + } loggy.info("connection status: ${event.format()}"); }); } CoreFacade get _core => ref.watch(coreFacadeProvider); + Future mayConnect() async { + if (state case AsyncData(:final value)) { + if (value case Disconnected()) return _connect(); + } + } + Future toggleConnection() async { if (state case AsyncError()) { await _connect(); } else if (state case AsyncData(:final value)) { switch (value) { case Disconnected(): + await ref.read(startedByUserProvider.notifier).update(true); await _connect(); case Connected(): + await ref.read(startedByUserProvider.notifier).update(false); await _disconnect(); default: loggy.warning("switching status, debounce"); @@ -52,6 +65,7 @@ class ConnectivityController extends _$ConnectivityController with AppLogger { return _disconnect(); } loggy.info("active profile changed, reconnecting"); + await ref.read(startedByUserProvider.notifier).update(true); await _core .restart(profileId, ref.read(disableMemoryLimitProvider)) .mapLeft((err) { diff --git a/lib/features/common/window/window_controller.dart b/lib/features/common/window/window_controller.dart index 6d7adb56..edd375b6 100644 --- a/lib/features/common/window/window_controller.dart +++ b/lib/features/common/window/window_controller.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; import 'package:hiddify/core/prefs/prefs.dart'; +import 'package:hiddify/core/prefs/service_prefs.dart'; +import 'package:hiddify/features/common/connectivity/connectivity_controller.dart'; import 'package:hiddify/utils/utils.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:window_manager/window_manager.dart'; @@ -28,6 +30,17 @@ class WindowController extends _$WindowController loggy.debug("silent start is enabled, hiding window"); await windowManager.hide(); } + await Future.delayed( + const Duration(seconds: 1), + () async { + if (ref.read(startedByUserProvider)) { + loggy.debug("previously started by user, trying to connect"); + return ref + .read(connectivityControllerProvider.notifier) + .mayConnect(); + } + }, + ); }, ); windowManager.addListener(this);