Merge branch 'othmane2'

profile
Enzo 2 years ago
commit 0f43b43ead

File diff suppressed because it is too large Load Diff

@ -1,6 +1,7 @@
import 'dart:math';
import 'dart:ui' as ui;
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';
class Graph extends StatelessWidget {
@ -28,17 +29,6 @@ class _GraphAreaState extends State<GraphArea>
with SingleTickerProviderStateMixin {
late AnimationController _animationController;
List<DataPoint> data = [
DataPoint(day: 1, steps: Random().nextInt(70)),
DataPoint(day: 2, steps: Random().nextInt(70)),
DataPoint(day: 3, steps: Random().nextInt(70)),
DataPoint(day: 4, steps: Random().nextInt(70)),
DataPoint(day: 5, steps: Random().nextInt(70)),
DataPoint(day: 6, steps: Random().nextInt(70)),
DataPoint(day: 7, steps: Random().nextInt(70)),
DataPoint(day: 8, steps: Random().nextInt(70)),
];
@override
void initState() {
super.initState();
@ -55,12 +45,16 @@ class _GraphAreaState extends State<GraphArea>
@override
Widget build(BuildContext context) {
List<DataPoint> vitesseSecondes = Provider.of<User>(context, listen: false)
.listActivity[0]
.getSpeedWithTimeActivity();
return GestureDetector(
onTap: () {
_animationController.forward(from: 0.0);
},
child: CustomPaint(
painter: GraphPainter(_animationController.view, data: data),
painter: GraphPainter(_animationController.view, data: vitesseSecondes),
),
);
}
@ -93,8 +87,8 @@ class GraphPainter extends CustomPainter {
var xSpacing = size.width / (data.length - 1);
var maxSteps = data
.fold<DataPoint>(data[0], (p, c) => p.steps > c.steps ? p : c)
.steps;
.fold<DataPoint>(data[0], (p, c) => p.speed > c.speed ? p : c)
.speed;
var yRatio = size.height / maxSteps;
var curveOffset = xSpacing * 0.3;
@ -103,7 +97,7 @@ class GraphPainter extends CustomPainter {
var cx = 0.0;
for (int i = 0; i < data.length; i++) {
var y = size.height - (data[i].steps * yRatio * _size.value);
var y = size.height - (data[i].speed * yRatio * _size.value);
offsets.add(Offset(cx, y));
cx += xSpacing;
@ -133,7 +127,7 @@ class GraphPainter extends CustomPainter {
..style = PaintingStyle.fill;
Paint dotOutlinePaint = Paint()
..color = Colors.white.withAlpha(200)
..color = ui.Color.fromARGB(255, 236, 236, 236).withAlpha(200)
..strokeWidth = 8;
Paint dotCenter = Paint()
@ -166,8 +160,21 @@ class GraphPainter extends CustomPainter {
canvas.drawPath(linePath, shadowPaint);
canvas.drawPath(linePath, linePaint);
canvas.drawCircle(offsets[4], 15 * _dotSize.value, dotOutlinePaint);
canvas.drawCircle(offsets[4], 6 * _dotSize.value, dotCenter);
int maxIndex = 0;
double maxY = offsets[0]
.dy; // Supposons que la première coordonnée est la plus grande
for (int i = 1; i < offsets.length; i++) {
if (offsets[i].dy < maxY) {
maxIndex = i;
maxY = offsets[i].dy;
}
}
// Maintenant, maxIndex contient l'indice de la coordonnée maximale dans la liste offsets
// Utilisez ces coordonnées pour dessiner le point
canvas.drawCircle(offsets[maxIndex], 15 * _dotSize.value, dotOutlinePaint);
canvas.drawCircle(offsets[maxIndex], 6 * _dotSize.value, dotCenter);
}
@override
@ -177,11 +184,11 @@ class GraphPainter extends CustomPainter {
}
class DataPoint {
final int day;
final int steps;
DataPoint({
required this.day,
required this.steps,
});
}
final double time;
final double speed;
DataPoint(
this.time,
this.speed,
);
}

@ -1,27 +1,31 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:smartfit_app_mobile/modele/user.dart';
class Info extends StatelessWidget {
const Info({Key? key}) : super(key: key);
Info({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
String distance = Provider.of<User>(context, listen: false)
.listActivity[0]
.getTotalDistance();
return Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: const [
Stats(value: '345', unit: 'kcal', label: 'Calories'),
Stats(value: '3.6', unit: 'km', label: 'Distance'),
Stats(value: '1.5', unit: 'hr', label: 'Hours'),
children: [
Stats(value: distance, unit: 'm', label: 'Distance'),
],
);
}
}
class Stats extends StatelessWidget {
final String value;
final String unit;
final String label;
String value;
String unit;
String label;
const Stats({
Stats({
Key? key,
required this.value,
required this.unit,
@ -37,25 +41,25 @@ class Stats extends StatelessWidget {
Text.rich(
TextSpan(
text: value,
style: const TextStyle(
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w900,
),
children: [
const TextSpan(text: ' '),
TextSpan(text: ' '),
TextSpan(
text: unit,
style: const TextStyle(
style: TextStyle(
fontSize: 10,
fontWeight: FontWeight.w500,
),
),
]),
),
const SizedBox(height: 6),
SizedBox(height: 6),
Text(
label,
style: const TextStyle(
style: TextStyle(
fontSize: 10,
fontWeight: FontWeight.w500,
),
@ -63,4 +67,4 @@ class Stats extends StatelessWidget {
],
);
}
}
}

@ -1,4 +1,6 @@
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';
class Stats extends StatelessWidget {
@ -6,12 +8,22 @@ class Stats extends StatelessWidget {
@override
Widget build(BuildContext context) {
String calories = Provider.of<User>(context, listen: false)
.listActivity[0]
.getTotalCalorie();
String heartrate = Provider.of<User>(context, listen: false)
.listActivity[0]
.getTotalAvgHeartRate();
String time = Provider.of<User>(context, listen: false)
.listActivity[0]
.getTotalTime();
return Column(
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 30),
child: Row(
children: [
children: [
Text(
'Statistiques',
style: TextStyle(
@ -32,7 +44,7 @@ class Stats extends StatelessWidget {
SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Row(
children: const [
children: [
SizedBox(width: 30),
InfoStat(
icon: Icons.timer,
@ -40,7 +52,7 @@ class Stats extends StatelessWidget {
iconBackground: Color(0xff6131AD),
time: '+5s',
label: 'Time',
value: '30:34',
value: time + ' s',
),
SizedBox(width: 15),
InfoStat(
@ -49,7 +61,7 @@ class Stats extends StatelessWidget {
iconBackground: Color(0xff6131AD),
time: '+5s',
label: 'Heart Rate',
value: '151bpm',
value: heartrate + " BPM",
),
SizedBox(width: 15),
InfoStat(
@ -58,7 +70,7 @@ class Stats extends StatelessWidget {
iconBackground: Color(0xff6131AD),
time: '+5s',
label: 'Energy',
value: '169kcal',
value: calories + " kCal",
),
SizedBox(width: 30),
],
@ -194,4 +206,4 @@ class StatIcon extends StatelessWidget {
child: Icon(icon, size: 15, color: iconColor),
);
}
}
}

@ -1,4 +1,5 @@
import 'package:smartfit_app_mobile/common_widget/helpers.dart';
import 'package:provider/provider.dart';
import 'package:smartfit_app_mobile/modele/user.dart';
import 'package:flutter/material.dart';
class Steps extends StatelessWidget {
@ -6,7 +7,11 @@ class Steps extends StatelessWidget {
@override
Widget build(BuildContext context) {
String steps = formatNumber(randBetween(3000, 6000));
print("lhwaa");
String steps = Provider.of<User>(context, listen: false)
.listActivity[0]
.getTotalSteps();
return Padding(
padding: const EdgeInsets.symmetric(vertical: 20),
child: Column(
@ -30,4 +35,4 @@ class Steps extends StatelessWidget {
),
);
}
}
}

@ -1,11 +1,6 @@
import 'package:flutter_svg/svg.dart';
import 'package:provider/provider.dart';
import 'package:smartfit_app_mobile/modele/activity.dart';
import 'package:smartfit_app_mobile/modele/user.dart';
import 'package:smartfit_app_mobile/view/activity/activity.dart';
import 'package:smartfit_app_mobile/common/colo_extension.dart';
import 'package:flutter/material.dart';
import 'package:simple_animation_progress_bar/simple_animation_progress_bar.dart';
class WorkoutRow extends StatelessWidget {
final Map wObj;

@ -1,9 +1,7 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:smartfit_app_mobile/modele/user.dart';
import 'package:smartfit_app_mobile/view/activity/list_activity.dart';
import 'package:smartfit_app_mobile/view/login/login_view.dart';
import 'package:smartfit_app_mobile/view/login/signup_view.dart';
import 'package:smartfit_app_mobile/view/main_tab/main_tab_view.dart';
import 'package:smartfit_app_mobile/common/colo_extension.dart';
void main() {
@ -38,7 +36,7 @@ class MyApp extends StatelessWidget {
primaryColor: TColor.primaryColor1,
fontFamily: "Poppins"),
//home: const StartedView(),
home: const SignUpView(),
home: const MainTabView(),
);
}
}

@ -1,4 +1,5 @@
import 'package:fl_chart/fl_chart.dart';
import 'package:smartfit_app_mobile/common_widget/graph.dart';
class ActivityOfUser {
late String _nomActivite;
@ -55,27 +56,110 @@ class ActivityOfUser {
}
return result;
}
List<FlSpot> getCalories() {
List<FlSpot> result = List.empty(growable: true);
int firtTimeStamp = 0;
print("enzo");
print(_contentActivity.length);
for (List<dynamic> ligne in _contentActivity) {
if (ligne.length >= 39 && ligne[0] == "Data" && ligne[39] == "total_calories") {
print("enzo");
if (ligne.length >= 39 &&
ligne[0] == "Data" &&
ligne[39] == "total_calories") {
print(ligne[39]);
if (firtTimeStamp == 0) {
firtTimeStamp = ligne[4];
}
//result.add([(ligne[4] - firtTimeStamp) ~/ 100, ligne[7].toInt()]);
result
.add(FlSpot((ligne[4] - firtTimeStamp) / 100, ligne[40].toDouble()));
result.add(
FlSpot((ligne[4] - firtTimeStamp) / 100, ligne[40].toDouble()));
}
}
return result;
}
String getTotalSteps() {
List<FlSpot> result = List.empty(growable: true);
print(_contentActivity.length);
for (int i = 0;
i < _contentActivity[_contentActivity.length - 3].length;
i++) {
print(_contentActivity[_contentActivity.length - 3][i]);
if (_contentActivity[_contentActivity.length - 3][i] == "total_strides") {
return _contentActivity[_contentActivity.length - 3][i + 1].toString();
}
}
return "NAN";
}
String getTotalCalorie() {
List<FlSpot> result = List.empty(growable: true);
print(_contentActivity.length);
for (int i = 0;
i < _contentActivity[_contentActivity.length - 3].length;
i++) {
print(_contentActivity[_contentActivity.length - 3][i]);
if (_contentActivity[_contentActivity.length - 3][i] ==
"total_calories") {
return _contentActivity[_contentActivity.length - 3][i + 1].toString();
}
}
return "NAN";
}
String getTotalAvgHeartRate() {
List<FlSpot> result = List.empty(growable: true);
print(_contentActivity.length);
for (int i = 0;
i < _contentActivity[_contentActivity.length - 3].length;
i++) {
print(_contentActivity[_contentActivity.length - 3][i]);
if (_contentActivity[_contentActivity.length - 3][i] ==
"total_calories") {
return _contentActivity[_contentActivity.length - 3][i + 1].toString();
}
}
return "NAN";
}
String getTotalTime() {
List<FlSpot> result = List.empty(growable: true);
print(_contentActivity.length);
for (int i = 0;
i < _contentActivity[_contentActivity.length - 3].length;
i++) {
print(_contentActivity[_contentActivity.length - 3][i]);
if (_contentActivity[_contentActivity.length - 3][i] ==
"total_elapsed_time") {
return _contentActivity[_contentActivity.length - 3][i + 1].toString();
}
}
return "NAN";
}
String getTotalDistance() {
List<FlSpot> result = List.empty(growable: true);
print(_contentActivity.length);
for (int i = 0;
i < _contentActivity[_contentActivity.length - 3].length;
i++) {
print(_contentActivity[_contentActivity.length - 3][i]);
if (_contentActivity[_contentActivity.length - 3][i] ==
"total_distance") {
return _contentActivity[_contentActivity.length - 3][i + 1].toString();
}
}
return "NAN";
}
List<FlSpot> getAltitudeWithTime() {
List<FlSpot> result = List.empty(growable: true);
int firtTimeStamp = 0;
@ -130,6 +214,31 @@ class ActivityOfUser {
return result;
}
List<DataPoint> getSpeedWithTimeActivity() {
List<DataPoint> result = List.empty(growable: true);
int firtTimeStamp = 0;
for (List<dynamic> ligne in _contentActivity) {
if (ligne[0] == "Data" && ligne[1] == 1) {
if (firtTimeStamp == 0) {
firtTimeStamp = ligne[4];
}
result.add(DataPoint(
((ligne[4] - firtTimeStamp) / 100),
ligne[19].toDouble(),
));
}
if (ligne[0] == "Data" && ligne[1] == 2) {
if (firtTimeStamp == 0) {
firtTimeStamp = ligne[4];
}
result.add(DataPoint(
((ligne[4] - firtTimeStamp) / 100), ligne[25].toDouble()));
}
}
return result;
}
Map<String, dynamic> toMap() {
return {
'nomActivite': _nomActivite,

@ -1,6 +1,5 @@
import 'package:flutter/material.dart';
import 'package:smartfit_app_mobile/modele/activity.dart';
import 'package:smartfit_app_mobile/view/activity/list_activity.dart';
class User extends ChangeNotifier {
String username = "VOID";

@ -1,16 +0,0 @@
import 'package:responsive_builder/responsive_builder.dart';
import 'package:smartfit_app_mobile/view/home/mobile/mobile_Activity_view.dart';
import 'package:smartfit_app_mobile/view/home/web/web_Activity_view.dart';
import 'package:flutter/material.dart';
class Activity extends StatelessWidget {
const Activity({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return ScreenTypeLayout.builder(
mobile: (_) => const MobileActivity(),
desktop: (_) => const WebActivity(),
);
}
}

@ -2,7 +2,6 @@ import 'dart:convert';
import 'dart:io';
import 'package:crypto/crypto.dart';
import 'package:dotted_dashed_line/dotted_dashed_line.dart';
import 'package:file_picker/file_picker.dart';
import 'package:provider/provider.dart';
import 'package:smartfit_app_mobile/modele/api/i_data_strategy.dart';
@ -10,14 +9,8 @@ import 'package:smartfit_app_mobile/modele/api/request_api.dart';
import 'package:smartfit_app_mobile/modele/activity.dart';
import 'package:smartfit_app_mobile/modele/manager_file.dart';
import 'package:smartfit_app_mobile/modele/user.dart';
import 'package:smartfit_app_mobile/view/home/home_view.dart';
import 'package:smartfit_app_mobile/view/main_tab/main_tab_view.dart';
import 'package:smartfit_app_mobile/common_widget/round_button.dart';
import 'package:smartfit_app_mobile/common_widget/workout_row.dart';
import 'package:fl_chart/fl_chart.dart';
import 'package:flutter/material.dart';
import 'package:simple_animation_progress_bar/simple_animation_progress_bar.dart';
import 'package:simple_circular_progress_bar/simple_circular_progress_bar.dart';
import 'package:tuple/tuple.dart';
import '../../common/colo_extension.dart';
@ -195,7 +188,7 @@ class _ListActivityState extends State<ListActivity> {
)
],
),
Provider.of<User>(context, listen: true).listActivity!.isEmpty
Provider.of<User>(context, listen: true).listActivity.isEmpty
? Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@ -215,12 +208,12 @@ class _ListActivityState extends State<ListActivity> {
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: Provider.of<User>(context, listen: true)
.listActivity!
.listActivity
.length,
itemBuilder: (context, index) {
var activityObj =
Provider.of<User>(context, listen: true)
.listActivity![index] as ActivityOfUser;
.listActivity[index] as ActivityOfUser;
var activityMap = activityObj.toMap();
return InkWell(
onTap: () {

@ -1,21 +0,0 @@
import 'package:flutter/material.dart';
import 'package:responsive_builder/responsive_builder.dart';
import 'package:smartfit_app_mobile/view/home/mobile/mobile_homeview.dart';
import 'package:smartfit_app_mobile/view/home/web/web_homeview.dart';
class HomeView extends StatefulWidget {
const HomeView({super.key});
@override
State<HomeView> createState() => _HomeViewState();
}
class _HomeViewState extends State<HomeView> {
@override
Widget build(BuildContext context) {
return ScreenTypeLayout.builder(
mobile: (_) => const MobileHomeView(),
desktop: (_) => const WebHomeView(),
);
}
}

@ -1,20 +0,0 @@
import 'package:responsive_builder/responsive_builder.dart';
import 'package:smartfit_app_mobile/view/login/mobile/android_login_view.dart';
import 'package:smartfit_app_mobile/view/login/web/web_login_view.dart';
import 'package:flutter/material.dart';
class LoginView extends StatefulWidget {
const LoginView({super.key});
@override
State<LoginView> createState() => _LoginViewState();
}
class _LoginViewState extends State<LoginView> {
@override
Widget build(BuildContext context) {
return ScreenTypeLayout.builder(
mobile: (_) => const MobileLoginView(),
desktop: (_) => const WebLoginView());
}
}

@ -1,21 +0,0 @@
import 'package:responsive_builder/responsive_builder.dart';
import 'package:smartfit_app_mobile/view/login/mobile/android_signup_view.dart';
import 'package:flutter/material.dart';
import 'package:smartfit_app_mobile/view/login/web/web_signup_view.dart';
class SignUpView extends StatefulWidget {
const SignUpView({super.key});
@override
State<SignUpView> createState() => _SignUpViewState();
}
class _SignUpViewState extends State<SignUpView> {
@override
Widget build(BuildContext context) {
return ScreenTypeLayout.builder(
mobile: (_) => const MobileSignUpView(),
desktop: (_) => const WebSignUpView(),
);
}
}

@ -1,3 +1,4 @@
import 'package:smartfit_app_mobile/view/activity/list_activity.dart';
import 'package:smartfit_app_mobile/common/colo_extension.dart';
import 'package:smartfit_app_mobile/common_widget/tab_button.dart';
import 'package:smartfit_app_mobile/view/activity/activity.dart';

@ -1,16 +1,15 @@
/*import 'dart:convert';
/*
import 'dart:convert';
import 'package:crypto/crypto.dart';
import 'package:flutter/foundation.dart' show kIsWeb;
import 'package:csv/csv.dart';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:file_picker/file_picker.dart';
import 'package:provider/provider.dart';
import 'dart:io';
import 'package:smartfit_app_mobile/modele/api/i_data_strategy.dart';
import 'package:smartfit_app_mobile/modele/manager_file.dart';
import 'package:smartfit_app_mobile/modele/user.dart';
import 'package:smartfit_app_mobile/modele/api/request_api.dart';
import 'package:smartfit_app_mobile/modele/manager_file.dart';
import 'package:tuple/tuple.dart';
// ----------- File --------------- //
@ -89,16 +88,15 @@ class _TestPage extends State<TestPage> {
print("t");
} else {
List<dynamic> result = await x.readFitFile(y!);
print("test11");
print(result);
print("test22");
print(ActivityOfUser(result).getHeartRateWithTime());
print("test33");
Provider.of<User>(context, listen: false).addActivity(ActivityOfUser(result));
//print(x.getDistanceWithTime(ActivityOfUser(result)));
//print(x.getDistance(ActivityOfUser(result)));
//print(x.getAltitudeWithTime(ActivityOfUser(result)));
//print(x.getSpeedWithTime(ActivityOfUser(result)));
final csv = const ListToCsvConverter().convert(result.cast<List?>());
File f = File(await x.localPath + "/fit2.csv");
f.createSync();
await f.writeAsString(csv);
}
}
@ -228,8 +226,7 @@ class _TestPage extends State<TestPage> {
onPressed: createUser, child: const Text("Create User")),
ElevatedButton(
onPressed: deleteUser, child: const Text("Delete User")),
ElevatedButton(
onPressed: readFile, child: const Text("ReadFile")),
ElevatedButton(onPressed: readFile, child: const Text("ReadFile")),
ElevatedButton(onPressed: getFiles, child: const Text("getFiles")),
ElevatedButton(
onPressed: modifAttribut, child: const Text("modif attribut")),
@ -405,4 +402,5 @@ class _MyHomePageState extends State<MyHomePage> {
),
);
}
}*/
}
*/

@ -1,21 +0,0 @@
import 'package:flutter/material.dart';
import 'package:responsive_builder/responsive_builder.dart';
import 'package:smartfit_app_mobile/view/profile/mobile/mobile_profile_view.dart';
import 'package:smartfit_app_mobile/view/profile/web/web_profile_view.dart';
class ProfileView extends StatefulWidget {
const ProfileView({super.key});
@override
State<ProfileView> createState() => _ProfileViewState();
}
class _ProfileViewState extends State<ProfileView> {
@override
Widget build(BuildContext context) {
return ScreenTypeLayout.builder(
mobile: (_) => const MobileProfileView(),
desktop: (_) => const WebProfileView(),
);
}
}
Loading…
Cancel
Save