From 77bf49898797d3a5bef13cf9d1f45540c5378b8d Mon Sep 17 00:00:00 2001 From: Mohammed Mohsin Date: Sun, 29 Mar 2026 14:20:09 +0530 Subject: [PATCH 1/3] fix(ios): allow force=true to bypass disconnected connection guard ensureConnection returned null for the same device when disconnected, even with force=true. This meant user-initiated reconnect taps were silently ignored on iOS where native auto-reconnect left a stale _connection object with the correct device ID but disconnected status. --- app/lib/services/devices.dart | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/lib/services/devices.dart b/app/lib/services/devices.dart index 65c5212bc28..49e61b7b991 100644 --- a/app/lib/services/devices.dart +++ b/app/lib/services/devices.dart @@ -122,12 +122,16 @@ class DeviceService implements IDeviceService { } Future _connectToDevice(String id) async { + print('_connectToDevice: id=$id, existing connection=${_connection != null}'); // Clean up existing connection — disconnect if active, then dispose transport if (_connection != null) { + print('_connectToDevice: cleaning up existing connection (status=${_connection!.status})'); if (_connection!.status == DeviceConnectionState.connected) { await _connection!.disconnect(); } + print('_connectToDevice: disposing transport'); await _connection!.transport.dispose(); + print('_connectToDevice: transport disposed'); } _connection = null; @@ -217,7 +221,9 @@ class DeviceService implements IDeviceService { final Mutex _mutex = Mutex(); @override Future ensureConnection(String deviceId, {bool force = false}) async { + print('ensureConnection: waiting for mutex (force=$force, deviceId=$deviceId)'); await _mutex.acquire(); + print('ensureConnection: mutex acquired'); try { Logger.debug("ensureConnection ${_connection?.device.id} ${_connection?.status} $force"); @@ -228,7 +234,8 @@ class DeviceService implements IDeviceService { // Transport exists for this device but disconnected — native handles reconnection. // Don't dispose and recreate the transport; that would cancel native's auto-reconnect. - if (_connection?.device.id == deviceId) { + // But if force=true (user-initiated), reconnect explicitly. + if (!force && _connection?.device.id == deviceId) { return null; } From 6d53da806b972979be954081b482625f77cf6d51 Mon Sep 17 00:00:00 2001 From: Mohammed Mohsin Date: Sun, 29 Mar 2026 14:22:03 +0530 Subject: [PATCH 2/3] chore: remove debug print statements --- app/lib/services/devices.dart | 6 ------ 1 file changed, 6 deletions(-) diff --git a/app/lib/services/devices.dart b/app/lib/services/devices.dart index 49e61b7b991..3127a231ca6 100644 --- a/app/lib/services/devices.dart +++ b/app/lib/services/devices.dart @@ -122,16 +122,12 @@ class DeviceService implements IDeviceService { } Future _connectToDevice(String id) async { - print('_connectToDevice: id=$id, existing connection=${_connection != null}'); // Clean up existing connection — disconnect if active, then dispose transport if (_connection != null) { - print('_connectToDevice: cleaning up existing connection (status=${_connection!.status})'); if (_connection!.status == DeviceConnectionState.connected) { await _connection!.disconnect(); } - print('_connectToDevice: disposing transport'); await _connection!.transport.dispose(); - print('_connectToDevice: transport disposed'); } _connection = null; @@ -221,9 +217,7 @@ class DeviceService implements IDeviceService { final Mutex _mutex = Mutex(); @override Future ensureConnection(String deviceId, {bool force = false}) async { - print('ensureConnection: waiting for mutex (force=$force, deviceId=$deviceId)'); await _mutex.acquire(); - print('ensureConnection: mutex acquired'); try { Logger.debug("ensureConnection ${_connection?.device.id} ${_connection?.status} $force"); From 2f83368f76789dcb7f0af4af9853a558fbb5826c Mon Sep 17 00:00:00 2001 From: Mohammed Mohsin Date: Sun, 29 Mar 2026 14:37:11 +0530 Subject: [PATCH 3/3] chore: bump build number to 796 --- app/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/pubspec.yaml b/app/pubspec.yaml index 216d65aef22..05e3352cd06 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -3,7 +3,7 @@ description: A new Flutter project. publish_to: "none" # Remove this line if you wish to publish to pub.dev -version: 1.0.528+795 +version: 1.0.528+796 environment: sdk: ">=3.0.0 <4.0.0"