From bd41a3c693225cd8a0df522078eef459fa66343c Mon Sep 17 00:00:00 2001 From: esefxdz Date: Sun, 6 Sep 2026 11:28:52 +0300 Subject: [PATCH] refactor(app): drop Dart wrappers whose native handlers no longer exist MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #17 removed the `setSessionExpiry` and `isVpnRuntimeAlive` MethodChannel handlers from MainActivity, and #18 removed their last callers. The Dart wrappers stayed behind. Both swallow their errors, so a future caller would not fail loudly — it would get a silent no-op from `setSessionExpiry` and a permanent `processAlive: false` from `runtimeState()`, which previously read as "the tunnel is dead". Deleting them keeps that trap out of the codebase. `VpnRuntimeState` goes with them; runtime liveness now arrives through the native status stream, which is generation-scoped. The battery-optimisation methods are untouched and still used by background_reliability.dart. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_019HT2x2JvJNg7XNsJubfHFf --- lib/logic/power_settings.dart | 49 ----------------------------------- 1 file changed, 49 deletions(-) diff --git a/lib/logic/power_settings.dart b/lib/logic/power_settings.dart index cee5934..c4ea368 100644 --- a/lib/logic/power_settings.dart +++ b/lib/logic/power_settings.dart @@ -41,53 +41,4 @@ abstract final class PowerSettings { return false; } } - - /// Whether the VPN runtime is genuinely alive. - /// - /// The Xray service runs in a separate process, so nothing it stores in - /// statics is visible to us. This asks the OS instead: is our service process - /// running, and (for TUN) is there an active VPN transport? - static Future runtimeState() async { - if (kIsWeb) return const VpnRuntimeState(processAlive: false, vpnTransport: false); - try { - final result = await _channel.invokeMapMethod( - 'isVpnRuntimeAlive', - ); - return VpnRuntimeState( - processAlive: result?['processAlive'] == true, - vpnTransport: result?['vpnTransport'] == true, - ); - } catch (_) { - return const VpnRuntimeState(processAlive: false, vpnTransport: false); - } - } - - /// Pushes the absolute session-expiry timestamp (epoch ms) to the VPN - /// service so it can tear the tunnel down even when the UI process is gone. - static Future setSessionExpiry(int expiresAtMs) async { - if (kIsWeb) return; - try { - await _channel.invokeMethod('setSessionExpiry', { - 'expiresAtMs': expiresAtMs, - }); - } catch (_) { - // Best-effort. The daemon also keeps its last persisted expiry. - } - } -} - -@immutable -class VpnRuntimeState { - final bool processAlive; - final bool vpnTransport; - - const VpnRuntimeState({ - required this.processAlive, - required this.vpnTransport, - }); - - /// TUN needs both a live service and a real VPN interface. Proxy mode has no - /// VPN interface at all, so the service process is the whole signal. - bool aliveFor({required bool tunMode}) => - processAlive && (!tunMode || vpnTransport); }