From 9f0b80072d9beef882015f8a26fd95daaf4ff5b7 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Mon, 19 Oct 2026 17:40:57 -0400 Subject: [PATCH] pause sync when app is backgrounded --- gomuks | 2 +- lib/controllers/app_paused.dart | 18 ++++++++++++++++++ lib/controllers/client.dart | 5 +++++ lib/controllers/gomuks_listener.dart | 16 ++++++++++++++++ 4 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 lib/controllers/app_paused.dart diff --git a/gomuks b/gomuks index 7e43a63..ba82b6e 160000 --- a/gomuks +++ b/gomuks @@ -1 +1 @@ -Subproject commit 7e43a63e578b0d6f52269d65297198077bf5b45d +Subproject commit ba82b6e31c87c99766a8366a72a9f07d643b323f diff --git a/lib/controllers/app_paused.dart b/lib/controllers/app_paused.dart new file mode 100644 index 0000000..09a5b0a --- /dev/null +++ b/lib/controllers/app_paused.dart @@ -0,0 +1,18 @@ +import "package:flutter/widgets.dart"; +import "package:flutter_riverpod/flutter_riverpod.dart"; + +class AppPausedController extends Notifier { + @override + bool build() { + final listener = AppLifecycleListener( + onPause: () => state = true, + onResume: () => state = false, + ); + ref.onDispose(listener.dispose); + return WidgetsBinding.instance.lifecycleState == .paused; + } + + static final provider = NotifierProvider( + AppPausedController.new, + ); +} diff --git a/lib/controllers/client.dart b/lib/controllers/client.dart index 52b49ee..8432468 100644 --- a/lib/controllers/client.dart +++ b/lib/controllers/client.dart @@ -95,6 +95,11 @@ class ClientController extends AsyncNotifier { } }); + if (!ref.mounted) { + GomuksDestroy(handle); + return Completer().future; + } + ref.onDispose(() => GomuksDestroy(handle)); return handle; diff --git a/lib/controllers/gomuks_listener.dart b/lib/controllers/gomuks_listener.dart index 96a21db..9d742fa 100644 --- a/lib/controllers/gomuks_listener.dart +++ b/lib/controllers/gomuks_listener.dart @@ -1,10 +1,12 @@ import "dart:async"; import "dart:ffi"; +import "dart:io"; import "dart:isolate"; import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter/foundation.dart"; import "package:nexus/controllers/account_data.dart"; +import "package:nexus/controllers/app_paused.dart"; import "package:nexus/controllers/client.dart"; import "package:nexus/controllers/client_state.dart"; import "package:nexus/controllers/init_complete.dart"; @@ -141,6 +143,20 @@ class GomuksListenerController extends AsyncNotifier { if (errorCode != 0) { throw Exception("GomuksStart returned error code $errorCode"); } + + if (!ref.mounted) return; + + if (Platform.isAndroid || Platform.isIOS) { + // Mobile OSes block network access for backgrounded apps, so pause + // syncing instead of letting it fail. + ref.listen(AppPausedController.provider, (_, paused) { + if (paused) { + GomuksPauseSync(handle); + } else { + GomuksResumeSync(handle); + } + }, fireImmediately: true); + } } /// Waits for gomuks to report the client's device ID