Merge branch 'othmane5'

pull/4/head
Enzo 1 year ago
commit 222a676d73

@ -0,0 +1,27 @@
import 'package:flutter/material.dart';
import 'package:responsive_builder/responsive_builder.dart';
import 'package:smartfit_app_mobile/common/colo_extension.dart';
import 'package:smartfit_app_mobile/common_widget/container/mobile/mobile_container_stats_activities.dart';
import 'package:smartfit_app_mobile/common_widget/container/web/web_container_stats_activities.dart';
import 'package:smartfit_app_mobile/common_widget/stats.dart';
class ContainerStatsActivities extends StatelessWidget {
const ContainerStatsActivities(
this.value,
this.designation,
this.icon, {
Key? key,
}) : super(key: key);
final String value;
final String designation;
final IconData icon;
@override
Widget build(BuildContext context) {
return ScreenTypeLayout.builder(
mobile: (_) => MobileContainerStatsActivities(this.value, this.designation, this.icon),
desktop: (_) => WebContainerStatsActivities(this.value, this.designation, this.icon),
);
}
}

@ -36,6 +36,7 @@ class MobileContainerStats extends StatelessWidget {
icon: icon,
iconColor: TColor.white,
iconBackground: TColor.secondaryColor1,
sizeIcon: 12,
),
Align(
alignment: Alignment.bottomLeft,

@ -0,0 +1,69 @@
import 'package:flutter/material.dart';
import 'package:smartfit_app_mobile/common/colo_extension.dart';
import 'package:smartfit_app_mobile/common_widget/stats.dart';
class MobileContainerStatsActivities extends StatelessWidget {
const MobileContainerStatsActivities(
this.value,
this.designation,
this.icon, {
Key? key,
}) : super(key: key);
final String value;
final String designation;
final IconData icon;
@override
Widget build(BuildContext context) {
var media = MediaQuery.of(context).size;
return Container(
height: media.width * 0.4,
width: media.width * 0.27,
padding: const EdgeInsets.all(8),
margin: const EdgeInsets.symmetric(vertical: 5),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(15),
border: Border.all(
color: const Color(0xffe1e1e1),
),
boxShadow: const [
BoxShadow(
color: Colors.black12,
offset: Offset(3, 3),
blurRadius: 3,
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center, // Centrer horizontalement
mainAxisAlignment: MainAxisAlignment.center,
children: [
StatIcon(
icon: icon,
iconColor: TColor.white,
iconBackground: TColor.secondaryColor1,
sizeIcon: 30.0,
),
SizedBox(height: 20), // Espacement entre l'icône et le texte
Text(
designation,
style: const TextStyle(fontSize: 12),
textAlign: TextAlign.center,
),
Text(
value,
style: const TextStyle(
fontSize: 17 ,
fontWeight: FontWeight.w800,
),
textAlign: TextAlign.center,
),
],
),
);
}
}

@ -13,7 +13,7 @@ class WebContainerStats extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
height: 70,
height: 80,
width: 70,
padding: const EdgeInsets.all(8),
margin: const EdgeInsets.symmetric(vertical: 5),
@ -36,6 +36,7 @@ class WebContainerStats extends StatelessWidget {
icon: icon,
iconColor: TColor.white,
iconBackground: TColor.secondaryColor1,
sizeIcon: 8.0,
),
Align(
alignment: Alignment.bottomLeft,

@ -0,0 +1,69 @@
import 'package:flutter/material.dart';
import 'package:smartfit_app_mobile/common/colo_extension.dart';
import 'package:smartfit_app_mobile/common_widget/stats.dart';
class WebContainerStatsActivities extends StatelessWidget {
const WebContainerStatsActivities(
this.value,
this.designation,
this.icon, {
Key? key,
}) : super(key: key);
final String value;
final String designation;
final IconData icon;
@override
Widget build(BuildContext context) {
var media = MediaQuery.of(context).size;
return Container(
height: media.width * 0.2,
width: media.width * 0.3,
padding: const EdgeInsets.all(8),
margin: const EdgeInsets.symmetric(vertical: 5),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(15),
border: Border.all(
color: const Color(0xffe1e1e1),
),
boxShadow: const [
BoxShadow(
color: Colors.black12,
offset: Offset(3, 3),
blurRadius: 3,
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center, // Centrer horizontalement
mainAxisAlignment: MainAxisAlignment.center,
children: [
StatIcon(
icon: icon,
iconColor: TColor.white,
iconBackground: TColor.secondaryColor1,
sizeIcon: 40.0,
),
SizedBox(height: 40), // Espacement entre l'icône et le texte
Text(
designation,
style: const TextStyle(fontSize: 15),
textAlign: TextAlign.center,
),
Text(
value,
style: const TextStyle(
fontSize: 20 ,
fontWeight: FontWeight.w800,
),
textAlign: TextAlign.center,
),
],
),
);
}
}

@ -57,7 +57,15 @@ class _MobileGraphAltitudeByTime extends State<MobileGraphAltitudeByTime> {
titlesData: FlTitlesData(
leftTitles: const AxisTitles(),
topTitles: const AxisTitles(),
bottomTitles: const AxisTitles(),
bottomTitles: AxisTitles(
sideTitles: SideTitles(
reservedSize: 20,
showTitles: true,
getTitlesWidget: (value, meta) {
return Text(
"${double.parse((value / 10).toStringAsFixed(2))}s");
},
)),
rightTitles: AxisTitles(
sideTitles: SideTitles(
reservedSize: 60,

@ -94,7 +94,7 @@ class _MobileGraphBpmAndSpeedByTime
getTooltipItems: (List<LineBarSpot> lineBarsSpot) {
return lineBarsSpot.map((lineBarSpot) {
return LineTooltipItem(
"Seconde ${lineBarSpot.x.toInt()} ",
"Seconde ${lineBarSpot.x.toInt() / 10} ",
const TextStyle(
color: Colors.white,
fontSize: 10,
@ -110,9 +110,19 @@ class _MobileGraphBpmAndSpeedByTime
maxY: 110,
titlesData: FlTitlesData(
show: true,
leftTitles: const AxisTitles(),
leftTitles: AxisTitles(
sideTitles: rightTitles,
),
topTitles: const AxisTitles(),
bottomTitles: const AxisTitles(),
bottomTitles: AxisTitles(
sideTitles: SideTitles(
reservedSize: 20,
showTitles: true,
getTitlesWidget: (value, meta) {
return Text(
"${double.parse((value / 10).toStringAsFixed(2))}s");
},
)),
rightTitles: AxisTitles(
sideTitles: SideTitles(
reservedSize: 70,

@ -61,7 +61,7 @@ class _MobileBpmByTime extends State<MobileBpmByTime> {
reservedSize: 20,
showTitles: true,
getTitlesWidget: (value, meta) {
return Text("${double.parse(value.toStringAsFixed(2))}s");
return Text("${double.parse((value/10).toStringAsFixed(2))}s");
},
)),
rightTitles: AxisTitles(

@ -1,3 +1,4 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:smartfit_app_mobile/modele/user.dart';
@ -127,6 +128,7 @@ class InfoStat extends StatelessWidget {
icon: icon,
iconColor: iconColor,
iconBackground: iconBackground,
sizeIcon: 8.0,
),
Align(
alignment: Alignment.bottomLeft,
@ -160,11 +162,13 @@ class StatIcon extends StatelessWidget {
required this.icon,
required this.iconColor,
required this.iconBackground,
required this.sizeIcon,
}) : super(key: key);
final IconData icon;
final Color iconColor;
final Color iconBackground;
final double? sizeIcon;
@override
Widget build(BuildContext context) {
@ -174,7 +178,7 @@ class StatIcon extends StatelessWidget {
color: iconBackground,
borderRadius: BorderRadius.circular(9),
),
child: Icon(icon, size: 8, color: iconColor),
child: Icon(icon, size: sizeIcon, color: iconColor),
);
}
}

@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:smartfit_app_mobile/modele/user.dart';
import 'package:smartfit_app_mobile/common/colo_extension.dart';
import 'package:smartfit_app_mobile/view/home/stats_activities_view.dart';
import 'package:smartfit_app_mobile/view/login/signup_view.dart';
void main() {

@ -14,6 +14,9 @@ class ManagerFile {
final String _fieldAltitude = "altitude";
final String _fieldTotalStep = "total_strides";
final String _fieldTotalCalorie = "total_calories";
final String _fieldTemperature = "temperature";
// -- Getter field
String get fieldTimeStamp => _fieldTimestamp;
String get fieldPositionLatitude => _fieldPositionLatitue;
@ -24,6 +27,8 @@ class ManagerFile {
String get fieldAltitude => _fieldAltitude;
String get fieldTotalStep => _fieldTotalStep;
String get fieldTotalCalories => _fieldTotalCalorie;
String get fieldTemperature => _fieldTemperature;
List<String> allowedFieldWalking = List.empty(growable: true);
@ -37,7 +42,8 @@ class ManagerFile {
_fieldSpeed,
_fieldAltitude,
_fieldTotalStep,
_fieldTotalCalorie
_fieldTotalCalorie,
_fieldTemperature
];
}

@ -41,6 +41,7 @@ class ManagerSelectedActivity {
return true;
}
bool _notNull(int indexActivitySelected, int ligne, int colonne) {
if (activitySelected[indexActivitySelected].contentActivity[ligne]
[colonne] ==
@ -138,6 +139,83 @@ class ManagerSelectedActivity {
}
return somme ~/ nb;
}
double getAvgAltitude() {
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.fieldAltitude}"]!)) {
somme += activitySelected[c].contentActivity[i][activitySelected[c]
.enteteCSV["Value_${_managerFile.fieldAltitude}"]!] ;
nb++;
}
}
}
double average = somme / nb;
return double.parse(average.toStringAsFixed(2));
}
double getAvgTemperature() {
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.fieldTemperature}"]!)) {
somme += activitySelected[c].contentActivity[i][activitySelected[c]
.enteteCSV["Value_${_managerFile.fieldTemperature}"]!];
nb++;
}
}
}
double average = somme / nb;
return double.parse(average.toStringAsFixed(2));
}
double getMaxTemperature() {
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.fieldTemperature}"]!)) {
double valueTmp = activitySelected[c].contentActivity[i]
[activitySelected[c].enteteCSV["Value_${_managerFile.fieldTemperature}"]!];
if (valueTmp > max) {
max = valueTmp;
}
}
}
}
return max;
}
double getMinTemperature() {
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.fieldTemperature}"]!)) {
double valueTmp = activitySelected[c]
.contentActivity[i][activitySelected[c]
.enteteCSV["Value_${_managerFile.fieldTemperature}"]!]
.toDouble();
if (valueTmp < min) {
min = valueTmp;
}
}
}
}
return min;
}
// -------------------------- FIN BPM ---------------------- //
@ -216,22 +294,36 @@ class ManagerSelectedActivity {
// ------------------------- Time ----------------------------- //
int getTotalTime() {
for (int c = 0; c < activitySelected.length; c++) {
for (int i = activitySelected[c].contentActivity.length - 1;
i != 0;
i--) {
double getTotalTime() {
int timestampMax = 0;
int timestampMin = 0;
for (int i = 0; i < activitySelected[0].contentActivity.length; i++) {
if (_notNull(
c,
0,
i,
activitySelected[c]
activitySelected[0]
.enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!)) {
return activitySelected[c].contentActivity[i][activitySelected[c]
.enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!];
timestampMin = activitySelected[0].contentActivity[i][
activitySelected[0]
.enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!];
break;
}
}
for (int i = activitySelected[0].contentActivity.length - 1; i != 0; i--) {
if (_notNull(
0,
i,
activitySelected[0]
.enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!)) {
timestampMax = activitySelected[0].contentActivity[i][
activitySelected[0]
.enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!];
break;
}
}
return 0;
return (timestampMax - timestampMin) / 1000;
}
// ---------------------------- FIN time -------------------- //
@ -350,6 +442,28 @@ class ManagerSelectedActivity {
return max;
}
double getMinSpeed() {
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.fieldSpeed}"]!)) {
double valueTmp = activitySelected[c]
.contentActivity[i][activitySelected[c]
.enteteCSV["Value_${_managerFile.fieldSpeed}"]!]
.toDouble();
if (valueTmp < min) {
min = valueTmp;
}
}
}
}
return min;
}
// Retourne avg Max (Fichier CSV)
double getAvgSpeed() {
double somme = 0;
@ -369,7 +483,8 @@ class ManagerSelectedActivity {
}
}
return somme / nb;
double average = somme / nb;
return double.parse(average.toStringAsFixed(2));
}
// -------------------------- FIN Speed ---------------------- //

