From 2941a29a5c3596d9c05dc3520c447857550d62b9 Mon Sep 17 00:00:00 2001 From: Enzo Date: Wed, 6 Dec 2023 14:30:11 +0100 Subject: [PATCH] workout categorie --- .../container/list/list_activity_widget.dart | 110 +++++++++------- .../workout_row/workout_row_generic.dart | 118 +++++++++++++++++ .../workout_row_walking.dart} | 9 +- lib/modele/activity.dart | 10 +- lib/modele/activity_info/activity_info.dart | 120 +++++++++++++++--- lib/modele/convertisseur.dart | 11 ++ lib/modele/manager_file.dart | 4 +- .../list_activity/list_activity_utile.dart | 2 + 8 files changed, 304 insertions(+), 80 deletions(-) create mode 100644 lib/common_widget/container/workout_row/workout_row_generic.dart rename lib/common_widget/container/{workout_row.dart => workout_row/workout_row_walking.dart} (91%) create mode 100644 lib/modele/convertisseur.dart diff --git a/lib/common_widget/container/list/list_activity_widget.dart b/lib/common_widget/container/list/list_activity_widget.dart index bcaaba8..8d85253 100644 --- a/lib/common_widget/container/list/list_activity_widget.dart +++ b/lib/common_widget/container/list/list_activity_widget.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:smartfit_app_mobile/common_widget/container/workout_row.dart'; +import 'package:smartfit_app_mobile/common_widget/container/workout_row/workout_row_generic.dart'; +import 'package:smartfit_app_mobile/common_widget/container/workout_row/workout_row_walking.dart'; import 'package:smartfit_app_mobile/modele/activity.dart'; import 'package:smartfit_app_mobile/modele/manager_file.dart'; import 'package:smartfit_app_mobile/modele/user.dart'; @@ -20,6 +21,48 @@ class _ListActivityWidget extends State { @override Widget build(BuildContext context) { + void onClick(ActivityOfUser activityObj) async { + if (!Provider.of(context, listen: false) + .managerSelectedActivity + .fileNotSelected(activityObj.fileUuid)) { + Provider.of(context, listen: false) + .managerSelectedActivity + .removeSelectedActivity(activityObj.fileUuid); + setState(() {}); + 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); + } + + void onDelete(ActivityOfUser activityObj) async { + if (await _utile.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); + } + } + + bool isSelected(ActivityOfUser activityObj) { + return !Provider.of(context) + .managerSelectedActivity + .fileNotSelected(activityObj.fileUuid); + } + return Material( color: Colors.transparent, child: ListView.builder( @@ -34,57 +77,28 @@ class _ListActivityWidget extends State { // -- Si categorie == marche if (activityObj.category == managerFile.marche) { activityMap = activityObj.toMapWalking(); + return InkWell( + onTap: () {}, + child: WorkoutRowWalking( + wObj: activityMap, + onDelete: () => onDelete(activityObj), + onClick: () => onClick(activityObj), + isSelected: isSelected(activityObj), + ), + ); } else { // -- Default -- // activityMap = activityObj.toMapGeneric(); + return InkWell( + onTap: () {}, + child: WorkoutRowGeneric( + wObj: activityMap, + onDelete: () => onDelete(activityObj), + onClick: () => onClick(activityObj), + isSelected: isSelected(activityObj), + ), + ); } - - return InkWell( - onTap: () {}, - child: WorkoutRow( - wObj: activityMap, - onDelete: () async { - if (await _utile.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); - } - }, - onClick: () async { - if (!Provider.of(context, listen: false) - .managerSelectedActivity - .fileNotSelected(activityObj.fileUuid)) { - Provider.of(context, listen: false) - .managerSelectedActivity - .removeSelectedActivity(activityObj.fileUuid); - setState(() {}); - 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); - }, - isSelected: !Provider.of(context) - .managerSelectedActivity - .fileNotSelected(activityObj.fileUuid), - ), - ); }, ), ); diff --git a/lib/common_widget/container/workout_row/workout_row_generic.dart b/lib/common_widget/container/workout_row/workout_row_generic.dart new file mode 100644 index 0000000..fa733a9 --- /dev/null +++ b/lib/common_widget/container/workout_row/workout_row_generic.dart @@ -0,0 +1,118 @@ +import 'package:flutter_svg/svg.dart'; +import 'package:smartfit_app_mobile/common/colo_extension.dart'; +import 'package:flutter/material.dart'; +import 'package:smartfit_app_mobile/modele/convertisseur.dart'; + +class WorkoutRowGeneric extends StatelessWidget { + final Map wObj; + final bool isSelected; + final VoidCallback onDelete; + final VoidCallback onClick; + + const WorkoutRowGeneric({ + Key? key, + required this.wObj, + required this.onDelete, + required this.onClick, + required this.isSelected, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onClick, + child: Container( + margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 2), + decoration: BoxDecoration( + border: Border.all( + color: isSelected + ? const Color.fromARGB(255, 144, 252, 148) + : Colors.transparent, + width: 2.0, + ), + borderRadius: BorderRadius.circular(10), + ), + child: Material( + color: isSelected + ? const Color.fromARGB(255, 240, 255, 240) + : Colors.transparent, + child: InkWell( + borderRadius: + BorderRadius.circular(10), // Utiliser le même borderRadius + splashColor: const Color.fromARGB(255, 42, 94, 44) + .withOpacity(0.3), // Couleur du fond au survol + onTap: onClick, + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 15), + child: Row( + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(10), + child: SvgPicture.asset( + wObj["image"].toString(), + width: 60, + height: 60, + fit: BoxFit.cover, + ), + ), + const SizedBox(width: 15), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Type : ${wObj["categorie"].toString()}", + style: TextStyle( + color: TColor.black, + fontSize: 12, + ), + ), + Text( + "Date : ${wObj["date"].toString()}", + style: TextStyle( + color: TColor.black, + fontSize: 12, + ), + ), + Text( + "Temps : ${Convertisseur.secondeIntoMinute(wObj["time"]).toStringAsFixed(2)} m", + style: TextStyle( + color: TColor.black, + fontSize: 12, + ), + ) + ], + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + IconButton( + onPressed: onClick, + icon: Image.asset( + "assets/img/next_icon.png", + width: 30, + height: 30, + fit: BoxFit.contain, + ), + ), + IconButton( + onPressed: onDelete, + icon: Image.asset( + "assets/img/corbeille.png", + width: 30, + height: 30, + fit: BoxFit.contain, + ), + ), + ], + ), + ], + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/common_widget/container/workout_row.dart b/lib/common_widget/container/workout_row/workout_row_walking.dart similarity index 91% rename from lib/common_widget/container/workout_row.dart rename to lib/common_widget/container/workout_row/workout_row_walking.dart index d4d499a..1f6b5fd 100644 --- a/lib/common_widget/container/workout_row.dart +++ b/lib/common_widget/container/workout_row/workout_row_walking.dart @@ -1,14 +1,15 @@ import 'package:flutter_svg/svg.dart'; import 'package:smartfit_app_mobile/common/colo_extension.dart'; import 'package:flutter/material.dart'; +import 'package:smartfit_app_mobile/modele/convertisseur.dart'; -class WorkoutRow extends StatelessWidget { +class WorkoutRowWalking extends StatelessWidget { final Map wObj; final bool isSelected; final VoidCallback onDelete; final VoidCallback onClick; - const WorkoutRow({ + const WorkoutRowWalking({ Key? key, required this.wObj, required this.onDelete, @@ -74,14 +75,14 @@ class WorkoutRow extends StatelessWidget { ), ), Text( - "Temps : ${wObj["time"].toString()}", + "Temps : ${Convertisseur.secondeIntoMinute(wObj["time"]).toStringAsFixed(2)} m", style: TextStyle( color: TColor.black, fontSize: 12, ), ), Text( - "Dénivelé positif : ${wObj["DenivelePositif"].toString()}", + "Vitesse moyenne : ${Convertisseur.msIntoKmh(wObj["VitesseAvg"]).toStringAsFixed(2)} km/h", style: TextStyle( color: TColor.black, fontSize: 12, diff --git a/lib/modele/activity.dart b/lib/modele/activity.dart index 57b36f1..5637d1c 100644 --- a/lib/modele/activity.dart +++ b/lib/modele/activity.dart @@ -3,7 +3,7 @@ import 'package:smartfit_app_mobile/modele/activity_info/activity_info.dart'; class ActivityOfUser { final ActivityInfo _activityInfo; // A afficher - final String _categorie; + final String _category; final String _fileUuid; final String _nameFile; // ------------ // @@ -14,7 +14,7 @@ class ActivityOfUser { String get fileUuid => _fileUuid; String get nameFile => _nameFile; - String get category => _categorie; + String get category => _category; ActivityInfo get activityInfo => _activityInfo; Map get enteteCSV => _enteteCSV; @@ -29,9 +29,9 @@ class ActivityOfUser { } ActivityOfUser( - this._activityInfo, this._categorie, this._fileUuid, this._nameFile) { + this._activityInfo, this._category, this._fileUuid, this._nameFile) { // Mettre dans une fonction appart - if (_categorie == "Walking") { + if (_category == "Walking") { _imageName = "assets/img/workout1.svg"; } else { // Mettre des conditions pour d'autre type d'activité @@ -43,7 +43,7 @@ class ActivityOfUser { Map toMapGeneric() { Map map = { - 'categorie': _categorie, + 'categorie': _category, 'image': _imageName, 'date': _activityInfo.startTime, 'time': _activityInfo.timeOfActivity, diff --git a/lib/modele/activity_info/activity_info.dart b/lib/modele/activity_info/activity_info.dart index aed8424..92ba698 100644 --- a/lib/modele/activity_info/activity_info.dart +++ b/lib/modele/activity_info/activity_info.dart @@ -319,7 +319,9 @@ class ActivityInfo { // -- Altitude -- // "AltitudeMax": altitudeMax, "AltitudeMin": altitudeMin, - "AltitudeAvg": altitudeAvg + "AltitudeAvg": altitudeAvg, + // -- Vitesse -- // + "VitesseAvg": vitesseAvg }; } @@ -330,30 +332,106 @@ class ActivityInfo { return; } // -- Ligne session -- // - startTime = DateTime.parse(map["startTime"]); - timeOfActivity = map["timeOfActivity"].toDouble(); - distance = map["distance"].toDouble(); - calories = map["calories"].toInt(); - steps = map["steps"].toInt(); + try { + startTime = DateTime.parse(map["startTime"]); + } catch (e) { + print("Impossible de recup -> startTime"); + } + try { + timeOfActivity = map["timeOfActivity"]; + } catch (e) { + print("Impossible de recup -> timeOfActivity"); + } + try { + distance = map["distance"].toDouble(); + } catch (e) { + print("Impossible de recup -> distance"); + } + try { + calories = map["calories"]; + } catch (e) { + print("Impossible de recup -> calories"); + } + try { + steps = map["steps"]; + } catch (e) { + print("Impossible de recup -> steps"); + } // -- BPM -- // - bpmAvg = map["bpmAvg"]; - bpmMax = map["bpmMax"]; - bpmMin = map["bpmMin"]; + try { + bpmAvg = map["bpmAvg"]; + } catch (e) { + print("Impossible de recup -> "); + } + try { + bpmMax = map["bpmMax"]; + } catch (e) { + print("Impossible de recup -> "); + } + try { + bpmMin = map["bpmMin"]; + } catch (e) { + print("Impossible de recup -> "); + } // -- Denivelé -- // - deniveleNegatif = map["deniveleNegatif"].toDouble(); - denivelePositif = map["denivelePositif"].toDouble(); + try { + deniveleNegatif = map["deniveleNegatif"]; + } catch (e) { + print("Impossible de recup -> deniveleNegatif"); + } + try { + denivelePositif = map["denivelePositif"]; + } catch (e) { + print("Impossible de recup -> denivelePositif"); + } // -- Altitude -- // - altitudeMax = map["altitudeMax"].toDouble(); - altitudeMin = map["altitudeMin"].toDouble(); - altitudeAvg = map["altitudeAvg"].toDouble(); + try { + altitudeMax = map["altitudeMax"]; + } catch (e) { + print("Impossible de recup -> altitudeMax"); + } + try { + altitudeMin = map["altitudeMin"]; + } catch (e) { + print("Impossible de recup -> altitudeMin"); + } + try { + altitudeAvg = map["altitudeAvg"]; + } catch (e) { + print("Impossible de recup -> altitudeAvg"); + } // -- Température -- // - temperatureMax = map["temperatureMax"].toInt(); - temperatureMin = map["temperatureMin"].toInt(); - temperatureAvg = map["temperatureAvg"].toInt(); + try { + temperatureMax = map["temperatureMax"]; + } catch (e) { + print("Impossible de recup -> temperatureMax"); + } + try { + temperatureMin = map["temperatureMin"]; + } catch (e) { + print("Impossible de recup -> temperatureMin"); + } + try { + temperatureAvg = map["temperatureAvg"]; + } catch (e) { + print("Impossible de recup -> temperatureAvg"); + } // -- Vitesse -- // - vitesseMax = map["vitesseMax"].toDouble(); - vitesseMin = map["vitesseMin"].toDouble(); - vitesseAvg = map["vitesseAvg"].toDouble(); + try { + vitesseMax = map["vitesseMax"].toDouble(); + } catch (e) { + print("Impossible de recup -> vitesseMax"); + } + try { + vitesseMin = map["vitesseMin"].toDouble(); + } catch (e) { + print("Impossible de recup -> vitesseMin"); + } + try { + vitesseAvg = map["vitesseAvg"].toDouble(); + } catch (e) { + print("Impossible de recup -> vitesseAvg"); + } } // -- Ecriture -- // @@ -379,7 +457,7 @@ class ActivityInfo { 'vitesseMin': vitesseMin, 'vitesseAvg': vitesseAvg, // Ligne session - 'startTime': startTime.toString(), + 'startTime': startTime.toIso8601String(), 'timeOfActivity': timeOfActivity, 'distance': distance, 'calories': calories, diff --git a/lib/modele/convertisseur.dart b/lib/modele/convertisseur.dart new file mode 100644 index 0000000..89e3ebc --- /dev/null +++ b/lib/modele/convertisseur.dart @@ -0,0 +1,11 @@ +class Convertisseur { + // Mettre que des trucs static + + static double secondeIntoMinute(double seconde) { + return seconde / 60; + } + + static double msIntoKmh(double metreSeconde) { + return metreSeconde * 3.6; + } +} diff --git a/lib/modele/manager_file.dart b/lib/modele/manager_file.dart index a83e975..efb9959 100644 --- a/lib/modele/manager_file.dart +++ b/lib/modele/manager_file.dart @@ -113,7 +113,7 @@ class ManagerFile { categorie = _getCategoryById(int.parse(_getXfromListe(_sport, ligneSession))); - // -- Si la catégorie est pas prévu est est généric -- // + // -- Si la catégorie est pas prévu == généric -- // switch (categorie) { case (_marche): fieldAllowed = allowedFieldWalking; @@ -143,7 +143,6 @@ class ManagerFile { info.calories = int.parse(_getXfromListe(_totalCalories, ligneSession)); info.steps = int.parse(_getXfromListe(_totalStep, ligneSession)); // ----------------------------------------------------- // - // -- Extraire les données en fonction de la catégorie -- // switch (categorie) { case (_marche): @@ -154,6 +153,7 @@ class ManagerFile { info.getDataGeneric(csvData); } + //print("Fin : ManagerFile -> convertBytesFitFileIntoCSVListAndGetInfo "); return Tuple4(true, csvData, info, categorie); } diff --git a/lib/modele/utile/list_activity/list_activity_utile.dart b/lib/modele/utile/list_activity/list_activity_utile.dart index dc963e2..1f9ef4f 100644 --- a/lib/modele/utile/list_activity/list_activity_utile.dart +++ b/lib/modele/utile/list_activity/list_activity_utile.dart @@ -81,6 +81,8 @@ class ListActivityUtile { resultData.item4, resultData.item3.startTime, resultData.item3); + // resultData.item4 == category + // resultData.item3 == ActivityInfo if (result.item1 == false) { return Tuple2(false, result.item2); }