Maintainer changes on top of PR #2 (Naveax). Reduces the release to two deliberate connection modes and resolves the issues found in review: - Lock-screen privacy: move VISIBILITY_PRIVATE and a generic publicVersion into MainActivity.updateVpnNotification. The PR's fix lived in an unreferenced class and never reached the live notification. - Haptics: restore the default to off, and reduce HapticSettings to a single success() on connect/disconnect via the native channel. - SOCKS5: make it a real proxyOnly local-proxy mode rather than a TUN connection under a different label. TUN stays the default. - Health probe: restore the idle-only guard so /health is no longer polled every 30s while connected. - Recovery: add a _connectionEpoch counter so connect() aborts an in-flight Extreme recovery. - Startup restoration: rebuild the recovery snapshot from the still-active session after an app-process restart (TUN), and surface an honest orphaned state with a Reconnect action in proxy mode. Drops per-app routing entirely. It only ever functioned in TUN -- addDisallowedApplication lives inside the VPN-interface setup that proxyOnly skips -- and its allowlist half had no Dart caller. Also removes flutter_local_notifications, the global tap-haptic surface, and unused runtime telemetry. Co-Authored-By: Claude Opus 5 <[email protected]>
57 lines
1.8 KiB
Dart
57 lines
1.8 KiB
Dart
import 'package:shared_preferences/shared_preferences.dart';
|
|
|
|
enum ConnectionMode { tun, proxy }
|
|
enum ResilienceMode { standard, extreme }
|
|
|
|
abstract final class ConnectionSettings {
|
|
ConnectionSettings._();
|
|
|
|
static const String _modeKey = 'connection_mode';
|
|
static const String _resilienceModeKey = 'resilience_mode';
|
|
|
|
static ConnectionMode _mode = ConnectionMode.tun;
|
|
static ResilienceMode _resilienceMode = ResilienceMode.standard;
|
|
static bool _initialized = false;
|
|
|
|
static ConnectionMode get mode => _mode;
|
|
static ResilienceMode get resilienceMode => _resilienceMode;
|
|
|
|
static Future<void> initialize() async {
|
|
if (_initialized) return;
|
|
|
|
final prefs = await SharedPreferences.getInstance();
|
|
final storedMode = prefs.getString(_modeKey);
|
|
|
|
// Legacy 'ass' was the pre-V3 SOCKS5 label; map it to proxy. Everything
|
|
// else (including the old 'auto') is TUN — there is no runtime auto mode.
|
|
_mode = storedMode == ConnectionMode.proxy.name || storedMode == 'ass'
|
|
? ConnectionMode.proxy
|
|
: ConnectionMode.tun;
|
|
|
|
_resilienceMode =
|
|
prefs.getString(_resilienceModeKey) == ResilienceMode.extreme.name
|
|
? ResilienceMode.extreme
|
|
: ResilienceMode.standard;
|
|
|
|
if (storedMode != _mode.name) {
|
|
await prefs.setString(_modeKey, _mode.name);
|
|
}
|
|
|
|
_initialized = true;
|
|
}
|
|
|
|
static Future<void> setMode(ConnectionMode mode) async {
|
|
_mode = mode;
|
|
_initialized = true;
|
|
final prefs = await SharedPreferences.getInstance();
|
|
await prefs.setString(_modeKey, mode.name);
|
|
}
|
|
|
|
static Future<void> setResilienceMode(ResilienceMode mode) async {
|
|
_resilienceMode = mode;
|
|
_initialized = true;
|
|
final prefs = await SharedPreferences.getInstance();
|
|
await prefs.setString(_resilienceModeKey, mode.name);
|
|
}
|
|
}
|