@ -5,10 +5,11 @@ 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';
import 'package:smartfit_app_mobile/view/home/stats_activities_view.dart';
import 'package:smartfit_app_mobile/view/home/web/web_homeview.dart';
class HomeView extends StatefulWidget {
const HomeView({super.key});
const HomeView({Key? key});
@override
State<HomeView> createState() => _HomeViewState();
@ -17,25 +18,21 @@ class HomeView extends StatefulWidget {
class _HomeViewState extends State<HomeView> {
@override
Widget build(BuildContext context) {
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(),
);
final selectedActivitiesCount =
context.watch<User>().managerSelectedActivity.activitySelected.length;
return selectedActivitiesCount == 1
? ScreenTypeLayout.builder(
mobile: (_) => const MobileHomeView(),
desktop: (_) => const WebHomeView(),
)
: selectedActivitiesCount > 1
? const StatAtivities()
: ScreenTypeLayout.builder(
mobile: (_) =>
const NoActivityView("Pas d'activité sélectionnée"),
desktop: (_) =>
const NoActivityView("Pas d'activité sélectionnée"),
);
}
}

@ -0,0 +1,152 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:smartfit_app_mobile/common_widget/container/container_stats_activities.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/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';
class StatAtivities extends StatefulWidget {
const StatAtivities({super.key});
@override
State<StatAtivities> createState() => _StatAtivities();
}
class _StatAtivities extends State<StatAtivities> {
late DataHomeView data;
TextEditingController bpmController = TextEditingController();
@override
Widget build(BuildContext context) {
var media = MediaQuery.of(context).size;
data = HomeViewUtil().initData(context);
int maxBpm = context.watch<User>().managerSelectedActivity.getMaxBpm();
int avgBpm = context.watch<User>().managerSelectedActivity.getAvgBpm();
double getTotalDistance = context.watch<User>().managerSelectedActivity.getTotalDistance();
int totalSteps = context.watch<User>().managerSelectedActivity.getTotalSteps();
double totalTime = context.watch<User>().managerSelectedActivity.getTotalTime();
int totalCalories = context.watch<User>().managerSelectedActivity.getCalorie();
double avgSpeed = context.watch<User>().managerSelectedActivity.getAvgSpeed();
double avgAltitude = context.watch<User>().managerSelectedActivity.getAvgAltitude();
double avgTemperature = context.watch<User>().managerSelectedActivity.getAvgTemperature();
double maxAltitude = context.watch<User>().managerSelectedActivity.getAvgTemperature();
double maxTemperature = context.watch<User>().managerSelectedActivity.getMaxTemperature();
double maxSpeed = context.watch<User>().managerSelectedActivity.getMaxSpeed();
double minSpeed = context.watch<User>().managerSelectedActivity.getMinSpeed();
double minAltitude = context.watch<User>().managerSelectedActivity.getMinAltitude();
double minTemperature = context.watch<User>().managerSelectedActivity.getMinTemperature();
int minBpm = context.watch<User>().managerSelectedActivity.getMinBpm();
print(avgTemperature);
print(avgAltitude);
return Scaffold(
backgroundColor: TColor.white,
body: SingleChildScrollView(
child: SafeArea(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 15),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
height: media.width * 0.03,
),
const EnteteHomeView(),
SizedBox(
height: media.width * 0.05,
),
Text(
"Status d'activité",
style: TextStyle(
color: TColor.black,
fontSize: 16,
fontWeight: FontWeight.w700),
),
SizedBox(
height: media.width * 0.03,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ContainerStatsActivities("$avgBpm BPM","Moyenne Bpm", Icons.favorite),
SizedBox(width: media.width *0.03,),
ContainerStatsActivities("$maxBpm BPM","Maximum Bpm", Icons.trending_up),
SizedBox(width: media.width *0.03,),
ContainerStatsActivities("$minBpm BPM","Minimum Bpm", Icons.trending_down)
],),
SizedBox(
height: media.width * 0.03,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ContainerStatsActivities("$avgSpeed m/s","Moyenne vitesse", Icons.bolt),
SizedBox(width: media.width *0.03,),
ContainerStatsActivities("$maxSpeed m/s","Maximum vitesse", Icons.trending_up),
SizedBox(width: media.width *0.03,),
ContainerStatsActivities("$minSpeed m/s","Minimum vitesse", Icons.trending_down)
],),
SizedBox(
height: media.width * 0.03,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ContainerStatsActivities("$avgTemperature °C","Moyenne Temperature", Icons.thermostat),
SizedBox(width: media.width *0.03,),
ContainerStatsActivities("$maxTemperature °C","Maximum Temperature", Icons.trending_up),
SizedBox(width: media.width *0.03,),
ContainerStatsActivities("$minTemperature °C","Minimum Temperature", Icons.trending_down)
],),
SizedBox(
height: media.width * 0.03,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ContainerStatsActivities("$avgAltitude m","Moyenne Altitude", Icons.landscape),
SizedBox(width: media.width *0.03,),
ContainerStatsActivities("$maxAltitude m","Maximum Altitude", Icons.trending_up),
SizedBox(width: media.width *0.03,),
ContainerStatsActivities("$minAltitude m","Minimum Altitude", Icons.trending_down)
],),
SizedBox(
height: media.width * 0.03,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ContainerStatsActivities("$getTotalDistance m","Distance Totale", Icons.double_arrow),
SizedBox(width: media.width *0.03,),
ContainerStatsActivities("$totalSteps","Total Pas", Icons.do_not_step_rounded),
],),
SizedBox(
height: media.width * 0.03,
),Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ContainerStatsActivities("$totalTime s","Temps Total", Icons.timer),
SizedBox(width: media.width *0.03,),
ContainerStatsActivities("$totalCalories kCal","Calories Dépensées", Icons.local_fire_department),
],),
SizedBox(
height: media.width * 0.03,
),
],
),
),
),
),
);
}
}
Loading…
Cancel
Save