Commit 583489f

derdilla <82763757+derdilla@users.noreply.github.com>
2025-09-20 12:43:58
Extract warning configuration to a new screen (#602)
* Create designated screen to configure warn values * tag golden tests
1 parent 8995fff
Changed files (4)
app/lib/features/settings/configure_warn_values_screen.dart
@@ -0,0 +1,94 @@
+import 'package:blood_pressure_app/components/custom_banner.dart';
+import 'package:blood_pressure_app/components/input_dialoge.dart';
+import 'package:blood_pressure_app/features/settings/tiles/number_input_list_tile.dart';
+import 'package:blood_pressure_app/l10n/app_localizations.dart';
+import 'package:blood_pressure_app/model/blood_pressure/warn_values.dart';
+import 'package:blood_pressure_app/model/storage/settings_store.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:url_launcher/url_launcher.dart';
+
+/// Screen containing warn value related information and settings.
+class ConfigureWarnValuesScreen extends StatelessWidget {
+  /// Create screen containing warn value related information and settings.
+  const ConfigureWarnValuesScreen({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    final settings = context.watch<Settings>();
+    return Scaffold(
+      appBar: AppBar(forceMaterialTransparency: true),
+      floatingActionButton: FloatingActionButton.extended(
+        label: Text(AppLocalizations.of(context)!.determineWarnValues),
+        onPressed:() async {
+          final age = (await showNumberInputDialoge(context,
+            hintText: AppLocalizations.of(context)!.age,
+          ))?.round();
+          if (age != null) {
+            settings.sysWarn = BloodPressureWarnValues.getUpperSysWarnValue(age);
+            settings.diaWarn = BloodPressureWarnValues.getUpperDiaWarnValue(age);
+          }
+        },
+      ),
+      body: ListView(
+        //mainAxisAlignment: MainAxisAlignment.start,
+        //crossAxisAlignment: CrossAxisAlignment.start,
+        //crossAxisAlignment: CrossAxisAlignment.start,
+        //crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          CustomBanner(
+            content: Column(children: [
+              Text(AppLocalizations.of(context)!.warnAboutTxt1),
+              const SizedBox(
+                height: 5,
+              ),
+              InkWell(
+                onTap: () async {
+                  final url = Uri.parse(BloodPressureWarnValues.source);
+                  if (await canLaunchUrl(url)) {
+                    await launchUrl(url, mode: LaunchMode.externalApplication);
+                  } else if (context.mounted) {
+                    ScaffoldMessenger.of(context).showSnackBar(SnackBar(
+                      content: Text(AppLocalizations.of(context)!
+                          .errCantOpenURL(BloodPressureWarnValues.source),),),);
+                  }
+                },
+                child: SizedBox(
+                  height: 48,
+                  child: Center(
+                    child: Text(
+                      AppLocalizations.of(context)!.warnAboutTxt2,
+                      style: const TextStyle(color: Colors.blue),
+                    ),
+                  ),
+                ),
+              ),
+              const SizedBox(
+                height: 5,
+              ),
+              Text(AppLocalizations.of(context)!.warnAboutTxt3),
+              const SizedBox(height: 10.0),
+            ],),
+          ),
+          NumberInputListTile(
+            label: AppLocalizations.of(context)!.sysWarn,
+            leading: const Icon(Icons.warning_amber_outlined),
+            value: settings.sysWarn,
+            onParsableSubmit: (double value) {
+              settings.sysWarn = value.round();
+            },
+          ),
+          NumberInputListTile(
+            label: AppLocalizations.of(context)!.diaWarn,
+            leading: const Icon(Icons.warning_amber_outlined),
+            value: settings.diaWarn,
+            onParsableSubmit: (double value) {
+              settings.diaWarn = value.round();
+            },
+          ),
+        ],
+      ) ,
+    );
+  }
+
+}
app/lib/screens/settings_screen.dart
@@ -3,6 +3,7 @@ import 'dart:io';
 import 'package:archive/archive_io.dart';
 import 'package:blood_pressure_app/components/input_dialoge.dart';
 import 'package:blood_pressure_app/data_util/consistent_future_builder.dart';
+import 'package:blood_pressure_app/features/settings/configure_warn_values_screen.dart';
 import 'package:blood_pressure_app/features/settings/delete_data_screen.dart';
 import 'package:blood_pressure_app/features/settings/enter_timeformat_dialoge.dart';
 import 'package:blood_pressure_app/features/settings/export_import_screen.dart';
