From 4df9430b3caf8ec48694ed54d4ef362f91b1cf12 Mon Sep 17 00:00:00 2001 From: Enzo Date: Tue, 28 Nov 2023 16:20:55 +0100 Subject: [PATCH 1/3] =?UTF-8?q?avancement=20sur=20data=20plusieur=20activi?= =?UTF-8?q?t=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/common_widget/graph/graph.dart | 2 +- .../graph/mobile/mobile_altitude_by_time.dart | 7 +- .../mobile/mobile_bpm_and_speed_by_time.dart | 33 +- .../graph/mobile/mobile_bpm_by_time.dart | 10 +- .../graph/web/web_altitude_by_time.dart | 10 +- .../graph/web/web_bpm_and_speed_by_time.dart | 49 ++- .../graph/web/web_bpm_by_time.dart | 10 +- lib/common_widget/info.dart | 2 +- lib/common_widget/stats.dart | 6 +- lib/common_widget/steps.dart | 2 +- lib/modele/activity.dart | 279 +--------------- lib/modele/manager_file.dart | 4 +- lib/modele/manager_selected_activity.dart | 297 ++++++++++++++++++ lib/modele/user.dart | 3 +- .../utile/home_view/home_view_util.dart | 18 +- .../list_activity/list_activity_utile.dart | 16 +- lib/modele/utile/maps/maps_utile.dart | 2 +- lib/view/activity/activity.dart | 6 +- .../activity/mobile/mobile_list_activity.dart | 26 +- lib/view/activity/web/web_list_activity.dart | 4 +- lib/view/home/home_view.dart | 6 +- lib/view/home/mobile/mobile_homeview.dart | 18 +- lib/view/home/web/web_homeview.dart | 18 +- lib/view/map/my_map.dart | 6 +- lib/view/test/page_test.dart | 14 +- 25 files changed, 444 insertions(+), 404 deletions(-) create mode 100644 lib/modele/manager_selected_activity.dart diff --git a/lib/common_widget/graph/graph.dart b/lib/common_widget/graph/graph.dart index 3c92b47..ee34f2f 100644 --- a/lib/common_widget/graph/graph.dart +++ b/lib/common_widget/graph/graph.dart @@ -46,7 +46,7 @@ class _GraphAreaState extends State @override Widget build(BuildContext context) { List vitesseSecondes = Provider.of(context, listen: false) - .listActivity[0] + .managerSelectedActivity .getSpeedWithTimeActivity(); return GestureDetector( diff --git a/lib/common_widget/graph/mobile/mobile_altitude_by_time.dart b/lib/common_widget/graph/mobile/mobile_altitude_by_time.dart index d484510..da7691c 100644 --- a/lib/common_widget/graph/mobile/mobile_altitude_by_time.dart +++ b/lib/common_widget/graph/mobile/mobile_altitude_by_time.dart @@ -13,16 +13,17 @@ class MobileGraphAltitudeByTime extends StatefulWidget { : super(key: key); @override - State createState() => _MobileGraphAltitudeByTime(); + State createState() => + _MobileGraphAltitudeByTime(); } class _MobileGraphAltitudeByTime extends State { @override Widget build(BuildContext context) { final double maxY = - context.watch().listActivity[0].getMaxAltitude() + 2; + context.watch().managerSelectedActivity.getMaxAltitude() + 2; final double minY = - context.watch().listActivity[0].getMinAltitude() - 2; + context.watch().managerSelectedActivity.getMinAltitude() - 2; final lineBarsData = [ LineChartBarData( diff --git a/lib/common_widget/graph/mobile/mobile_bpm_and_speed_by_time.dart b/lib/common_widget/graph/mobile/mobile_bpm_and_speed_by_time.dart index de15c57..6cc203f 100644 --- a/lib/common_widget/graph/mobile/mobile_bpm_and_speed_by_time.dart +++ b/lib/common_widget/graph/mobile/mobile_bpm_and_speed_by_time.dart @@ -13,10 +13,12 @@ class MobileGraphBpmAndSpeedByTime extends StatefulWidget { : super(key: key); @override - State createState() => _MobileGraphBpmAndSpeedByTime(); + State createState() => + _MobileGraphBpmAndSpeedByTime(); } -class _MobileGraphBpmAndSpeedByTime extends State { +class _MobileGraphBpmAndSpeedByTime + extends State { TextEditingController bpmController = TextEditingController(); List showingTooltipOnSpots = [0]; @@ -96,15 +98,13 @@ class _MobileGraphBpmAndSpeedByTime extends State @override Widget build(BuildContext context) { - - final double maxY = - context.watch().listActivity[0].getMaxBpm() + 2; + final double maxY = + context.watch().managerSelectedActivity.getMaxBpm() + 2; final double minY = - context.watch().listActivity[0].getMinBpm() - 2; + context.watch().managerSelectedActivity.getMinBpm() - 2; final double maxX = widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x; - final double minX = - 0.0; + final double minX = 0.0; final lineBarsData = [ LineChartBarData( spots: widget.data.bpmSecondes, @@ -188,7 +188,7 @@ class _MobileGraphBpmAndSpeedByTime extends State getTooltipItems: (List lineBarsSpot) { return lineBarsSpot.map((lineBarSpot) { return LineTooltipItem( - "Seconde ${lineBarSpot.x.toInt() } ", + "Seconde ${lineBarSpot.x.toInt()} ", const TextStyle( color: Colors.white, fontSize: 10, @@ -208,13 +208,14 @@ class _MobileGraphBpmAndSpeedByTime extends State topTitles: const AxisTitles(), bottomTitles: const AxisTitles(), rightTitles: AxisTitles( - sideTitles: SideTitles( - reservedSize: 70, - showTitles: true, - getTitlesWidget: (value, meta) { - return Text("${double.parse(value.toStringAsFixed(2))} BPM"); - }, - ))), + sideTitles: SideTitles( + reservedSize: 70, + showTitles: true, + getTitlesWidget: (value, meta) { + return Text( + "${double.parse(value.toStringAsFixed(2))} BPM"); + }, + ))), gridData: FlGridData( drawVerticalLine: true, drawHorizontalLine: true, diff --git a/lib/common_widget/graph/mobile/mobile_bpm_by_time.dart b/lib/common_widget/graph/mobile/mobile_bpm_by_time.dart index 6f52792..93690ae 100644 --- a/lib/common_widget/graph/mobile/mobile_bpm_by_time.dart +++ b/lib/common_widget/graph/mobile/mobile_bpm_by_time.dart @@ -9,8 +9,7 @@ class MobileBpmByTime extends StatefulWidget { final Size media; final DataHomeView data; - const MobileBpmByTime(this.media, this.data, {Key? key}) - : super(key: key); + const MobileBpmByTime(this.media, this.data, {Key? key}) : super(key: key); @override State createState() => _MobileBpmByTime(); @@ -20,13 +19,12 @@ class _MobileBpmByTime extends State { @override Widget build(BuildContext context) { final double maxY = - context.watch().listActivity[0].getMaxBpm() + 2; + context.watch().managerSelectedActivity.getMaxBpm() + 2; final double minY = - context.watch().listActivity[0].getMinBpm() - 2; + context.watch().managerSelectedActivity.getMinBpm() - 2; final double maxX = widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x; - final double minX = - 0.0; + final double minX = 0.0; final lineBarsData = [ LineChartBarData( spots: widget.data.bpmSecondes, diff --git a/lib/common_widget/graph/web/web_altitude_by_time.dart b/lib/common_widget/graph/web/web_altitude_by_time.dart index f97d933..636d9ac 100644 --- a/lib/common_widget/graph/web/web_altitude_by_time.dart +++ b/lib/common_widget/graph/web/web_altitude_by_time.dart @@ -21,12 +21,11 @@ class _WebGraphAltitudeByTime extends State { Widget build(BuildContext context) { final double maxX = widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x; - final double minX = - 0.0; + final double minX = 0.0; final double maxY = - context.watch().listActivity[0].getMaxAltitude() + 2; + context.watch().managerSelectedActivity.getMaxAltitude() + 2; final double minY = - context.watch().listActivity[0].getMinAltitude() - 2; + context.watch().managerSelectedActivity.getMinAltitude() - 2; final lineBarsData = [ LineChartBarData( @@ -65,7 +64,8 @@ class _WebGraphAltitudeByTime extends State { reservedSize: 20, showTitles: true, getTitlesWidget: (value, meta) { - return Text("${double.parse((value/10).toStringAsFixed(2))}s"); + return Text( + "${double.parse((value / 10).toStringAsFixed(2))}s"); }, )), rightTitles: AxisTitles( diff --git a/lib/common_widget/graph/web/web_bpm_and_speed_by_time.dart b/lib/common_widget/graph/web/web_bpm_and_speed_by_time.dart index 3965178..5cf6c2a 100644 --- a/lib/common_widget/graph/web/web_bpm_and_speed_by_time.dart +++ b/lib/common_widget/graph/web/web_bpm_and_speed_by_time.dart @@ -13,7 +13,8 @@ class WebGraphBpmAndSpeedByTime extends StatefulWidget { : super(key: key); @override - State createState() => _WebGraphBpmAndSpeedByTime(); + State createState() => + _WebGraphBpmAndSpeedByTime(); } class _WebGraphBpmAndSpeedByTime extends State { @@ -77,7 +78,6 @@ class _WebGraphBpmAndSpeedByTime extends State { dotData: const FlDotData(show: false), belowBarData: BarAreaData(show: false), spots: widget.data.vitesseSecondes, - ); LineChartBarData get lineChartBarData1_2 => LineChartBarData( @@ -97,19 +97,17 @@ class _WebGraphBpmAndSpeedByTime extends State { @override Widget build(BuildContext context) { - - final double maxY = - context.watch().listActivity[0].getMaxBpm() + 2; + final double maxY = + context.watch().managerSelectedActivity.getMaxBpm() + 2; final double minY = - context.watch().listActivity[0].getMinBpm() - 2; + context.watch().managerSelectedActivity.getMinBpm() - 2; final double maxY1 = - context.watch().listActivity[0].getMaxBpm() + 2; + context.watch().managerSelectedActivity.getMaxBpm() + 2; final double minY2 = - context.watch().listActivity[0].getMinBpm() - 2; + context.watch().managerSelectedActivity.getMinBpm() - 2; final double maxX = widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x; - final double minX = - 0.0; + final double minX = 0.0; final lineBarsData = [ LineChartBarData( @@ -127,7 +125,6 @@ class _WebGraphBpmAndSpeedByTime extends State { gradient: LinearGradient( colors: TColor.secondaryG, ), - ), ]; final tooltipsOnBar = lineBarsData[0]; @@ -216,21 +213,23 @@ class _WebGraphBpmAndSpeedByTime extends State { ), topTitles: const AxisTitles(), bottomTitles: AxisTitles( - sideTitles: SideTitles( - reservedSize: 20, - showTitles: true, - getTitlesWidget: (value, meta) { - return Text("${double.parse((value/10).toStringAsFixed(2))}s"); - }, - )), + sideTitles: SideTitles( + reservedSize: 20, + showTitles: true, + getTitlesWidget: (value, meta) { + return Text( + "${double.parse((value / 10).toStringAsFixed(2))}s"); + }, + )), rightTitles: AxisTitles( - sideTitles: SideTitles( - reservedSize: 70, - showTitles: true, - getTitlesWidget: (value, meta) { - return Text("${double.parse(value.toStringAsFixed(2))} BPM"); - }, - ))), + sideTitles: SideTitles( + reservedSize: 70, + showTitles: true, + getTitlesWidget: (value, meta) { + return Text( + "${double.parse(value.toStringAsFixed(2))} BPM"); + }, + ))), gridData: FlGridData( drawVerticalLine: true, drawHorizontalLine: true, diff --git a/lib/common_widget/graph/web/web_bpm_by_time.dart b/lib/common_widget/graph/web/web_bpm_by_time.dart index 95938a6..b39cab2 100644 --- a/lib/common_widget/graph/web/web_bpm_by_time.dart +++ b/lib/common_widget/graph/web/web_bpm_by_time.dart @@ -9,8 +9,7 @@ class WebBpmByTime extends StatefulWidget { final Size media; final DataHomeView data; - const WebBpmByTime(this.media, this.data, {Key? key}) - : super(key: key); + const WebBpmByTime(this.media, this.data, {Key? key}) : super(key: key); @override State createState() => _WebBpmByTime(); @@ -20,13 +19,12 @@ class _WebBpmByTime extends State { @override Widget build(BuildContext context) { final double maxY = - context.watch().listActivity[0].getMaxBpm() + 2; + context.watch().managerSelectedActivity.getMaxBpm() + 2; final double minY = - context.watch().listActivity[0].getMinBpm() - 2; + context.watch().managerSelectedActivity.getMinBpm() - 2; final double maxX = widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x; - final double minX = - 0.0; + final double minX = 0.0; final lineBarsData = [ LineChartBarData( spots: widget.data.bpmSecondes, diff --git a/lib/common_widget/info.dart b/lib/common_widget/info.dart index ac0ff16..d17ad64 100644 --- a/lib/common_widget/info.dart +++ b/lib/common_widget/info.dart @@ -8,7 +8,7 @@ class Info extends StatelessWidget { @override Widget build(BuildContext context) { String distance = Provider.of(context, listen: false) - .listActivity[0] + .managerSelectedActivity .getTotalDistance() .toString(); diff --git a/lib/common_widget/stats.dart b/lib/common_widget/stats.dart index e32cb09..dc6f72c 100644 --- a/lib/common_widget/stats.dart +++ b/lib/common_widget/stats.dart @@ -9,15 +9,15 @@ class Stats extends StatelessWidget { @override Widget build(BuildContext context) { String calories = Provider.of(context, listen: false) - .listActivity[0] + .managerSelectedActivity .getCalorie() .toString(); String heartrate = Provider.of(context, listen: false) - .listActivity[0] + .managerSelectedActivity .getAvgBpm() .toString(); String time = Provider.of(context, listen: false) - .listActivity[0] + .managerSelectedActivity .getTotalTime() .toString(); return Column( diff --git a/lib/common_widget/steps.dart b/lib/common_widget/steps.dart index bbf770f..6bcb530 100644 --- a/lib/common_widget/steps.dart +++ b/lib/common_widget/steps.dart @@ -8,7 +8,7 @@ class Steps extends StatelessWidget { @override Widget build(BuildContext context) { String steps = Provider.of(context, listen: false) - .listActivity[0] + .managerSelectedActivity .getTotalSteps() .toString(); diff --git a/lib/modele/activity.dart b/lib/modele/activity.dart index 391afa7..2252632 100644 --- a/lib/modele/activity.dart +++ b/lib/modele/activity.dart @@ -1,8 +1,3 @@ -import 'package:fl_chart/fl_chart.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; -import 'package:smartfit_app_mobile/common_widget/graph/graph.dart'; -import 'package:smartfit_app_mobile/modele/manager_file.dart'; - class ActivityOfUser { // A afficher late String _categorie; @@ -11,25 +6,24 @@ class ActivityOfUser { late String _nameFile; // ------------ // late String _imageName; - late List> _contentActivity; - Map enteteCSV = {}; - // ManagerFile for the field - final ManagerFile _managerFile = ManagerFile(); + List> _contentActivity = List.empty(growable: true); + Map _enteteCSV = {}; - // -- Getter/Setter -- // + String get fileUuid => _fileUuid; + String get nameFile => _nameFile; + Map get enteteCSV => _enteteCSV; + + // -- Getter/Setter -- Ancien // List> get contentActivity => _contentActivity; set contentActivity(List> content) { _contentActivity = content; for (int i = 0; i < content.first.length; i++) { - enteteCSV.addAll({content.first[i]: i}); + _enteteCSV.addAll({content.first[i]: i}); } _contentActivity.removeAt(0); } - String get fileUuid => _fileUuid; - String get nameFile => _nameFile; - ActivityOfUser( String date, String categorie, String fileUuid, String nameFile) { _categorie = categorie; @@ -46,263 +40,6 @@ class ActivityOfUser { } } -// -- func utile -- // - bool notNull(int ligne, int colonne) { - if (_contentActivity[ligne][colonne] == "null") { - return false; - } - return true; - } - -// ----------------- X WithTime ------------ // - - List getXWithTime(String field) { - List result = List.empty(growable: true); - - int firstTimestamp = 0; - - for (int i = 0; i < contentActivity.length; i++) { - if (notNull(i, enteteCSV["Value_$field"]!)) { - if (firstTimestamp == 0) { - firstTimestamp = contentActivity[i] - [enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!]; - } - result.add(FlSpot( - (((contentActivity[i][enteteCSV[ - "Value_${_managerFile.fieldTimeStamp}"]!]) - - firstTimestamp) ~/ - 100) - .toDouble(), - contentActivity[i][enteteCSV["Value_$field"]!].toDouble())); - } - } - return result; - } - -// ----------------- BPM ------------------ // - - // Retourne le BPM Max (Fichier CSV) - int getMaxBpm() { - int max = 0; - for (int i = 0; i < contentActivity.length; i++) { - if (notNull(i, enteteCSV["Value_${_managerFile.fielBPM}"]!)) { - int valueTmp = - contentActivity[i][enteteCSV["Value_${_managerFile.fielBPM}"]!]; - if (valueTmp > max) { - max = valueTmp; - } - } - } - return max; - } - -// Retourne le BPM Min (Fichier CSV) - int getMinBpm() { - int min = 300; - for (int i = 0; i < contentActivity.length; i++) { - if (notNull(i, enteteCSV["Value_${_managerFile.fielBPM}"]!)) { - int valueTmp = - contentActivity[i][enteteCSV["Value_${_managerFile.fielBPM}"]!]; - if (valueTmp < min) { - min = valueTmp; - } - } - } - return min; - } - - // Retourne le BPM avg (Fichier CSV) - int getAvgBpm() { - int somme = 0; - int nb = 0; - for (int i = 0; i < contentActivity.length; i++) { - if (notNull(i, enteteCSV["Value_${_managerFile.fielBPM}"]!)) { - somme += contentActivity[i][enteteCSV["Value_${_managerFile.fielBPM}"]!] - as int; - nb++; - } - } - return somme ~/ nb; - } - - // -------------------------- FIN BPM ---------------------- // - - // ---------------------- Distance ---------------------- // - - double getTotalDistance() { - double max = 0; - for (int i = contentActivity.length - 1; i != 0; i--) { - if (notNull(i, enteteCSV["Value_${_managerFile.fieldDistance}"]!)) { - double valueTmp = contentActivity[i] - [enteteCSV["Value_${_managerFile.fieldDistance}"]!] - .toDouble(); - if (valueTmp > max) { - max = valueTmp; - } - } - } - return max; - } - - // ---------------------- FIN Distance ---------------------- // - - // ---------------------- Calories ---------------------- // - int getCalorie() { - for (int i = contentActivity.length - 1; i != 0; i--) { - if (notNull(i, enteteCSV["Value_${_managerFile.fieldTotalCalories}"]!)) { - return contentActivity[i] - [enteteCSV["Value_${_managerFile.fieldTotalCalories}"]!] as int; - } - } - return 0; - } - - // ---------------------- FIN Calories ---------------------- // - - // ---------------------- Step ------------------------------// - - int getTotalSteps() { - for (int i = contentActivity.length - 1; i != 0; i--) { - if (notNull(i, enteteCSV["Value_${_managerFile.fieldTotalStep}"]!)) { - return contentActivity[i] - [enteteCSV["Value_${_managerFile.fieldTotalStep}"]!] - .toInt(); - } - } - return 0; - } - // ----------------------- FIN Step ------------------------ // - - // ------------------------- Time ----------------------------- // - - int getTotalTime() { - for (int i = contentActivity.length - 1; i != 0; i--) { - if (notNull(i, enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!)) { - return contentActivity[i] - [enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!]; - } - } - return 0; - return 0; - } - // ---------------------------- FIN time -------------------- // - - // ---------------------------------------- Altitude -------------------- // - - // --- Fichier CSV --- // - double getMaxAltitude() { - double max = 0; - for (int i = 0; i < contentActivity.length; i++) { - if (notNull(i, enteteCSV["Value_${_managerFile.fieldAltitude}"]!)) { - double valueTmp = contentActivity[i] - [enteteCSV["Value_${_managerFile.fieldAltitude}"]!] - .toDouble(); - if (valueTmp > max) { - max = valueTmp; - } - } - } - return max; - } - - // --- Fichier CSV --- // - double getMinAltitude() { - double min = 5000; - for (int i = 0; i < contentActivity.length; i++) { - if (notNull(i, enteteCSV["Value_${_managerFile.fieldAltitude}"]!)) { - double valueTmp = contentActivity[i] - [enteteCSV["Value_${_managerFile.fieldAltitude}"]!] - .toDouble(); - if (valueTmp < min) { - min = valueTmp; - } - } - } - return min; - } - - // -------------------------- FIN altitude ---------------------- // - - // -------------------------- Speed ---------------------- // - - // -- CSV -- // - List getSpeedWithTimeActivity() { - List result = List.empty(growable: true); - int firstTimestamp = 0; - - for (int i = 0; i < contentActivity.length; i++) { - if (notNull(i, enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!) && - notNull(i, enteteCSV["Value_${_managerFile.fieldSpeed}"]!)) { - if (firstTimestamp == 0) { - firstTimestamp = contentActivity[i] - [enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!]; - } - result.add(DataPoint( - (((contentActivity[i][enteteCSV[ - "Value_${_managerFile.fieldTimeStamp}"]!]) - - firstTimestamp) ~/ - 100) - .toDouble(), - contentActivity[i][enteteCSV["Value_${_managerFile.fieldSpeed}"]!] - .toDouble())); - } - } - return result; - } - - // Retourne la Speed Max (Fichier CSV) - double getMaxSpeed() { - double max = 0.00; - for (int i = 0; i < contentActivity.length; i++) { - if (notNull(i, enteteCSV["Value_${_managerFile.fieldSpeed}"]!)) { - double valueTmp = contentActivity[i] - [enteteCSV["Value_${_managerFile.fieldSpeed}"]!] - .toDouble(); - if (valueTmp > max) { - max = valueTmp; - } - } - } - return max; - } - - // Retourne avg Max (Fichier CSV) - double getAvgSpeed() { - double somme = 0; - int nb = 0; - for (int i = 0; i < contentActivity.length; i++) { - if (notNull(i, enteteCSV["Value_${_managerFile.fieldSpeed}"]!)) { - somme += - contentActivity[i][enteteCSV["Value_${_managerFile.fieldSpeed}"]!]; - nb++; - } - } - return somme / nb; - } - - // -------------------------- FIN Speed ---------------------- // - - // -------------------------- Localisation ------------------- // - - // Retourne les positions (Fichier CSV) - List getPosition() { - List list = List.empty(growable: true); - - for (int i = 0; i < contentActivity.length; i++) { - if (notNull( - i, enteteCSV["Value_${_managerFile.fieldPositionLatitude}"]!) && - notNull( - i, enteteCSV["Value_${_managerFile.fieldPositionLongitude}"]!)) { - list.add(LatLng( - contentActivity[i] - [enteteCSV["Value_${_managerFile.fieldPositionLatitude}"]!], - contentActivity[i] - [enteteCSV["Value_${_managerFile.fieldPositionLongitude}"]!])); - } - } - return list; - } - // -------------------------- FIN Localisation ---------------------- // Map toMap() { diff --git a/lib/modele/manager_file.dart b/lib/modele/manager_file.dart index 512c7e4..a4178d2 100644 --- a/lib/modele/manager_file.dart +++ b/lib/modele/manager_file.dart @@ -2,7 +2,6 @@ import 'dart:convert'; import 'dart:typed_data'; import 'package:csv/csv.dart'; import 'package:fit_tool/fit_tool.dart'; -import 'package:path_provider/path_provider.dart'; class ManagerFile { // -- Field @@ -108,11 +107,12 @@ class ManagerFile { return const CsvToListConverter().convert(utf8.decode(bytes)); } + /* // ------------- Get The path of application --- // Future get localPath async { final directory = await getApplicationDocumentsDirectory(); return directory.path; - } + }*/ /* // ----- Read csv File ------- // diff --git a/lib/modele/manager_selected_activity.dart b/lib/modele/manager_selected_activity.dart new file mode 100644 index 0000000..7f6fa48 --- /dev/null +++ b/lib/modele/manager_selected_activity.dart @@ -0,0 +1,297 @@ +import 'package:fl_chart/fl_chart.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:smartfit_app_mobile/common_widget/graph/graph.dart'; +import 'package:smartfit_app_mobile/modele/activity.dart'; +import 'package:smartfit_app_mobile/modele/manager_file.dart'; + +class ManagerSelectedActivity { + final ManagerFile _managerFile = ManagerFile(); + List activitySelected = List.empty(growable: true); + + bool addSelectedActivity(ActivityOfUser activityOfUser) { + // Chercher le contenu du fichier + // Regarder si l'entete est la même + // Supprimer l'entete + return true; + } + + // ---- Function utile ---- // + // -- func utile -- // + bool _notNull(int indexActivitySelected, int ligne, int colonne) { + if (activitySelected[indexActivitySelected].contentActivity[ligne] + [colonne] == + "null") { + return false; + } + return true; + } + // ------------------- Fonction pour calcul --------- // + // ----------------- X WithTime ------------ // + + List getXWithTime(String field) { + List result = List.empty(growable: true); + + int firstTimestamp = 0; + + for (int i = 0; i < activity.contentActivity.length; i++) { + if (_notNull( + activity.contentActivity, i, activity.enteteCSV["Value_$field"]!)) { + if (firstTimestamp == 0) { + firstTimestamp = activity.contentActivity[i] + [activity.enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!]; + } + result.add(FlSpot( + (((activity.contentActivity[i][activity.enteteCSV[ + "Value_${_managerFile.fieldTimeStamp}"]!]) - + firstTimestamp) ~/ + 100) + .toDouble(), + activity.contentActivity[i][activity.enteteCSV["Value_$field"]!] + .toDouble())); + } + } + return result; + } + +// ----------------- BPM ------------------ // + + // Retourne le BPM Max (Fichier CSV) + int getMaxBpm() { + int max = 0; + for (int i = 0; i < activity.contentActivity.length; i++) { + if (_notNull(activity.contentActivity, i, + activity.enteteCSV["Value_${_managerFile.fielBPM}"]!)) { + int valueTmp = activity.contentActivity[i] + [activity.enteteCSV["Value_${_managerFile.fielBPM}"]!]; + if (valueTmp > max) { + max = valueTmp; + } + } + } + return max; + } + +// Retourne le BPM Min (Fichier CSV) + int getMinBpm() { + int min = 300; + for (int i = 0; i < activity.contentActivity.length; i++) { + if (_notNull(activity.contentActivity, i, + activity.enteteCSV["Value_${_managerFile.fielBPM}"]!)) { + int valueTmp = activity.contentActivity[i] + [activity.enteteCSV["Value_${_managerFile.fielBPM}"]!]; + if (valueTmp < min) { + min = valueTmp; + } + } + } + return min; + } + + // Retourne le BPM avg (Fichier CSV) + int getAvgBpm() { + int somme = 0; + int nb = 0; + for (int i = 0; i < contentActivity.length; i++) { + if (_notNull( + contentActivity, i, enteteCSV["Value_${_managerFile.fielBPM}"]!)) { + somme += contentActivity[i][enteteCSV["Value_${_managerFile.fielBPM}"]!] + as int; + nb++; + } + } + return somme ~/ nb; + } + + // -------------------------- FIN BPM ---------------------- // + + // ---------------------- Distance ---------------------- // + + double getTotalDistance() { + double max = 0; + for (int i = contentActivity.length - 1; i != 0; i--) { + if (_notNull(contentActivity, i, + enteteCSV["Value_${_managerFile.fieldDistance}"]!)) { + double valueTmp = contentActivity[i] + [enteteCSV["Value_${_managerFile.fieldDistance}"]!] + .toDouble(); + if (valueTmp > max) { + max = valueTmp; + } + } + } + return max; + } + + // ---------------------- FIN Distance ---------------------- // + + // ---------------------- Calories ---------------------- // + int getCalorie() { + for (int i = contentActivity.length - 1; i != 0; i--) { + if (_notNull(contentActivity, i, + enteteCSV["Value_${_managerFile.fieldTotalCalories}"]!)) { + return contentActivity[i] + [enteteCSV["Value_${_managerFile.fieldTotalCalories}"]!] as int; + } + } + return 0; + } + + // ---------------------- FIN Calories ---------------------- // + // ---------------------- Step ------------------------------// + + int getTotalSteps() { + for (int i = contentActivity.length - 1; i != 0; i--) { + if (_notNull(contentActivity, i, + enteteCSV["Value_${_managerFile.fieldTotalStep}"]!)) { + return contentActivity[i] + [enteteCSV["Value_${_managerFile.fieldTotalStep}"]!] + .toInt(); + } + } + return 0; + } + // ----------------------- FIN Step ------------------------ // + + // ------------------------- Time ----------------------------- // + + int getTotalTime() { + for (int i = contentActivity.length - 1; i != 0; i--) { + if (_notNull(contentActivity, i, + enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!)) { + return contentActivity[i] + [enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!]; + } + } + return 0; + } + // ---------------------------- FIN time -------------------- // + + // ---------------------------------------- Altitude -------------------- // + + // --- Fichier CSV --- // + double getMaxAltitude() { + double max = 0; + for (int i = 0; i < contentActivity.length; i++) { + if (_notNull(contentActivity, i, + enteteCSV["Value_${_managerFile.fieldAltitude}"]!)) { + double valueTmp = contentActivity[i] + [enteteCSV["Value_${_managerFile.fieldAltitude}"]!] + .toDouble(); + if (valueTmp > max) { + max = valueTmp; + } + } + } + return max; + } + + // --- Fichier CSV --- // + double getMinAltitude() { + double min = 5000; + for (int i = 0; i < contentActivity.length; i++) { + if (_notNull(contentActivity, i, + enteteCSV["Value_${_managerFile.fieldAltitude}"]!)) { + double valueTmp = contentActivity[i] + [enteteCSV["Value_${_managerFile.fieldAltitude}"]!] + .toDouble(); + if (valueTmp < min) { + min = valueTmp; + } + } + } + return min; + } + + // -------------------------- FIN altitude ---------------------- // + + // -------------------------- Speed ---------------------- // + + // -- CSV -- // + List getSpeedWithTimeActivity() { + List result = List.empty(growable: true); + int firstTimestamp = 0; + + for (int i = 0; i < contentActivity.length; i++) { + if (_notNull(contentActivity, i, + enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!) && + notNull(contentActivity, i, + enteteCSV["Value_${_managerFile.fieldSpeed}"]!)) { + if (firstTimestamp == 0) { + firstTimestamp = contentActivity[i] + [enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!]; + } + result.add(DataPoint( + (((contentActivity[i][enteteCSV[ + "Value_${_managerFile.fieldTimeStamp}"]!]) - + firstTimestamp) ~/ + 100) + .toDouble(), + contentActivity[i][enteteCSV["Value_${_managerFile.fieldSpeed}"]!] + .toDouble())); + } + } + return result; + } + + // Retourne la Speed Max (Fichier CSV) + double getMaxSpeed() { + double max = 0.00; + for (int i = 0; i < contentActivity.length; i++) { + if (_notNull( + contentActivity, i, enteteCSV["Value_${_managerFile.fieldSpeed}"]!)) { + double valueTmp = contentActivity[i] + [enteteCSV["Value_${_managerFile.fieldSpeed}"]!] + .toDouble(); + if (valueTmp > max) { + max = valueTmp; + } + } + } + return max; + } + + // Retourne avg Max (Fichier CSV) + double getAvgSpeed() { + double somme = 0; + int nb = 0; + for (int i = 0; i < contentActivity.length; i++) { + if (_notNull( + contentActivity, i, enteteCSV["Value_${_managerFile.fieldSpeed}"]!)) { + somme += + contentActivity[i][enteteCSV["Value_${_managerFile.fieldSpeed}"]!]; + nb++; + } + } + return somme / nb; + } + + // -------------------------- FIN Speed ---------------------- // + + // -------------------------- Localisation ------------------- // + + // Retourne les positions (Fichier CSV) + // Utilisable que si qu'une seule activité à été utilisé !!! + List getPosition() { + List list = List.empty(growable: true); + + for (int i = 0; i < activitySelected[0].contentActivity.length; i++) { + if (_notNull( + 0, + i, + activitySelected[0] + .enteteCSV["Value_${_managerFile.fieldPositionLatitude}"]!) && + _notNull( + 0, + i, + activitySelected[0].enteteCSV[ + "Value_${_managerFile.fieldPositionLongitude}"]!)) { + list.add(LatLng( + activitySelected[0].contentActivity[i][activitySelected[0] + .enteteCSV["Value_${_managerFile.fieldPositionLatitude}"]!], + activitySelected[0].contentActivity[i][activitySelected[0] + .enteteCSV["Value_${_managerFile.fieldPositionLongitude}"]!])); + } + } + return list; + } +} diff --git a/lib/modele/user.dart b/lib/modele/user.dart index ce294d8..e866ebc 100644 --- a/lib/modele/user.dart +++ b/lib/modele/user.dart @@ -1,12 +1,13 @@ import 'package:flutter/material.dart'; import 'package:smartfit_app_mobile/modele/activity.dart'; -import 'package:smartfit_app_mobile/modele/utile/list_activity/list_activity_utile.dart'; +import 'package:smartfit_app_mobile/modele/manager_selected_activity.dart'; class User extends ChangeNotifier { String username = "VOID"; String email = "VOID"; String token = "VOID"; List listActivity = List.empty(growable: true); + ManagerSelectedActivity managerSelectedActivity = ManagerSelectedActivity(); void addActivity(ActivityOfUser activity) { listActivity.add(activity); diff --git a/lib/modele/utile/home_view/home_view_util.dart b/lib/modele/utile/home_view/home_view_util.dart index c0cd498..131f6fd 100644 --- a/lib/modele/utile/home_view/home_view_util.dart +++ b/lib/modele/utile/home_view/home_view_util.dart @@ -3,19 +3,23 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:smartfit_app_mobile/modele/activity.dart'; import 'package:smartfit_app_mobile/modele/manager_file.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'; class HomeViewUtil { DataHomeView initData(BuildContext context) { - ManagerFile _managerFile = ManagerFile(); + final ManagerFile managerFile = ManagerFile(); - ActivityOfUser activity = Provider.of(context).listActivity[0]; - List bpmSecondes = activity.getXWithTime(_managerFile.fielBPM); - List vitesseSecondes = - activity.getXWithTime(_managerFile.fieldSpeed); - List altitudeSeconde = - activity.getXWithTime(_managerFile.fieldAltitude); + List bpmSecondes = Provider.of(context) + .managerSelectedActivity + .getXWithTime(managerFile.fielBPM); + List vitesseSecondes = Provider.of(context) + .managerSelectedActivity + .getXWithTime(managerFile.fieldSpeed); + List altitudeSeconde = Provider.of(context) + .managerSelectedActivity + .getXWithTime(managerFile.fieldAltitude); List bpmSecondes2 = List.from(bpmSecondes); diff --git a/lib/modele/utile/list_activity/list_activity_utile.dart b/lib/modele/utile/list_activity/list_activity_utile.dart index 0ee8bae..512280e 100644 --- a/lib/modele/utile/list_activity/list_activity_utile.dart +++ b/lib/modele/utile/list_activity/list_activity_utile.dart @@ -14,15 +14,21 @@ class ListActivityUtile { final IDataStrategy _strategy = RequestApi(); final ManagerFile _managerFile = ManagerFile(); - Future> getContentActivity(BuildContext context) async { + Future> getContentActivity( + BuildContext context, ActivityOfUser activityOfUser) async { Tuple2 result = await _strategy.getFile( Provider.of(context, listen: false).token, - Provider.of(context, listen: false).listActivity[0].fileUuid); + activityOfUser.fileUuid); if (result.item1 == false) { return Tuple2(result.item1, result.item2); } - Provider.of(context, listen: false).listActivity[0].contentActivity = + + activityOfUser.contentActivity = List.from(_managerFile.convertByteIntoCSV(result.item2)); + + Provider.of(context, listen: false) + .managerSelectedActivity + .addSelectedActivity(activityOfUser); return const Tuple2(true, "Yeah"); } @@ -46,10 +52,10 @@ class ListActivityUtile { element["uuid"].toString(), element["filename"].toString())); } - + /* if (notZero) { await getContentActivity(context); - } + }*/ return const Tuple2(true, "Yeah"); } diff --git a/lib/modele/utile/maps/maps_utile.dart b/lib/modele/utile/maps/maps_utile.dart index e74c450..300c417 100644 --- a/lib/modele/utile/maps/maps_utile.dart +++ b/lib/modele/utile/maps/maps_utile.dart @@ -9,7 +9,7 @@ class MapUtil { _polylines.add(Polyline( polylineId: const PolylineId("Polyline"), color: couleur, - points: context.watch().listActivity[0].getPosition(), + points: context.watch().managerSelectedActivity.getPosition(), width: largueur)); return _polylines; } diff --git a/lib/view/activity/activity.dart b/lib/view/activity/activity.dart index 5ada537..95a1fd8 100644 --- a/lib/view/activity/activity.dart +++ b/lib/view/activity/activity.dart @@ -11,7 +11,11 @@ class Activity extends StatelessWidget { @override Widget build(BuildContext context) { - return context.watch().listActivity.isEmpty + return context + .watch() + .managerSelectedActivity + .activitySelected + .isEmpty ? ScreenTypeLayout.builder( mobile: (_) => const NoActivityView(), desktop: (_) => const NoActivityView(), diff --git a/lib/view/activity/mobile/mobile_list_activity.dart b/lib/view/activity/mobile/mobile_list_activity.dart index 3a978e7..886a942 100644 --- a/lib/view/activity/mobile/mobile_list_activity.dart +++ b/lib/view/activity/mobile/mobile_list_activity.dart @@ -27,31 +27,8 @@ class _MobileListActivity extends State { FilePickerResult? result; final IDataStrategy _strategy = RequestApi(); final ListActivityUtile _utile = ListActivityUtile(); - final ManagerFile _managerFile = ManagerFile(); int firstActivityIndex = 0; - /* - Future readFile(String nom) async { - PlatformFile t = result!.files.single; - String? y = t.path; - if (t.path == null) { - print("t"); - } else { - List result = await _managerFile.readFitFile(y!); - - // Upload the file and Syncronise (getFiles()) - - strategy.uploadFile(context.watch().token, File(y)); - - Provider.of(context, listen: false) - .addActivity(ActivityOfUser("Random date", "$nom categorie !")); - Provider.of(context, listen: false) - .listActivity - .last - .contentActivity = result; - } - }*/ - Future deleteFileOnBDD(String token, String fileUuid) async { Tuple2 result = await _strategy.deleteFile(token, fileUuid); if (!result.item1) { @@ -195,7 +172,8 @@ class _MobileListActivity extends State { .removeActivity(activityObj); Provider.of(context, listen: false) .insertActivity(0, activityObj); - _utile.getContentActivity(context); + _utile.getContentActivity( + context, activityObj); }, isFirstActivity: isFirstActivity, ), diff --git a/lib/view/activity/web/web_list_activity.dart b/lib/view/activity/web/web_list_activity.dart index 8577f5a..9bfd1a5 100644 --- a/lib/view/activity/web/web_list_activity.dart +++ b/lib/view/activity/web/web_list_activity.dart @@ -1,4 +1,3 @@ -import 'dart:io'; import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:smartfit_app_mobile/modele/utile/list_activity/list_activity_utile.dart'; @@ -197,7 +196,8 @@ class _WebListActivityState extends State { .removeActivity(activityObj); Provider.of(context, listen: false) .insertActivity(0, activityObj); - _utile.getContentActivity(context); + _utile.getContentActivity( + context, activityObj); }, isFirstActivity: isFirstActivity, ), diff --git a/lib/view/home/home_view.dart b/lib/view/home/home_view.dart index c8d2ba9..f4d98b2 100644 --- a/lib/view/home/home_view.dart +++ b/lib/view/home/home_view.dart @@ -16,7 +16,11 @@ class HomeView extends StatefulWidget { class _HomeViewState extends State { @override Widget build(BuildContext context) { - return context.watch().listActivity.isEmpty + return context + .watch() + .managerSelectedActivity + .activitySelected + .isEmpty ? ScreenTypeLayout.builder( mobile: (_) => const NoActivityView(), desktop: (_) => const NoActivityView(), diff --git a/lib/view/home/mobile/mobile_homeview.dart b/lib/view/home/mobile/mobile_homeview.dart index 8a1673b..ccad930 100644 --- a/lib/view/home/mobile/mobile_homeview.dart +++ b/lib/view/home/mobile/mobile_homeview.dart @@ -6,6 +6,7 @@ import 'package:smartfit_app_mobile/common_widget/graph/bpm_and_speed_by_time.da 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'; @@ -24,18 +25,21 @@ class _MobileHomeView extends State { @override Widget build(BuildContext context) { var media = MediaQuery.of(context).size; + ManagerSelectedActivity managerSelectedActivity = + context.watch().managerSelectedActivity; + // -- BPM -- // - int maxBpm = context.watch().listActivity[0].getMaxBpm(); - int minBpm = context.watch().listActivity[0].getMinBpm(); - int avgBpm = context.watch().listActivity[0].getAvgBpm(); + int maxBpm = managerSelectedActivity.getMaxBpm(); + int minBpm = managerSelectedActivity.getMinBpm(); + int avgBpm = managerSelectedActivity.getAvgBpm(); // -- Altitude -- // - double minAltitude = context.watch().listActivity[0].getMinAltitude(); - double maxAltitude = context.watch().listActivity[0].getMaxAltitude(); + double minAltitude = managerSelectedActivity.getMinAltitude(); + double maxAltitude = managerSelectedActivity.getMaxAltitude(); double avgAltitude = (maxAltitude + minAltitude) / 2; // -- Speed -- // - double maxSpeed = context.watch().listActivity[0].getMaxSpeed(); - double avgSpeed = context.watch().listActivity[0].getAvgSpeed(); + double maxSpeed = managerSelectedActivity.getMaxSpeed(); + double avgSpeed = managerSelectedActivity.getAvgSpeed(); data = HomeViewUtil().initData(context); return Scaffold( diff --git a/lib/view/home/web/web_homeview.dart b/lib/view/home/web/web_homeview.dart index 3cf76e5..74ccf41 100644 --- a/lib/view/home/web/web_homeview.dart +++ b/lib/view/home/web/web_homeview.dart @@ -25,16 +25,20 @@ class _WebHomeView extends State { Widget build(BuildContext context) { var media = MediaQuery.of(context).size; // -- BPM -- // - int maxBpm = context.watch().listActivity[0].getMaxBpm(); - int minBpm = context.watch().listActivity[0].getMinBpm(); - int avgBpm = context.watch().listActivity[0].getAvgBpm(); + int maxBpm = context.watch().managerSelectedActivity.getMaxBpm(); + int minBpm = context.watch().managerSelectedActivity.getMinBpm(); + int avgBpm = context.watch().managerSelectedActivity.getAvgBpm(); // -- Altitude -- // - double minAltitude = context.watch().listActivity[0].getMinAltitude(); - double maxAltitude = context.watch().listActivity[0].getMaxAltitude(); + double minAltitude = + context.watch().managerSelectedActivity.getMinAltitude(); + double maxAltitude = + context.watch().managerSelectedActivity.getMaxAltitude(); double avgAltitude = (maxAltitude + minAltitude) / 2; // -- Speed -- // - double maxSpeed = context.watch().listActivity[0].getMaxSpeed(); - double avgSpeed = context.watch().listActivity[0].getAvgSpeed(); + double maxSpeed = + context.watch().managerSelectedActivity.getMaxSpeed(); + double avgSpeed = + context.watch().managerSelectedActivity.getAvgSpeed(); data = HomeViewUtil().initData(context); diff --git a/lib/view/map/my_map.dart b/lib/view/map/my_map.dart index 720d7b3..77516fa 100644 --- a/lib/view/map/my_map.dart +++ b/lib/view/map/my_map.dart @@ -16,7 +16,11 @@ class MyMap extends StatefulWidget { class _MyMapState extends State { @override Widget build(BuildContext context) { - return context.watch().listActivity.isEmpty + return context + .watch() + .managerSelectedActivity + .activitySelected + .isEmpty ? ScreenTypeLayout.builder( mobile: (_) => const NoActivityView(), desktop: (_) => const NoActivityView(), diff --git a/lib/view/test/page_test.dart b/lib/view/test/page_test.dart index 86aed19..c051ed1 100644 --- a/lib/view/test/page_test.dart +++ b/lib/view/test/page_test.dart @@ -99,8 +99,8 @@ class _TestPage extends State { print("--------------"); print("--------------"); - print("${await _managerFile.localPath}\\test.csv"); - final outFile = File("${await _managerFile.localPath}\\test.csv"); + //print("${await _managerFile.localPath}\\test.csv"); + //final outFile = File("${await _managerFile.localPath}\\test.csv"); //final csv = const ListToCsvConverter().convert(fitFile.toRows()); //await outFile.writeAsString(csv); @@ -170,7 +170,7 @@ class _TestPage extends State { csvData.insert(0, enteteCSV); final csv = const ListToCsvConverter().convert(csvData); - await outFile.writeAsString(csv); + //await outFile.writeAsString(csv); // ------- FIN --------------- // @@ -262,10 +262,10 @@ class _TestPage extends State { print(res.item2); ManagerFile x = ManagerFile(); - File file = File("${await x.localPath}/Walking_2023-11-08T10_57_28.fit"); - await file.create(); - await file.writeAsBytes(res.item2); - print(await x.localPath); + //File file = File("${await x.localPath}/Walking_2023-11-08T10_57_28.fit"); + //await file.create(); + //await file.writeAsBytes(res.item2); + //print(await x.localPath); print("Save"); //print(await x From cfe7879c2f1672c697a1be026821a4a5a4cbbb23 Mon Sep 17 00:00:00 2001 From: Enzo Date: Wed, 29 Nov 2023 10:17:56 +0100 Subject: [PATCH 2/3] list activity --- lib/common_widget/container/workout_row.dart | 8 +- lib/modele/manager_selected_activity.dart | 319 ++++++++++++------ .../activity/mobile/mobile_list_activity.dart | 42 +-- lib/view/activity/web/web_list_activity.dart | 33 +- 4 files changed, 243 insertions(+), 159 deletions(-) diff --git a/lib/common_widget/container/workout_row.dart b/lib/common_widget/container/workout_row.dart index 0fd3514..9137ee6 100644 --- a/lib/common_widget/container/workout_row.dart +++ b/lib/common_widget/container/workout_row.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; class WorkoutRow extends StatelessWidget { final Map wObj; - final bool isFirstActivity; // Ajouter la propriété isFirstActivity + final bool isSelected; final VoidCallback onDelete; final VoidCallback onClick; @@ -13,7 +13,7 @@ class WorkoutRow extends StatelessWidget { required this.wObj, required this.onDelete, required this.onClick, - required this.isFirstActivity, + required this.isSelected, }) : super(key: key); @override @@ -24,7 +24,7 @@ class WorkoutRow extends StatelessWidget { margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 2), decoration: BoxDecoration( border: Border.all( - color: isFirstActivity + color: isSelected ? Color.fromARGB(255, 144, 252, 148) : Colors.transparent, width: 2.0, @@ -32,7 +32,7 @@ class WorkoutRow extends StatelessWidget { borderRadius: BorderRadius.circular(10), ), child: Material( - color: isFirstActivity + color: isSelected ? Color.fromARGB(255, 240, 255, 240) : Colors.transparent, child: InkWell( diff --git a/lib/modele/manager_selected_activity.dart b/lib/modele/manager_selected_activity.dart index 7f6fa48..7fbe4e7 100644 --- a/lib/modele/manager_selected_activity.dart +++ b/lib/modele/manager_selected_activity.dart @@ -9,14 +9,38 @@ class ManagerSelectedActivity { List activitySelected = List.empty(growable: true); bool addSelectedActivity(ActivityOfUser activityOfUser) { - // Chercher le contenu du fichier // Regarder si l'entete est la même - // Supprimer l'entete + // C'est de la merde!! + /* + if (activitySelected.isNotEmpty && + activitySelected.first.enteteCSV != activityOfUser.enteteCSV) { + return false; + }*/ + activitySelected.add(activityOfUser); return true; } + bool removeSelectedActivity(String fileUuid) { + for (ActivityOfUser activityOfUser in activitySelected) { + if (activityOfUser.fileUuid == fileUuid) { + activitySelected.remove(activityOfUser); + return true; + } + } + return false; + } + // ---- Function utile ---- // // -- func utile -- // + bool fileNotSelected(String fileUuid) { + for (ActivityOfUser activityOfUser in activitySelected) { + if (activityOfUser.fileUuid == fileUuid) { + return false; + } + } + return true; + } + bool _notNull(int indexActivitySelected, int ligne, int colonne) { if (activitySelected[indexActivitySelected].contentActivity[ligne] [colonne] == @@ -33,21 +57,26 @@ class ManagerSelectedActivity { int firstTimestamp = 0; - for (int i = 0; i < activity.contentActivity.length; i++) { - if (_notNull( - activity.contentActivity, i, activity.enteteCSV["Value_$field"]!)) { - if (firstTimestamp == 0) { - firstTimestamp = activity.contentActivity[i] - [activity.enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!]; + 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_$field"]!)) { + if (firstTimestamp == 0) { + firstTimestamp = activitySelected[c].contentActivity[i][ + activitySelected[c] + .enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!]; + } + result.add(FlSpot( + (((activitySelected[c].contentActivity[i][ + activitySelected[c].enteteCSV[ + "Value_${_managerFile.fieldTimeStamp}"]!]) - + firstTimestamp) ~/ + 100) + .toDouble(), + activitySelected[c] + .contentActivity[i] + [activitySelected[c].enteteCSV["Value_$field"]!] + .toDouble())); } - result.add(FlSpot( - (((activity.contentActivity[i][activity.enteteCSV[ - "Value_${_managerFile.fieldTimeStamp}"]!]) - - firstTimestamp) ~/ - 100) - .toDouble(), - activity.contentActivity[i][activity.enteteCSV["Value_$field"]!] - .toDouble())); } } return result; @@ -58,29 +87,35 @@ class ManagerSelectedActivity { // Retourne le BPM Max (Fichier CSV) int getMaxBpm() { int max = 0; - for (int i = 0; i < activity.contentActivity.length; i++) { - if (_notNull(activity.contentActivity, i, - activity.enteteCSV["Value_${_managerFile.fielBPM}"]!)) { - int valueTmp = activity.contentActivity[i] - [activity.enteteCSV["Value_${_managerFile.fielBPM}"]!]; - if (valueTmp > max) { - max = valueTmp; + 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.fielBPM}"]!)) { + int valueTmp = activitySelected[c].contentActivity[i] + [activitySelected[c].enteteCSV["Value_${_managerFile.fielBPM}"]!]; + if (valueTmp > max) { + max = valueTmp; + } } } } + return max; } // Retourne le BPM Min (Fichier CSV) int getMinBpm() { int min = 300; - for (int i = 0; i < activity.contentActivity.length; i++) { - if (_notNull(activity.contentActivity, i, - activity.enteteCSV["Value_${_managerFile.fielBPM}"]!)) { - int valueTmp = activity.contentActivity[i] - [activity.enteteCSV["Value_${_managerFile.fielBPM}"]!]; - if (valueTmp < min) { - min = valueTmp; + + 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.fielBPM}"]!)) { + int valueTmp = activitySelected[c].contentActivity[i] + [activitySelected[c].enteteCSV["Value_${_managerFile.fielBPM}"]!]; + if (valueTmp < min) { + min = valueTmp; + } } } } @@ -91,12 +126,14 @@ class ManagerSelectedActivity { int getAvgBpm() { int somme = 0; int nb = 0; - for (int i = 0; i < contentActivity.length; i++) { - if (_notNull( - contentActivity, i, enteteCSV["Value_${_managerFile.fielBPM}"]!)) { - somme += contentActivity[i][enteteCSV["Value_${_managerFile.fielBPM}"]!] - as int; - nb++; + 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.fielBPM}"]!)) { + somme += activitySelected[c].contentActivity[i][activitySelected[c] + .enteteCSV["Value_${_managerFile.fielBPM}"]!] as int; + nb++; + } } } return somme ~/ nb; @@ -108,17 +145,27 @@ class ManagerSelectedActivity { double getTotalDistance() { double max = 0; - for (int i = contentActivity.length - 1; i != 0; i--) { - if (_notNull(contentActivity, i, - enteteCSV["Value_${_managerFile.fieldDistance}"]!)) { - double valueTmp = contentActivity[i] - [enteteCSV["Value_${_managerFile.fieldDistance}"]!] - .toDouble(); - if (valueTmp > max) { - max = valueTmp; + + for (int c = 0; c < activitySelected.length; c++) { + for (int i = activitySelected[c].contentActivity.length - 1; + i != 0; + i--) { + if (_notNull( + c, + i, + activitySelected[c] + .enteteCSV["Value_${_managerFile.fieldDistance}"]!)) { + double valueTmp = activitySelected[c] + .contentActivity[i][activitySelected[c] + .enteteCSV["Value_${_managerFile.fieldDistance}"]!] + .toDouble(); + if (valueTmp > max) { + max = valueTmp; + } } } } + return max; } @@ -126,11 +173,18 @@ class ManagerSelectedActivity { // ---------------------- Calories ---------------------- // int getCalorie() { - for (int i = contentActivity.length - 1; i != 0; i--) { - if (_notNull(contentActivity, i, - enteteCSV["Value_${_managerFile.fieldTotalCalories}"]!)) { - return contentActivity[i] - [enteteCSV["Value_${_managerFile.fieldTotalCalories}"]!] as int; + for (int c = 0; c < activitySelected.length; c++) { + for (int i = activitySelected[c].contentActivity.length - 1; + i != 0; + i--) { + if (_notNull( + c, + i, + activitySelected[c] + .enteteCSV["Value_${_managerFile.fieldTotalCalories}"]!)) { + return activitySelected[c].contentActivity[i][activitySelected[c] + .enteteCSV["Value_${_managerFile.fieldTotalCalories}"]!] as int; + } } } return 0; @@ -140,12 +194,20 @@ class ManagerSelectedActivity { // ---------------------- Step ------------------------------// int getTotalSteps() { - for (int i = contentActivity.length - 1; i != 0; i--) { - if (_notNull(contentActivity, i, - enteteCSV["Value_${_managerFile.fieldTotalStep}"]!)) { - return contentActivity[i] - [enteteCSV["Value_${_managerFile.fieldTotalStep}"]!] - .toInt(); + for (int c = 0; c < activitySelected.length; c++) { + for (int i = activitySelected[c].contentActivity.length - 1; + i != 0; + i--) { + if (_notNull( + c, + i, + activitySelected[c] + .enteteCSV["Value_${_managerFile.fieldTotalStep}"]!)) { + return activitySelected[c] + .contentActivity[i][activitySelected[c] + .enteteCSV["Value_${_managerFile.fieldTotalStep}"]!] + .toInt(); + } } } return 0; @@ -155,11 +217,18 @@ class ManagerSelectedActivity { // ------------------------- Time ----------------------------- // int getTotalTime() { - for (int i = contentActivity.length - 1; i != 0; i--) { - if (_notNull(contentActivity, i, - enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!)) { - return contentActivity[i] - [enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!]; + for (int c = 0; c < activitySelected.length; c++) { + for (int i = activitySelected[c].contentActivity.length - 1; + i != 0; + i--) { + if (_notNull( + c, + i, + activitySelected[c] + .enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!)) { + return activitySelected[c].contentActivity[i][activitySelected[c] + .enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!]; + } } } return 0; @@ -171,14 +240,20 @@ class ManagerSelectedActivity { // --- Fichier CSV --- // double getMaxAltitude() { double max = 0; - for (int i = 0; i < contentActivity.length; i++) { - if (_notNull(contentActivity, i, - enteteCSV["Value_${_managerFile.fieldAltitude}"]!)) { - double valueTmp = contentActivity[i] - [enteteCSV["Value_${_managerFile.fieldAltitude}"]!] - .toDouble(); - if (valueTmp > max) { - max = valueTmp; + 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}"]!)) { + double valueTmp = activitySelected[c] + .contentActivity[i][activitySelected[c] + .enteteCSV["Value_${_managerFile.fieldAltitude}"]!] + .toDouble(); + if (valueTmp > max) { + max = valueTmp; + } } } } @@ -188,14 +263,20 @@ class ManagerSelectedActivity { // --- Fichier CSV --- // double getMinAltitude() { double min = 5000; - for (int i = 0; i < contentActivity.length; i++) { - if (_notNull(contentActivity, i, - enteteCSV["Value_${_managerFile.fieldAltitude}"]!)) { - double valueTmp = contentActivity[i] - [enteteCSV["Value_${_managerFile.fieldAltitude}"]!] - .toDouble(); - if (valueTmp < min) { - min = valueTmp; + 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}"]!)) { + double valueTmp = activitySelected[c] + .contentActivity[i][activitySelected[c] + .enteteCSV["Value_${_managerFile.fieldAltitude}"]!] + .toDouble(); + if (valueTmp < min) { + min = valueTmp; + } } } } @@ -211,23 +292,35 @@ class ManagerSelectedActivity { List result = List.empty(growable: true); int firstTimestamp = 0; - for (int i = 0; i < contentActivity.length; i++) { - if (_notNull(contentActivity, i, - enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!) && - notNull(contentActivity, i, - enteteCSV["Value_${_managerFile.fieldSpeed}"]!)) { - if (firstTimestamp == 0) { - firstTimestamp = contentActivity[i] - [enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!]; + 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.fieldTimeStamp}"]!) && + _notNull( + c, + i, + activitySelected[c] + .enteteCSV["Value_${_managerFile.fieldSpeed}"]!)) { + if (firstTimestamp == 0) { + firstTimestamp = activitySelected[c].contentActivity[i][ + activitySelected[c] + .enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!]; + } + result.add(DataPoint( + (((activitySelected[c].contentActivity[i][ + activitySelected[c].enteteCSV[ + "Value_${_managerFile.fieldTimeStamp}"]!]) - + firstTimestamp) ~/ + 100) + .toDouble(), + activitySelected[c] + .contentActivity[i][activitySelected[c] + .enteteCSV["Value_${_managerFile.fieldSpeed}"]!] + .toDouble())); } - result.add(DataPoint( - (((contentActivity[i][enteteCSV[ - "Value_${_managerFile.fieldTimeStamp}"]!]) - - firstTimestamp) ~/ - 100) - .toDouble(), - contentActivity[i][enteteCSV["Value_${_managerFile.fieldSpeed}"]!] - .toDouble())); } } return result; @@ -236,14 +329,21 @@ class ManagerSelectedActivity { // Retourne la Speed Max (Fichier CSV) double getMaxSpeed() { double max = 0.00; - for (int i = 0; i < contentActivity.length; i++) { - if (_notNull( - contentActivity, i, enteteCSV["Value_${_managerFile.fieldSpeed}"]!)) { - double valueTmp = contentActivity[i] - [enteteCSV["Value_${_managerFile.fieldSpeed}"]!] - .toDouble(); - if (valueTmp > max) { - max = valueTmp; + + 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 > max) { + max = valueTmp; + } } } } @@ -254,14 +354,21 @@ class ManagerSelectedActivity { double getAvgSpeed() { double somme = 0; int nb = 0; - for (int i = 0; i < contentActivity.length; i++) { - if (_notNull( - contentActivity, i, enteteCSV["Value_${_managerFile.fieldSpeed}"]!)) { - somme += - contentActivity[i][enteteCSV["Value_${_managerFile.fieldSpeed}"]!]; - nb++; + + 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}"]!)) { + somme += activitySelected[c].contentActivity[i][activitySelected[c] + .enteteCSV["Value_${_managerFile.fieldSpeed}"]!]; + nb++; + } } } + return somme / nb; } diff --git a/lib/view/activity/mobile/mobile_list_activity.dart b/lib/view/activity/mobile/mobile_list_activity.dart index 886a942..a3c50c7 100644 --- a/lib/view/activity/mobile/mobile_list_activity.dart +++ b/lib/view/activity/mobile/mobile_list_activity.dart @@ -27,14 +27,10 @@ class _MobileListActivity extends State { FilePickerResult? result; final IDataStrategy _strategy = RequestApi(); final ListActivityUtile _utile = ListActivityUtile(); - int firstActivityIndex = 0; Future deleteFileOnBDD(String token, String fileUuid) async { Tuple2 result = await _strategy.deleteFile(token, fileUuid); if (!result.item1) { - print(fileUuid); - print("msg d'erreur"); - print(result.item2); return false; } return true; @@ -142,20 +138,8 @@ class _MobileListActivity extends State { .listActivity[index]; var activityMap = activityObj.toMap(); - bool isFirstActivity = false; - if (index == firstActivityIndex) { - isFirstActivity = true; - } return InkWell( - onTap: () { - setState(() { - firstActivityIndex = index; - }); - Provider.of(context, listen: false) - .removeActivity(activityObj); - Provider.of(context, listen: false) - .insertActivity(0, activityObj); - }, + onTap: () {}, child: WorkoutRow( wObj: activityMap, onDelete: () async { @@ -167,15 +151,31 @@ class _MobileListActivity extends State { .removeActivity(activityObj); } }, - onClick: () { + onClick: () async { + if (!Provider.of(context, listen: false) + .managerSelectedActivity + .fileNotSelected(activityObj.fileUuid)) { + Provider.of(context, listen: false) + .managerSelectedActivity + .removeSelectedActivity( + activityObj.fileUuid); + return; + } + + Tuple2 result = await _utile + .getContentActivity(context, activityObj); + if (!result.item1) { + return; + } + Provider.of(context, listen: false) .removeActivity(activityObj); Provider.of(context, listen: false) .insertActivity(0, activityObj); - _utile.getContentActivity( - context, activityObj); }, - isFirstActivity: isFirstActivity, + isSelected: !Provider.of(context) + .managerSelectedActivity + .fileNotSelected(activityObj.fileUuid), ), ); }, diff --git a/lib/view/activity/web/web_list_activity.dart b/lib/view/activity/web/web_list_activity.dart index 9bfd1a5..9abfca7 100644 --- a/lib/view/activity/web/web_list_activity.dart +++ b/lib/view/activity/web/web_list_activity.dart @@ -23,28 +23,8 @@ class _WebListActivityState extends State { FilePickerResult? result; IDataStrategy strategy = RequestApi(); final ListActivityUtile _utile = ListActivityUtile(); - int firstActivityIndex = 0; final IDataStrategy _strategy = RequestApi(); - /* - void readFile(html.File file) async { - ManagerFile x = ManagerFile(); - final reader = html.FileReader(); - reader.readAsArrayBuffer(file); - reader.onLoadEnd.listen((event) { - if (reader.readyState == html.FileReader.DONE) { - Uint8List bytes = reader.result as Uint8List; - List result = x.readFitFileWeb(bytes); - Provider.of(context, listen: false).addActivity( - ActivityOfUser("Date random", "${file.name} Categorie", "", "")); - Provider.of(context, listen: false) - .listActivity - .last - .contentActivity = result; - } - }); - }*/ - Future deleteFileOnBDD(String token, String fileUuid) async { Tuple2 result = await _strategy.deleteFile(token, fileUuid); if (!result.item1) { @@ -62,7 +42,6 @@ class _WebListActivityState extends State { reader.onLoadEnd.listen((event) async { if (reader.readyState == html.FileReader.DONE) { - print("donne"); Uint8List bytes = reader.result as Uint8List; Tuple2 resultAdd = await _utile.addFile(bytes, file.name, token); @@ -165,20 +144,16 @@ class _WebListActivityState extends State { Provider.of(context, listen: true) .listActivity[index]; var activityMap = activityObj.toMap(); - - bool isFirstActivity = false; - if (index == firstActivityIndex) { - isFirstActivity = true; - } return InkWell( onTap: () { + /* setState(() { firstActivityIndex = index; }); Provider.of(context, listen: false) .removeActivity(activityObj); Provider.of(context, listen: false) - .insertActivity(0, activityObj); + .insertActivity(0, activityObj);*/ }, child: WorkoutRow( wObj: activityMap, @@ -199,7 +174,9 @@ class _WebListActivityState extends State { _utile.getContentActivity( context, activityObj); }, - isFirstActivity: isFirstActivity, + isSelected: Provider.of(context) + .managerSelectedActivity + .fileNotSelected(activityObj.fileUuid), ), ); }, From b7970313815f5b9155126e0f48d9c01c2f984b8b Mon Sep 17 00:00:00 2001 From: Enzo Date: Wed, 29 Nov 2023 14:39:34 +0100 Subject: [PATCH 3/3] petite opti sur les BPM et home sur 1 view --- .../mobile/mobile_bpm_and_speed_by_time.dart | 8 ++--- .../graph/mobile/mobile_bpm_by_time.dart | 8 ++--- .../graph/web/web_altitude_by_time.dart | 3 -- .../graph/web/web_bpm_and_speed_by_time.dart | 12 ++----- .../utile/home_view/data_home_view.dart | 2 ++ lib/view/activity/activity.dart | 4 +-- .../activity/mobile/mobile_list_activity.dart | 17 +++++---- lib/view/home/home_view.dart | 34 +++++++++++------- lib/view/home/mobile/mobile_homeview.dart | 10 +++--- lib/view/home/no_activity_view.dart | 5 +-- lib/view/map/my_map.dart | 35 ++++++++++++------- 11 files changed, 75 insertions(+), 63 deletions(-) diff --git a/lib/common_widget/graph/mobile/mobile_bpm_and_speed_by_time.dart b/lib/common_widget/graph/mobile/mobile_bpm_and_speed_by_time.dart index 6cc203f..350db88 100644 --- a/lib/common_widget/graph/mobile/mobile_bpm_and_speed_by_time.dart +++ b/lib/common_widget/graph/mobile/mobile_bpm_and_speed_by_time.dart @@ -98,13 +98,11 @@ class _MobileGraphBpmAndSpeedByTime @override Widget build(BuildContext context) { - final double maxY = - context.watch().managerSelectedActivity.getMaxBpm() + 2; - final double minY = - context.watch().managerSelectedActivity.getMinBpm() - 2; + final double maxY = widget.data.maxBPM + 2; + final double minY = widget.data.minBPM - 2; final double maxX = widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x; - final double minX = 0.0; + const double minX = 0.0; final lineBarsData = [ LineChartBarData( spots: widget.data.bpmSecondes, diff --git a/lib/common_widget/graph/mobile/mobile_bpm_by_time.dart b/lib/common_widget/graph/mobile/mobile_bpm_by_time.dart index 93690ae..070b11c 100644 --- a/lib/common_widget/graph/mobile/mobile_bpm_by_time.dart +++ b/lib/common_widget/graph/mobile/mobile_bpm_by_time.dart @@ -18,13 +18,11 @@ class MobileBpmByTime extends StatefulWidget { class _MobileBpmByTime extends State { @override Widget build(BuildContext context) { - final double maxY = - context.watch().managerSelectedActivity.getMaxBpm() + 2; - final double minY = - context.watch().managerSelectedActivity.getMinBpm() - 2; + final double maxY = widget.data.maxBPM + 2; + final double minY = widget.data.minBPM - 2; final double maxX = widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x; - final double minX = 0.0; + const double minX = 0.0; final lineBarsData = [ LineChartBarData( spots: widget.data.bpmSecondes, diff --git a/lib/common_widget/graph/web/web_altitude_by_time.dart b/lib/common_widget/graph/web/web_altitude_by_time.dart index 636d9ac..0368c88 100644 --- a/lib/common_widget/graph/web/web_altitude_by_time.dart +++ b/lib/common_widget/graph/web/web_altitude_by_time.dart @@ -19,9 +19,6 @@ class WebGraphAltitudeByTime extends StatefulWidget { class _WebGraphAltitudeByTime extends State { @override Widget build(BuildContext context) { - final double maxX = - widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x; - final double minX = 0.0; final double maxY = context.watch().managerSelectedActivity.getMaxAltitude() + 2; final double minY = diff --git a/lib/common_widget/graph/web/web_bpm_and_speed_by_time.dart b/lib/common_widget/graph/web/web_bpm_and_speed_by_time.dart index 5cf6c2a..061439c 100644 --- a/lib/common_widget/graph/web/web_bpm_and_speed_by_time.dart +++ b/lib/common_widget/graph/web/web_bpm_and_speed_by_time.dart @@ -97,17 +97,11 @@ class _WebGraphBpmAndSpeedByTime extends State { @override Widget build(BuildContext context) { - final double maxY = - context.watch().managerSelectedActivity.getMaxBpm() + 2; - final double minY = - context.watch().managerSelectedActivity.getMinBpm() - 2; - final double maxY1 = - context.watch().managerSelectedActivity.getMaxBpm() + 2; - final double minY2 = - context.watch().managerSelectedActivity.getMinBpm() - 2; + final double maxY = widget.data.maxBPM + 2; + final double minY = widget.data.minBPM - 2; final double maxX = widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x; - final double minX = 0.0; + const double minX = 0.0; final lineBarsData = [ LineChartBarData( diff --git a/lib/modele/utile/home_view/data_home_view.dart b/lib/modele/utile/home_view/data_home_view.dart index 962bc96..6c3220f 100644 --- a/lib/modele/utile/home_view/data_home_view.dart +++ b/lib/modele/utile/home_view/data_home_view.dart @@ -5,6 +5,8 @@ class DataHomeView { late List bpmSecondes2; late List vitesseSecondes; late List altitudeSeconde; + int minBPM = 0; + int maxBPM = 0; DataHomeView(this.bpmSecondes, this.bpmSecondes2, this.vitesseSecondes, this.altitudeSeconde); diff --git a/lib/view/activity/activity.dart b/lib/view/activity/activity.dart index 95a1fd8..ee54c69 100644 --- a/lib/view/activity/activity.dart +++ b/lib/view/activity/activity.dart @@ -17,8 +17,8 @@ class Activity extends StatelessWidget { .activitySelected .isEmpty ? ScreenTypeLayout.builder( - mobile: (_) => const NoActivityView(), - desktop: (_) => const NoActivityView(), + mobile: (_) => const NoActivityView("Pas d'activité sélectionnée"), + desktop: (_) => const NoActivityView("Pas d'activité sélectionnée"), ) : ScreenTypeLayout.builder( mobile: (_) => const MobileActivity(), diff --git a/lib/view/activity/mobile/mobile_list_activity.dart b/lib/view/activity/mobile/mobile_list_activity.dart index a3c50c7..61b9709 100644 --- a/lib/view/activity/mobile/mobile_list_activity.dart +++ b/lib/view/activity/mobile/mobile_list_activity.dart @@ -1,16 +1,10 @@ -import 'dart:convert'; import 'dart:io'; -import 'dart:typed_data'; - -import 'package:csv/csv.dart'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; -import 'package:smartfit_app_mobile/modele/activity.dart'; import 'package:smartfit_app_mobile/modele/api/i_data_strategy.dart'; import 'package:smartfit_app_mobile/modele/api/request_api.dart'; -import 'package:smartfit_app_mobile/modele/manager_file.dart'; import 'package:smartfit_app_mobile/modele/user.dart'; import 'package:smartfit_app_mobile/common_widget/container/workout_row.dart'; import 'package:smartfit_app_mobile/modele/utile/list_activity/list_activity_utile.dart'; @@ -143,10 +137,21 @@ class _MobileListActivity extends State { child: WorkoutRow( wObj: activityMap, onDelete: () async { + // Attention toute modif peut amener à une surchage mémoire !! if (await deleteFileOnBDD( Provider.of(context, listen: false) .token, activityObj.fileUuid)) { + if (!Provider.of(context, + listen: false) + .managerSelectedActivity + .fileNotSelected( + activityObj.fileUuid)) { + Provider.of(context, listen: false) + .managerSelectedActivity + .removeSelectedActivity( + activityObj.fileUuid); + } Provider.of(context, listen: false) .removeActivity(activityObj); } diff --git a/lib/view/home/home_view.dart b/lib/view/home/home_view.dart index f4d98b2..637a004 100644 --- a/lib/view/home/home_view.dart +++ b/lib/view/home/home_view.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:responsive_builder/responsive_builder.dart'; +import 'package:smartfit_app_mobile/modele/activity.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'; @@ -16,18 +17,25 @@ class HomeView extends StatefulWidget { class _HomeViewState extends State { @override Widget build(BuildContext context) { - return context - .watch() - .managerSelectedActivity - .activitySelected - .isEmpty - ? ScreenTypeLayout.builder( - mobile: (_) => const NoActivityView(), - desktop: (_) => const NoActivityView(), - ) - : ScreenTypeLayout.builder( - mobile: (_) => const MobileHomeView(), - desktop: (_) => const WebHomeView(), - ); + List listSelected = + context.watch().managerSelectedActivity.activitySelected; + if (listSelected.isEmpty) { + return ScreenTypeLayout.builder( + mobile: (_) => const NoActivityView("Pas d'activité sélectionnée"), + desktop: (_) => const NoActivityView("Pas d'activité sélectionnée"), + ); + } + if (listSelected.length > 1) { + return ScreenTypeLayout.builder( + mobile: (_) => const NoActivityView( + "Qu'une seule activité doit être sélectionner"), + desktop: (_) => const NoActivityView( + "Qu'une seule activité doit être sélectionner"), + ); + } + return ScreenTypeLayout.builder( + mobile: (_) => const MobileHomeView(), + desktop: (_) => const WebHomeView(), + ); } } diff --git a/lib/view/home/mobile/mobile_homeview.dart b/lib/view/home/mobile/mobile_homeview.dart index ccad930..3c7439c 100644 --- a/lib/view/home/mobile/mobile_homeview.dart +++ b/lib/view/home/mobile/mobile_homeview.dart @@ -28,9 +28,10 @@ class _MobileHomeView extends State { ManagerSelectedActivity managerSelectedActivity = context.watch().managerSelectedActivity; + data = HomeViewUtil().initData(context); // -- BPM -- // - int maxBpm = managerSelectedActivity.getMaxBpm(); - int minBpm = managerSelectedActivity.getMinBpm(); + data.maxBPM = managerSelectedActivity.getMaxBpm(); + data.minBPM = managerSelectedActivity.getMinBpm(); int avgBpm = managerSelectedActivity.getAvgBpm(); // -- Altitude -- // @@ -40,7 +41,6 @@ class _MobileHomeView extends State { // -- Speed -- // double maxSpeed = managerSelectedActivity.getMaxSpeed(); double avgSpeed = managerSelectedActivity.getAvgSpeed(); - data = HomeViewUtil().initData(context); return Scaffold( backgroundColor: TColor.white, @@ -70,8 +70,8 @@ class _MobileHomeView extends State { height: media.width * 0.05, ), LigneContainerStats( - "${minBpm.toString()} BPM", - "${maxBpm.toString()} BPM", + "${data.minBPM.toString()} BPM", + "${data.maxBPM.toString()} BPM", "${avgBpm.toString()} BPM", "Minimum", "Maximum", diff --git a/lib/view/home/no_activity_view.dart b/lib/view/home/no_activity_view.dart index 698b7ee..caca166 100644 --- a/lib/view/home/no_activity_view.dart +++ b/lib/view/home/no_activity_view.dart @@ -4,7 +4,8 @@ import 'package:flutter_svg/svg.dart'; import '../../common/colo_extension.dart'; class NoActivityView extends StatefulWidget { - const NoActivityView({super.key}); + const NoActivityView(this.msg, {super.key}); + final String msg; @override State createState() => _NoActivityViewState(); @@ -40,7 +41,7 @@ class _NoActivityViewState extends State { height: media.height * 0.1, ), Text( - "Pas d'activité sélectionnée", + widget.msg, style: TextStyle( color: TColor.black, fontSize: 20, diff --git a/lib/view/map/my_map.dart b/lib/view/map/my_map.dart index 77516fa..a234d6f 100644 --- a/lib/view/map/my_map.dart +++ b/lib/view/map/my_map.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:responsive_builder/responsive_builder.dart'; +import 'package:smartfit_app_mobile/modele/activity.dart'; import 'package:smartfit_app_mobile/modele/user.dart'; import 'package:smartfit_app_mobile/view/home/no_activity_view.dart'; import 'package:smartfit_app_mobile/view/map/mobile/mobile_my_map.dart'; @@ -16,18 +17,26 @@ class MyMap extends StatefulWidget { class _MyMapState extends State { @override Widget build(BuildContext context) { - return context - .watch() - .managerSelectedActivity - .activitySelected - .isEmpty - ? ScreenTypeLayout.builder( - mobile: (_) => const NoActivityView(), - desktop: (_) => const NoActivityView(), - ) - : ScreenTypeLayout.builder( - mobile: (_) => const MobileMyMaps(), - desktop: (_) => const WebMyMaps(), - ); + List listSelected = + context.watch().managerSelectedActivity.activitySelected; + + if (listSelected.isEmpty) { + return ScreenTypeLayout.builder( + mobile: (_) => const NoActivityView("Pas d'activité sélectionnée"), + desktop: (_) => const NoActivityView("Pas d'activité sélectionnée"), + ); + } + if (listSelected.length > 1) { + return ScreenTypeLayout.builder( + mobile: (_) => const NoActivityView( + "Qu'une seule activité doit être sélectionner"), + desktop: (_) => const NoActivityView( + "Qu'une seule activité doit être sélectionner"), + ); + } + return ScreenTypeLayout.builder( + mobile: (_) => const MobileMyMaps(), + desktop: (_) => const WebMyMaps(), + ); } }