Merge branch 'master' into othmane3

profile
Othmane BENJELLOUN 1 year ago
commit c5a405d221

@ -18,6 +18,16 @@ steps:
- curl -F "file=@$sfm_apk" https://anonfiles.me/api/v1/upload > upload.json - curl -F "file=@$sfm_apk" https://anonfiles.me/api/v1/upload > upload.json
- cat upload.json | cut -d '"' -f 12 - cat upload.json | cut -d '"' -f 12
- name: build-web
image: ghcr.io/cirruslabs/flutter:3.13.9
environment:
FIREBASE_TOKEN:
from_secret: firebase_token
commands:
- flutter build web --web-renderer canvaskit
- curl -sL https://firebase.tools | bash
- firebase deploy --token $${FIREBASE_TOKEN}
- name: code-analysis - name: code-analysis
image: ghcr.io/cirruslabs/flutter:3.13.9 image: ghcr.io/cirruslabs/flutter:3.13.9
environment: environment:
@ -31,4 +41,4 @@ steps:
- export PATH=$SONAR_SCANNER_HOME/bin:$PATH - export PATH=$SONAR_SCANNER_HOME/bin:$PATH
- export SONAR_SCANNER_OPTS="-server" - export SONAR_SCANNER_OPTS="-server"
- sonar-scanner -D sonar.projectKey=SmartFit_Mobile -D sonar.sources=. -D sonar.host.url=https://codefirst.iut.uca.fr/sonar -D sonar.login=$${SONAR_TOKEN} - sonar-scanner -D sonar.projectKey=SmartFit_Mobile -D sonar.sources=. -D sonar.host.url=https://codefirst.iut.uca.fr/sonar -D sonar.login=$${SONAR_TOKEN}
depends_on: [ build-apk ] depends_on: [ build-apk, build-web ]

@ -0,0 +1,5 @@
{
"projects": {
"default": "smartfit-9b86c"
}
}

3
.gitignore vendored

@ -11,6 +11,9 @@
.history .history
.svn/ .svn/
# Firebase
.firebase/
# IntelliJ related # IntelliJ related
*.iml *.iml
*.ipr *.ipr

