Commit 557a451

derdilla <82763757+NobodyForNothing@users.noreply.github.com>
2024-06-22 18:08:04
fix bluetooth input unaware of success and layout not updating
Signed-off-by: derdilla <82763757+NobodyForNothing@users.noreply.github.com>
1 parent abcc030
Changed files (2)
app
app/lib/bluetooth/ble_read_cubit.dart
@@ -30,8 +30,8 @@ class BleReadCubit extends Cubit<BleReadState> {
   BleReadCubit(this._device, {
     required this.serviceUUID,
     required this.characteristicUUID,
-  })
-    : super(BleReadInProgress()){
+  }) : super(BleReadInProgress())
+  {
     _subscription = _device.connectionState
       .listen(_onConnectionStateChanged);
     // timeout
app/lib/components/bluetooth_input.dart
@@ -2,7 +2,9 @@ import 'dart:async';
 
 import 'package:blood_pressure_app/bluetooth/ble_read_cubit.dart';
 import 'package:blood_pressure_app/bluetooth/bluetooth_cubit.dart';
+import 'package:blood_pressure_app/bluetooth/characteristics/ble_measurement_data.dart';
 import 'package:blood_pressure_app/bluetooth/device_scan_cubit.dart';
+import 'package:blood_pressure_app/bluetooth/flutter_blue_plus_mockable.dart';
 import 'package:blood_pressure_app/components/bluetooth_input/closed_bluetooth_input.dart';
 import 'package:blood_pressure_app/components/bluetooth_input/device_selection.dart';
 import 'package:blood_pressure_app/components/bluetooth_input/input_card.dart';
@@ -13,7 +15,7 @@ import 'package:blood_pressure_app/model/blood_pressure/record.dart';
 import 'package:blood_pressure_app/model/storage/storage.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_bloc/flutter_bloc.dart';
-import 'package:flutter_blue_plus/flutter_blue_plus.dart' show Guid;
+import 'package:flutter_blue_plus/flutter_blue_plus.dart' show BluetoothDevice, Guid;
 import 'package:flutter_gen/gen_l10n/app_localizations.dart';
 
 /// Class for inputting measurement through bluetooth.
@@ -25,6 +27,7 @@ class BluetoothInput extends StatefulWidget {
     this.bluetoothCubit,
     this.deviceScanCubit,
     this.bleReadCubit,
+    this.flutterBluePlus,
   });
 
   /// Settings to store known devices.
@@ -40,7 +43,9 @@ class BluetoothInput extends StatefulWidget {
   final DeviceScanCubit Function()? deviceScanCubit;
 
   /// Function to customize [BleReadCubit] creation.
-  final BleReadCubit Function()? bleReadCubit;
+  final BleReadCubit Function(BluetoothDevice dev)? bleReadCubit;
+
+  final FlutterBluePlusMockable? flutterBluePlus;
 
   @override
   State<BluetoothInput> createState() => _BluetoothInputState();
@@ -56,10 +61,16 @@ class _BluetoothInputState extends State<BluetoothInput> {
 
   StreamSubscription<BluetoothState>? _bluetoothSubscription;
 
+  /// Data received from reading bluetooth values.
+  ///
+  /// Its presence indicates that this input is done.
+  BleMeasurementData? _finishedData;
+
   @override
   void initState() {
     super.initState();
-    _bluetoothCubit = widget.bluetoothCubit?.call() ?? BluetoothCubit();
+    _bluetoothCubit = widget.bluetoothCubit?.call()
+      ?? BluetoothCubit(flutterBluePlus: widget.flutterBluePlus);
   }
 
   @override
@@ -76,6 +87,7 @@ class _BluetoothInputState extends State<BluetoothInput> {
     if (_isActive) {
       setState(() {
         _isActive = false;
+        _finishedData = null;
       });
     }
 
@@ -99,11 +111,12 @@ class _BluetoothInputState extends State<BluetoothInput> {
     _deviceScanCubit ??= widget.deviceScanCubit?.call() ?? DeviceScanCubit(
       service: serviceUUID,
       settings: widget.settings,
+      flutterBluePlus: widget.flutterBluePlus,
     );
     return BlocBuilder<DeviceScanCubit, DeviceScanState>(
       bloc: _deviceScanCubit,
       builder: (context, DeviceScanState state) {
-        Log.trace('_BluetoothInputState _deviceScanCubit: $state');
+        Log.trace('BluetoothInput _BluetoothInputState _deviceScanCubit: $state');
         return switch(state) {
           DeviceListLoading() => _buildMainCard(context,
             title: Text(AppLocalizations.of(context)!.scanningForDevices),
@@ -120,7 +133,8 @@ class _BluetoothInputState extends State<BluetoothInput> {
             // distinction
           DeviceSelected() => BlocConsumer<BleReadCubit, BleReadState>(
             bloc: (){
-              _deviceReadCubit = widget.bleReadCubit?.call() ?? BleReadCubit(state.device,
+              _deviceReadCubit = widget.bleReadCubit?.call(state.device) ?? BleReadCubit(
+                state.device,
                 characteristicUUID: characteristicUUID,
                 serviceUUID: serviceUUID,
               );
@@ -136,6 +150,9 @@ class _BluetoothInputState extends State<BluetoothInput> {
                   'notes',
                 );
                 widget.onMeasurement(record);
+                setState(() {
+                  _finishedData = state.data;
+                });
               }
             },
             builder: (BuildContext context, BleReadState state) {
@@ -161,6 +178,13 @@ class _BluetoothInputState extends State<BluetoothInput> {
 
   @override
   Widget build(BuildContext context) {
+    SizeChangedLayoutNotification().dispatch(context);
+    if (_finishedData != null) {
+      return MeasurementSuccess(
+        onTap: _returnToIdle,
+        data: _finishedData!,
+      );
+    }
     if (_isActive) return _buildActive(context);
     return ClosedBluetoothInput(
       bluetoothCubit: _bluetoothCubit,