Skip to content

Commit 4e0ed3a

Browse files
fix: Squashed all commits into one
1 parent 72f0594 commit 4e0ed3a

File tree

3 files changed

+58
-63
lines changed

3 files changed

+58
-63
lines changed

lib/bademagic_module/bluetooth/connect_state.dart

Lines changed: 18 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -11,54 +11,37 @@ class ConnectState extends RetryBleState {
1111

1212
@override
1313
Future<BleState?> processState() async {
14-
bool connected = false;
15-
try {
16-
await scanResult.device.disconnect();
17-
logger.d("Pre-emptive disconnect for clean state");
18-
await Future.delayed(const Duration(seconds: 1));
19-
} catch (_) {
20-
// Ignore disconnect errors
21-
}
2214
try {
15+
try {
16+
await scanResult.device.disconnect();
17+
logger.d("Pre-emptive disconnect for clean state");
18+
await Future.delayed(const Duration(seconds: 1));
19+
} catch (_) {
20+
logger.d("No existing connection to disconnect");
21+
}
22+
2323
await scanResult.device.connect(autoConnect: false);
2424
BluetoothConnectionState connectionState =
2525
await scanResult.device.connectionState.first;
2626

2727
if (connectionState == BluetoothConnectionState.connected) {
28-
connected = true;
29-
30-
logger.d("Device connected");
28+
logger.d("Device connected successfully");
3129
toast.showToast('Device connected successfully.');
3230

33-
final writeState =
34-
WriteState(device: scanResult.device, manager: manager);
35-
final result = await writeState.process();
36-
try {
37-
await scanResult.device.disconnect();
38-
logger.d("Device disconnected after transfer");
39-
await Future.delayed(const Duration(seconds: 1));
40-
logger.d("Waited 1s after disconnect");
41-
} catch (e) {
42-
logger.e("Error during disconnect after transfer: $e");
43-
}
44-
return result;
31+
manager.connectedDevice = scanResult.device;
32+
33+
final writeState = WriteState(
34+
device: scanResult.device,
35+
manager: manager,
36+
);
37+
38+
return await writeState.process();
4539
} else {
4640
throw Exception("Failed to connect to the device");
4741
}
4842
} catch (e) {
49-
toast.showErrorToast('Failed to connect retrying...');
43+
toast.showErrorToast('Failed to connect. Retrying...');
5044
rethrow;
51-
} finally {
52-
if (!connected) {
53-
try {
54-
await scanResult.device.disconnect();
55-
logger.d("Device disconnected in finally block");
56-
await Future.delayed(const Duration(seconds: 1));
57-
logger.d("Waited 1s after disconnect (finally)");
58-
} catch (e) {
59-
logger.e("Error during disconnect in finally: $e");
60-
}
61-
}
6245
}
6346
}
6447
}

lib/bademagic_module/bluetooth/datagenerator.dart

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,30 @@ import 'package:badgemagic/bademagic_module/utils/data_to_bytearray_converter.da
33
import 'package:badgemagic/bademagic_module/utils/file_helper.dart';
44
import 'package:badgemagic/providers/badge_message_provider.dart';
55
import 'package:badgemagic/providers/imageprovider.dart';
6+
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
67
import 'package:get_it/get_it.dart';
78

89
class DataTransferManager {
910
final Data data;
10-
//make it singleton
1111

12-
DataTransferManager(this.data);
12+
/// Keeps the connected Bluetooth device for reuse.
13+
BluetoothDevice? connectedDevice;
1314

15+
/// Other existing properties.
1416
final BadgeMessageProvider badgeData = BadgeMessageProvider();
15-
DataToByteArrayConverter converter = DataToByteArrayConverter();
16-
FileHelper fileHelper = FileHelper();
17-
InlineImageProvider controllerData = GetIt.instance<InlineImageProvider>();
17+
final DataToByteArrayConverter converter = DataToByteArrayConverter();
18+
final FileHelper fileHelper = FileHelper();
19+
final InlineImageProvider controllerData =
20+
GetIt.instance<InlineImageProvider>();
21+
22+
DataTransferManager(this.data);
1823

1924
Future<List<List<int>>> generateDataChunk() async {
2025
return converter.convert(data);
2126
}
27+
28+
/// Helper to clear the currently connected device.
29+
void clearConnectedDevice() {
30+
connectedDevice = null;
31+
}
2232
}

lib/bademagic_module/bluetooth/scan_state.dart

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,34 +11,35 @@ class ScanState extends NormalBleState {
1111

1212
@override
1313
Future<BleState?> processState() async {
14-
StreamSubscription<List<ScanResult>>? subscription;
15-
toast.showToast("Searching for device...");
14+
manager.clearConnectedDevice();
15+
await FlutterBluePlus.stopScan();
1616

17+
toast.showToast("Searching for device...");
1718
Completer<BleState?> nextStateCompleter = Completer();
18-
bool isCompleted = false;
19+
StreamSubscription<List<ScanResult>>? subscription;
1920

21+
bool isCompleted = false;
2022
try {
2123
subscription = FlutterBluePlus.scanResults.listen(
2224
(results) async {
23-
if (!isCompleted && results.isNotEmpty) {
24-
try {
25-
final foundDevice = results.firstWhere(
26-
(result) => result.advertisementData.serviceUuids
27-
.contains(Guid("0000fee0-0000-1000-8000-00805f9b34fb")),
28-
orElse: () => throw Exception("Matching device not found."),
29-
);
25+
if (isCompleted || results.isEmpty) return;
3026

31-
toast.showToast('Device found. Connecting...');
32-
isCompleted = true;
33-
await FlutterBluePlus.stopScan();
27+
try {
28+
final foundDevice = results.firstWhere(
29+
(r) => r.advertisementData.serviceUuids.contains(
30+
Guid("0000fee0-0000-1000-8000-00805f9b34fb"),
31+
),
32+
orElse: () => throw Exception("Matching device not found."),
33+
);
3434

35-
nextStateCompleter.complete(ConnectState(
36-
scanResult: foundDevice,
37-
manager: manager,
38-
));
39-
} catch (e) {
40-
// Ignore and keep scanning
41-
}
35+
isCompleted = true;
36+
await FlutterBluePlus.stopScan();
37+
toast.showToast('Device found. Connecting...');
38+
nextStateCompleter.complete(
39+
ConnectState(scanResult: foundDevice, manager: manager),
40+
);
41+
} catch (_) {
42+
// Ignore and keep scanning
4243
}
4344
},
4445
onError: (e) {
@@ -47,8 +48,9 @@ class ScanState extends NormalBleState {
4748
FlutterBluePlus.stopScan();
4849
logger.e("Scan error: $e");
4950
toast.showErrorToast('Scan error occurred.');
50-
nextStateCompleter
51-
.completeError(Exception("Error during scanning: $e"));
51+
nextStateCompleter.completeError(
52+
Exception("Error during scanning: $e"),
53+
);
5254
}
5355
},
5456
);
@@ -65,7 +67,7 @@ class ScanState extends NormalBleState {
6567
if (!isCompleted) {
6668
isCompleted = true;
6769
FlutterBluePlus.stopScan();
68-
toast.showToast('Device not found.');
70+
toast.showErrorToast('Device not found.');
6971
nextStateCompleter.completeError(Exception('Device not found.'));
7072
}
7173

0 commit comments

Comments
 (0)