add db + creat user and activity tables

pull/4/head
remrem 1 year ago
commit d0f20ec3e0

@ -4,7 +4,7 @@
# This file should be version controlled and should not be manually edited.
version:
revision: "d211f42860350d914a5ad8102f9ec32764dc6d06"
revision: "db7ef5bf9f59442b0e200a90587e8fa5e0c6336a"
channel: "stable"
project_type: app
@ -13,11 +13,11 @@ project_type: app
migration:
platforms:
- platform: root
create_revision: d211f42860350d914a5ad8102f9ec32764dc6d06
base_revision: d211f42860350d914a5ad8102f9ec32764dc6d06
create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
- platform: linux
create_revision: d211f42860350d914a5ad8102f9ec32764dc6d06
base_revision: d211f42860350d914a5ad8102f9ec32764dc6d06
create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
# User provided section

@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
class WorkoutRow extends StatelessWidget {
final Map wObj;
final bool isFirstActivity; // Ajouter la propriété isFirstActivity
final bool isSelected;
final VoidCallback onDelete;
final VoidCallback onClick;
@ -13,7 +13,7 @@ class WorkoutRow extends StatelessWidget {
required this.wObj,
required this.onDelete,
required this.onClick,
required this.isFirstActivity,
required this.isSelected,
}) : super(key: key);
@override
@ -24,7 +24,7 @@ class WorkoutRow extends StatelessWidget {
margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 2),
decoration: BoxDecoration(
border: Border.all(
color: isFirstActivity
color: isSelected
? Color.fromARGB(255, 144, 252, 148)
: Colors.transparent,
width: 2.0,
@ -32,7 +32,7 @@ class WorkoutRow extends StatelessWidget {
borderRadius: BorderRadius.circular(10),
),
child: Material(
color: isFirstActivity
color: isSelected
? Color.fromARGB(255, 240, 255, 240)
: Colors.transparent,
child: InkWell(

@ -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,11 @@ class _MobileGraphBpmAndSpeedByTime extends State<MobileGraphBpmAndSpeedByTime>
@override
Widget build(BuildContext context) {
final double maxY =
context.watch<User>().listActivity[0].getMaxBpm() + 2;
final double minY =
context.watch<User>().listActivity[0].getMinBpm() - 2;
final double maxY = widget.data.maxBPM + 2;
final double minY = widget.data.minBPM - 2;
final double maxX =
widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x;
final double minX =
0.0;
const double minX = 0.0;
final lineBarsData = [
LineChartBarData(
spots: widget.data.bpmSecondes,
@ -188,7 +186,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 +206,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();
@ -19,14 +18,11 @@ class MobileBpmByTime extends StatefulWidget {
class _MobileBpmByTime extends State<MobileBpmByTime> {
@override
Widget build(BuildContext context) {
final double maxY =
context.watch<User>().listActivity[0].getMaxBpm() + 2;
final double minY =
context.watch<User>().listActivity[0].getMinBpm() - 2;
final double maxY = widget.data.maxBPM + 2;
final double minY = widget.data.minBPM - 2;
final double maxX =
widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x;
final double minX =
0.0;
const double minX = 0.0;
final lineBarsData = [
LineChartBarData(
spots: widget.data.bpmSecondes,

@ -19,14 +19,10 @@ class WebGraphAltitudeByTime extends StatefulWidget {
class _WebGraphAltitudeByTime extends State<WebGraphAltitudeByTime> {
@override
Widget build(BuildContext context) {
final double maxX =
widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x;
final double minX =
0.0;
final double maxY =
context.watch<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 +61,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,11 @@ class _WebGraphBpmAndSpeedByTime extends State<WebGraphBpmAndSpeedByTime> {
@override
Widget build(BuildContext context) {
final double maxY =
context.watch<User>().listActivity[0].getMaxBpm() + 2;
final double minY =
context.watch<User>().listActivity[0].getMinBpm() - 2;
final double maxY1 =
context.watch<User>().listActivity[0].getMaxBpm() + 2;
final double minY2 =
context.watch<User>().listActivity[0].getMinBpm() - 2;
final double maxY = widget.data.maxBPM + 2;
final double minY = widget.data.minBPM - 2;
final double maxX =
widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x;
final double minX =
0.0;
const double minX = 0.0;
final lineBarsData = [
LineChartBarData(
@ -127,7 +119,6 @@ class _WebGraphBpmAndSpeedByTime extends State<WebGraphBpmAndSpeedByTime> {
gradient: LinearGradient(
colors: TColor.secondaryG,
),
),
];
final tooltipsOnBar = lineBarsData[0];
@ -216,21 +207,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();

@ -4,15 +4,18 @@ import 'package:smartfit_app_mobile/modele/local_db/objectbox.dart';
import 'package:smartfit_app_mobile/modele/user.dart';
import 'package:smartfit_app_mobile/common/colo_extension.dart';
import 'package:smartfit_app_mobile/view/login/signup_view.dart';
import 'package:smartfit_app_mobile/view/main_tab/main_tab_view.dart';
late ObjectBox localDB;
Future<void> main() async {
runApp(ChangeNotifierProvider(
create: (context) => User(), child: const MyApp()));
// ObjectBox
WidgetsFlutterBinding.ensureInitialized();
localDB = await ObjectBox.create();
localDB.init();
runApp(ChangeNotifierProvider(
create: (context) => User(), child: const MyApp()));
}
class MyApp extends StatelessWidget {
@ -20,6 +23,9 @@ class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
Widget viewToDisplay = const SignUpView();
if (localDB.hasUser()) viewToDisplay = const MainTabView();
return MaterialApp(
title: 'SmartFit',
debugShowCheckedModeBanner: false,
@ -41,7 +47,7 @@ class MyApp extends StatelessWidget {
// tested with just a hot reload.
primaryColor: TColor.primaryColor1,
fontFamily: "Poppins"),
home: const SignUpView(),
home: viewToDisplay,
//home: const ProfileView(),
);
}

@ -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() {

@ -22,4 +22,8 @@ class ObjectBox {
userBox = store.box<User>();
activityBox = store.box<Activity>();
}
bool hasUser() {
return !userBox.isEmpty();
}
}

@ -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,404 @@
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) {
// Regarder si l'entete est la même
// C'est de la merde!!
/*
if (activitySelected.isNotEmpty &&
activitySelected.first.enteteCSV != activityOfUser.enteteCSV) {
return false;
}*/
activitySelected.add(activityOfUser);
return true;
}
bool removeSelectedActivity(String fileUuid) {
for (ActivityOfUser activityOfUser in activitySelected) {
if (activityOfUser.fileUuid == fileUuid) {
activitySelected.remove(activityOfUser);
return true;
}
}
return false;
}
// ---- Function utile ---- //
// -- func utile -- //
bool fileNotSelected(String fileUuid) {
for (ActivityOfUser activityOfUser in activitySelected) {
if (activityOfUser.fileUuid == fileUuid) {
return false;
}
}
return true;
}
bool _notNull(int indexActivitySelected, int ligne, int colonne) {
if (activitySelected[indexActivitySelected].contentActivity[ligne]
[colonne] ==
"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 c = 0; c < activitySelected.length; c++) {
for (int i = 0; i < activitySelected[c].contentActivity.length; i++) {
if (_notNull(c, i, activitySelected[c].enteteCSV["Value_$field"]!)) {
if (firstTimestamp == 0) {
firstTimestamp = activitySelected[c].contentActivity[i][
activitySelected[c]
.enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!];
}
result.add(FlSpot(
(((activitySelected[c].contentActivity[i][
activitySelected[c].enteteCSV[
"Value_${_managerFile.fieldTimeStamp}"]!]) -
firstTimestamp) ~/
100)
.toDouble(),
activitySelected[c]
.contentActivity[i]
[activitySelected[c].enteteCSV["Value_$field"]!]
.toDouble()));
}
}
}
return result;
}
// ----------------- BPM ------------------ //
// Retourne le BPM Max (Fichier CSV)
int getMaxBpm() {
int max = 0;
for (int c = 0; c < activitySelected.length; c++) {
for (int i = 0; i < activitySelected[c].contentActivity.length; i++) {
if (_notNull(c, i,
activitySelected[c].enteteCSV["Value_${_managerFile.fielBPM}"]!)) {
int valueTmp = activitySelected[c].contentActivity[i]
[activitySelected[c].enteteCSV["Value_${_managerFile.fielBPM}"]!];
if (valueTmp > max) {
max = valueTmp;
}
}
}
}
return max;
}
// Retourne le BPM Min (Fichier CSV)
int getMinBpm() {
int min = 300;
for (int c = 0; c < activitySelected.length; c++) {
for (int i = 0; i < activitySelected[c].contentActivity.length; i++) {
if (_notNull(c, i,
activitySelected[c].enteteCSV["Value_${_managerFile.fielBPM}"]!)) {
int valueTmp = activitySelected[c].contentActivity[i]
[activitySelected[c].enteteCSV["Value_${_managerFile.fielBPM}"]!];
if (valueTmp < min) {
min = valueTmp;
}
}
}
}
return min;
}
// Retourne le BPM avg (Fichier CSV)
int getAvgBpm() {
int somme = 0;
int nb = 0;
for (int c = 0; c < activitySelected.length; c++) {
for (int i = 0; i < activitySelected[c].contentActivity.length; i++) {
if (_notNull(c, i,
activitySelected[c].enteteCSV["Value_${_managerFile.fielBPM}"]!)) {
somme += activitySelected[c].contentActivity[i][activitySelected[c]
.enteteCSV["Value_${_managerFile.fielBPM}"]!] as int;
nb++;
}
}
}
return somme ~/ nb;
}
// -------------------------- FIN BPM ---------------------- //
// ---------------------- Distance ---------------------- //
double getTotalDistance() {
double max = 0;
for (int c = 0; c < activitySelected.length; c++) {
for (int i = activitySelected[c].contentActivity.length - 1;
i != 0;
i--) {
if (_notNull(
c,
i,
activitySelected[c]
.enteteCSV["Value_${_managerFile.fieldDistance}"]!)) {
double valueTmp = activitySelected[c]
.contentActivity[i][activitySelected[c]
.enteteCSV["Value_${_managerFile.fieldDistance}"]!]
.toDouble();
if (valueTmp > max) {
max = valueTmp;
}
}
}
}
return max;
}
// ---------------------- FIN Distance ---------------------- //
// ---------------------- Calories ---------------------- //
int getCalorie() {
for (int c = 0; c < activitySelected.length; c++) {
for (int i = activitySelected[c].contentActivity.length - 1;
i != 0;
i--) {
if (_notNull(
c,
i,
activitySelected[c]
.enteteCSV["Value_${_managerFile.fieldTotalCalories}"]!)) {
return activitySelected[c].contentActivity[i][activitySelected[c]
.enteteCSV["Value_${_managerFile.fieldTotalCalories}"]!] as int;
}
}
}
return 0;
}
// ---------------------- FIN Calories ---------------------- //
// ---------------------- Step ------------------------------//
int getTotalSteps() {
for (int c = 0; c < activitySelected.length; c++) {
for (int i = activitySelected[c].contentActivity.length - 1;
i != 0;
i--) {
if (_notNull(
c,
i,
activitySelected[c]
.enteteCSV["Value_${_managerFile.fieldTotalStep}"]!)) {
return activitySelected[c]
.contentActivity[i][activitySelected[c]
.enteteCSV["Value_${_managerFile.fieldTotalStep}"]!]
.toInt();
}
}
}
return 0;
}
// ----------------------- FIN Step ------------------------ //
// ------------------------- Time ----------------------------- //
int getTotalTime() {
for (int c = 0; c < activitySelected.length; c++) {
for (int i = activitySelected[c].contentActivity.length - 1;
i != 0;
i--) {
if (_notNull(
c,
i,
activitySelected[c]
.enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!)) {
return activitySelected[c].contentActivity[i][activitySelected[c]
.enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!];
}
}
}
return 0;
}
// ---------------------------- FIN time -------------------- //
// ---------------------------------------- Altitude -------------------- //
// --- Fichier CSV --- //
double getMaxAltitude() {
double max = 0;
for (int c = 0; c < activitySelected.length; c++) {
for (int i = 0; i < activitySelected[c].contentActivity.length; i++) {
if (_notNull(
c,
i,
activitySelected[c]
.enteteCSV["Value_${_managerFile.fieldAltitude}"]!)) {
double valueTmp = activitySelected[c]
.contentActivity[i][activitySelected[c]
.enteteCSV["Value_${_managerFile.fieldAltitude}"]!]
.toDouble();
if (valueTmp > max) {
max = valueTmp;
}
}
}
}
return max;
}
// --- Fichier CSV --- //
double getMinAltitude() {
double min = 5000;
for (int c = 0; c < activitySelected.length; c++) {
for (int i = 0; i < activitySelected[c].contentActivity.length; i++) {
if (_notNull(
c,
i,
activitySelected[c]
.enteteCSV["Value_${_managerFile.fieldAltitude}"]!)) {
double valueTmp = activitySelected[c]
.contentActivity[i][activitySelected[c]
.enteteCSV["Value_${_managerFile.fieldAltitude}"]!]
.toDouble();
if (valueTmp < min) {
min = valueTmp;
}
}
}
}
return min;
}
// -------------------------- FIN altitude ---------------------- //
// -------------------------- Speed ---------------------- //
// -- CSV -- //
List<DataPoint> getSpeedWithTimeActivity() {
List<DataPoint> result = List.empty(growable: true);
int firstTimestamp = 0;
for (int c = 0; c < activitySelected.length; c++) {
for (int i = 0; i < activitySelected[c].contentActivity.length; i++) {
if (_notNull(
c,
i,
activitySelected[c]
.enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!) &&
_notNull(
c,
i,
activitySelected[c]
.enteteCSV["Value_${_managerFile.fieldSpeed}"]!)) {
if (firstTimestamp == 0) {
firstTimestamp = activitySelected[c].contentActivity[i][
activitySelected[c]
.enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!];
}
result.add(DataPoint(
(((activitySelected[c].contentActivity[i][
activitySelected[c].enteteCSV[
"Value_${_managerFile.fieldTimeStamp}"]!]) -
firstTimestamp) ~/
100)
.toDouble(),
activitySelected[c]
.contentActivity[i][activitySelected[c]
.enteteCSV["Value_${_managerFile.fieldSpeed}"]!]
.toDouble()));
}
}
}
return result;
}
// Retourne la Speed Max (Fichier CSV)
double getMaxSpeed() {
double max = 0.00;
for (int c = 0; c < activitySelected.length; c++) {
for (int i = 0; i < activitySelected[c].contentActivity.length; i++) {
if (_notNull(
c,
i,
activitySelected[c]
.enteteCSV["Value_${_managerFile.fieldSpeed}"]!)) {
double valueTmp = activitySelected[c]
.contentActivity[i][activitySelected[c]
.enteteCSV["Value_${_managerFile.fieldSpeed}"]!]
.toDouble();
if (valueTmp > max) {
max = valueTmp;
}
}
}
}
return max;
}
// Retourne avg Max (Fichier CSV)
double getAvgSpeed() {
double somme = 0;
int nb = 0;
for (int c = 0; c < activitySelected.length; c++) {
for (int i = 0; i < activitySelected[c].contentActivity.length; i++) {
if (_notNull(
c,
i,
activitySelected[c]
.enteteCSV["Value_${_managerFile.fieldSpeed}"]!)) {
somme += activitySelected[c].contentActivity[i][activitySelected[c]
.enteteCSV["Value_${_managerFile.fieldSpeed}"]!];
nb++;
}
}
}
return somme / nb;
}
// -------------------------- 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);

@ -5,6 +5,8 @@ class DataHomeView {
late List<FlSpot> bpmSecondes2;
late List<FlSpot> vitesseSecondes;
late List<FlSpot> altitudeSeconde;
int minBPM = 0;
int maxBPM = 0;
DataHomeView(this.bpmSecondes, this.bpmSecondes2, this.vitesseSecondes,
this.altitudeSeconde);

@ -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,10 +11,14 @@ 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(),
mobile: (_) => const NoActivityView("Pas d'activité sélectionnée"),
desktop: (_) => const NoActivityView("Pas d'activité sélectionnée"),
)
: ScreenTypeLayout.builder(
mobile: (_) => const MobileActivity(),

@ -1,16 +1,10 @@
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import 'package:csv/csv.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:smartfit_app_mobile/common/colo_extension.dart';
import 'package:smartfit_app_mobile/modele/activity.dart';
import 'package:smartfit_app_mobile/modele/api/i_data_strategy.dart';
import 'package:smartfit_app_mobile/modele/api/request_api.dart';
import 'package:smartfit_app_mobile/modele/manager_file.dart';
import 'package:smartfit_app_mobile/modele/user.dart';
import 'package:smartfit_app_mobile/common_widget/container/workout_row.dart';
import 'package:smartfit_app_mobile/modele/utile/list_activity/list_activity_utile.dart';
@ -27,37 +21,10 @@ 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) {
print(fileUuid);
print("msg d'erreur");
print(result.item2);
return false;
}
return true;
@ -165,39 +132,55 @@ class _MobileListActivity extends State<MobileListActivity> {
.listActivity[index];
var activityMap = activityObj.toMap();
bool isFirstActivity = false;
if (index == firstActivityIndex) {
isFirstActivity = true;
}
return InkWell(
onTap: () {
setState(() {
firstActivityIndex = index;
});
Provider.of<User>(context, listen: false)
.removeActivity(activityObj);
Provider.of<User>(context, listen: false)
.insertActivity(0, activityObj);
},
onTap: () {},
child: WorkoutRow(
wObj: activityMap,
onDelete: () async {
// Attention toute modif peut amener à une surchage mémoire !!
if (await deleteFileOnBDD(
Provider.of<User>(context, listen: false)
.token,
activityObj.fileUuid)) {
if (!Provider.of<User>(context,
listen: false)
.managerSelectedActivity
.fileNotSelected(
activityObj.fileUuid)) {
Provider.of<User>(context, listen: false)
.managerSelectedActivity
.removeSelectedActivity(
activityObj.fileUuid);
}
Provider.of<User>(context, listen: false)
.removeActivity(activityObj);
}
},
onClick: () {
onClick: () async {
if (!Provider.of<User>(context, listen: false)
.managerSelectedActivity
.fileNotSelected(activityObj.fileUuid)) {
Provider.of<User>(context, listen: false)
.managerSelectedActivity
.removeSelectedActivity(
activityObj.fileUuid);
return;
}
Tuple2<bool, String> result = await _utile
.getContentActivity(context, activityObj);
if (!result.item1) {
return;
}
Provider.of<User>(context, listen: false)
.removeActivity(activityObj);
Provider.of<User>(context, listen: false)
.insertActivity(0, activityObj);
_utile.getContentActivity(context);
},
isFirstActivity: isFirstActivity,
isSelected: !Provider.of<User>(context)
.managerSelectedActivity
.fileNotSelected(activityObj.fileUuid),
),
);
},

@ -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';
@ -24,28 +23,8 @@ class _WebListActivityState extends State<WebListActivity> {
FilePickerResult? result;
IDataStrategy strategy = RequestApi();
final ListActivityUtile _utile = ListActivityUtile();
int firstActivityIndex = 0;
final IDataStrategy _strategy = RequestApi();
/*
void readFile(html.File file) async {
ManagerFile x = ManagerFile();
final reader = html.FileReader();
reader.readAsArrayBuffer(file);
reader.onLoadEnd.listen((event) {
if (reader.readyState == html.FileReader.DONE) {
Uint8List bytes = reader.result as Uint8List;
List<dynamic> result = x.readFitFileWeb(bytes);
Provider.of<User>(context, listen: false).addActivity(
ActivityOfUser("Date random", "${file.name} 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) {
@ -63,7 +42,6 @@ class _WebListActivityState extends State<WebListActivity> {
reader.onLoadEnd.listen((event) async {
if (reader.readyState == html.FileReader.DONE) {
print("donne");
Uint8List bytes = reader.result as Uint8List;
Tuple2<bool, String> resultAdd =
await _utile.addFile(bytes, file.name, token);
@ -166,20 +144,16 @@ class _WebListActivityState extends State<WebListActivity> {
Provider.of<User>(context, listen: true)
.listActivity[index];
var activityMap = activityObj.toMap();
bool isFirstActivity = false;
if (index == firstActivityIndex) {
isFirstActivity = true;
}
return InkWell(
onTap: () {
/*
setState(() {
firstActivityIndex = index;
});
Provider.of<User>(context, listen: false)
.removeActivity(activityObj);
Provider.of<User>(context, listen: false)
.insertActivity(0, activityObj);
.insertActivity(0, activityObj);*/
},
child: WorkoutRow(
wObj: activityMap,
@ -197,9 +171,12 @@ 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,
isSelected: Provider.of<User>(context)
.managerSelectedActivity
.fileNotSelected(activityObj.fileUuid),
),
);
},

@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:responsive_builder/responsive_builder.dart';
import 'package:smartfit_app_mobile/modele/activity.dart';
import 'package:smartfit_app_mobile/modele/user.dart';
import 'package:smartfit_app_mobile/view/home/mobile/mobile_homeview.dart';
import 'package:smartfit_app_mobile/view/home/no_activity_view.dart';
@ -16,14 +17,25 @@ class HomeView extends StatefulWidget {
class _HomeViewState extends State<HomeView> {
@override
Widget build(BuildContext context) {
return context.watch<User>().listActivity.isEmpty
? ScreenTypeLayout.builder(
mobile: (_) => const NoActivityView(),
desktop: (_) => const NoActivityView(),
)
: ScreenTypeLayout.builder(
mobile: (_) => const MobileHomeView(),
desktop: (_) => const WebHomeView(),
);
List<ActivityOfUser> listSelected =
context.watch<User>().managerSelectedActivity.activitySelected;
if (listSelected.isEmpty) {
return ScreenTypeLayout.builder(
mobile: (_) => const NoActivityView("Pas d'activité sélectionnée"),
desktop: (_) => const NoActivityView("Pas d'activité sélectionnée"),
);
}
if (listSelected.length > 1) {
return ScreenTypeLayout.builder(
mobile: (_) => const NoActivityView(
"Qu'une seule activité doit être sélectionner"),
desktop: (_) => const NoActivityView(
"Qu'une seule activité doit être sélectionner"),
);
}
return ScreenTypeLayout.builder(
mobile: (_) => const MobileHomeView(),
desktop: (_) => const WebHomeView(),
);
}
}

@ -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,19 +25,22 @@ class _MobileHomeView extends State<MobileHomeView> {
@override
Widget build(BuildContext context) {
var media = MediaQuery.of(context).size;
ManagerSelectedActivity managerSelectedActivity =
context.watch<User>().managerSelectedActivity;
data = HomeViewUtil().initData(context);
// -- 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();
data.maxBPM = managerSelectedActivity.getMaxBpm();
data.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();
data = HomeViewUtil().initData(context);
double maxSpeed = managerSelectedActivity.getMaxSpeed();
double avgSpeed = managerSelectedActivity.getAvgSpeed();
return Scaffold(
backgroundColor: TColor.white,
@ -66,8 +70,8 @@ class _MobileHomeView extends State<MobileHomeView> {
height: media.width * 0.05,
),
LigneContainerStats(
"${minBpm.toString()} BPM",
"${maxBpm.toString()} BPM",
"${data.minBPM.toString()} BPM",
"${data.maxBPM.toString()} BPM",
"${avgBpm.toString()} BPM",
"Minimum",
"Maximum",

@ -4,7 +4,8 @@ import 'package:flutter_svg/svg.dart';
import '../../common/colo_extension.dart';
class NoActivityView extends StatefulWidget {
const NoActivityView({super.key});
const NoActivityView(this.msg, {super.key});
final String msg;
@override
State<NoActivityView> createState() => _NoActivityViewState();
@ -40,7 +41,7 @@ class _NoActivityViewState extends State<NoActivityView> {
height: media.height * 0.1,
),
Text(
"Pas d'activité sélectionnée",
widget.msg,
style: TextStyle(
color: TColor.black,
fontSize: 20,

@ -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);

@ -1,5 +1,7 @@
import 'package:smartfit_app_mobile/modele/local_db/model.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:smartfit_app_mobile/main.dart';
import 'package:smartfit_app_mobile/modele/utile/login_user.dart';
import 'package:smartfit_app_mobile/view/main_tab/main_tab_view.dart';
import 'package:smartfit_app_mobile/common/colo_extension.dart';
@ -168,6 +170,8 @@ class _WebLoginView extends State<WebLoginView> {
"Impossible de récupéré les données de l'utilisateur - {$infoUser.item2}");
} else {
util.fillUser(context, infoUser.item2, result.item2);
localDB.userBox.put(User(0, infoUser.item2["username"],
infoUser.item2["email"], result.item2));
Navigator.push(
context,
MaterialPageRoute(

@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:responsive_builder/responsive_builder.dart';
import 'package:smartfit_app_mobile/modele/activity.dart';
import 'package:smartfit_app_mobile/modele/user.dart';
import 'package:smartfit_app_mobile/view/home/no_activity_view.dart';
import 'package:smartfit_app_mobile/view/map/mobile/mobile_my_map.dart';
@ -16,14 +17,26 @@ class MyMap extends StatefulWidget {
class _MyMapState extends State<MyMap> {
@override
Widget build(BuildContext context) {
return context.watch<User>().listActivity.isEmpty
? ScreenTypeLayout.builder(
mobile: (_) => const NoActivityView(),
desktop: (_) => const NoActivityView(),
)
: ScreenTypeLayout.builder(
mobile: (_) => const MobileMyMaps(),
desktop: (_) => const WebMyMaps(),
);
List<ActivityOfUser> listSelected =
context.watch<User>().managerSelectedActivity.activitySelected;
if (listSelected.isEmpty) {
return ScreenTypeLayout.builder(
mobile: (_) => const NoActivityView("Pas d'activité sélectionnée"),
desktop: (_) => const NoActivityView("Pas d'activité sélectionnée"),
);
}
if (listSelected.length > 1) {
return ScreenTypeLayout.builder(
mobile: (_) => const NoActivityView(
"Qu'une seule activité doit être sélectionner"),
desktop: (_) => const NoActivityView(
"Qu'une seule activité doit être sélectionner"),
);
}
return ScreenTypeLayout.builder(
mobile: (_) => const MobileMyMaps(),
desktop: (_) => const WebMyMaps(),
);
}
}

@ -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