From c657c7979ac331d3611951566e5d9be9ba219679 Mon Sep 17 00:00:00 2001 From: TobiasRoeddiger Date: Wed, 15 Jul 2026 10:49:53 +0200 Subject: [PATCH] fix: apply edge recorder prefix to stereo pairs --- .../edge_recorder_prefix_row.dart | 14 +++++- .../sensor_configuration_device_row.dart | 5 ++ .../edge_recorder_prefix_row_test.dart | 47 +++++++++++++++++++ 3 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 open_wearable/test/widgets/sensors/configuration/edge_recorder_prefix_row_test.dart diff --git a/open_wearable/lib/widgets/sensors/configuration/edge_recorder_prefix_row.dart b/open_wearable/lib/widgets/sensors/configuration/edge_recorder_prefix_row.dart index 7537ad99..e3f15c65 100644 --- a/open_wearable/lib/widgets/sensors/configuration/edge_recorder_prefix_row.dart +++ b/open_wearable/lib/widgets/sensors/configuration/edge_recorder_prefix_row.dart @@ -6,9 +6,14 @@ import 'package:open_earable_flutter/open_earable_flutter.dart'; /// Row that shows the current file prefix of an [EdgeRecorderManager] /// and lets the user change it. class EdgeRecorderPrefixRow extends StatefulWidget { - const EdgeRecorderPrefixRow({super.key, required this.manager}); + const EdgeRecorderPrefixRow({ + super.key, + required this.manager, + this.pairedManager, + }); final EdgeRecorderManager manager; + final EdgeRecorderManager? pairedManager; @override State createState() => _RecorderPrefixRowState(); @@ -83,7 +88,12 @@ class _RecorderPrefixRowState extends State { ); if (result == true) { - await widget.manager.setFilePrefix(_editPrefixController.text.trim()); + final prefix = _editPrefixController.text.trim(); + await Future.wait([ + widget.manager.setFilePrefix(prefix), + if (widget.pairedManager != null) + widget.pairedManager!.setFilePrefix(prefix), + ]); if (!mounted) { return; } diff --git a/open_wearable/lib/widgets/sensors/configuration/sensor_configuration_device_row.dart b/open_wearable/lib/widgets/sensors/configuration/sensor_configuration_device_row.dart index 4845f87a..71ff57d4 100644 --- a/open_wearable/lib/widgets/sensors/configuration/sensor_configuration_device_row.dart +++ b/open_wearable/lib/widgets/sensors/configuration/sensor_configuration_device_row.dart @@ -384,10 +384,15 @@ class _SensorConfigurationDeviceRowState ]; if (device.hasCapability()) { + final pairedEdgeRecorderManager = widget.pairedDevice != null && + widget.pairedDevice!.hasCapability() + ? widget.pairedDevice!.requireCapability() + : null; content.addAll([ const InsetSectionDivider(), EdgeRecorderPrefixRow( manager: device.requireCapability(), + pairedManager: pairedEdgeRecorderManager, ), ]); } diff --git a/open_wearable/test/widgets/sensors/configuration/edge_recorder_prefix_row_test.dart b/open_wearable/test/widgets/sensors/configuration/edge_recorder_prefix_row_test.dart new file mode 100644 index 00000000..1e29048a --- /dev/null +++ b/open_wearable/test/widgets/sensors/configuration/edge_recorder_prefix_row_test.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:open_earable_flutter/open_earable_flutter.dart'; +import 'package:open_wearable/widgets/sensors/configuration/edge_recorder_prefix_row.dart'; + +void main() { + testWidgets('sets filename prefix on both paired edge recorder managers', + (tester) async { + final primaryManager = _FakeEdgeRecorderManager(''); + final pairedManager = _FakeEdgeRecorderManager(''); + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: EdgeRecorderPrefixRow( + manager: primaryManager, + pairedManager: pairedManager, + ), + ), + ), + ); + await tester.pumpAndSettle(); + + await tester.tap(find.text('On-Device Filename Prefix')); + await tester.pumpAndSettle(); + await tester.enterText(find.byType(TextField), 'session_01'); + await tester.tap(find.text('Save')); + await tester.pumpAndSettle(); + + expect(primaryManager.prefix, 'session_01'); + expect(pairedManager.prefix, 'session_01'); + }); +} + +class _FakeEdgeRecorderManager implements EdgeRecorderManager { + _FakeEdgeRecorderManager(this.prefix); + + String prefix; + + @override + Future get filePrefix async => prefix; + + @override + Future setFilePrefix(String prefix) async { + this.prefix = prefix; + } +}