@ -3,13 +3,13 @@ TODO: Description
## Getting Started ## Getting Started
This project is a starting point for a Flutter application. ### Web
We host a **[SmartFit Web](https://smartfit-9b86c.web.app/)** instance on Firebase.
TODO: Build
A few resources to get you started if this is your first Flutter project: ### Mobile
TODO: Installation and Build
- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) ## Docs
- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) You can find **[here](https://codefirst.iut.uca.fr/documentation/SmartFit/SmartFit_Docs/docusaurus/)**
the docusaurus for SmartFit!
For help getting started with Flutter development, view the
[online documentation](https://docs.flutter.dev/), which offers tutorials,
samples, guidance on mobile development, and a full API reference.

@ -0,0 +1,16 @@
{
"hosting": {
"public": "build/web",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"rewrites": [
{
"source": "**",
"destination": "/index.html"
}
]
}
}

@ -24,17 +24,22 @@ 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.fromARGB(255, 144, 252, 148) : Colors.transparent, color: isFirstActivity
? Color.fromARGB(255, 144, 252, 148)
: Colors.transparent,
width: 2.0, width: 2.0,
), ),
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
), ),
child: Material( child: Material(
color: isFirstActivity
color: isFirstActivity ? Color.fromARGB(255, 240, 255, 240) : Colors.transparent, ? Color.fromARGB(255, 240, 255, 240)
: Colors.transparent,
child: InkWell( child: InkWell(
borderRadius: BorderRadius.circular(10), // Utiliser le même borderRadius borderRadius:
splashColor: Color.fromARGB(255, 42, 94, 44).withOpacity(0.3), // Couleur du fond au survol BorderRadius.circular(10), // Utiliser le même borderRadius
splashColor: Color.fromARGB(255, 42, 94, 44)
.withOpacity(0.3), // Couleur du fond au survol
onTap: onClick, onTap: onClick,
child: Padding( child: Padding(
padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 15), padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 15),

@ -28,6 +28,9 @@ class _GraphAltitudeByTime extends State<GraphAltitudeByTime> {
LineChartBarData( LineChartBarData(
spots: widget.data.altitudeSeconde, spots: widget.data.altitudeSeconde,
isCurved: false, isCurved: false,
gradient: LinearGradient(
colors: TColor.primaryG,
),
dotData: const FlDotData(show: false)) dotData: const FlDotData(show: false))
]; ];
@ -43,7 +46,7 @@ class _GraphAltitudeByTime extends State<GraphAltitudeByTime> {
gridData: FlGridData( gridData: FlGridData(
drawVerticalLine: false, drawVerticalLine: false,
drawHorizontalLine: true, drawHorizontalLine: true,
horizontalInterval: 1, horizontalInterval: (maxY - minY) / 5,
getDrawingHorizontalLine: (value) { getDrawingHorizontalLine: (value) {
return FlLine( return FlLine(
color: TColor.gray.withOpacity(0.15), color: TColor.gray.withOpacity(0.15),
@ -56,10 +59,10 @@ class _GraphAltitudeByTime extends State<GraphAltitudeByTime> {
bottomTitles: const AxisTitles(), bottomTitles: const AxisTitles(),
rightTitles: AxisTitles( rightTitles: AxisTitles(
sideTitles: SideTitles( sideTitles: SideTitles(
reservedSize: 50, reservedSize: 60,
showTitles: true, showTitles: true,
getTitlesWidget: (value, meta) { getTitlesWidget: (value, meta) {
return Text("${value.toInt()} m"); return Text("${double.parse(value.toStringAsFixed(2))} m");
}, },
)), )),
)))); ))));

@ -13,7 +13,8 @@ class Stats extends StatelessWidget {
.getTotalCalorie(); .getTotalCalorie();
String heartrate = Provider.of<User>(context, listen: false) String heartrate = Provider.of<User>(context, listen: false)
.listActivity[0] .listActivity[0]
.getTotalAvgHeartRate(); .getAvgBpm()
.toString();
String time = Provider.of<User>(context, listen: false) String time = Provider.of<User>(context, listen: false)
.listActivity[0] .listActivity[0]
.getTotalTime(); .getTotalTime();
@ -152,8 +153,6 @@ class InfoStat extends StatelessWidget {
} }
} }
class StatIcon extends StatelessWidget { class StatIcon extends StatelessWidget {
const StatIcon({ const StatIcon({
Key? key, Key? key,

@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.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/home/no_activity_view.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';
void main() { void main() {
@ -16,7 +15,7 @@ class MyApp extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return MaterialApp( return MaterialApp(
title: 'SmartFit 3 in 1', title: 'SmartFit',
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
theme: ThemeData( theme: ThemeData(
// This is the theme of your application. // This is the theme of your application.

@ -1,4 +1,5 @@
import 'package:fl_chart/fl_chart.dart'; 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/common_widget/graph/graph.dart';
class ActivityOfUser { class ActivityOfUser {
@ -27,6 +28,7 @@ class ActivityOfUser {
return 0; return 0;
} }
// ----------------- BPM ------------------ //
List<FlSpot> getHeartRateWithTime() { List<FlSpot> getHeartRateWithTime() {
List<FlSpot> result = List.empty(growable: true); List<FlSpot> result = List.empty(growable: true);
int firtTimeStamp = 0; int firtTimeStamp = 0;
@ -53,6 +55,35 @@ class ActivityOfUser {
return result; return result;
} }
int getMaxBpm() {
for (int i = 0; i < _contentActivity[_dataSession].length; i++) {
if (_contentActivity[_dataSession][i] == "max_heart_rate") {
return _contentActivity[_dataSession][i + 1];
}
}
return 0;
}
int getMinBpm() {
for (int i = 0; i < _contentActivity[_dataSession].length; i++) {
if (_contentActivity[_dataSession][i] == "min_heart_rate") {
return _contentActivity[_dataSession][i + 1];
}
}
return 0;
}
int getAvgBpm() {
for (int i = 0; i < _contentActivity[_dataSession].length; i++) {
if (_contentActivity[_dataSession][i] == "avg_heart_rate") {
return _contentActivity[_dataSession][i + 1];
}
}
return 0;
}
// -------------------------- FIN BPM ---------------------- //
// ---------------------- Distance ---------------------- //
List<FlSpot> getDistanceWithTime() { List<FlSpot> getDistanceWithTime() {
List<FlSpot> result = List.empty(growable: true); List<FlSpot> result = List.empty(growable: true);
int firtTimeStamp = 0; int firtTimeStamp = 0;
@ -70,6 +101,18 @@ class ActivityOfUser {
return result; return result;
} }
String getTotalDistance() {
for (int i = 0; i < _contentActivity[_dataSession].length; i++) {
if (_contentActivity[_dataSession][i] == "total_distance") {
return _contentActivity[_dataSession][i + 1].toString();
}
}
return "null";
}
// ---------------------- FIN Distance ---------------------- //
// ---------------------- Calories ---------------------- //
List<FlSpot> getCalories() { List<FlSpot> getCalories() {
List<FlSpot> result = List.empty(growable: true); List<FlSpot> result = List.empty(growable: true);
int firtTimeStamp = 0; int firtTimeStamp = 0;
@ -88,41 +131,6 @@ class ActivityOfUser {
return result; return result;
} }
String getTotalSteps() {
for (int i = 0; i < _contentActivity[_dataSession].length; i++) {
if (_contentActivity[_dataSession][i] == "total_strides") {
return _contentActivity[_dataSession][i + 1].toString();
}
}
return "null";
}
String getMaxBpm() {
for (int i = 0; i < _contentActivity[_dataSession].length; i++) {
if (_contentActivity[_dataSession][i] == "max_heart_rate") {
return _contentActivity[_dataSession][i + 1].toString();
}
}
return "null";
}
String getMinBpm() {
for (int i = 0; i < _contentActivity[_dataSession].length; i++) {
if (_contentActivity[_dataSession][i] == "min_heart_rate") {
return _contentActivity[_dataSession][i + 1].toString();
}
}
return "null";
}
String getAvgBpm() {
for (int i = 0; i < _contentActivity[_dataSession].length; i++) {
if (_contentActivity[_dataSession][i] == "avg_heart_rate") {
return _contentActivity[_dataSession][i + 1].toString();
}
}
return "null";
}
String getTotalCalorie() { String getTotalCalorie() {
for (int i = 0; i < _contentActivity[_dataSession].length; i++) { for (int i = 0; i < _contentActivity[_dataSession].length; i++) {
if (_contentActivity[_dataSession][i] == "total_calories") { if (_contentActivity[_dataSession][i] == "total_calories") {
@ -132,15 +140,20 @@ class ActivityOfUser {
return "null"; return "null";
} }
String getTotalAvgHeartRate() { // ---------------------- FIN Calories ---------------------- //
// ---------------------- Step ------------------------------//
String getTotalSteps() {
for (int i = 0; i < _contentActivity[_dataSession].length; i++) { for (int i = 0; i < _contentActivity[_dataSession].length; i++) {
if (_contentActivity[_dataSession][i] == "avg_heart_rate") { if (_contentActivity[_dataSession][i] == "total_strides") {
return _contentActivity[_dataSession][i + 1].toString(); return _contentActivity[_dataSession][i + 1].toString();
} }
} }
return "null"; return "null";
} }
// ----------------------- FIN Step ------------------------ //
// ------------------------- Time ----------------------------- //
String getTotalTime() { String getTotalTime() {
for (int i = 0; i < _contentActivity[_dataSession].length; i++) { for (int i = 0; i < _contentActivity[_dataSession].length; i++) {
if (_contentActivity[_dataSession][i] == "total_elapsed_time") { if (_contentActivity[_dataSession][i] == "total_elapsed_time") {
@ -149,15 +162,7 @@ class ActivityOfUser {
} }
return "null"; return "null";
} }
// ---------------------------- FIN time -------------------- //
String getTotalDistance() {
for (int i = 0; i < _contentActivity[_dataSession].length; i++) {
if (_contentActivity[_dataSession][i] == "total_distance") {
return _contentActivity[_dataSession][i + 1].toString();
}
}
return "null";
}
// ---------------------------------------- Altitude -------------------- // // ---------------------------------------- Altitude -------------------- //
List<FlSpot> getAltitudeWithTime() { List<FlSpot> getAltitudeWithTime() {
@ -196,6 +201,8 @@ class ActivityOfUser {
} }
// -------------------------- FIN altitude ---------------------- // // -------------------------- FIN altitude ---------------------- //
// -------------------------- Speed ---------------------- //
List<FlSpot> getSpeedWithTime() { List<FlSpot> getSpeedWithTime() {
List<FlSpot> result = List.empty(growable: true); List<FlSpot> result = List.empty(growable: true);
int firtTimeStamp = 0; int firtTimeStamp = 0;
@ -244,6 +251,41 @@ class ActivityOfUser {
return result; return result;
} }
double getMaxSpeed() {
for (int i = 4; i < _contentActivity[_dataSession].length; i++) {
if (_contentActivity[_dataSession][i] == "max_speed") {
return _contentActivity[_dataSession][i + 1];
}
}
return 0.0;
}
double getAvgSpeed() {
for (int i = 4; i < _contentActivity[_dataSession].length; i++) {
if (_contentActivity[_dataSession][i] == "avg_speed") {
return _contentActivity[_dataSession][i + 1];
}
}
return 0.0;
}
// -------------------------- FIN Speed ---------------------- //
// -------------------------- Localisation ------------------- //
List<LatLng> getPosition() {
List<LatLng> list = List.empty(growable: true);
for (List<dynamic> ligne in _contentActivity) {
if (ligne[0] == "Data" && ligne[6] == "position_lat") {
list.add(LatLng(ligne[7], ligne[10]));
}
}
return list;
}
// -------------------------- FIN Localisation ---------------------- //
Map<String, dynamic> toMap() { Map<String, dynamic> toMap() {
return { return {
'nomActivite': _nomActivite, 'nomActivite': _nomActivite,

@ -0,0 +1,16 @@
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:provider/provider.dart';
import 'package:smartfit_app_mobile/modele/user.dart';
class MapUtil {
Set<Polyline> initPolines(BuildContext context, int largueur, Color couleur) {
Set<Polyline> _polylines = {};
_polylines.add(Polyline(
polylineId: const PolylineId("Polyline"),
color: couleur,
points: context.watch<User>().listActivity[0].getPosition(),
width: largueur));
return _polylines;
}
}

@ -1,4 +1,3 @@
import 'package:provider/provider.dart';
import 'package:smartfit_app_mobile/common_widget/steps.dart'; import 'package:smartfit_app_mobile/common_widget/steps.dart';
import 'package:smartfit_app_mobile/common_widget/graph/graph.dart'; import 'package:smartfit_app_mobile/common_widget/graph/graph.dart';
import 'package:smartfit_app_mobile/common_widget/info.dart' hide Stats; import 'package:smartfit_app_mobile/common_widget/info.dart' hide Stats;

@ -1,4 +1,3 @@
import 'dart:convert';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:smartfit_app_mobile/modele/manager_file.dart'; import 'package:smartfit_app_mobile/modele/manager_file.dart';
@ -27,7 +26,6 @@ class _WebListActivityState extends State<WebListActivity> {
//late File x = File(file.path); //late File x = File(file.path);
void readFile(html.File file) async { void readFile(html.File file) async {
ManagerFile x = ManagerFile(); ManagerFile x = ManagerFile();
final reader = html.FileReader(); final reader = html.FileReader();

@ -24,9 +24,18 @@ 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;
String maxBpm = context.watch<User>().listActivity[0].getMaxBpm(); // -- BPM -- //
String minBpm = context.watch<User>().listActivity[0].getMinBpm(); int maxBpm = context.watch<User>().listActivity[0].getMaxBpm();
String avgBpm = context.watch<User>().listActivity[0].getAvgBpm(); int minBpm = context.watch<User>().listActivity[0].getMinBpm();
int avgBpm = context.watch<User>().listActivity[0].getAvgBpm();
// -- Altitude -- //
double minAltitude = context.watch<User>().listActivity[0].getMinAltitude();
double maxAltitude = context.watch<User>().listActivity[0].getMaxAltitude();
double avgAltitude = (maxAltitude + minAltitude) / 2;
// -- Speed -- //
double maxSpeed = context.watch<User>().listActivity[0].getMaxSpeed();
double avgSpeed = context.watch<User>().listActivity[0].getAvgSpeed();
data = HomeViewUtil().initData(context); data = HomeViewUtil().initData(context);
return Scaffold( return Scaffold(
@ -57,9 +66,9 @@ class _MobileHomeView extends State<MobileHomeView> {
height: media.width * 0.05, height: media.width * 0.05,
), ),
LigneContainerStats( LigneContainerStats(
"$minBpm BPM", "${minBpm.toString()} BPM",
"$maxBpm BPM", "${maxBpm.toString()} BPM",
"$avgBpm BPM", "${avgBpm.toString()} BPM",
"Minimum", "Minimum",
"Maximum", "Maximum",
"Moyenne", "Moyenne",
@ -85,10 +94,36 @@ class _MobileHomeView extends State<MobileHomeView> {
SizedBox( SizedBox(
height: media.width * 0.05, height: media.width * 0.05,
), ),
const LigneContainerStats( LigneContainerStats(
"30 BPM", "${double.parse(maxSpeed.toStringAsFixed(2))} KM/H",
"90 BPM", "${double.parse(avgSpeed.toStringAsFixed(2))} km/H",
"290 BPM", "${avgBpm.toString()} BPM",
"Max Speed",
"Moyenne Speed",
"Moyenne BPM",
Icons.trending_down,
Icons.trending_up,
Icons.favorite_outline),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"Altitude",
style: TextStyle(
color: TColor.black,
fontSize: 16,
fontWeight: FontWeight.w700),
),
],
),
SizedBox(
height: media.width * 0.05,
),
GraphAltitudeByTime(media, data),
LigneContainerStats(
"${minAltitude.toInt()} M",
"${maxAltitude.toInt()} M",
"${avgAltitude.toInt()} M",
"Minimum", "Minimum",
"Maximum", "Maximum",
"Moyenne", "Moyenne",
@ -98,7 +133,6 @@ class _MobileHomeView extends State<MobileHomeView> {
SizedBox( SizedBox(
height: media.width * 0.05, height: media.width * 0.05,
), ),
GraphAltitudeByTime(media, data)
], ],
), ),
), ),

@ -2,9 +2,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import '../../common/colo_extension.dart'; import '../../common/colo_extension.dart';
import '../../common_widget/button/round_button.dart';
import '../main_tab/main_tab_view.dart';
class NoActivityView extends StatefulWidget { class NoActivityView extends StatefulWidget {
const NoActivityView({super.key}); const NoActivityView({super.key});
@ -20,13 +17,15 @@ class _NoActivityViewState extends State<NoActivityView> {
return Scaffold( return Scaffold(
backgroundColor: TColor.white, backgroundColor: TColor.white,
body: SafeArea( body: SafeArea(
child: Center( // Utilisation du widget Center pour centrer verticalement child: Center(
// Utilisation du widget Center pour centrer verticalement
child: Container( child: Container(
width: media.width, width: media.width,
padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 25), padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 25),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.min, // Utilisation de MainAxisSize.min pour que la colonne prenne la hauteur minimale nécessaire mainAxisSize: MainAxisSize
.min, // Utilisation de MainAxisSize.min pour que la colonne prenne la hauteur minimale nécessaire
children: [ children: [
SizedBox( SizedBox(
height: media.height * 0.1, height: media.height * 0.1,

@ -24,9 +24,17 @@ class _WebHomeView extends State<WebHomeView> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var media = MediaQuery.of(context).size; var media = MediaQuery.of(context).size;
String maxBpm = context.watch<User>().listActivity[0].getMaxBpm(); // -- BPM -- //
String minBpm = context.watch<User>().listActivity[0].getMinBpm(); int maxBpm = context.watch<User>().listActivity[0].getMaxBpm();
String avgBpm = context.watch<User>().listActivity[0].getAvgBpm(); int minBpm = context.watch<User>().listActivity[0].getMinBpm();
int avgBpm = context.watch<User>().listActivity[0].getAvgBpm();
// -- Altitude -- //
double minAltitude = context.watch<User>().listActivity[0].getMinAltitude();
double maxAltitude = context.watch<User>().listActivity[0].getMaxAltitude();
double avgAltitude = (maxAltitude + minAltitude) / 2;
// -- Speed -- //
double maxSpeed = context.watch<User>().listActivity[0].getMaxSpeed();
double avgSpeed = context.watch<User>().listActivity[0].getAvgSpeed();
data = HomeViewUtil().initData(context); data = HomeViewUtil().initData(context);
@ -61,9 +69,9 @@ class _WebHomeView extends State<WebHomeView> {
height: media.width * 0.05, height: media.width * 0.05,
), ),
LigneContainerStats( LigneContainerStats(
"$minBpm BPM", "${minBpm.toString()} BPM",
"$maxBpm BPM", "${maxBpm.toString()} BPM",
"$avgBpm BPM", "${avgBpm.toString()} BPM",
"Minimum", "Minimum",
"Maximum", "Maximum",
"Moyenne", "Moyenne",
@ -92,10 +100,24 @@ class _WebHomeView extends State<WebHomeView> {
SizedBox( SizedBox(
height: media.width * 0.05, height: media.width * 0.05,
), ),
const LigneContainerStats( LigneContainerStats(
"30 BPM", "${double.parse(maxSpeed.toStringAsFixed(2))} KM/H",
"90 BPM", "${double.parse(avgSpeed.toStringAsFixed(2))} km/H",
"290 BPM", "${avgBpm.toString()} BPM",
"Minimum",
"Maximum",
"Moyenne",
Icons.trending_down,
Icons.trending_up,
Icons.favorite_outline),
SizedBox(
height: media.width * 0.05,
),
GraphAltitudeByTime(media, data),
LigneContainerStats(
"${minAltitude.toInt()} M",
"${maxAltitude.toInt()} M",
"${avgAltitude.toInt()} M",
"Minimum", "Minimum",
"Maximum", "Maximum",
"Moyenne", "Moyenne",
@ -105,7 +127,6 @@ class _WebHomeView extends State<WebHomeView> {
SizedBox( SizedBox(
height: media.width * 0.05, height: media.width * 0.05,
), ),
GraphAltitudeByTime(media, data)
], ],
), ),
), ),

@ -76,7 +76,7 @@ class _WebLoginView extends State<WebLoginView> {
body: SingleChildScrollView( body: SingleChildScrollView(
child: SafeArea( child: SafeArea(
child: Container( child: Container(
padding: const EdgeInsets.symmetric(horizontal: 20), padding: const EdgeInsets.symmetric(horizontal: 300),
height: media.height, height: media.height,
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
@ -182,25 +182,7 @@ class _WebLoginView extends State<WebLoginView> {
SizedBox( SizedBox(
height: media.width * 0.04, height: media.width * 0.04,
), ),
Row(
// crossAxisAlignment: CrossAxisAlignment.,
children: [
Expanded(
child: Container(
height: 1,
color: TColor.gray.withOpacity(0.5),
)),
Text(
" Or ",
style: TextStyle(color: TColor.black, fontSize: 12),
),
Expanded(
child: Container(
height: 1,
color: TColor.gray.withOpacity(0.5),
)),
],
),
SizedBox( SizedBox(
height: media.width * 0.04, height: media.width * 0.04,
), ),

@ -93,10 +93,13 @@ class _WebSignUpView extends State<WebSignUpView> {
body: SingleChildScrollView( body: SingleChildScrollView(
child: SafeArea( child: SafeArea(
child: Padding( child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 20), padding: const EdgeInsets.symmetric(horizontal: 300),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
SizedBox(
height: media.width * 0.04,
),
Text( Text(
"Bienvenue,", "Bienvenue,",
style: TextStyle(color: TColor.gray, fontSize: 16), style: TextStyle(color: TColor.gray, fontSize: 16),
@ -170,15 +173,13 @@ class _WebSignUpView extends State<WebSignUpView> {
) )
], ],
), ),
SizedBox(
height: media.width * 0.05,
),
Visibility( Visibility(
visible: _errorCreateUser, visible: _errorCreateUser,
child: Text("Error - $_msgError", child: Text("Error - $_msgError",
style: TextStyle(color: TColor.red))), style: TextStyle(color: TColor.red))),
SizedBox( SizedBox(
height: media.width * 0.4, height: media.width * 0.05,
), ),
RoundButton( RoundButton(
title: "Créer un compte", title: "Créer un compte",
@ -206,78 +207,7 @@ class _WebSignUpView extends State<WebSignUpView> {
SizedBox( SizedBox(
height: media.width * 0.04, height: media.width * 0.04,
), ),
Row(
// crossAxisAlignment: CrossAxisAlignment.,
children: [
Expanded(
child: Container(
height: 1,
color: TColor.gray.withOpacity(0.5),
)),
Text(
" Ou ",
style: TextStyle(color: TColor.black, fontSize: 12),
),
Expanded(
child: Container(
height: 1,
color: TColor.gray.withOpacity(0.5),
)),
],
),
SizedBox(
height: media.width * 0.04,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
GestureDetector(
onTap: () {},
child: Container(
width: 50,
height: 50,
alignment: Alignment.center,
decoration: BoxDecoration(
color: TColor.white,
border: Border.all(
width: 1,
color: TColor.gray.withOpacity(0.4),
),
borderRadius: BorderRadius.circular(15),
),
child: Image.asset(
"assets/img/google.png",
width: 20,
height: 20,
),
),
),
SizedBox(
width: media.width * 0.04,
),
GestureDetector(
onTap: () {},
child: Container(
width: 50,
height: 50,
alignment: Alignment.center,
decoration: BoxDecoration(
color: TColor.white,
border: Border.all(
width: 1,
color: TColor.gray.withOpacity(0.4),
),
borderRadius: BorderRadius.circular(15),
),
child: Image.asset(
"assets/img/suunto.png",
width: 35,
height: 35,
),
),
)
],
),
SizedBox( SizedBox(
height: media.width * 0.04, height: media.width * 0.04,
), ),

@ -0,0 +1,46 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:smartfit_app_mobile/common/colo_extension.dart';
import 'package:smartfit_app_mobile/modele/utile/maps/maps_utile.dart';
class MobileMyMaps extends StatefulWidget {
const MobileMyMaps({super.key});
@override
State<MobileMyMaps> createState() => _MobileMyMaps();
}
class _MobileMyMaps extends State<MobileMyMaps> {
final Completer<GoogleMapController> _googleMapController = Completer();
CameraPosition? _cameraPosition;
Set<Polyline> _polylines = {};
@override
Widget build(BuildContext context) {
_polylines = MapUtil().initPolines(context, 10, TColor.primaryColor1);
_cameraPosition =
CameraPosition(target: _polylines.first.points.first, zoom: 18);
return Scaffold(
body: _getMap(),
);
}
Widget _getMap() {
return Stack(
children: [
GoogleMap(
initialCameraPosition: _cameraPosition!,
mapType: MapType.normal,
onMapCreated: (GoogleMapController controller) {
if (!_googleMapController.isCompleted) {
_googleMapController.complete(controller);
}
},
polylines: _polylines,
)
],
);
}
}

@ -1,9 +1,10 @@
import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:provider/provider.dart';
import 'package:location/location.dart'; import 'package:responsive_builder/responsive_builder.dart';
import 'package:smartfit_app_mobile/common/colo_extension.dart'; import 'package:smartfit_app_mobile/modele/user.dart';
import 'package:smartfit_app_mobile/view/map/mobile/mobile_my_map.dart';
import 'package:smartfit_app_mobile/view/map/web/web_my_map.dart';
import 'package:smartfit_app_mobile/view/profile/profile_view.dart';
class MyMap extends StatefulWidget { class MyMap extends StatefulWidget {
const MyMap({Key? key}) : super(key: key); const MyMap({Key? key}) : super(key: key);
@ -13,142 +14,16 @@ class MyMap extends StatefulWidget {
} }
class _MyMapState extends State<MyMap> { class _MyMapState extends State<MyMap> {
Completer<GoogleMapController> _googleMapController = Completer();
CameraPosition? _cameraPosition;
Location? _location;
LocationData? _currentLocation;
List<LatLng> _polylineCoordinates = [];
Set<Polyline> _polylines = {};
Set<Marker> _markers = {}; // Add a set to store markers
@override
void initState() {
_init();
super.initState();
}
_init() async {
_location = Location();
_cameraPosition = CameraPosition(
target: LatLng(0, 0), // this is just the example lat and lng for initializing
zoom: 20
);
_initLocation();
}
//function to listen when we move position
_initLocation() {
_location?.getLocation().then((location) {
_currentLocation = location;
});
_location?.onLocationChanged.listen((newLocation) {
setState(() {
_currentLocation = newLocation;
_polylineCoordinates.add(LatLng(
_currentLocation?.latitude ?? 0,
_currentLocation?.longitude ?? 0,
));
_updatePolyline();
});
moveToPosition(LatLng(_currentLocation?.latitude ?? 0,
_currentLocation?.longitude ?? 0));
});
}
_updatePolyline() {
setState(() {
_polylines.clear();
_polylines.add(Polyline(
polylineId: PolylineId("polyline"),
color: TColor.primaryColor1,
points: _polylineCoordinates,
width: 10,
));
});
}
// Updated _updateMarker to use the custom marker
_updateMarker(LatLng position) async {
final markerId = MarkerId('marker');
final marker = Marker(
markerId: markerId,
position: position
);
_markers.clear();
_markers.add(marker);
}
moveToPosition(LatLng latLng) async {
GoogleMapController mapController = await _googleMapController.future;
mapController.animateCamera(
CameraUpdate.newCameraPosition(
CameraPosition(
target: latLng,
zoom: 15
)
)
);
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return context.watch<User>().listActivity.isEmpty
body: _buildBody(), ? ScreenTypeLayout.builder(
); mobile: (_) => const ProfileView(),
} desktop: (_) => const ProfileView(),
Widget _buildBody() {
return _getMap();
}
Widget _getMarker() {
return Container(
width: 25,
height: 25,
padding: EdgeInsets.all(2),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(100),
boxShadow: [
BoxShadow(
color: Colors.grey,
offset: Offset(0,3),
spreadRadius: 4,
blurRadius: 6
)
]
),
child: ClipOval(child: Image.asset("assets/img/u1.png")),
);
}
Widget _getMap() {
return Stack(
children: [
GoogleMap(
initialCameraPosition: _cameraPosition!,
mapType: MapType.normal,
onMapCreated: (GoogleMapController controller) {
if (!_googleMapController.isCompleted) {
_googleMapController.complete(controller);
}
},
polylines: _polylines,
markers: _markers,
),
Positioned.fill(
child: Align(
alignment: Alignment.center,
child: _getMarker()
)
) )
], : ScreenTypeLayout.builder(
mobile: (_) => const MobileMyMaps(),
desktop: (_) => const WebMyMaps(),
); );
} }
} }

@ -0,0 +1,47 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:smartfit_app_mobile/common/colo_extension.dart';
import 'package:smartfit_app_mobile/modele/utile/maps/maps_utile.dart';
class WebMyMaps extends StatefulWidget {
const WebMyMaps({super.key});
@override
State<WebMyMaps> createState() => _WebMyMaps();
}
class _WebMyMaps extends State<WebMyMaps> {
final Completer<GoogleMapController> _googleMapController = Completer();
CameraPosition? _cameraPosition;
Set<Polyline> _polylines = {};
@override
Widget build(BuildContext context) {
_polylines = MapUtil().initPolines(context, 10, TColor.primaryColor1);
_cameraPosition =
CameraPosition(target: _polylines.first.points.first, zoom: 18);
return Scaffold(
body: _getMap(),
);
}
Widget _getMap() {
return Stack(
children: [
GoogleMap(
initialCameraPosition: _cameraPosition!,
mapType: MapType.normal,
onMapCreated: (GoogleMapController controller) {
if (!_googleMapController.isCompleted) {
_googleMapController.complete(controller);
}
},
polylines: _polylines,
)
],
);
}
}

@ -0,0 +1,131 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:location/location.dart';
import 'package:smartfit_app_mobile/common/colo_extension.dart';
class MobileMyMaps extends StatefulWidget {
const MobileMyMaps({super.key});
@override
State<MobileMyMaps> createState() => _MobileMyMaps();
}
class _MobileMyMaps extends State<MobileMyMaps> {
Completer<GoogleMapController> _googleMapController = Completer();
CameraPosition? _cameraPosition;
Location? _location;
LocationData? _currentLocation;
List<LatLng> _polylineCoordinates = [];
Set<Polyline> _polylines = {};
Set<Marker> _markers = {}; // Add a set to store markers
@override
void initState() {
_init();
super.initState();
}
_init() async {
_location = Location();
_cameraPosition = const CameraPosition(
target: LatLng(
0, 0), // this is just the example lat and lng for initializing
zoom: 20);
_initLocation();
}
//function to listen when we move position
_initLocation() {
_location?.getLocation().then((location) {
_currentLocation = location;
});
_location?.onLocationChanged.listen((newLocation) {
setState(() {
_currentLocation = newLocation;
_polylineCoordinates.add(LatLng(
_currentLocation?.latitude ?? 0,
_currentLocation?.longitude ?? 0,
));
_updatePolyline();
});
moveToPosition(LatLng(
_currentLocation?.latitude ?? 0, _currentLocation?.longitude ?? 0));
});
}
_updatePolyline() {
setState(() {
_polylines.clear();
_polylines.add(Polyline(
polylineId: PolylineId("polyline"),
color: TColor.primaryColor1,
points: _polylineCoordinates,
width: 10,
));
});
}
/*
// Updated _updateMarker to use the custom marker
_updateMarker(LatLng position) async {
final markerId = MarkerId('marker');
final marker = Marker(markerId: markerId, position: position);
_markers.clear();
_markers.add(marker);
}*/
moveToPosition(LatLng latLng) async {
GoogleMapController mapController = await _googleMapController.future;
mapController.animateCamera(CameraUpdate.newCameraPosition(
CameraPosition(target: latLng, zoom: 15)));
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: _getMap(),
);
}
Widget _getMarker() {
return Container(
width: 25,
height: 25,
padding: EdgeInsets.all(2),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(100),
boxShadow: [
BoxShadow(
color: Colors.grey,
offset: Offset(0, 3),
spreadRadius: 4,
blurRadius: 6)
]),
child: ClipOval(child: Image.asset("assets/img/u1.png")),
);
}
Widget _getMap() {
return Stack(
children: [
GoogleMap(
initialCameraPosition: _cameraPosition!,
mapType: MapType.normal,
onMapCreated: (GoogleMapController controller) {
if (!_googleMapController.isCompleted) {
_googleMapController.complete(controller);
}
},
polylines: _polylines,
markers: _markers,
),
Positioned.fill(
child: Align(alignment: Alignment.center, child: _getMarker()))
],
);
}
}

@ -4,7 +4,6 @@ import 'package:smartfit_app_mobile/common/colo_extension.dart';
import 'package:smartfit_app_mobile/common_widget/button/round_button.dart'; import 'package:smartfit_app_mobile/common_widget/button/round_button.dart';
import 'package:smartfit_app_mobile/common_widget/setting_row.dart'; import 'package:smartfit_app_mobile/common_widget/setting_row.dart';
import 'package:smartfit_app_mobile/common_widget/title_subtitle_cell.dart'; import 'package:smartfit_app_mobile/common_widget/title_subtitle_cell.dart';
import 'package:smartfit_app_mobile/view/home/notification_view.dart';
import 'package:smartfit_app_mobile/view/profile/change_password.dart'; import 'package:smartfit_app_mobile/view/profile/change_password.dart';
import 'package:smartfit_app_mobile/view/profile/change_email.dart'; import 'package:smartfit_app_mobile/view/profile/change_email.dart';
import 'package:smartfit_app_mobile/view/profile/change_username.dart'; import 'package:smartfit_app_mobile/view/profile/change_username.dart';

@ -26,6 +26,9 @@
<meta name="apple-mobile-web-app-title" content="smartfit_app_mobile"> <meta name="apple-mobile-web-app-title" content="smartfit_app_mobile">
<link rel="apple-touch-icon" href="icons/Icon-192.png"> <link rel="apple-touch-icon" href="icons/Icon-192.png">
<!-- MAP GOOGLE-->
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyD2Jgh9NXhtKaH8qRyGfkCeMDusBJ4xcRY"></script>
<!-- Favicon --> <!-- Favicon -->
<link rel="icon" type="image/png" href="favicon.png"/> <link rel="icon" type="image/png" href="favicon.png"/>

Loading…
Cancel
Save