Commit 583489f
Changed files (4)
app
lib
features
screens
test
features
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(