Skip to content

Repository files navigation

RepTimer

CI Release

Application mobile (Android) de suivi et d'exécution de séances d'entraînement, développée avec Flutter.

Pas de version iOS prévue.

RepTimer permet de créer ses propres séances (échauffement, circuits, séries...), de les organiser en groupes d'exercices répétables, puis de les exécuter avec un système de minuteur, de progression et d'historique.

Fonctionnalités

Création et édition des séances

  • Séances composées de cinq types de groupes d'exercices :
    • un groupe libre répète tous ses éléments pendant un nombre de tours défini ;
    • un groupe à répétitions variables applique une suite ordonnée (par exemple 10, 12, 15, 12, 10) aux exercices en mode Répétitions, sans modifier les exercices chronométrés, les durées libres ni les pauses ;
    • un groupe Tabata alterne un effort chronométré et une pause pendant 1 à 999 cycles ;
    • un groupe AMRAP enregistre les tours terminés pendant une durée de 1 à 60 minutes et conserve le tour partiel ;
    • un groupe EMOM redémarre automatiquement le même effort de 60 secondes pendant 1 à 60 minutes.
  • L'ajout d'un groupe commence par le choix explicite de son type. Les changements incompatibles demandent confirmation et les brouillons des types visités restent disponibles jusqu'à la fermeture de l'éditeur.
  • Trois types d'exercices :
    • Répétitions — un nombre de répétitions à effectuer.
    • Temps — une durée définie (saisie via un sélecteur Minutes/Secondes).
    • Durée libre — aucun temps ni répétitions fixés à l'avance ; l'utilisateur décide lui-même de la fin de l'exercice, un chronomètre mesure le temps réellement passé.
  • Pauses chronométrées entre les exercices.
  • Réorganisation des groupes et des exercices par glisser-déposer depuis une poignée dédiée.
  • Groupes initialement repliés dans l'éditeur de séance, avec aperçu dépliable de leur contenu et écran dédié à l'édition de leurs paramètres, exercices et pauses.
  • Les noms des séances et des groupes s'affichent dans la barre de titre et se modifient depuis le titre ou son crayon. Les nouveaux groupes Libre et Variables reçoivent immédiatement un nom modifiable.
  • Le clavier propose naturellement une majuscule au début des noms et des textes libres, sans modifier automatiquement la casse choisie par l'utilisateur.
  • Option permettant de désactiver le préremplissage du nom des nouveaux exercices avec le nom du groupe.
  • Duplication d'une séance depuis l'écran d'accueil, avec choix du nom de la copie ; la nouvelle séance reste indépendante de l'originale.
  • Icône personnalisable par exercice, parmi une liste prédéfinie.
  • Commentaire libre et optionnel par exercice (poids, intensité...), modifiable aussi bien à l'édition que pendant l'exécution de la séance.
  • Détection des modifications non enregistrées à la fermeture de l'écran d'édition (proposition d'enregistrer, d'abandonner ou d'annuler).
  • Validation explicite des saisies : noms et commentaires limités, tours et répétitions compris entre 1 et 999, durées programmées comprises entre 1 s et 2 h 00 min 59 s, et séances limitées à 10 000 étapes développées. Une valeur invalide n'est jamais corrigée ou tronquée silencieusement.

Exécution d'une séance

  • Écran de résumé avant le lancement : nom de la séance, compteurs de groupes, d'exercices et de pauses, puis aperçu des groupes, de leurs répétitions et de leurs exercices.
  • Empêche la mise en veille de l'écran pendant toute la durée de la séance.
  • Chronomètre global de la séance, indépendant du minuteur de chaque exercice.
  • Écran organisé autour des commandes de séance, de la progression, du prochain élément et de l'exercice ou de la pause en cours.
  • Navigation manuelle entre les exercices (précédent/suivant), en plus de la progression automatique.
  • Mise en évidence visuelle (clignotement) de l'exercice en cours.
  • Pause/reprise de la séance à tout moment.
  • Écran de progression détaillée, avec possibilité de sauter directement à un exercice donné (avec confirmation).
  • Fin de séance anticipée ou normale, toutes deux enregistrées dans l'historique : le statut (Terminée / Incomplète) est toujours déterminé à partir de la progression réelle (mêmes coches que l'écran de progression détaillée), quel que soit le mode de fin de séance.
  • Si l'ordre d'exécution est modifié manuellement (exercices/pauses sautés, groupes réalisés dans un autre ordre) et que le dernier exercice du dernier groupe est terminé alors que des éléments restent non réalisés, la séance ne se termine pas automatiquement : elle se met en pause et propose de reprendre à un exercice de son choix (via l'écran de progression) ou de terminer la séance (enregistrée avec le statut Incomplète).
  • Si une pause est définie à la fin de la séance (dernière pause du dernier groupe), cette pause sera ignorée.
  • Alerte de fin des exercices et pauses chronométrés, configurable sur Son, Vibration ou Rien depuis les paramètres et ajustable pendant la séance.
  • Les signaux sonores et leurs aperçus diminuent temporairement le volume d'une autre application audio au lieu d'interrompre sa lecture.
  • Notification Android persistante pendant qu'un chronomètre est actif (pause, exercice Temps ou Durée libre — jamais pour un exercice Répétitions) : icône Play/Pause dans la barre d'état, nom de l'exercice/de la pause et temps restant (ou écoulé en Durée libre), prochain élément de la séance et bouton Pause / Reprendre. Un appui sur la notification rouvre la séance. Repose sur un vrai Foreground Service Android (et non une simple notification), afin que la mise à jour du chronomètre ainsi que le son/la vibration de fin d'exercice restent fiables même lorsque l'application est en arrière-plan. Disparaît automatiquement à la fin, à l'abandon, ou à l'arrêt de la séance.
  • Exécution tour par tour des groupes à répétitions variables, avec la valeur résolue affichée et conservée dans l'historique. La reprise d'une séance interrompue restaure le bon tour et la bonne répétition.
  • Exécution des Tabata cycle par cycle, des AMRAP avec suivi et annulation du dernier tour, et des EMOM minute par minute. Les récupérations configurées après un groupe ne sont exécutées que lorsqu'un autre groupe suit.
  • Compte à rebours de préparation facultatif de 0 à 15 secondes, commun aux séances enregistrées et rapides. Il peut être mis en pause ou passé et n'est jamais inclus dans les chronos, checkpoints, estimations, historiques ou statistiques.
  • Avant chaque lancement, un contrôle permet d'activer ou de désactiver temporairement cette préparation. Si le réglage global vaut 0, une durée peut être choisie uniquement pour la séance à venir, sans modifier les Paramètres.

Accueil

  • La sélection d'une séance affiche les actions Dupliquer, Supprimer et Éditer sur une première ligne, puis Commencer sur toute la largeur.
  • La suppression réutilise la même confirmation que l'éditeur et laisse la liste ainsi que la sélection dans un état cohérent.

Session rapide

  • Lancement d'un groupe Libre, à répétitions variables, Tabata, AMRAP ou EMOM sans créer d'entraînement enregistré (accessible via « Rapide » dans la barre de navigation).
  • Aucun type n'est présélectionné ; après le choix, Tabata utilise un effort de 20 secondes, une pause de 10 secondes et un cycle, et les cinq types réutilisent l'éditeur et les validations des groupes enregistrés.
  • Temps total estimé recalculé en direct, sans récupération finale puisqu'un seul groupe est exécuté ; une aide contextuelle précise les éléments inclus dans ce calcul.
  • La séance est générée entièrement en mémoire et exécutée avec le même moteur qu'une séance classique (mêmes statistiques, même historique) — elle n'est jamais ajoutée à « Mes entraînements ».

Historique

  • Historique local des séances effectuées : nom, date, durée totale, statut.
  • Tableau de bord par semaine ou par mois, avec navigation entre les périodes et liste filtrée sur la période affichée.
  • Bilan des séances terminées et incomplètes, ainsi que du temps global passé : détail quotidien en vue hebdomadaire et agrégation par semaine en vue mensuelle.
  • Suppression d'une entrée d'historique avec confirmation.
  • Détail d'une séance avec sa date et son heure, ses statistiques de réalisation, ses durées de travail et de pause, puis le temps passé sur chaque exercice ou pause, regroupé dans des groupes initialement repliés.
  • Détail des tours terminés et du tour partiel pour un AMRAP, ainsi que de chaque minute terminée ou incomplète pour un EMOM.

Import / Export

  • Deux parcours de partage de séances : Exporter des séances crée un fichier v1 à partir des séances sélectionnées et Importer des séances les ajoute avec de nouveaux identifiants, sans remplacer les données locales.
  • Deux parcours distincts pour les données complètes : Sauvegarder les données crée une sauvegarde v3 et Restaurer les données accepte les sauvegardes v2/v3 après présentation d'un résumé et confirmation explicite.
  • Un fichier choisi dans le mauvais parcours est refusé avant toute mutation. L'import de séances reste strictement additif, tandis que la restauration complète remplace les séances, l'historique et les préférences couverts par la sauvegarde.
  • Lecture défensive du stockage local : les données récupérables restent consultables, les erreurs sont signalées sans exposer leur contenu et les mutations susceptibles d'écraser des données illisibles sont bloquées.

Interface

  • Thème système, clair ou sombre, réglable manuellement et conservé après redémarrage.
  • Interface entièrement en français.
  • Interface uniquement en mode portrait pour conserver la lisibilité des écrans.

Stack technique

  • Flutter / Dart
  • Stockage local via shared_preferences (séances et historique, format JSON)
  • wakelock_plus pour le maintien de l'écran actif pendant l'exécution
  • file_picker pour l'import des séances
  • share_plus pour l'export des séances via la fenêtre standard de partage d'éléments
  • flutter_launcher_icons pour la gestion du logo
  • flutter_native_splash pour les ressources du splash natif Android
  • package_info_plus pour l'affichage des informations du package dans la boîte « À propos »
  • flutter_foreground_task pour le Foreground Service Android de la notification persistante pendant l'exécution d'une séance

Aucun backend, aucun compte utilisateur : toutes les données restent sur l'appareil.

Prérequis

  • Flutter SDK (canal stable)
  • Un appareil Android (ou un émulateur) avec le débogage USB activé, ou le support desktop Linux activé (instable) pour tester sur PC

Installation

git clone https://github.com/YannickLevadoux/rep_timer.git
cd rep_timer
flutter pub get

Lancer l'application

Les lancements locaux doivent de préférence passer par le script tool/flutter_with_build_metadata.sh. Le premier argument est directement la sous-commande Flutter : il ne faut pas ajouter le mot flutter après le nom du script.

Commandes disponibles :

# Afficher l'aide du script
./tool/flutter_with_build_metadata.sh --help

# Lancer l'application sur un appareil Android connecté
./tool/flutter_with_build_metadata.sh run

# Lancer l'application sur Linux desktop
./tool/flutter_with_build_metadata.sh run -d linux

Les options placées après run sont transmises à Flutter. Les métadonnées de ces lancements locaux sont décrites dans le guide des builds et des releases.

Documentation

Auteur

Yannick Levadoux

Avec l'aimable contribution de Claude et de ChatGPT

About

Application Android pour gérer les exercices à la salle de sport

Resources

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages