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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
List<DataPoint> vitesseSecondes = Provider.of<User>(context, listen: false) List<DataPoint> vitesseSecondes = Provider.of<User>(context, listen: false)
.listActivity[0] .managerSelectedActivity
.getSpeedWithTimeActivity(); .getSpeedWithTimeActivity();
return GestureDetector( return GestureDetector(

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

@ -13,10 +13,12 @@ class MobileGraphBpmAndSpeedByTime extends StatefulWidget {
: super(key: key); : super(key: key);
@override @override
State<MobileGraphBpmAndSpeedByTime> createState() => _MobileGraphBpmAndSpeedByTime(); State<MobileGraphBpmAndSpeedByTime> createState() =>
_MobileGraphBpmAndSpeedByTime();
} }
class _MobileGraphBpmAndSpeedByTime extends State<MobileGraphBpmAndSpeedByTime> { class _MobileGraphBpmAndSpeedByTime
extends State<MobileGraphBpmAndSpeedByTime> {
TextEditingController bpmController = TextEditingController(); TextEditingController bpmController = TextEditingController();
List<int> showingTooltipOnSpots = [0]; List<int> showingTooltipOnSpots = [0];
@ -96,15 +98,13 @@ class _MobileGraphBpmAndSpeedByTime extends State<MobileGraphBpmAndSpeedByTime>
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final double maxY =
final double maxY = context.watch<User>().managerSelectedActivity.getMaxBpm() + 2;
context.watch<User>().listActivity[0].getMaxBpm() + 2;
final double minY = final double minY =
context.watch<User>().listActivity[0].getMinBpm() - 2; context.watch<User>().managerSelectedActivity.getMinBpm() - 2;
final double maxX = final double maxX =
widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x; widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x;
final double minX = final double minX = 0.0;
0.0;
final lineBarsData = [ final lineBarsData = [
LineChartBarData( LineChartBarData(
spots: widget.data.bpmSecondes, spots: widget.data.bpmSecondes,
@ -188,7 +188,7 @@ class _MobileGraphBpmAndSpeedByTime extends State<MobileGraphBpmAndSpeedByTime>
getTooltipItems: (List<LineBarSpot> lineBarsSpot) { getTooltipItems: (List<LineBarSpot> lineBarsSpot) {
return lineBarsSpot.map((lineBarSpot) { return lineBarsSpot.map((lineBarSpot) {
return LineTooltipItem( return LineTooltipItem(
"Seconde ${lineBarSpot.x.toInt() } ", "Seconde ${lineBarSpot.x.toInt()} ",
const TextStyle( const TextStyle(
color: Colors.white, color: Colors.white,
fontSize: 10, fontSize: 10,
@ -208,13 +208,14 @@ class _MobileGraphBpmAndSpeedByTime extends State<MobileGraphBpmAndSpeedByTime>
topTitles: const AxisTitles(), topTitles: const AxisTitles(),
bottomTitles: const AxisTitles(), bottomTitles: const AxisTitles(),
rightTitles: AxisTitles( rightTitles: AxisTitles(
sideTitles: SideTitles( sideTitles: SideTitles(
reservedSize: 70, reservedSize: 70,
showTitles: true, showTitles: true,
getTitlesWidget: (value, meta) { getTitlesWidget: (value, meta) {
return Text("${double.parse(value.toStringAsFixed(2))} BPM"); return Text(
}, "${double.parse(value.toStringAsFixed(2))} BPM");
))), },
))),
gridData: FlGridData( gridData: FlGridData(
drawVerticalLine: true, drawVerticalLine: true,
drawHorizontalLine: true, drawHorizontalLine: true,

@ -9,8 +9,7 @@ class MobileBpmByTime extends StatefulWidget {
final Size media; final Size media;
final DataHomeView data; final DataHomeView data;
const MobileBpmByTime(this.media, this.data, {Key? key}) const MobileBpmByTime(this.media, this.data, {Key? key}) : super(key: key);
: super(key: key);
@override @override
State<MobileBpmByTime> createState() => _MobileBpmByTime(); State<MobileBpmByTime> createState() => _MobileBpmByTime();
@ -20,13 +19,12 @@ class _MobileBpmByTime extends State<MobileBpmByTime> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final double maxY = final double maxY =
context.watch<User>().listActivity[0].getMaxBpm() + 2; context.watch<User>().managerSelectedActivity.getMaxBpm() + 2;
final double minY = final double minY =
context.watch<User>().listActivity[0].getMinBpm() - 2; context.watch<User>().managerSelectedActivity.getMinBpm() - 2;
final double maxX = final double maxX =
widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x; widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x;
final double minX = final double minX = 0.0;
0.0;
final lineBarsData = [ final lineBarsData = [
LineChartBarData( LineChartBarData(
spots: widget.data.bpmSecondes, spots: widget.data.bpmSecondes,

@ -21,12 +21,11 @@ class _WebGraphAltitudeByTime extends State<WebGraphAltitudeByTime> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
final double maxX = final double maxX =
widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x; widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x;
final double minX = final double minX = 0.0;
0.0;
final double maxY = final double maxY =
context.watch<User>().listActivity[0].getMaxAltitude() + 2; context.watch<User>().managerSelectedActivity.getMaxAltitude() + 2;
final double minY = final double minY =
context.watch<User>().listActivity[0].getMinAltitude() - 2; context.watch<User>().managerSelectedActivity.getMinAltitude() - 2;
final lineBarsData = [ final lineBarsData = [
LineChartBarData( LineChartBarData(
@ -65,7 +64,8 @@ class _WebGraphAltitudeByTime extends State<WebGraphAltitudeByTime> {
reservedSize: 20, reservedSize: 20,
showTitles: true, showTitles: true,
getTitlesWidget: (value, meta) { getTitlesWidget: (value, meta) {
return Text("${double.parse((value/10).toStringAsFixed(2))}s"); return Text(
"${double.parse((value / 10).toStringAsFixed(2))}s");
}, },
)), )),
rightTitles: AxisTitles( rightTitles: AxisTitles(

@ -13,7 +13,8 @@ class WebGraphBpmAndSpeedByTime extends StatefulWidget {
: super(key: key); : super(key: key);
@override @override
State<WebGraphBpmAndSpeedByTime> createState() => _WebGraphBpmAndSpeedByTime(); State<WebGraphBpmAndSpeedByTime> createState() =>
_WebGraphBpmAndSpeedByTime();
} }
class _WebGraphBpmAndSpeedByTime extends State<WebGraphBpmAndSpeedByTime> { class _WebGraphBpmAndSpeedByTime extends State<WebGraphBpmAndSpeedByTime> {
@ -77,7 +78,6 @@ class _WebGraphBpmAndSpeedByTime extends State<WebGraphBpmAndSpeedByTime> {
dotData: const FlDotData(show: false), dotData: const FlDotData(show: false),
belowBarData: BarAreaData(show: false), belowBarData: BarAreaData(show: false),
spots: widget.data.vitesseSecondes, spots: widget.data.vitesseSecondes,
); );
LineChartBarData get lineChartBarData1_2 => LineChartBarData( LineChartBarData get lineChartBarData1_2 => LineChartBarData(
@ -97,19 +97,17 @@ class _WebGraphBpmAndSpeedByTime extends State<WebGraphBpmAndSpeedByTime> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final double maxY =
final double maxY = context.watch<User>().managerSelectedActivity.getMaxBpm() + 2;
context.watch<User>().listActivity[0].getMaxBpm() + 2;
final double minY = final double minY =
context.watch<User>().listActivity[0].getMinBpm() - 2; context.watch<User>().managerSelectedActivity.getMinBpm() - 2;
final double maxY1 = final double maxY1 =
context.watch<User>().listActivity[0].getMaxBpm() + 2; context.watch<User>().managerSelectedActivity.getMaxBpm() + 2;
final double minY2 = final double minY2 =
context.watch<User>().listActivity[0].getMinBpm() - 2; context.watch<User>().managerSelectedActivity.getMinBpm() - 2;
final double maxX = final double maxX =
widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x; widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x;
final double minX = final double minX = 0.0;
0.0;
final lineBarsData = [ final lineBarsData = [
LineChartBarData( LineChartBarData(
@ -127,7 +125,6 @@ class _WebGraphBpmAndSpeedByTime extends State<WebGraphBpmAndSpeedByTime> {
gradient: LinearGradient( gradient: LinearGradient(
colors: TColor.secondaryG, colors: TColor.secondaryG,
), ),
), ),
]; ];
final tooltipsOnBar = lineBarsData[0]; final tooltipsOnBar = lineBarsData[0];
@ -216,21 +213,23 @@ class _WebGraphBpmAndSpeedByTime extends State<WebGraphBpmAndSpeedByTime> {
), ),
topTitles: const AxisTitles(), topTitles: const AxisTitles(),
bottomTitles: AxisTitles( bottomTitles: AxisTitles(
sideTitles: SideTitles( sideTitles: SideTitles(
reservedSize: 20, reservedSize: 20,
showTitles: true, showTitles: true,
getTitlesWidget: (value, meta) { getTitlesWidget: (value, meta) {
return Text("${double.parse((value/10).toStringAsFixed(2))}s"); return Text(
}, "${double.parse((value / 10).toStringAsFixed(2))}s");
)), },
)),
rightTitles: AxisTitles( rightTitles: AxisTitles(
sideTitles: SideTitles( sideTitles: SideTitles(
reservedSize: 70, reservedSize: 70,
showTitles: true, showTitles: true,
getTitlesWidget: (value, meta) { getTitlesWidget: (value, meta) {
return Text("${double.parse(value.toStringAsFixed(2))} BPM"); return Text(
}, "${double.parse(value.toStringAsFixed(2))} BPM");
))), },
))),
gridData: FlGridData( gridData: FlGridData(
drawVerticalLine: true, drawVerticalLine: true,
drawHorizontalLine: true, drawHorizontalLine: true,

@ -9,8 +9,7 @@ class WebBpmByTime extends StatefulWidget {
final Size media; final Size media;
final DataHomeView data; final DataHomeView data;
const WebBpmByTime(this.media, this.data, {Key? key}) const WebBpmByTime(this.media, this.data, {Key? key}) : super(key: key);
: super(key: key);
@override @override
State<WebBpmByTime> createState() => _WebBpmByTime(); State<WebBpmByTime> createState() => _WebBpmByTime();
@ -20,13 +19,12 @@ class _WebBpmByTime extends State<WebBpmByTime> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final double maxY = final double maxY =
context.watch<User>().listActivity[0].getMaxBpm() + 2; context.watch<User>().managerSelectedActivity.getMaxBpm() + 2;
final double minY = final double minY =
context.watch<User>().listActivity[0].getMinBpm() - 2; context.watch<User>().managerSelectedActivity.getMinBpm() - 2;
final double maxX = final double maxX =
widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x; widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x;
final double minX = final double minX = 0.0;
0.0;
final lineBarsData = [ final lineBarsData = [
LineChartBarData( LineChartBarData(
spots: widget.data.bpmSecondes, spots: widget.data.bpmSecondes,

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

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

@ -8,7 +8,7 @@ class Steps extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
String steps = Provider.of<User>(context, listen: false) String steps = Provider.of<User>(context, listen: false)
.listActivity[0] .managerSelectedActivity
.getTotalSteps() .getTotalSteps()
.toString(); .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 { class ActivityOfUser {
// A afficher // A afficher
late String _categorie; late String _categorie;
@ -11,25 +6,24 @@ class ActivityOfUser {
late String _nameFile; late String _nameFile;
// ------------ // // ------------ //
late String _imageName; late String _imageName;
late List<List<dynamic>> _contentActivity;
Map<String, int> enteteCSV = {};
// ManagerFile for the field List<List<dynamic>> _contentActivity = List.empty(growable: true);
final ManagerFile _managerFile = ManagerFile(); 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; List<List<dynamic>> get contentActivity => _contentActivity;
set contentActivity(List<List<dynamic>> content) { set contentActivity(List<List<dynamic>> content) {
_contentActivity = content; _contentActivity = content;
for (int i = 0; i < content.first.length; i++) { for (int i = 0; i < content.first.length; i++) {
enteteCSV.addAll({content.first[i]: i}); _enteteCSV.addAll({content.first[i]: i});
} }
_contentActivity.removeAt(0); _contentActivity.removeAt(0);
} }
String get fileUuid => _fileUuid;
String get nameFile => _nameFile;
ActivityOfUser( ActivityOfUser(
String date, String categorie, String fileUuid, String nameFile) { String date, String categorie, String fileUuid, String nameFile) {
_categorie = categorie; _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 ---------------------- // // -------------------------- FIN Localisation ---------------------- //
Map<String, dynamic> toMap() { Map<String, dynamic> toMap() {

@ -2,7 +2,6 @@ import 'dart:convert';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:csv/csv.dart'; import 'package:csv/csv.dart';
import 'package:fit_tool/fit_tool.dart'; import 'package:fit_tool/fit_tool.dart';
import 'package:path_provider/path_provider.dart';
class ManagerFile { class ManagerFile {
// -- Field // -- Field
@ -108,11 +107,12 @@ class ManagerFile {
return const CsvToListConverter().convert(utf8.decode(bytes)); return const CsvToListConverter().convert(utf8.decode(bytes));
} }
/*
// ------------- Get The path of application --- // // ------------- Get The path of application --- //
Future<String> get localPath async { Future<String> get localPath async {
final directory = await getApplicationDocumentsDirectory(); final directory = await getApplicationDocumentsDirectory();
return directory.path; return directory.path;
} }*/
/* /*
// ----- Read csv File ------- // // ----- 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:flutter/material.dart';
import 'package:smartfit_app_mobile/modele/activity.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 { class User extends ChangeNotifier {
String username = "VOID"; String username = "VOID";
String email = "VOID"; String email = "VOID";
String token = "VOID"; String token = "VOID";
List<ActivityOfUser> listActivity = List.empty(growable: true); List<ActivityOfUser> listActivity = List.empty(growable: true);
ManagerSelectedActivity managerSelectedActivity = ManagerSelectedActivity();
void addActivity(ActivityOfUser activity) { void addActivity(ActivityOfUser activity) {
listActivity.add(activity); listActivity.add(activity);

@ -3,19 +3,23 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:smartfit_app_mobile/modele/activity.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_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/user.dart';
import 'package:smartfit_app_mobile/modele/utile/home_view/data_home_view.dart'; import 'package:smartfit_app_mobile/modele/utile/home_view/data_home_view.dart';
class HomeViewUtil { class HomeViewUtil {
DataHomeView initData(BuildContext context) { DataHomeView initData(BuildContext context) {
ManagerFile _managerFile = ManagerFile(); final ManagerFile managerFile = ManagerFile();
ActivityOfUser activity = Provider.of<User>(context).listActivity[0]; List<FlSpot> bpmSecondes = Provider.of<User>(context)
List<FlSpot> bpmSecondes = activity.getXWithTime(_managerFile.fielBPM); .managerSelectedActivity
List<FlSpot> vitesseSecondes = .getXWithTime(managerFile.fielBPM);
activity.getXWithTime(_managerFile.fieldSpeed); List<FlSpot> vitesseSecondes = Provider.of<User>(context)
List<FlSpot> altitudeSeconde = .managerSelectedActivity
activity.getXWithTime(_managerFile.fieldAltitude); .getXWithTime(managerFile.fieldSpeed);
List<FlSpot> altitudeSeconde = Provider.of<User>(context)
.managerSelectedActivity
.getXWithTime(managerFile.fieldAltitude);
List<FlSpot> bpmSecondes2 = List.from(bpmSecondes); List<FlSpot> bpmSecondes2 = List.from(bpmSecondes);

@ -14,15 +14,21 @@ class ListActivityUtile {
final IDataStrategy _strategy = RequestApi(); final IDataStrategy _strategy = RequestApi();
final ManagerFile _managerFile = ManagerFile(); 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( Tuple2 result = await _strategy.getFile(
Provider.of<User>(context, listen: false).token, Provider.of<User>(context, listen: false).token,
Provider.of<User>(context, listen: false).listActivity[0].fileUuid); activityOfUser.fileUuid);
if (result.item1 == false) { if (result.item1 == false) {
return Tuple2(result.item1, result.item2); return Tuple2(result.item1, result.item2);
} }
Provider.of<User>(context, listen: false).listActivity[0].contentActivity =
activityOfUser.contentActivity =
List.from(_managerFile.convertByteIntoCSV(result.item2)); List.from(_managerFile.convertByteIntoCSV(result.item2));
Provider.of<User>(context, listen: false)
.managerSelectedActivity
.addSelectedActivity(activityOfUser);
return const Tuple2(true, "Yeah"); return const Tuple2(true, "Yeah");
} }
@ -46,10 +52,10 @@ class ListActivityUtile {
element["uuid"].toString(), element["uuid"].toString(),
element["filename"].toString())); element["filename"].toString()));
} }
/*
if (notZero) { if (notZero) {
await getContentActivity(context); await getContentActivity(context);
} }*/
return const Tuple2(true, "Yeah"); return const Tuple2(true, "Yeah");
} }

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

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

@ -27,31 +27,8 @@ class _MobileListActivity extends State<MobileListActivity> {
FilePickerResult? result; FilePickerResult? result;
final IDataStrategy _strategy = RequestApi(); final IDataStrategy _strategy = RequestApi();
final ListActivityUtile _utile = ListActivityUtile(); final ListActivityUtile _utile = ListActivityUtile();
final ManagerFile _managerFile = ManagerFile();
int firstActivityIndex = 0; 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 { Future<bool> deleteFileOnBDD(String token, String fileUuid) async {
Tuple2<bool, String> result = await _strategy.deleteFile(token, fileUuid); Tuple2<bool, String> result = await _strategy.deleteFile(token, fileUuid);
if (!result.item1) { if (!result.item1) {
@ -195,7 +172,8 @@ class _MobileListActivity extends State<MobileListActivity> {
.removeActivity(activityObj); .removeActivity(activityObj);
Provider.of<User>(context, listen: false) Provider.of<User>(context, listen: false)
.insertActivity(0, activityObj); .insertActivity(0, activityObj);
_utile.getContentActivity(context); _utile.getContentActivity(
context, activityObj);
}, },
isFirstActivity: isFirstActivity, isFirstActivity: isFirstActivity,
), ),

@ -1,4 +1,3 @@
import 'dart:io';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:smartfit_app_mobile/modele/utile/list_activity/list_activity_utile.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); .removeActivity(activityObj);
Provider.of<User>(context, listen: false) Provider.of<User>(context, listen: false)
.insertActivity(0, activityObj); .insertActivity(0, activityObj);
_utile.getContentActivity(context); _utile.getContentActivity(
context, activityObj);
}, },
isFirstActivity: isFirstActivity, isFirstActivity: isFirstActivity,
), ),

@ -16,7 +16,11 @@ class HomeView extends StatefulWidget {
class _HomeViewState extends State<HomeView> { class _HomeViewState extends State<HomeView> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return context.watch<User>().listActivity.isEmpty return context
.watch<User>()
.managerSelectedActivity
.activitySelected
.isEmpty
? ScreenTypeLayout.builder( ? ScreenTypeLayout.builder(
mobile: (_) => const NoActivityView(), mobile: (_) => const NoActivityView(),
desktop: (_) => 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/graph/bpm_by_time.dart';
import 'package:smartfit_app_mobile/common_widget/other/entete_home_view.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/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/user.dart';
import 'package:smartfit_app_mobile/modele/utile/home_view/data_home_view.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'; import 'package:smartfit_app_mobile/modele/utile/home_view/home_view_util.dart';
@ -24,18 +25,21 @@ class _MobileHomeView extends State<MobileHomeView> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var media = MediaQuery.of(context).size; var media = MediaQuery.of(context).size;
ManagerSelectedActivity managerSelectedActivity =
context.watch<User>().managerSelectedActivity;
// -- BPM -- // // -- BPM -- //
int maxBpm = context.watch<User>().listActivity[0].getMaxBpm(); int maxBpm = managerSelectedActivity.getMaxBpm();
int minBpm = context.watch<User>().listActivity[0].getMinBpm(); int minBpm = managerSelectedActivity.getMinBpm();
int avgBpm = context.watch<User>().listActivity[0].getAvgBpm(); int avgBpm = managerSelectedActivity.getAvgBpm();
// -- Altitude -- // // -- Altitude -- //
double minAltitude = context.watch<User>().listActivity[0].getMinAltitude(); double minAltitude = managerSelectedActivity.getMinAltitude();
double maxAltitude = context.watch<User>().listActivity[0].getMaxAltitude(); double maxAltitude = managerSelectedActivity.getMaxAltitude();
double avgAltitude = (maxAltitude + minAltitude) / 2; double avgAltitude = (maxAltitude + minAltitude) / 2;
// -- Speed -- // // -- Speed -- //
double maxSpeed = context.watch<User>().listActivity[0].getMaxSpeed(); double maxSpeed = managerSelectedActivity.getMaxSpeed();
double avgSpeed = context.watch<User>().listActivity[0].getAvgSpeed(); double avgSpeed = managerSelectedActivity.getAvgSpeed();
data = HomeViewUtil().initData(context); data = HomeViewUtil().initData(context);
return Scaffold( return Scaffold(

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

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

@ -99,8 +99,8 @@ class _TestPage extends State<TestPage> {
print("--------------"); print("--------------");
print("--------------"); print("--------------");
print("${await _managerFile.localPath}\\test.csv"); //print("${await _managerFile.localPath}\\test.csv");
final outFile = File("${await _managerFile.localPath}\\test.csv"); //final outFile = File("${await _managerFile.localPath}\\test.csv");
//final csv = const ListToCsvConverter().convert(fitFile.toRows()); //final csv = const ListToCsvConverter().convert(fitFile.toRows());
//await outFile.writeAsString(csv); //await outFile.writeAsString(csv);
@ -170,7 +170,7 @@ class _TestPage extends State<TestPage> {
csvData.insert(0, enteteCSV); csvData.insert(0, enteteCSV);
final csv = const ListToCsvConverter().convert(csvData); final csv = const ListToCsvConverter().convert(csvData);
await outFile.writeAsString(csv); //await outFile.writeAsString(csv);
// ------- FIN --------------- // // ------- FIN --------------- //
@ -262,10 +262,10 @@ class _TestPage extends State<TestPage> {
print(res.item2); print(res.item2);
ManagerFile x = ManagerFile(); ManagerFile x = ManagerFile();
File file = File("${await x.localPath}/Walking_2023-11-08T10_57_28.fit"); //File file = File("${await x.localPath}/Walking_2023-11-08T10_57_28.fit");
await file.create(); //await file.create();
await file.writeAsBytes(res.item2); //await file.writeAsBytes(res.item2);
print(await x.localPath); //print(await x.localPath);
print("Save"); print("Save");
//print(await x //print(await x

Loading…
Cancel
Save