Add auto connect on start

This commit is contained in:
problematicconsumer
2023-11-02 12:16:13 +03:30
parent 58002a2dff
commit 5b262cbf00
3 changed files with 47 additions and 0 deletions

View File

@@ -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<void> update(bool value) {
state = value;
return _pref.update(value);
}
}

View File

@@ -1,4 +1,5 @@
import 'package:hiddify/core/prefs/prefs.dart'; 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/data/data_providers.dart';
import 'package:hiddify/domain/connectivity/connectivity.dart'; import 'package:hiddify/domain/connectivity/connectivity.dart';
import 'package:hiddify/domain/core_facade.dart'; import 'package:hiddify/domain/core_facade.dart';
@@ -24,20 +25,32 @@ class ConnectivityController extends _$ConnectivityController with AppLogger {
}, },
); );
return _core.watchConnectionStatus().doOnData((event) { 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()}"); loggy.info("connection status: ${event.format()}");
}); });
} }
CoreFacade get _core => ref.watch(coreFacadeProvider); CoreFacade get _core => ref.watch(coreFacadeProvider);
Future<void> mayConnect() async {
if (state case AsyncData(:final value)) {
if (value case Disconnected()) return _connect();
}
}
Future<void> toggleConnection() async { Future<void> toggleConnection() async {
if (state case AsyncError()) { if (state case AsyncError()) {
await _connect(); await _connect();
} else if (state case AsyncData(:final value)) { } else if (state case AsyncData(:final value)) {
switch (value) { switch (value) {
case Disconnected(): case Disconnected():
await ref.read(startedByUserProvider.notifier).update(true);
await _connect(); await _connect();
case Connected(): case Connected():
await ref.read(startedByUserProvider.notifier).update(false);
await _disconnect(); await _disconnect();
default: default:
loggy.warning("switching status, debounce"); loggy.warning("switching status, debounce");
@@ -52,6 +65,7 @@ class ConnectivityController extends _$ConnectivityController with AppLogger {
return _disconnect(); return _disconnect();
} }
loggy.info("active profile changed, reconnecting"); loggy.info("active profile changed, reconnecting");
await ref.read(startedByUserProvider.notifier).update(true);
await _core await _core
.restart(profileId, ref.read(disableMemoryLimitProvider)) .restart(profileId, ref.read(disableMemoryLimitProvider))
.mapLeft((err) { .mapLeft((err) {

View File

@@ -1,5 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hiddify/core/prefs/prefs.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:hiddify/utils/utils.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:window_manager/window_manager.dart'; import 'package:window_manager/window_manager.dart';
@@ -28,6 +30,17 @@ class WindowController extends _$WindowController
loggy.debug("silent start is enabled, hiding window"); loggy.debug("silent start is enabled, hiding window");
await windowManager.hide(); 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); windowManager.addListener(this);