diff --git a/lib/controller/bluetooth.dart b/lib/controller/bluetooth.dart index 65c4306..b67b12b 100644 --- a/lib/controller/bluetooth.dart +++ b/lib/controller/bluetooth.dart @@ -14,6 +14,13 @@ part 'bluetooth.g.dart'; final log = Logger('BluetoothController'); +final backgroundBluetoothDisconnectSuppressionCountProvider = + StateProvider((ref) => 0); + +final backgroundBluetoothDisconnectSuppressedProvider = Provider((ref) { + return ref.watch(backgroundBluetoothDisconnectSuppressionCountProvider) > 0; +}); + @Riverpod(keepAlive: true) FlutterReactiveBle reactiveBle(Ref ref) { ref.keepAlive(); diff --git a/lib/main.dart b/lib/main.dart index 8b7e407..5b65f3e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -57,6 +57,9 @@ class _AbawoBtAppState extends ConsumerState void didChangeAppLifecycleState(AppLifecycleState state) { if (state == AppLifecycleState.hidden || state == AppLifecycleState.paused) { + if (ref.read(backgroundBluetoothDisconnectSuppressedProvider)) { + return; + } unawaited(_disconnectBluetoothForBackground()); } } diff --git a/lib/pages/device_details_page.dart b/lib/pages/device_details_page.dart index e5f0932..abed2ff 100644 --- a/lib/pages/device_details_page.dart +++ b/lib/pages/device_details_page.dart @@ -549,8 +549,19 @@ class _DeviceDetailsPageState extends ConsumerState { _firmwareUserMessage = null; }); - final result = - await _firmwareFileSelectionService.selectAndPrepareBootloaderDfu(); + final suppressionCount = ref.read( + backgroundBluetoothDisconnectSuppressionCountProvider.notifier, + ); + suppressionCount.state += 1; + + final FirmwareFileSelectionResult result; + try { + result = + await _firmwareFileSelectionService.selectAndPrepareBootloaderDfu(); + } finally { + suppressionCount.state = + suppressionCount.state <= 0 ? 0 : suppressionCount.state - 1; + } if (!mounted) { return; }