main
1import 'dart:async';
2
3import 'package:blood_pressure_app/features/bluetooth/backend/flutter_blue_plus/flutter_blue_plus_mockable.dart';
4import 'package:flutter/foundation.dart';
5import 'package:flutter_blue_plus/flutter_blue_plus.dart';
6
7import 'fake_device.dart';
8
9/// Wrapper for FlutterBluePlus in order to easily mock it
10/// Wraps all calls for testing purposes
11class FakeFlutterBluePlus extends FlutterBluePlusMockable {
12 FakeFlutterBluePlus(): assert(kDebugMode);
13
14 final BluetoothAdapterState _kFakeAdapterState = BluetoothAdapterState.on;
15 final List<ScanResult> _kFakeScanResults = [
16 ScanResult(
17 device: FakeDevice(),
18 advertisementData: FakeDevice().createFakeData(),
19 rssi: 123,
20 timeStamp: DateTime.now()
21 )
22 ];
23
24 StreamController<List<ScanResult>> _fakeScanResultsEmiter = StreamController.broadcast();
25 Timer? _fakeScanResultsEmitTimer;
26
27 @override
28 BluetoothAdapterState get adapterStateNow => BluetoothAdapterState.on;
29
30 StreamController<bool> _isScanning = StreamController.broadcast();
31 bool _scanningNow = false;
32
33 @override
34 Stream<bool> get isScanning => _isScanning.stream;
35
36 @override
37 bool get isScanningNow => _scanningNow;
38
39 @override
40 List<ScanResult> get lastScanResults => _kFakeScanResults;
41
42 @override
43 Stream<List<ScanResult>> get scanResults => _fakeScanResultsEmiter.stream;
44
45 @override
46 Stream<List<ScanResult>> get onScanResults => _fakeScanResultsEmiter.stream;
47
48 @override
49 BluetoothEvents get events => throw UnimplementedError();
50
51 @override
52 Stream<BluetoothAdapterState> get adapterState => Stream.value(_kFakeAdapterState);
53
54 @override
55 List<BluetoothDevice> get connectedDevices => throw UnimplementedError();
56
57 @override
58 Future<List<BluetoothDevice>> systemDevices(List<Guid> withServices) => throw UnimplementedError();
59
60 @override
61 Future<List<BluetoothDevice>> get bondedDevices => throw UnimplementedError();
62
63 @override
64 Future<void> setOptions({bool showPowerAlert = true,}) => throw UnimplementedError();
65
66 @override
67 Future<void> turnOn({int timeout = 60}) async {}
68
69 @override
70 Future<void> startScan({
71 List<Guid> withServices = const [],
72 List<String> withRemoteIds = const [],
73 List<String> withNames = const [],
74 List<String> withKeywords = const [],
75 List<MsdFilter> withMsd = const [],
76 List<ServiceDataFilter> withServiceData = const [],
77 Duration? timeout,
78 Duration? removeIfGone,
79 bool continuousUpdates = false,
80 int continuousDivisor = 1,
81 bool oneByOne = false,
82 AndroidScanMode androidScanMode = AndroidScanMode.lowLatency,
83 bool androidUsesFineLocation = false,
84 }) async {
85 assert(_fakeScanResultsEmitTimer == null);
86 _scanningNow = true;
87 _fakeScanResultsEmitTimer = Timer.periodic(Duration(seconds: 1), (timer) {
88 _fakeScanResultsEmiter.add(_kFakeScanResults);
89 });
90 }
91
92 @override
93 Future<void> stopScan() async {
94 _scanningNow = false;
95 _fakeScanResultsEmitTimer!.cancel();
96 }
97
98 @override
99 void cancelWhenScanComplete(StreamSubscription subscription) =>
100 FlutterBluePlus.cancelWhenScanComplete(subscription); // TODO: figure out if useful
101
102
103 @override
104 Future<PhySupport> getPhySupport() => throw UnimplementedError();
105}