avancement sur data plusieur activité

pull/4/head
Enzo 1 year ago
parent 361c5bed9c
commit 4df9430b3c

@ -46,7 +46,7 @@ class _GraphAreaState extends State<GraphArea>
@override
Widget build(BuildContext context) {
List<DataPoint> vitesseSecondes = Provider.of<User>(context, listen: false)
.listActivity[0]
.managerSelectedActivity
.getSpeedWithTimeActivity();
return GestureDetector(

@ -13,16 +13,17 @@ class MobileGraphAltitudeByTime extends StatefulWidget {
: super(key: key);
@override
State<MobileGraphAltitudeByTime> createState() => _MobileGraphAltitudeByTime();
State<MobileGraphAltitudeByTime> createState() =>
_MobileGraphAltitudeByTime();
}
class _MobileGraphAltitudeByTime extends State<MobileGraphAltitudeByTime> {
@override
Widget build(BuildContext context) {
final double maxY =
context.watch<User>().listActivity[0].getMaxAltitude() + 2;
context.watch<User>().managerSelectedActivity.getMaxAltitude() + 2;
final double minY =
context.watch<User>().listActivity[0].getMinAltitude() - 2;
context.watch<User>().managerSelectedActivity.getMinAltitude() - 2;
final lineBarsData = [
LineChartBarData(

@ -13,10 +13,12 @@ class MobileGraphBpmAndSpeedByTime extends StatefulWidget {
: super(key: key);
@override
State<MobileGraphBpmAndSpeedByTime> createState() => _MobileGraphBpmAndSpeedByTime();
State<MobileGraphBpmAndSpeedByTime> createState() =>
_MobileGraphBpmAndSpeedByTime();
}
class _MobileGraphBpmAndSpeedByTime extends State<MobileGraphBpmAndSpeedByTime> {
class _MobileGraphBpmAndSpeedByTime
extends State<MobileGraphBpmAndSpeedByTime> {
TextEditingController bpmController = TextEditingController();
List<int> showingTooltipOnSpots = [0];
@ -96,15 +98,13 @@ class _MobileGraphBpmAndSpeedByTime extends State<MobileGraphBpmAndSpeedByTime>
@override
Widget build(BuildContext context) {
final double maxY =
context.watch<User>().listActivity[0].getMaxBpm() + 2;
final double maxY =
context.watch<User>().managerSelectedActivity.getMaxBpm() + 2;
final double minY =
context.watch<User>().listActivity[0].getMinBpm() - 2;
context.watch<User>().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<MobileGraphBpmAndSpeedByTime>
getTooltipItems: (List<LineBarSpot> 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<MobileGraphBpmAndSpeedByTime>
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,

@ -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<MobileBpmByTime> createState() => _MobileBpmByTime();
@ -20,13 +19,12 @@ class _MobileBpmByTime extends State<MobileBpmByTime> {
@override
Widget build(BuildContext context) {
final double maxY =
context.watch<User>().listActivity[0].getMaxBpm() + 2;
context.watch<User>().managerSelectedActivity.getMaxBpm() + 2;
final double minY =
context.watch<User>().listActivity[0].getMinBpm() - 2;
context.watch<User>().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,

@ -21,12 +21,11 @@ class _WebGraphAltitudeByTime extends State<WebGraphAltitudeByTime> {
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<User>().listActivity[0].getMaxAltitude() + 2;
context.watch<User>().managerSelectedActivity.getMaxAltitude() + 2;
final double minY =
context.watch<User>().listActivity[0].getMinAltitude() - 2;
context.watch<User>().managerSelectedActivity.getMinAltitude() - 2;
final lineBarsData = [
LineChartBarData(
@ -65,7 +64,8 @@ class _WebGraphAltitudeByTime extends State<WebGraphAltitudeByTime> {
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(

@ -13,7 +13,8 @@ class WebGraphBpmAndSpeedByTime extends StatefulWidget {
: super(key: key);
@override
State<WebGraphBpmAndSpeedByTime> createState() => _WebGraphBpmAndSpeedByTime();
State<WebGraphBpmAndSpeedByTime> createState() =>
_WebGraphBpmAndSpeedByTime();
}
class _WebGraphBpmAndSpeedByTime extends State<WebGraphBpmAndSpeedByTime> {
@ -77,7 +78,6 @@ class _WebGraphBpmAndSpeedByTime extends State<WebGraphBpmAndSpeedByTime> {
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<WebGraphBpmAndSpeedByTime> {
@override
Widget build(BuildContext context) {
final double maxY =
context.watch<User>().listActivity[0].getMaxBpm() + 2;
final double maxY =
context.watch<User>().managerSelectedActivity.getMaxBpm() + 2;
final double minY =
context.watch<User>().listActivity[0].getMinBpm() - 2;
context.watch<User>().managerSelectedActivity.getMinBpm() - 2;
final double maxY1 =
context.watch<User>().listActivity[0].getMaxBpm() + 2;
context.watch<User>().managerSelectedActivity.getMaxBpm() + 2;
final double minY2 =
context.watch<User>().listActivity[0].getMinBpm() - 2;
context.watch<User>().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<WebGraphBpmAndSpeedByTime> {
gradient: LinearGradient(
colors: TColor.secondaryG,
),
),
];
final tooltipsOnBar = lineBarsData[0];
@ -216,21 +213,23 @@ class _WebGraphBpmAndSpeedByTime extends State<WebGraphBpmAndSpeedByTime> {
),
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,

@ -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<WebBpmByTime> createState() => _WebBpmByTime();
@ -20,13 +19,12 @@ class _WebBpmByTime extends State<WebBpmByTime> {
@override
Widget build(BuildContext context) {
final double maxY =
context.watch<User>().listActivity[0].getMaxBpm() + 2;
context.watch<User>().managerSelectedActivity.getMaxBpm() + 2;
final double minY =
context.watch<User>().listActivity[0].getMinBpm() - 2;
context.watch<User>().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,

@ -8,7 +8,7 @@ class Info extends StatelessWidget {
@override
Widget build(BuildContext context) {
String distance = Provider.of<User>(context, listen: false)
.listActivity[0]
.managerSelectedActivity
.getTotalDistance()
.toString();

@ -9,15 +9,15 @@ class Stats extends StatelessWidget {
@override
Widget build(BuildContext context) {
String calories = Provider.of<User>(context, listen: false)
.listActivity[0]
.managerSelectedActivity
.getCalorie()
.toString();
String heartrate = Provider.of<User>(context, listen: false)
.listActivity[0]
.managerSelectedActivity
.getAvgBpm()
.toString();
String time = Provider.of<User>(context, listen: false)
.listActivity[0]
.managerSelectedActivity
.getTotalTime()
.toString();
return Column(

@ -8,7 +8,7 @@ class Steps extends StatelessWidget {
@override
Widget build(BuildContext context) {
String steps = Provider.of<User>(context, listen: false)
.listActivity[0]
.managerSelectedActivity
.getTotalSteps()
.toString();

@ -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<List<dynamic>> _contentActivity;
Map<String, int> enteteCSV = {};
// ManagerFile for the field
final ManagerFile _managerFile = ManagerFile();
List<List<dynamic>> _contentActivity = List.empty(growable: true);
Map<String, int> _enteteCSV = {};
// -- Getter/Setter -- //
String get fileUuid => _fileUuid;
String get nameFile => _nameFile;
Map<String, int> get enteteCSV => _enteteCSV;
// -- Getter/Setter -- Ancien //
List<List<dynamic>> get contentActivity => _contentActivity;
set contentActivity(List<List<dynamic>> 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<FlSpot> getXWithTime(String field) {
List<FlSpot> 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<DataPoint> getSpeedWithTimeActivity() {
List<DataPoint> 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<LatLng> getPosition() {
List<LatLng> 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<String, dynamic> toMap() {

@ -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<String> get localPath async {
final directory = await getApplicationDocumentsDirectory();
return directory.path;
}
}*/
/*
// ----- Read csv File ------- //

@ -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<ActivityOfUser> 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<FlSpot> getXWithTime(String field) {
List<FlSpot> 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<DataPoint> getSpeedWithTimeActivity() {
List<DataPoint> 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<LatLng> getPosition() {
List<LatLng> 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;
}
}

@ -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<ActivityOfUser> listActivity = List.empty(growable: true);
ManagerSelectedActivity managerSelectedActivity = ManagerSelectedActivity();
void addActivity(ActivityOfUser activity) {
listActivity.add(activity);

@ -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<User>(context).listActivity[0];
List<FlSpot> bpmSecondes = activity.getXWithTime(_managerFile.fielBPM);
List<FlSpot> vitesseSecondes =
activity.getXWithTime(_managerFile.fieldSpeed);
List<FlSpot> altitudeSeconde =
activity.getXWithTime(_managerFile.fieldAltitude);
List<FlSpot> bpmSecondes = Provider.of<User>(context)
.managerSelectedActivity
.getXWithTime(managerFile.fielBPM);
List<FlSpot> vitesseSecondes = Provider.of<User>(context)
.managerSelectedActivity
.getXWithTime(managerFile.fieldSpeed);
List<FlSpot> altitudeSeconde = Provider.of<User>(context)
.managerSelectedActivity
.getXWithTime(managerFile.fieldAltitude);
List<FlSpot> bpmSecondes2 = List.from(bpmSecondes);

@ -14,15 +14,21 @@ class ListActivityUtile {
final IDataStrategy _strategy = RequestApi();
final ManagerFile _managerFile = ManagerFile();
Future<Tuple2<bool, String>> getContentActivity(BuildContext context) async {
Future<Tuple2<bool, String>> getContentActivity(
BuildContext context, ActivityOfUser activityOfUser) async {
Tuple2 result = await _strategy.getFile(
Provider.of<User>(context, listen: false).token,
Provider.of<User>(context, listen: false).listActivity[0].fileUuid);
activityOfUser.fileUuid);
if (result.item1 == false) {
return Tuple2(result.item1, result.item2);
}
Provider.of<User>(context, listen: false).listActivity[0].contentActivity =
activityOfUser.contentActivity =
List.from(_managerFile.convertByteIntoCSV(result.item2));
Provider.of<User>(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");
}

@ -9,7 +9,7 @@ class MapUtil {
_polylines.add(Polyline(
polylineId: const PolylineId("Polyline"),
color: couleur,
points: context.watch<User>().listActivity[0].getPosition(),
points: context.watch<User>().managerSelectedActivity.getPosition(),
width: largueur));
return _polylines;
}

@ -11,7 +11,11 @@ class Activity extends StatelessWidget {
@override
Widget build(BuildContext context) {
return context.watch<User>().listActivity.isEmpty
return context
.watch<User>()
.managerSelectedActivity
.activitySelected
.isEmpty
? ScreenTypeLayout.builder(
mobile: (_) => const NoActivityView(),
desktop: (_) => const NoActivityView(),

@ -27,31 +27,8 @@ class _MobileListActivity extends State<MobileListActivity> {
FilePickerResult? result;
final IDataStrategy _strategy = RequestApi();
final ListActivityUtile _utile = ListActivityUtile();
final ManagerFile _managerFile = ManagerFile();
int firstActivityIndex = 0;
/*
Future<void> readFile(String nom) async {
PlatformFile t = result!.files.single;
String? y = t.path;
if (t.path == null) {
print("t");
} else {
List<dynamic> result = await _managerFile.readFitFile(y!);
// Upload the file and Syncronise (getFiles())
strategy.uploadFile(context.watch<User>().token, File(y));
Provider.of<User>(context, listen: false)
.addActivity(ActivityOfUser("Random date", "$nom categorie !"));
Provider.of<User>(context, listen: false)
.listActivity
.last
.contentActivity = result;
}
}*/
Future<bool> deleteFileOnBDD(String token, String fileUuid) async {
Tuple2<bool, String> result = await _strategy.deleteFile(token, fileUuid);
if (!result.item1) {
@ -195,7 +172,8 @@ class _MobileListActivity extends State<MobileListActivity> {
.removeActivity(activityObj);
Provider.of<User>(context, listen: false)
.insertActivity(0, activityObj);
_utile.getContentActivity(context);
_utile.getContentActivity(
context, activityObj);
},
isFirstActivity: isFirstActivity,
),

@ -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<WebListActivity> {
.removeActivity(activityObj);
Provider.of<User>(context, listen: false)
.insertActivity(0, activityObj);
_utile.getContentActivity(context);
_utile.getContentActivity(
context, activityObj);
},
isFirstActivity: isFirstActivity,
),

@ -16,7 +16,11 @@ class HomeView extends StatefulWidget {
class _HomeViewState extends State<HomeView> {
@override
Widget build(BuildContext context) {
return context.watch<User>().listActivity.isEmpty
return context
.watch<User>()
.managerSelectedActivity
.activitySelected
.isEmpty
? ScreenTypeLayout.builder(
mobile: (_) => const NoActivityView(),
desktop: (_) => const NoActivityView(),

@ -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<MobileHomeView> {
@override
Widget build(BuildContext context) {
var media = MediaQuery.of(context).size;
ManagerSelectedActivity managerSelectedActivity =
context.watch<User>().managerSelectedActivity;
// -- BPM -- //
int maxBpm = context.watch<User>().listActivity[0].getMaxBpm();
int minBpm = context.watch<User>().listActivity[0].getMinBpm();
int avgBpm = context.watch<User>().listActivity[0].getAvgBpm();
int maxBpm = managerSelectedActivity.getMaxBpm();
int minBpm = managerSelectedActivity.getMinBpm();
int avgBpm = managerSelectedActivity.getAvgBpm();
// -- Altitude -- //
double minAltitude = context.watch<User>().listActivity[0].getMinAltitude();
double maxAltitude = context.watch<User>().listActivity[0].getMaxAltitude();
double minAltitude = managerSelectedActivity.getMinAltitude();
double maxAltitude = managerSelectedActivity.getMaxAltitude();
double avgAltitude = (maxAltitude + minAltitude) / 2;
// -- Speed -- //
double maxSpeed = context.watch<User>().listActivity[0].getMaxSpeed();
double avgSpeed = context.watch<User>().listActivity[0].getAvgSpeed();
double maxSpeed = managerSelectedActivity.getMaxSpeed();
double avgSpeed = managerSelectedActivity.getAvgSpeed();
data = HomeViewUtil().initData(context);
return Scaffold(

@ -25,16 +25,20 @@ class _WebHomeView extends State<WebHomeView> {
Widget build(BuildContext context) {
var media = MediaQuery.of(context).size;
// -- BPM -- //
int maxBpm = context.watch<User>().listActivity[0].getMaxBpm();
int minBpm = context.watch<User>().listActivity[0].getMinBpm();
int avgBpm = context.watch<User>().listActivity[0].getAvgBpm();
int maxBpm = context.watch<User>().managerSelectedActivity.getMaxBpm();
int minBpm = context.watch<User>().managerSelectedActivity.getMinBpm();
int avgBpm = context.watch<User>().managerSelectedActivity.getAvgBpm();
// -- Altitude -- //
double minAltitude = context.watch<User>().listActivity[0].getMinAltitude();
double maxAltitude = context.watch<User>().listActivity[0].getMaxAltitude();
double minAltitude =
context.watch<User>().managerSelectedActivity.getMinAltitude();
double maxAltitude =
context.watch<User>().managerSelectedActivity.getMaxAltitude();
double avgAltitude = (maxAltitude + minAltitude) / 2;
// -- Speed -- //
double maxSpeed = context.watch<User>().listActivity[0].getMaxSpeed();
double avgSpeed = context.watch<User>().listActivity[0].getAvgSpeed();
double maxSpeed =
context.watch<User>().managerSelectedActivity.getMaxSpeed();
double avgSpeed =
context.watch<User>().managerSelectedActivity.getAvgSpeed();
data = HomeViewUtil().initData(context);

@ -16,7 +16,11 @@ class MyMap extends StatefulWidget {
class _MyMapState extends State<MyMap> {
@override
Widget build(BuildContext context) {
return context.watch<User>().listActivity.isEmpty
return context
.watch<User>()
.managerSelectedActivity
.activitySelected
.isEmpty
? ScreenTypeLayout.builder(
mobile: (_) => const NoActivityView(),
desktop: (_) => const NoActivityView(),

@ -99,8 +99,8 @@ class _TestPage extends State<TestPage> {
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<TestPage> {
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<TestPage> {
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

Loading…
Cancel
Save