@@ -203,44 +204,15 @@ class SettingsPage extends StatelessWidget {
                 onChanged: (value) {
                   settings.confirmDeletion = value;
                 },),
-              NumberInputListTile(
-                label: localizations.sysWarn,
-                leading: const Icon(Icons.warning_amber_outlined),
-                value: settings.sysWarn,
-                onParsableSubmit: (double value) {
-                  settings.sysWarn = value.round();
-                },
-              ),
-              NumberInputListTile(
-                label: localizations.diaWarn,
-                leading: const Icon(Icons.warning_amber_outlined),
-                value: settings.diaWarn,
-                onParsableSubmit: (double value) {
-                  settings.diaWarn = value.round();
-                },
-              ),
               ListTile(
-                leading: const Icon(Icons.settings_applications_outlined),
+                leading: const Icon(Icons.warning_amber_outlined),
                 title: Text(localizations.determineWarnValues),
-                onTap: () async {
-                  final age = (await showNumberInputDialoge(context,
-                    hintText: localizations.age,
-                  ))?.round();
-                  if (age != null) {
-                    settings.sysWarn = BloodPressureWarnValues.getUpperSysWarnValue(age);
-                    settings.diaWarn = BloodPressureWarnValues.getUpperDiaWarnValue(age);
-                  }
-                },
-              ),
-              ListTile(
-                title: Text(localizations.aboutWarnValuesScreen),
                 subtitle: Text(localizations.aboutWarnValuesScreenDesc),
-                leading: const Icon(Icons.info_outline),
                 trailing: const Icon(Icons.arrow_forward_ios),
                 onTap: () {
                   Navigator.push(
                     context,
-                    MaterialPageRoute(builder: (context) => const AboutWarnValuesScreen()),
+                    MaterialPageRoute(builder: (context) => const ConfigureWarnValuesScreen()),
                   );
                 },
               ),
app/test/features/statistics/clock_bp_graph_test.dart
@@ -43,7 +43,7 @@ void main() {
       ),
     ));
     await expectLater(find.byType(ClockBpGraph), myMatchesGoldenFile('ClockBpGraph-light.png'));
-  });
+  }, tags: 'gold');
   testWidgets('[gold] renders sample data like expected in dark mode', (tester) async {
     final rng = Random(1234);
     await tester.pumpWidget(MaterialApp(
@@ -66,5 +66,5 @@ void main() {
       ),
     ));
     await expectLater(find.byType(ClockBpGraph), myMatchesGoldenFile('ClockBpGraph-dark.png'));
-  });
+  }, tags: 'gold');
 }
app/test/features/statistics/value_graph_test.dart
@@ -104,7 +104,7 @@ void main() {
     expect(find.text(localizations.errNotEnoughDataToGraph), findsNothing);
 
     await expectLater(find.byType(BloodPressureValueGraph), myMatchesGoldenFile('full_graph-years.png'));
-  });
+  }, tags: 'gold');
 
   testWidgets('BloodPressureValueGraph is fine with enough values in sys category', (tester) async {
     await tester.pumpWidget(_buildGraph([
@@ -146,7 +146,7 @@ void main() {
     expect(find.text(localizations.errNotEnoughDataToGraph), findsNothing);
 
     await expectLater(find.byType(BloodPressureValueGraph), myMatchesGoldenFile('value-graph-start-warn.png'));
-  });
+  }, tags: 'gold');
   testWidgets('[gold] graph renders area at end correctly', (tester) async {
     await tester.pumpWidget(_buildGraph([
       mockRecord(time: DateTime(2005), sys: 170, dia: 100, pul: 50),
@@ -162,7 +162,7 @@ void main() {
     expect(find.text(localizations.errNotEnoughDataToGraph), findsNothing);
 
     await expectLater(find.byType(BloodPressureValueGraph), myMatchesGoldenFile('value-graph-end-warn.png'));
-  });
+  }, tags: 'gold');
   testWidgets('[gold] warn area not drawn above graph', (tester) async {
     await tester.pumpWidget(_buildGraph([
       mockRecord(time: DateTime(2005), sys: 103, dia: null, pul: null),
@@ -175,7 +175,7 @@ void main() {
     expect(find.text(localizations.errNotEnoughDataToGraph), findsNothing);
 
     await expectLater(find.byType(BloodPressureValueGraph), myMatchesGoldenFile('value-graph-warn-not-above.png'));
-  });
+  }, tags: 'gold');
 }
 
 Widget _buildGraph(