Skip to content

Commit 46099ca

Browse files
committed
Move knowndevices away from riverpod
1 parent ab7bae1 commit 46099ca

19 files changed

+354
-518
lines changed
Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,24 @@
11
import 'dart:async';
22

33
import 'package:built_collection/built_collection.dart';
4+
import 'package:flutter/foundation.dart';
45
import 'package:logging/logging.dart' as log;
5-
import 'package:riverpod_annotation/riverpod_annotation.dart';
66

77
import '../../constants.dart';
88
import '../Definitions/Device/device_definition.dart';
99
import '../device_registry.dart';
1010
import '../logging_wrappers.dart';
1111

12-
part 'bluetooth_manager.g.dart';
13-
1412
final log.Logger bluetoothLog = log.Logger('Bluetooth');
1513

16-
@Riverpod(keepAlive: true)
17-
class KnownDevices extends _$KnownDevices {
18-
@override
19-
BuiltMap<String, BaseStatefulDevice> build() {
14+
class KnownDevices with ChangeNotifier {
15+
late BuiltMap<String, BaseStatefulDevice> _state;
16+
BuiltMap<String, BaseStatefulDevice> get state => _state;
17+
18+
//https://stackoverflow.com/questions/12649573/how-do-you-build-a-singleton-in-dart
19+
static final KnownDevices instance = KnownDevices._internal();
20+
21+
KnownDevices._internal() {
2022
BuiltList<BaseStoredDevice> storedDevices = HiveProxy.getAll<BaseStoredDevice>(devicesBox).toBuiltList();
2123
Map<String, BaseStatefulDevice> results = {};
2224
try {
@@ -33,32 +35,27 @@ class KnownDevices extends _$KnownDevices {
3335
} catch (e, s) {
3436
bluetoothLog.severe("Unable to load stored devices due to $e", e, s);
3537
}
36-
return BuiltMap(results);
38+
_state = BuiltMap(results);
3739
}
3840

3941
Future<void> add(BaseStatefulDevice baseStatefulDevice) async {
40-
state = state.rebuild((p0) => p0[baseStatefulDevice.baseStoredDevice.btMACAddress] = baseStatefulDevice);
42+
_state = _state.rebuild((p0) => p0[baseStatefulDevice.baseStoredDevice.btMACAddress] = baseStatefulDevice);
4143
await store();
4244
}
4345

4446
Future<void> remove(String id) async {
45-
state = state.rebuild(
46-
(p0) => p0.remove(id),
47-
);
47+
_state = _state.rebuild((p0) => p0.remove(id));
4848
await store();
4949
}
5050

5151
Future<void> store() async {
5252
await HiveProxy.clear<BaseStoredDevice>(devicesBox);
5353
await HiveProxy.addAll<BaseStoredDevice>(devicesBox, state.values.map((e) => e.baseStoredDevice));
54+
notifyListeners();
5455
}
5556

5657
Future<void> removeDevGear() async {
57-
state = state.rebuild(
58-
(p0) => p0.removeWhere(
59-
(p0, p1) => p0.contains("DEV"),
60-
),
61-
);
58+
_state = _state.rebuild((p0) => p0.removeWhere((p0, p1) => p0.contains("DEV")));
6259
await store();
6360
}
6461
}

lib/Backend/Bluetooth/bluetooth_manager_plus.dart

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ class InitFlutterBluePlus extends _$InitFlutterBluePlus {
9696
ref.invalidate(_rSSIChangedProvider);
9797
ref.invalidate(_onScanResultsProvider);
9898
// Mark all gear disconnected;
99-
ref.read(knownDevicesProvider).forEach((key, value) => value.deviceConnectionState.value = ConnectivityState.disconnected);
99+
KnownDevices.instance.state.forEach((key, value) => value.deviceConnectionState.value = ConnectivityState.disconnected);
100100
isBluetoothEnabled.value = false;
101101
_didInitFlutterBluePlus = false; // Allow restarting ble stack
102102
});
@@ -116,7 +116,7 @@ class _MTUChanged extends _$MTUChanged {
116116

117117
void listener(OnMtuChangedEvent event) {
118118
_bluetoothPlusLogger.info('${event.device.advName} MTU:${event.mtu}');
119-
BaseStatefulDevice? statefulDevice = ref.read(knownDevicesProvider)[event.device.remoteId.str];
119+
BaseStatefulDevice? statefulDevice = KnownDevices.instance.state[event.device.remoteId.str];
120120
statefulDevice?.mtu.value = event.mtu;
121121
}
122122
}
@@ -137,7 +137,7 @@ class _OnDiscoveredServices extends _$OnDiscoveredServices {
137137
for (BluetoothService service in event.services) {
138138
BluetoothUartService? bluetoothUartService = uartServices.firstWhereOrNull((element) => element.bleDeviceService.toLowerCase() == service.serviceUuid.str128.toLowerCase());
139139
if (bluetoothUartService != null) {
140-
BaseStatefulDevice? statefulDevice = ref.read(knownDevicesProvider)[event.device.remoteId.str];
140+
BaseStatefulDevice? statefulDevice = KnownDevices.instance.state[event.device.remoteId.str];
141141
statefulDevice?.bluetoothUartService.value = bluetoothUartService;
142142
}
143143
for (BluetoothCharacteristic characteristic in service.characteristics) {
@@ -163,7 +163,7 @@ class _RSSIChanged extends _$RSSIChanged {
163163

164164
void listener(OnReadRssiEvent event) {
165165
_bluetoothPlusLogger.info('${event.device.advName} RSSI:${event.rssi}');
166-
BaseStatefulDevice? statefulDevice = ref.read(knownDevicesProvider)[event.device.remoteId.str];
166+
BaseStatefulDevice? statefulDevice = KnownDevices.instance.state[event.device.remoteId.str];
167167
statefulDevice?.rssi.value = event.rssi;
168168
}
169169
}
@@ -180,7 +180,7 @@ class _OnConnectionStateChanged extends _$OnConnectionStateChanged {
180180

181181
Future<void> listener(OnConnectionStateChangedEvent event) async {
182182
_bluetoothPlusLogger.info('${event.device.advName} ${event.connectionState}');
183-
BuiltMap<String, BaseStatefulDevice> knownDevices = ref.read(knownDevicesProvider);
183+
BuiltMap<String, BaseStatefulDevice> knownDevices = KnownDevices.instance.state;
184184
BluetoothDevice bluetoothDevice = event.device;
185185
BluetoothConnectionState bluetoothConnectionState = event.connectionState;
186186
String deviceID = bluetoothDevice.remoteId.str;
@@ -200,14 +200,14 @@ class _OnConnectionStateChanged extends _$OnConnectionStateChanged {
200200
if (statefulDevice.baseStoredDevice.conModePin.isEmpty) {
201201
int code = Random().nextInt(899999) + 100000;
202202
baseStoredDevice.conModePin = code.toString();
203-
Future(() => ref.read(knownDevicesProvider.notifier).add(statefulDevice));
203+
Future(() => KnownDevices.instance.add(statefulDevice));
204204
}
205205
} else {
206-
baseStoredDevice = BaseStoredDevice(deviceDefinition.uuid, deviceID, deviceDefinition.deviceType.color(ref: ref).toARGB32())..name = getNameFromBTName(deviceDefinition.btName);
206+
baseStoredDevice = BaseStoredDevice(deviceDefinition.uuid, deviceID, deviceDefinition.deviceType.color().toARGB32())..name = getNameFromBTName(deviceDefinition.btName);
207207
int code = Random().nextInt(899999) + 100000;
208208
baseStoredDevice.conModePin = code.toString();
209209
statefulDevice = BaseStatefulDevice(deviceDefinition, baseStoredDevice);
210-
Future(() => ref.read(knownDevicesProvider.notifier).add(statefulDevice));
210+
Future(() => KnownDevices.instance.add(statefulDevice));
211211
}
212212
statefulDevice.deviceConnectionState.value = event.connectionState == BluetoothConnectionState.connected ? ConnectivityState.connected : ConnectivityState.disconnected;
213213
if (bluetoothConnectionState == BluetoothConnectionState.connected) {
@@ -277,7 +277,7 @@ class _OnConnectionStateChanged extends _$OnConnectionStateChanged {
277277
// if the forget button was used, remove the device
278278
if (knownDevices[bluetoothDevice.remoteId.str] != null && knownDevices[bluetoothDevice.remoteId.str]!.forgetOnDisconnect) {
279279
_bluetoothPlusLogger.finer('forgetting about gear');
280-
ref.read(knownDevicesProvider.notifier).remove(bluetoothDevice.remoteId.str);
280+
KnownDevices.instance.remove(bluetoothDevice.remoteId.str);
281281
analyticsEvent(name: "Forgetting Gear", props: {"Gear Type": deviceDefinition.btName});
282282
} else {
283283
analyticsEvent(name: "Disconnect Gear", props: {"Gear Type": deviceDefinition.btName});
@@ -302,7 +302,7 @@ class _OnCharacteristicReceived extends _$OnCharacteristicReceived {
302302
BluetoothDevice bluetoothDevice = event.device;
303303
BluetoothCharacteristic bluetoothCharacteristic = event.characteristic;
304304
List<int> values = event.value;
305-
BaseStatefulDevice? statefulDevice = ref.read(knownDevicesProvider)[bluetoothDevice.remoteId.str];
305+
BaseStatefulDevice? statefulDevice = KnownDevices.instance.state[bluetoothDevice.remoteId.str];
306306
// get Device object
307307
// set value
308308
if (statefulDevice == null) {
@@ -400,7 +400,7 @@ class _KeepGearAwake extends _$KeepGearAwake {
400400
}
401401

402402
void listener(dynamic event) {
403-
BuiltMap<String, BaseStatefulDevice> knownDevices = ref.read(knownDevicesProvider);
403+
BuiltMap<String, BaseStatefulDevice> knownDevices = KnownDevices.instance.state;
404404
for (var element in FlutterBluePlus.connectedDevices) {
405405
BaseStatefulDevice? device = knownDevices[element.remoteId.str];
406406
if (device != null) {
@@ -437,7 +437,7 @@ class _OnScanResults extends _$OnScanResults {
437437
if (results.isNotEmpty) {
438438
ScanResult r = results.last; // the most recently found device
439439
_bluetoothPlusLogger.info('${r.device.remoteId}: "${r.advertisementData.advName}" found!');
440-
BuiltMap<String, BaseStatefulDevice> knownDevices = ref.read(knownDevicesProvider);
440+
BuiltMap<String, BaseStatefulDevice> knownDevices = KnownDevices.instance.state;
441441
if (knownDevices.containsKey(r.device.remoteId.str) &&
442442
knownDevices[r.device.remoteId.str]?.deviceConnectionState.value == ConnectivityState.disconnected &&
443443
!knownDevices[r.device.remoteId.str]!.disableAutoConnect) {

lib/Backend/Definitions/Device/device_definition.dart

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -85,18 +85,13 @@ extension DeviceTypeExtension on DeviceType {
8585
}
8686
}
8787

88-
Color color({Object? ref}) {
89-
if (ref != null && (ref is WidgetRef || ref is Ref)) {
90-
Iterable<BaseStatefulDevice> knownDevices = [];
91-
if (ref is WidgetRef) {
92-
knownDevices = ref.read(knownDevicesProvider).values;
93-
} else if (ref is Ref) {
94-
knownDevices = ref.read(knownDevicesProvider).values;
95-
}
96-
int? color = knownDevices.where((element) => element.baseDeviceDefinition.deviceType == this).map((e) => e.baseStoredDevice.color).firstOrNull;
97-
if (color != null) {
98-
return Color(color);
99-
}
88+
Color color() {
89+
Iterable<BaseStatefulDevice> knownDevices = [];
90+
knownDevices = KnownDevices.instance.state.values;
91+
92+
int? color = knownDevices.where((element) => element.baseDeviceDefinition.deviceType == this).map((e) => e.baseStoredDevice.color).firstOrNull;
93+
if (color != null) {
94+
return Color(color);
10095
}
10196
switch (this) {
10297
case DeviceType.tail:

lib/Backend/action_registry.dart

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -175,20 +175,17 @@ class ActionRegistry {
175175
CommandAction(name: "Rustles 3", command: "TAILT2", deviceCategory: [DeviceType.wings], response: "TAILT2 END", uuid: "5f7e16e4-04f6-46ab-bbc9-e6f908fc559c"),
176176
CommandAction(name: "Rustles 4", command: "TAILET", deviceCategory: [DeviceType.wings], response: "TAILET END", uuid: "0dfeb464-572b-452b-be4a-5a36affd2da9"),
177177
}.build();
178-
static final BuiltSet<BaseAction> allCommands = BuiltSet<BaseAction>()
179-
.union(glowtipCommands)
180-
.union(earMoves)
181-
.union(flutterWingsMoves)
182-
.union(miniTailMoves)
183-
.union(tailMoves)
184-
.union(rgbCommands);
178+
static final BuiltSet<BaseAction> allCommands = BuiltSet<BaseAction>().union(glowtipCommands).union(earMoves).union(flutterWingsMoves).union(miniTailMoves).union(tailMoves).union(rgbCommands);
185179
}
186180

187181
@Riverpod(keepAlive: true)
188182
class GetAvailableActions extends _$GetAvailableActions {
189183
@override
190184
BuiltMap<String, BuiltSet<BaseAction>> build() {
191-
for (BaseStatefulDevice baseStatefulDevice in ref.watch(knownDevicesProvider).values) {
185+
KnownDevices.instance
186+
..removeListener(onDeviceConnected)
187+
..addListener(onDeviceConnected);
188+
for (BaseStatefulDevice baseStatefulDevice in KnownDevices.instance.state.values) {
192189
baseStatefulDevice.hasGlowtip
193190
..removeListener(_listener)
194191
..addListener(_listener);
@@ -202,6 +199,10 @@ class GetAvailableActions extends _$GetAvailableActions {
202199
return getState();
203200
}
204201

202+
void onDeviceConnected() {
203+
ref.invalidateSelf();
204+
}
205+
205206
BuiltMap<String, BuiltSet<BaseAction>> getState() {
206207
Map<String, Set<BaseAction>> sortedActions = {};
207208
final BuiltMap<String, BuiltSet<BaseAction>> allActions = ref.watch(getAllActionsProvider);

0 commit comments

Comments
 (0)