1
 2
 3import 'dart:io';
 4
 5import 'package:blood_pressure_app/features/bluetooth/backend/bluetooth_manager.dart';
 6import 'package:blood_pressure_app/features/bluetooth/backend/bluetooth_state.dart';
 7import 'package:blood_pressure_app/features/bluetooth/backend/flutter_blue_plus/fbp_device.dart';
 8import 'package:blood_pressure_app/features/bluetooth/backend/flutter_blue_plus/fbp_discovery.dart';
 9import 'package:blood_pressure_app/features/bluetooth/backend/flutter_blue_plus/fbp_service.dart';
10import 'package:blood_pressure_app/features/bluetooth/backend/flutter_blue_plus/fbp_state.dart';
11import 'package:blood_pressure_app/features/bluetooth/backend/flutter_blue_plus/flutter_blue_plus_mockable.dart';
12import 'package:flutter_blue_plus/flutter_blue_plus.dart' as fbp;
13import 'package:flutter_blue_plus/flutter_blue_plus.dart' show Guid, ScanResult;
14
15/// Bluetooth manager for the 'flutter_blue_plus' package
16class FlutterBluePlusManager extends BluetoothManager<ScanResult, Guid, fbp.BluetoothService, fbp.BluetoothCharacteristic> {
17  /// constructor
18  FlutterBluePlusManager([FlutterBluePlusMockable? backend]): backend = (backend ?? FlutterBluePlusMockable()) {
19    logger.finer('init');
20  }
21
22  /// backend implementation
23  final FlutterBluePlusMockable backend;
24
25  @override
26  Future<bool?> enable() async {
27    if (Platform.isAndroid) {
28      await backend.turnOn();
29      return true;
30    }
31    return null;
32  }
33
34  @override
35  BluetoothAdapterState get lastKnownAdapterState {
36    // Check whether our lastKnownState is the same as FlutterBluePlus's
37    assert(_adapterStateParser.parse(backend.adapterStateNow) == _adapterStateParser.lastKnownState);
38    return _adapterStateParser.lastKnownState;
39  }
40
41  final FlutterBluePlusStateParser _adapterStateParser = FlutterBluePlusStateParser();
42
43  @override
44  Stream<BluetoothAdapterState> get stateStream => backend.adapterState.map(_adapterStateParser.parse);
45
46  FlutterBluePlusDiscovery? _discovery;
47
48  @override
49  FlutterBluePlusDiscovery get discovery {
50    _discovery ??= FlutterBluePlusDiscovery(this);
51    return _discovery!;
52  }
53
54  @override
55  FlutterBluePlusDevice createDevice(ScanResult device) => FlutterBluePlusDevice(this, device);
56
57  @override
58  FlutterBluePlusUUID createUuid(Guid uuid) => FlutterBluePlusUUID(uuid);
59
60  @override
61  FlutterBluePlusUUID createUuidFromString(String uuid) => FlutterBluePlusUUID.fromString(uuid);
62
63  @override
64  FlutterBluePlusService createService(fbp.BluetoothService service) => FlutterBluePlusService.fromSource(service);
65
66  @override
67  FlutterBluePlusCharacteristic createCharacteristic(fbp.BluetoothCharacteristic characteristic) => FlutterBluePlusCharacteristic.fromSource(characteristic);
68}