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

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

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

@ -19,14 +19,10 @@ class WebGraphAltitudeByTime extends StatefulWidget {
class _WebGraphAltitudeByTime extends State<WebGraphAltitudeByTime> { class _WebGraphAltitudeByTime extends State<WebGraphAltitudeByTime> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final double maxX =
widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x;
final double minX =
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 +61,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,11 @@ class _WebGraphBpmAndSpeedByTime extends State<WebGraphBpmAndSpeedByTime> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final double maxY = widget.data.maxBPM + 2;
final double maxY = final double minY = widget.data.minBPM - 2;
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 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 = const double minX = 0.0;
0.0;
final lineBarsData = [ final lineBarsData = [
LineChartBarData( LineChartBarData(
@ -127,7 +119,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 +207,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();

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

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

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

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

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

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

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

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:responsive_builder/responsive_builder.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/modele/user.dart';
import 'package:smartfit_app_mobile/view/home/mobile/mobile_homeview.dart'; import 'package:smartfit_app_mobile/view/home/mobile/mobile_homeview.dart';
import 'package:smartfit_app_mobile/view/home/no_activity_view.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> { class _HomeViewState extends State<HomeView> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return context.watch<User>().listActivity.isEmpty List<ActivityOfUser> listSelected =
? ScreenTypeLayout.builder( context.watch<User>().managerSelectedActivity.activitySelected;
mobile: (_) => const NoActivityView(), if (listSelected.isEmpty) {
desktop: (_) => const NoActivityView(), return ScreenTypeLayout.builder(
) mobile: (_) => const NoActivityView("Pas d'activité sélectionnée"),
: ScreenTypeLayout.builder( desktop: (_) => const NoActivityView("Pas d'activité sélectionnée"),
mobile: (_) => const MobileHomeView(), );
desktop: (_) => const WebHomeView(), }
); 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/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,19 +25,22 @@ 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;
data = HomeViewUtil().initData(context);
// -- BPM -- // // -- BPM -- //
int maxBpm = context.watch<User>().listActivity[0].getMaxBpm(); data.maxBPM = managerSelectedActivity.getMaxBpm();
int minBpm = context.watch<User>().listActivity[0].getMinBpm(); data.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);
return Scaffold( return Scaffold(
backgroundColor: TColor.white, backgroundColor: TColor.white,
@ -66,8 +70,8 @@ class _MobileHomeView extends State<MobileHomeView> {
height: media.width * 0.05, height: media.width * 0.05,
), ),
LigneContainerStats( LigneContainerStats(
"${minBpm.toString()} BPM", "${data.minBPM.toString()} BPM",
"${maxBpm.toString()} BPM", "${data.maxBPM.toString()} BPM",
"${avgBpm.toString()} BPM", "${avgBpm.toString()} BPM",
"Minimum", "Minimum",
"Maximum", "Maximum",

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

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

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

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