1import 'dart:async';
  2import 'dart:typed_data';
  3
  4import 'package:flutter/cupertino.dart';
  5import 'package:flutter_blue_plus/flutter_blue_plus.dart';
  6
  7import 'fake_service.dart';
  8
  9class FakeDevice implements BluetoothDevice {
 10  FakeDevice() {
 11    Timer.periodic(Duration(seconds: 2), (timer) {
 12      _connectedController.add(_connected ? BluetoothConnectionState.connected : BluetoothConnectionState.disconnected);
 13    });
 14  }
 15
 16  bool _connected = false;
 17  StreamController<BluetoothConnectionState> _connectedController = StreamController.broadcast();
 18
 19
 20  List<BluetoothService> _services = [
 21    FakeBleBPService(),
 22  ];
 23
 24  String _platformName = 'test device 1234';
 25
 26  AdvertisementData createFakeData() => AdvertisementData(
 27    advName: advName,
 28    txPowerLevel: null,
 29      appearance: null,
 30      connectable: true,
 31      manufacturerData: {},
 32      serviceData: {},
 33      serviceUuids: [],
 34  );
 35
 36  @override
 37  String get advName => platformName;
 38
 39  @override
 40  // TODO: implement bondState
 41  Stream<BluetoothBondState> get bondState => throw UnimplementedError();
 42
 43  @override
 44  void cancelWhenDisconnected(StreamSubscription subscription, {bool next = false, bool delayed = false}) {
 45    // TODO: implement cancelWhenDisconnected
 46  }
 47
 48  @override
 49  Future<void> clearGattCache() {
 50    // TODO: implement clearGattCache
 51    throw UnimplementedError();
 52  }
 53
 54  @override
 55  Future<void> connect({Duration timeout = const Duration(seconds: 35), int? mtu = 512, bool autoConnect = false}) async {
 56    print('CALLED CONNECT');
 57    _connected = true;
 58    final state = _connected
 59        ? BluetoothConnectionState.connected
 60        : BluetoothConnectionState.disconnected;
 61    _connectedController.add(state);
 62  }
 63
 64  @override
 65  Stream<BluetoothConnectionState> get connectionState => _connectedController.stream;
 66
 67  @override
 68  Future<void> createBond({int timeout = 90, Uint8List? pin}) {
 69    // TODO: implement createBond
 70    throw UnimplementedError();
 71  }
 72
 73  @override
 74  Future<void> disconnect({int timeout = 35, bool queue = true, int androidDelay = 2000,}) async {
 75    print('CALLED DISCONNECT:');
 76    debugPrintStack();
 77    _connected = false;
 78    final state = _connected
 79        ? BluetoothConnectionState.connected
 80        : BluetoothConnectionState.disconnected;
 81    _connectedController.add(state);
 82  }
 83
 84  @override
 85  DisconnectReason? get disconnectReason => null;
 86
 87  @override
 88  Future<List<BluetoothService>> discoverServices({bool subscribeToServicesChanged = true, int timeout = 15}) async {
 89    assert(_connected);
 90    return _services;
 91  }
 92
 93  @override
 94  // TODO: implement id
 95  DeviceIdentifier get id => throw UnimplementedError();
 96
 97  @override
 98  bool get isAutoConnectEnabled => false;
 99
100  @override
101  bool get isConnected => _connected;
102
103  @override
104  bool get isDisconnected => !_connected;
105
106  @override
107  // TODO: implement isDiscoveringServices
108  Stream<bool> get isDiscoveringServices => throw UnimplementedError();
109
110  @override
111  // TODO: implement localName
112  String get localName => throw UnimplementedError();
113
114  @override
115  // TODO: implement mtu
116  Stream<int> get mtu => throw UnimplementedError();
117
118  @override
119  // TODO: implement mtuNow
120  int get mtuNow => throw UnimplementedError();
121
122  @override
123  // TODO: implement name
124  String get name => throw UnimplementedError();
125
126  @override
127  // TODO: implement onServicesReset
128  Stream<void> get onServicesReset => throw UnimplementedError();
129
130  @override
131  Future<void> pair() {
132    // TODO: implement pair
133    throw UnimplementedError();
134  }
135
136  @override
137  String get platformName => _platformName;
138
139  @override
140  // TODO: implement prevBondState
141  BluetoothBondState? get prevBondState => throw UnimplementedError();
142
143  @override
144  Future<int> readRssi({int timeout = 15}) {
145    // TODO: implement readRssi
146    throw UnimplementedError();
147  }
148
149  @override
150  // TODO: implement remoteId
151  DeviceIdentifier get remoteId => throw UnimplementedError();
152
153  @override
154  Future<void> removeBond({int timeout = 30}) {
155    // TODO: implement removeBond
156    throw UnimplementedError();
157  }
158
159  @override
160  Future<void> requestConnectionPriority({required ConnectionPriority connectionPriorityRequest}) {
161    // TODO: implement requestConnectionPriority
162    throw UnimplementedError();
163  }
164
165  @override
166  Future<int> requestMtu(int desiredMtu, {double predelay = 0.35, int timeout = 15}) {
167    // TODO: implement requestMtu
168    throw UnimplementedError();
169  }
170
171  @override
172  Stream<List<BluetoothService>> get services => Stream.value(_services);
173
174  @override
175  List<BluetoothService> get servicesList => _services;
176
177  @override
178  Stream<List<BluetoothService>> get servicesStream => Stream.value(_services);
179
180  @override
181  Future<void> setPreferredPhy({required int txPhy, required int rxPhy, required PhyCoding option}) {
182    // TODO: implement setPreferredPhy
183    throw UnimplementedError();
184  }
185
186  @override
187  Stream<BluetoothConnectionState> get state => connectionState;
188
189}