pull/4/head
Enzo 1 year ago
parent bdc1a79d85
commit b99b62dc2f

@ -2,6 +2,9 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:smartfit_app_mobile/modele/user.dart';
import 'package:smartfit_app_mobile/common/colo_extension.dart';
import 'package:smartfit_app_mobile/modele/utile/signup_user.dart';
import 'package:smartfit_app_mobile/view/login/login_view.dart';
import 'package:smartfit_app_mobile/view/login/signup_view.dart';
import 'package:smartfit_app_mobile/view/test/page_test.dart';
void main() {
@ -36,7 +39,7 @@ class MyApp extends StatelessWidget {
primaryColor: TColor.primaryColor1,
fontFamily: "Poppins"),
//home: const StartedView(),
home: const TestPage(),
home: const SignUpView(),
);
}
}

@ -1,6 +1,7 @@
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
@ -10,14 +11,20 @@ class ActivityOfUser {
late String _nameFile;
// ------------ //
late String _imageName;
late List<dynamic> _contentActivity;
late int _dataSession;
late List<List<String>> _contentActivity;
Map<String, int> enteteCSV = {};
// ManagerFile for the field
final ManagerFile _managerFile = ManagerFile();
// -- Getter/Setter -- //
List<dynamic> get contentActivity => _contentActivity;
set contentActivity(List<dynamic> content) {
List<List<String>> get contentActivity => _contentActivity;
set contentActivity(List<List<String>> content) {
_contentActivity = content;
_dataSession = getDataSession();
for (int i = 0; i < content.first.length; i++) {
enteteCSV.addAll({content.first[i]: i});
}
_contentActivity.removeAt(0);
}
String get fileUuid => _fileUuid;
@ -39,18 +46,33 @@ class ActivityOfUser {
}
}
// ----- Retourne l'indice de la ligne qui contient les données de la session -- //
int getDataSession() {
for (int i = _contentActivity.length - 1; i != 0; i--) {
if (_contentActivity[i][0] == "Data" &&
_contentActivity[i][2] == "session") {
return i;
}
// ----------------- BPM ------------------ //
// Retourne le Temps+BPM (Fichier CSV)
List<FlSpot> getHeartRateWithTime() {
List<FlSpot> result = List.empty(growable: true);
int firstTimestamp = int.parse(contentActivity
.first[enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!]);
result.add(FlSpot(
(firstTimestamp ~/ 100).toDouble(),
double.parse(contentActivity
.first[enteteCSV["Value_${_managerFile.fielBPM}"]!])));
for (int i = 1; i < contentActivity.length; i++) {
result.add(FlSpot(
((int.parse(contentActivity[i][
enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!]) -
firstTimestamp) ~/
100)
.toDouble(),
double.parse(contentActivity[i]
[enteteCSV["Value_${_managerFile.fielBPM}"]!])));
}
return 0;
return result;
}
// ----------------- BPM ------------------ //
/*
List<FlSpot> getHeartRateWithTime() {
List<FlSpot> result = List.empty(growable: true);
int firtTimeStamp = 0;
@ -75,8 +97,23 @@ class ActivityOfUser {
}
}
return result;
}*/
// Retourne le BPM Max (Fichier CSV)
int getMaxBpm() {
int max = int.parse(
contentActivity.first[enteteCSV["Value_${_managerFile.fielBPM}"]!]);
for (int i = 1; i < contentActivity.length; i++) {
int valueTmp = int.parse(
contentActivity[i][enteteCSV["Value_${_managerFile.fielBPM}"]!]);
if (valueTmp > max) {
max = valueTmp;
}
}
return 0;
}
/*
int getMaxBpm() {
for (int i = 0; i < _contentActivity[_dataSession].length; i++) {
if (_contentActivity[_dataSession][i] == "max_heart_rate") {
@ -84,7 +121,7 @@ class ActivityOfUser {
}
}
return 0;
}
}*/
int getMinBpm() {
for (int i = 0; i < _contentActivity[_dataSession].length; i++) {
@ -104,7 +141,7 @@ class ActivityOfUser {
return 0;
}
// -------------------------- FIN BPM ---------------------- //
/*
// ---------------------- Distance ---------------------- //
List<FlSpot> getDistanceWithTime() {
List<FlSpot> result = List.empty(growable: true);
@ -304,7 +341,7 @@ class ActivityOfUser {
}
}
return list;
}
}*/
// -------------------------- FIN Localisation ---------------------- //

@ -37,7 +37,8 @@ class RequestApi extends IDataStrategy {
@override
Future<Tuple2<bool, String>> deleteFile(String token, String fileUuid) async {
final response = await http.delete(Uri.parse('$urlApi/user/files'),
final response = await http.delete(
Uri.parse('$urlApi/user/files/$fileUuid'),
headers: <String, String>{'Authorization': token});
if (response.statusCode == 200) {
@ -146,6 +147,7 @@ class RequestApi extends IDataStrategy {
}
}
// -- Priviligié uploadFileByte -- //
@override
Future<Tuple2<bool, String>> uploadFile(String token, File file) async {
String filename = file.path.split('/').last;

@ -1,11 +1,108 @@
import 'dart:convert';
import 'dart:io';
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
final String _fieldTimestamp = "timestamp";
final String _fieldPositionLatitue = "position_lat";
final String _fieldPositionLongitude = "position_long";
final String _fieldDistance = "distance";
final String _fieldBPM = "heart_rate";
// -- Getter field
String get fieldTimeStamp => _fieldTimestamp;
String get fieldPositionLatitude => _fieldPositionLatitue;
String get fieldPositionLongitude => _fieldPositionLongitude;
String get fieldDistance => _fieldDistance;
String get fielBPM => _fieldBPM;
List<String> allowedFieldWalking = List.empty(growable: true);
ManagerFile() {
allowedFieldWalking = [
_fieldTimestamp,
_fieldPositionLatitue,
_fieldPositionLongitude,
_fieldDistance,
_fieldBPM
];
}
List<List<String>> convertBytesFitFileIntoCSVList(Uint8List bytes) {
FitFile fitFile = FitFile.fromBytes(bytes);
// ----------- Lire le fit et extarire les données qu'on choisi ----------- //
List<Map<String, Map<String, String>>> dataResult =
List.empty(growable: true);
for (Record element in fitFile.records) {
List listeField = element.toRow();
Map<String, Map<String, String>> ligneDataResult = {};
bool skip = true;
if (listeField[0] != "Data") {
continue;
}
for (int i = 0; i < listeField.length;) {
if (allowedFieldWalking.contains(listeField[i])) {
Map<String, String> tmp = {};
tmp["Value"] = listeField[i + 1].toString();
tmp["Unite"] = listeField[i + 2].toString();
ligneDataResult[listeField[i]] = tmp;
i += 2;
skip = false;
}
i += 1;
}
if (!skip) {
dataResult.add(ligneDataResult);
}
}
// -------- FIN ---------- //
// ------- Création du csv ----- //
// --- Création de l'entête -- //
List<String> enteteCSV = [];
for (String field in allowedFieldWalking) {
enteteCSV.add("Value_$field");
enteteCSV.add("Unite_$field");
}
List<List<String>> csvData = List.empty(growable: true);
//
for (Map<String, Map<String, String>> ligne in dataResult) {
List<String> tmpLigne = List.empty(growable: true);
for (String field in allowedFieldWalking) {
if (!ligne.containsKey(field)) {
tmpLigne.add("null");
tmpLigne.add("null");
} else {
tmpLigne.add(ligne[field]!["Value"]!);
tmpLigne.add(ligne[field]!["Unite"]!);
}
}
csvData.add(tmpLigne);
}
csvData.insert(0, enteteCSV);
// ------- FIN --------------- //
return csvData;
}
// -- Read the byte of file CSV -- //
List<List<String>> convertByteIntoCSV(Uint8List bytes) {
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 ------- //
Future<List<dynamic>> readCSVFile(String path) async {
if (File(path).exists() == false) return List.empty();
@ -16,7 +113,7 @@ class ManagerFile {
.toList();
return fields;
}
// ----- Read a file FIT --- //
Future<List<dynamic>> readFitFile(String path) async {
if (File(path).existsSync() == false) return List.empty();
@ -37,13 +134,7 @@ class ManagerFile {
List<dynamic> readFitFileWeb(Uint8List bytes) {
final fitFile = FitFile.fromBytes(bytes);
return fitFile.toRows();
}
// ------------- Get The path of application --- //
Future<String> get localPath async {
final directory = await getApplicationDocumentsDirectory();
return directory.path;
}
}*/
/*
// --- A modifier si utilisé --- //
@ -56,7 +147,7 @@ class ManagerFile {
await outFile.writeAsString(await file.readAsString());
return true;*/
}*/
/*
// -- Check si le fichier existe localement -- //
Future<bool> fileExist(String filname) async {
Directory directory = Directory("${await localPath}\\Files\\");
@ -71,7 +162,7 @@ class ManagerFile {
}
}
return false;
}
}*/
// --- Ligne utile --- //
//final csv = const ListToCsvConverter().convert(fitFile.toRows());

@ -1,5 +1,4 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:smartfit_app_mobile/modele/api/i_data_strategy.dart';
@ -13,9 +12,6 @@ class ListActivityUtile {
final ManagerFile _managerFile = ManagerFile();
Future<void> getContentOnTheFirstFileMobile(BuildContext context) async {
String fileUuid =
Provider.of<User>(context, listen: false).listActivity[0].fileUuid;
Tuple2 result = await _strategy.getFile(
Provider.of<User>(context, listen: false).token,
Provider.of<User>(context, listen: false).listActivity[0].fileUuid);
@ -24,12 +20,16 @@ class ListActivityUtile {
//print(result);
return;
}
/*
File file = File(
"${await _managerFile.localPath}/${Provider.of<User>(context, listen: false).listActivity[0].nameFile}");
await file.create();
await file.writeAsBytes(result.item2);
Provider.of<User>(context, listen: false).listActivity[0].contentActivity =
await _managerFile.readFitFileWhithFile(file);
*/
Provider.of<User>(context, listen: false).listActivity[0].contentActivity =
_managerFile.convertByteIntoCSV(result.item2);
}
Future<void> getContentOnTheFirstFileWeb(BuildContext context) async {
@ -42,6 +42,6 @@ class ListActivityUtile {
return;
}
Provider.of<User>(context, listen: false).listActivity[0].contentActivity =
await _managerFile.readFitFileWeb(result.item2);
_managerFile.convertByteIntoCSV(result.item2);
}
}

@ -1,5 +1,8 @@
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import 'package:csv/csv.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
@ -7,6 +10,7 @@ import 'package:smartfit_app_mobile/common/colo_extension.dart';
import 'package:smartfit_app_mobile/modele/activity.dart';
import 'package:smartfit_app_mobile/modele/api/i_data_strategy.dart';
import 'package:smartfit_app_mobile/modele/api/request_api.dart';
import 'package:smartfit_app_mobile/modele/manager_file.dart';
import 'package:smartfit_app_mobile/modele/user.dart';
import 'package:smartfit_app_mobile/common_widget/container/workout_row.dart';
import 'package:smartfit_app_mobile/modele/utile/list_activity.dart/list_activity_utile.dart';
@ -21,8 +25,9 @@ class MobileListActivity extends StatefulWidget {
class _MobileListActivity extends State<MobileListActivity> {
FilePickerResult? result;
final IDataStrategy strategy = RequestApi();
final IDataStrategy _strategy = RequestApi();
final ListActivityUtile _utile = ListActivityUtile();
final ManagerFile _managerFile = ManagerFile();
int firstActivityIndex = 0;
/*
@ -47,23 +52,42 @@ class _MobileListActivity extends State<MobileListActivity> {
}
}*/
void addFile(String path) async {
Future<bool> deleteFileOnBDD(String token, String fileUuid) async {
Tuple2<bool, String> result = await _strategy.deleteFile(token, fileUuid);
if (!result.item1) {
print(fileUuid);
print("msg d'erreur");
print(result.item2);
return false;
}
return true;
}
void addFile(String path, String token, String filename) async {
// -- Transormer le fit en CSV
List<List<String>> csv = _managerFile
.convertBytesFitFileIntoCSVList(await File(path).readAsBytes());
String csvString = const ListToCsvConverter().convert(csv);
Uint8List byteCSV = Uint8List.fromList(utf8.encode(csvString));
// --- Save Local
// --- BDD
Tuple2<bool, String> result = await strategy.uploadFile(
Provider.of<User>(context, listen: false).token, File(path));
// --- Api
String categoryActivity = filename.split("_").first.toLowerCase();
String dateActivity = filename.split("_")[1].split("T").first;
Tuple2<bool, String> result = await _strategy.uploadFileByte(
token, byteCSV, filename, categoryActivity, dateActivity);
if (result.item1 == false) {
// Afficher msg d'erreur
print("Upload - ${result.item2}");
return;
}
getFiles();
getFiles(token);
}
void getFiles() async {
Tuple2 result = await strategy
.getFiles(Provider.of<User>(context, listen: false).token);
void getFiles(String token) async {
Tuple2 result = await _strategy.getFiles(token);
if (result.item1 == false) {
print("GetFiles - ${result.item2}");
// Afficher une message d'erreur
@ -107,7 +131,8 @@ class _MobileListActivity extends State<MobileListActivity> {
fontWeight: FontWeight.w700),
),
TextButton(
onPressed: getFiles,
onPressed: () => getFiles(
Provider.of<User>(context, listen: false).token),
child: Text("Get activity",
style: TextStyle(
color: TColor.gray,
@ -118,7 +143,10 @@ class _MobileListActivity extends State<MobileListActivity> {
FilePickerResult? result =
await FilePicker.platform.pickFiles();
if (result != null) {
addFile(result.files.single.path!);
addFile(
result.files.single.path!,
Provider.of<User>(context, listen: false).token,
result.files.single.name);
} else {
print("Picker");
// msg d'erreur
@ -181,9 +209,14 @@ class _MobileListActivity extends State<MobileListActivity> {
},
child: WorkoutRow(
wObj: activityMap,
onDelete: () {
Provider.of<User>(context, listen: false)
.removeActivity(activityObj);
onDelete: () async {
if (await deleteFileOnBDD(
Provider.of<User>(context, listen: false)
.token,
activityObj.fileUuid)) {
Provider.of<User>(context, listen: false)
.removeActivity(activityObj);
}
},
onClick: () {
Provider.of<User>(context, listen: false)

@ -268,8 +268,8 @@ class _TestPage extends State<TestPage> {
print(await x.localPath);
print("Save");
print(await x
.readFitFile("${await x.localPath}/Walking_2023-11-08T10_57_28.fit"));
//print(await x
// .readFitFile("${await x.localPath}/Walking_2023-11-08T10_57_28.fit"));
}
Future<void> getInfoUser() async {
@ -281,7 +281,7 @@ class _TestPage extends State<TestPage> {
}
void lunch() async {
print(await _managerFile.fileExist("lol"));
//print(await _managerFile.fileExist("lol"));
}
@override

Loading…
Cancel
Save