From cb9bd64873d1ed0f7f16f1b4e6f4e4fcb3e447c2 Mon Sep 17 00:00:00 2001 From: otbenjello Date: Fri, 1 Dec 2023 00:17:31 +0100 Subject: [PATCH] =?UTF-8?q?page=20stats=20plusieurs=20activit=C3=A9es=20mo?= =?UTF-8?q?bile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mobile_container_stats_activities.dart | 12 +- lib/main.dart | 2 +- lib/modele/manager_file.dart | 8 +- lib/modele/manager_selected_activity.dart | 137 ++++++++++++++++-- lib/view/home/home_view.dart | 27 ++-- lib/view/home/stats_activities_view.dart | 95 ++++++++++-- 6 files changed, 240 insertions(+), 41 deletions(-) diff --git a/lib/common_widget/container/mobile/mobile_container_stats_activities.dart b/lib/common_widget/container/mobile/mobile_container_stats_activities.dart index f32e5ad..b21114d 100644 --- a/lib/common_widget/container/mobile/mobile_container_stats_activities.dart +++ b/lib/common_widget/container/mobile/mobile_container_stats_activities.dart @@ -19,8 +19,8 @@ class MobileContainerStatsActivities extends StatelessWidget { var media = MediaQuery.of(context).size; return Container( - height: media.width * 0.5, - width: media.width * 0.4, + height: media.width * 0.4, + width: media.width * 0.27, padding: const EdgeInsets.all(8), margin: const EdgeInsets.symmetric(vertical: 5), decoration: BoxDecoration( @@ -46,18 +46,18 @@ class MobileContainerStatsActivities extends StatelessWidget { icon: icon, iconColor: TColor.white, iconBackground: TColor.secondaryColor1, - sizeIcon: 40.0, + sizeIcon: 30.0, ), - SizedBox(height: 40), // Espacement entre l'icône et le texte + SizedBox(height: 20), // Espacement entre l'icône et le texte Text( designation, - style: const TextStyle(fontSize: 15), + style: const TextStyle(fontSize: 12), textAlign: TextAlign.center, ), Text( value, style: const TextStyle( - fontSize: 20 , + fontSize: 17 , fontWeight: FontWeight.w800, ), textAlign: TextAlign.center, diff --git a/lib/main.dart b/lib/main.dart index 02e5c3d..9c78002 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -36,7 +36,7 @@ class MyApp extends StatelessWidget { // tested with just a hot reload. primaryColor: TColor.primaryColor1, fontFamily: "Poppins"), - home: const StatAtivities(), + home: const SignUpView(), //home: const ProfileView(), ); } diff --git a/lib/modele/manager_file.dart b/lib/modele/manager_file.dart index a4178d2..292f32c 100644 --- a/lib/modele/manager_file.dart +++ b/lib/modele/manager_file.dart @@ -14,6 +14,9 @@ class ManagerFile { final String _fieldAltitude = "altitude"; final String _fieldTotalStep = "total_strides"; final String _fieldTotalCalorie = "total_calories"; + final String _fieldTemperature = "temperature"; + + // -- Getter field String get fieldTimeStamp => _fieldTimestamp; String get fieldPositionLatitude => _fieldPositionLatitue; @@ -24,6 +27,8 @@ class ManagerFile { String get fieldAltitude => _fieldAltitude; String get fieldTotalStep => _fieldTotalStep; String get fieldTotalCalories => _fieldTotalCalorie; + String get fieldTemperature => _fieldTemperature; + List allowedFieldWalking = List.empty(growable: true); @@ -37,7 +42,8 @@ class ManagerFile { _fieldSpeed, _fieldAltitude, _fieldTotalStep, - _fieldTotalCalorie + _fieldTotalCalorie, + _fieldTemperature ]; } diff --git a/lib/modele/manager_selected_activity.dart b/lib/modele/manager_selected_activity.dart index 7fbe4e7..83fc73a 100644 --- a/lib/modele/manager_selected_activity.dart +++ b/lib/modele/manager_selected_activity.dart @@ -41,6 +41,7 @@ class ManagerSelectedActivity { return true; } + bool _notNull(int indexActivitySelected, int ligne, int colonne) { if (activitySelected[indexActivitySelected].contentActivity[ligne] [colonne] == @@ -138,6 +139,83 @@ class ManagerSelectedActivity { } return somme ~/ nb; } + double getAvgAltitude() { + double somme = 0; + int nb = 0; + for (int c = 0; c < activitySelected.length; c++) { + for (int i = 0; i < activitySelected[c].contentActivity.length; i++) { + if (_notNull(c, i, + activitySelected[c].enteteCSV["Value_${_managerFile.fieldAltitude}"]!)) { + somme += activitySelected[c].contentActivity[i][activitySelected[c] + .enteteCSV["Value_${_managerFile.fieldAltitude}"]!] ; + nb++; + } + } + } + double average = somme / nb; + return double.parse(average.toStringAsFixed(2)); + } + + double getAvgTemperature() { + double somme = 0; + int nb = 0; + for (int c = 0; c < activitySelected.length; c++) { + for (int i = 0; i < activitySelected[c].contentActivity.length; i++) { + if (_notNull(c, i, + activitySelected[c].enteteCSV["Value_${_managerFile.fieldTemperature}"]!)) { + somme += activitySelected[c].contentActivity[i][activitySelected[c] + .enteteCSV["Value_${_managerFile.fieldTemperature}"]!]; + nb++; + } + } + } + double average = somme / nb; + return double.parse(average.toStringAsFixed(2)); + } + + double getMaxTemperature() { + double max = 0; + for (int c = 0; c < activitySelected.length; c++) { + for (int i = 0; i < activitySelected[c].contentActivity.length; i++) { + if (_notNull(c, i, + activitySelected[c].enteteCSV["Value_${_managerFile.fieldTemperature}"]!)) { + double valueTmp = activitySelected[c].contentActivity[i] + [activitySelected[c].enteteCSV["Value_${_managerFile.fieldTemperature}"]!]; + if (valueTmp > max) { + max = valueTmp; + } + } + } + } + + return max; + } + + double getMinTemperature() { + double min = 5000; + for (int c = 0; c < activitySelected.length; c++) { + for (int i = 0; i < activitySelected[c].contentActivity.length; i++) { + if (_notNull( + c, + i, + activitySelected[c] + .enteteCSV["Value_${_managerFile.fieldTemperature}"]!)) { + double valueTmp = activitySelected[c] + .contentActivity[i][activitySelected[c] + .enteteCSV["Value_${_managerFile.fieldTemperature}"]!] + .toDouble(); + if (valueTmp < min) { + min = valueTmp; + } + } + } + } + return min; + } + + + + // -------------------------- FIN BPM ---------------------- // @@ -216,22 +294,36 @@ class ManagerSelectedActivity { // ------------------------- Time ----------------------------- // - int getTotalTime() { - for (int c = 0; c < activitySelected.length; c++) { - for (int i = activitySelected[c].contentActivity.length - 1; - i != 0; - i--) { + double getTotalTime() { + int timestampMax = 0; + int timestampMin = 0; + + for (int i = 0; i < activitySelected[0].contentActivity.length; i++) { if (_notNull( - c, + 0, i, - activitySelected[c] + activitySelected[0] .enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!)) { - return activitySelected[c].contentActivity[i][activitySelected[c] - .enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!]; + timestampMin = activitySelected[0].contentActivity[i][ + activitySelected[0] + .enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!]; + break; } + } + + for (int i = activitySelected[0].contentActivity.length - 1; i != 0; i--) { + if (_notNull( + 0, + i, + activitySelected[0] + .enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!)) { + timestampMax = activitySelected[0].contentActivity[i][ + activitySelected[0] + .enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!]; + break; } } - return 0; + return (timestampMax - timestampMin) / 1000; } // ---------------------------- FIN time -------------------- // @@ -350,6 +442,28 @@ class ManagerSelectedActivity { return max; } + double getMinSpeed() { + double min = 5000; + for (int c = 0; c < activitySelected.length; c++) { + for (int i = 0; i < activitySelected[c].contentActivity.length; i++) { + if (_notNull( + c, + i, + activitySelected[c] + .enteteCSV["Value_${_managerFile.fieldSpeed}"]!)) { + double valueTmp = activitySelected[c] + .contentActivity[i][activitySelected[c] + .enteteCSV["Value_${_managerFile.fieldSpeed}"]!] + .toDouble(); + if (valueTmp < min) { + min = valueTmp; + } + } + } + } + return min; + } + // Retourne avg Max (Fichier CSV) double getAvgSpeed() { double somme = 0; @@ -369,7 +483,8 @@ class ManagerSelectedActivity { } } - return somme / nb; + double average = somme / nb; + return double.parse(average.toStringAsFixed(2)); } // -------------------------- FIN Speed ---------------------- // diff --git a/lib/view/home/home_view.dart b/lib/view/home/home_view.dart index f4d98b2..399464f 100644 --- a/lib/view/home/home_view.dart +++ b/lib/view/home/home_view.dart @@ -4,10 +4,11 @@ import 'package:responsive_builder/responsive_builder.dart'; import 'package:smartfit_app_mobile/modele/user.dart'; import 'package:smartfit_app_mobile/view/home/mobile/mobile_homeview.dart'; import 'package:smartfit_app_mobile/view/home/no_activity_view.dart'; +import 'package:smartfit_app_mobile/view/home/stats_activities_view.dart'; import 'package:smartfit_app_mobile/view/home/web/web_homeview.dart'; class HomeView extends StatefulWidget { - const HomeView({super.key}); + const HomeView({Key? key}); @override State createState() => _HomeViewState(); @@ -16,18 +17,22 @@ class HomeView extends StatefulWidget { class _HomeViewState extends State { @override Widget build(BuildContext context) { - return context - .watch() - .managerSelectedActivity - .activitySelected - .isEmpty + final selectedActivitiesCount = context + .watch() + .managerSelectedActivity + .activitySelected + .length; + + return selectedActivitiesCount == 1 ? ScreenTypeLayout.builder( - mobile: (_) => const NoActivityView(), - desktop: (_) => const NoActivityView(), - ) - : ScreenTypeLayout.builder( mobile: (_) => const MobileHomeView(), desktop: (_) => const WebHomeView(), - ); + ) + : selectedActivitiesCount > 1 + ? const StatAtivities() + : ScreenTypeLayout.builder( + mobile: (_) => const NoActivityView(), + desktop: (_) => const NoActivityView(), + ); } } diff --git a/lib/view/home/stats_activities_view.dart b/lib/view/home/stats_activities_view.dart index 59bbf80..a9916e2 100644 --- a/lib/view/home/stats_activities_view.dart +++ b/lib/view/home/stats_activities_view.dart @@ -1,13 +1,8 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:smartfit_app_mobile/common_widget/container/container_stats_activities.dart'; -import 'package:smartfit_app_mobile/common_widget/container/ligne_container_stats.dart'; -import 'package:smartfit_app_mobile/common_widget/graph/altitude_by_time.dart'; -import 'package:smartfit_app_mobile/common_widget/graph/bpm_and_speed_by_time.dart'; -import 'package:smartfit_app_mobile/common_widget/graph/bpm_by_time.dart'; import 'package:smartfit_app_mobile/common_widget/other/entete_home_view.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; -import 'package:smartfit_app_mobile/modele/manager_selected_activity.dart'; import 'package:smartfit_app_mobile/modele/user.dart'; import 'package:smartfit_app_mobile/modele/utile/home_view/data_home_view.dart'; import 'package:smartfit_app_mobile/modele/utile/home_view/home_view_util.dart'; @@ -27,6 +22,30 @@ class _StatAtivities extends State { Widget build(BuildContext context) { var media = MediaQuery.of(context).size; data = HomeViewUtil().initData(context); + int maxBpm = context.watch().managerSelectedActivity.getMaxBpm(); + int avgBpm = context.watch().managerSelectedActivity.getAvgBpm(); + double getTotalDistance = context.watch().managerSelectedActivity.getTotalDistance(); + int totalSteps = context.watch().managerSelectedActivity.getTotalSteps(); + double totalTime = context.watch().managerSelectedActivity.getTotalTime(); + int totalCalories = context.watch().managerSelectedActivity.getCalorie(); + double avgSpeed = context.watch().managerSelectedActivity.getAvgSpeed(); + double avgAltitude = context.watch().managerSelectedActivity.getAvgAltitude(); + double avgTemperature = context.watch().managerSelectedActivity.getAvgTemperature(); + double maxAltitude = context.watch().managerSelectedActivity.getAvgTemperature(); + double maxTemperature = context.watch().managerSelectedActivity.getMaxTemperature(); + double maxSpeed = context.watch().managerSelectedActivity.getMaxSpeed(); + double minSpeed = context.watch().managerSelectedActivity.getMinSpeed(); + double minAltitude = context.watch().managerSelectedActivity.getMinAltitude(); + double minTemperature = context.watch().managerSelectedActivity.getMinTemperature(); + int minBpm = context.watch().managerSelectedActivity.getMinBpm(); + + + + print(avgTemperature); + print(avgAltitude); + + + return Scaffold( backgroundColor: TColor.white, @@ -37,6 +56,9 @@ class _StatAtivities extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ + SizedBox( + height: media.width * 0.03, + ), const EnteteHomeView(), SizedBox( height: media.width * 0.05, @@ -55,9 +77,48 @@ class _StatAtivities extends State { Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - ContainerStatsActivities("10 BPM","Moyenne Bpm", Icons.favorite), - SizedBox(width: media.width *0.05,), - ContainerStatsActivities("10 m/s","Moyenne vitesse", Icons.bolt) + ContainerStatsActivities("$avgBpm BPM","Moyenne Bpm", Icons.favorite), + SizedBox(width: media.width *0.03,), + ContainerStatsActivities("$maxBpm BPM","Maximum Bpm", Icons.trending_up), + SizedBox(width: media.width *0.03,), + ContainerStatsActivities("$minBpm BPM","Minimum Bpm", Icons.trending_down) + ],), + SizedBox( + height: media.width * 0.03, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + ContainerStatsActivities("$avgSpeed m/s","Moyenne vitesse", Icons.bolt), + SizedBox(width: media.width *0.03,), + ContainerStatsActivities("$maxSpeed m/s","Maximum vitesse", Icons.trending_up), + SizedBox(width: media.width *0.03,), + ContainerStatsActivities("$minSpeed m/s","Minimum vitesse", Icons.trending_down) + ],), + SizedBox( + height: media.width * 0.03, + ), + + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + ContainerStatsActivities("$avgTemperature °C","Moyenne Temperature", Icons.thermostat), + SizedBox(width: media.width *0.03,), + ContainerStatsActivities("$maxTemperature °C","Maximum Temperature", Icons.trending_up), + SizedBox(width: media.width *0.03,), + ContainerStatsActivities("$minTemperature °C","Minimum Temperature", Icons.trending_down) + ],), + SizedBox( + height: media.width * 0.03, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + ContainerStatsActivities("$avgAltitude m","Moyenne Altitude", Icons.landscape), + SizedBox(width: media.width *0.03,), + ContainerStatsActivities("$maxAltitude m","Maximum Altitude", Icons.trending_up), + SizedBox(width: media.width *0.03,), + ContainerStatsActivities("$minAltitude m","Minimum Altitude", Icons.trending_down) ],), SizedBox( height: media.width * 0.03, @@ -65,10 +126,22 @@ class _StatAtivities extends State { Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - ContainerStatsActivities("400 m","Moyenne Altitude", Icons.landscape), - SizedBox(width: media.width *0.05,), - ContainerStatsActivities("10 °C","Moyenne degrès", Icons.thermostat) + ContainerStatsActivities("$getTotalDistance m","Distance Totale", Icons.double_arrow), + SizedBox(width: media.width *0.03,), + ContainerStatsActivities("$totalSteps","Total Pas", Icons.do_not_step_rounded), ],), + SizedBox( + height: media.width * 0.03, + ),Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + ContainerStatsActivities("$totalTime s","Temps Total", Icons.timer), + SizedBox(width: media.width *0.03,), + ContainerStatsActivities("$totalCalories kCal","Calories Dépensées", Icons.local_fire_department), + ],), + SizedBox( + height: media.width * 0.03, + ), ], ), ),