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}