From e31e84cab9ba9d3c6c31d672557285f981bb97c5 Mon Sep 17 00:00:00 2001 From: BB Studio <282851981+bbstudioapp@users.noreply.github.com> Date: Sun, 31 May 2026 11:17:09 +0200 Subject: [PATCH 1/2] =?UTF-8?q?fix(session):=20d=C3=A9marrage=20iOS=20ne?= =?UTF-8?q?=20soft-locke=20plus=20si=20un=20init=20=C3=A9choue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sur iOS Safari/PWA, start() restait bloqué en idle : WakelockPlus.enable() (et potentiellement _tts/_beep.init()) peut lever une exception — la Wake Lock API exige un contexte de geste, indisponible depuis le Timer de prep appelé 7 s après « JE SUIS PRÊTE ». L'exception se propageait avant `_state = running` (le try n'avait qu'un finally, pas de catch), laissant la séance en idle. Or en prod l'écran de jeu n'a aucun bouton play (gated derrière le toggle debug showSessionControls) → soft-lock : l'utilisatrice ne voyait que les sliders de volume (retour iOS v0.4.0). Les trois inits deviennent best-effort (try/catch + debugPrint) : aucun n'est un prérequis du passage en running. La séance démarre toujours, au pire sans wakelock. Android/desktop inchangés (ces appels n'y throwent pas). --- .../lib/controllers/session_controller.dart | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/rhythm_coach/lib/controllers/session_controller.dart b/rhythm_coach/lib/controllers/session_controller.dart index dfbb83d..d8f42a3 100644 --- a/rhythm_coach/lib/controllers/session_controller.dart +++ b/rhythm_coach/lib/controllers/session_controller.dart @@ -940,9 +940,32 @@ class SessionController extends ChangeNotifier { _stats.getObedienceLevel().then(_obedience.seed); } - await _tts.init(); - await _beep.init(); - await WakelockPlus.enable(); + // Inits best-effort : aucun de ces appels n'est un prérequis du passage + // en `running`. Un échec (typiquement iOS Safari/PWA — voir ci-dessous) + // ne doit JAMAIS avorter `start()` : sinon `_state` reste `idle` et, + // en prod, l'écran de jeu n'a aucun bouton play (gated derrière le + // toggle debug `showSessionControls`) → soft-lock total (cf. retour + // iOS « pas de bouton pour commencer », v0.4.0). + try { + await _tts.init(); + } catch (e) { + debugPrint('start(): _tts.init() a échoué (non bloquant) : $e'); + } + try { + await _beep.init(); + } catch (e) { + debugPrint('start(): _beep.init() a échoué (non bloquant) : $e'); + } + try { + // Wakelock = garder l'écran allumé (confort, non essentiel). Sur iOS + // Safari/PWA la Wake Lock API exige un contexte de geste utilisateur ; + // appelée depuis le Timer de prep (7 s après « JE SUIS PRÊTE »), elle + // peut lever `NotAllowedError`. + await WakelockPlus.enable(); + } catch (e) { + debugPrint( + 'start(): WakelockPlus.enable() a échoué (non bloquant) : $e'); + } // Reset du fond média : on repart sur le placeholder animé tant que // le premier step de config n'a pas tiré une entrée. Évite qu'une From 510d373a10f0cae6ad39e2475dc013e550fc1fbb Mon Sep 17 00:00:00 2001 From: BB Studio <282851981+bbstudioapp@users.noreply.github.com> Date: Sun, 31 May 2026 11:28:24 +0200 Subject: [PATCH 2/2] chore(release): bump version 0.5.2+13 --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- CHANGELOG.md | 14 +++++++++++++- README.de.md | 2 +- README.fr.md | 2 +- README.md | 2 +- rhythm_coach/README.de.md | 2 +- rhythm_coach/README.fr.md | 2 +- rhythm_coach/README.md | 2 +- rhythm_coach/pubspec.yaml | 2 +- 9 files changed, 21 insertions(+), 9 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 39c2dbc..e269565 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -27,7 +27,7 @@ assignees: '' ## Environnement / Environment -- **Version BeatBitch** : +- **Version BeatBitch** : - **Plateforme / Platform** : - **OS** : - **Langue dans l'app / App language** : diff --git a/CHANGELOG.md b/CHANGELOG.md index c6a1601..c026898 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,17 @@ ## [Non publié] +## [0.5.2] — 2026-05-31 + +Correctifs ciblés sur les **défis intra-séance** (deux retours iOS) plus un nouveau geste d'input pour les défis dynamiques. + +### Ajouté +- **Input « tap GO / STOP » pour les défis dynamiques** — les défis rythmés, de franchissement de gorge, de biffle et d'endurance ne demandent plus de garder le doigt collé à l'écran toute la durée (épuisant quand le geste entre en compétition avec l'acte). On tape **DÉMARRE** pour lancer, le défi tourne seul, et un bouton **STOP** plein écran sert à abandonner (en cours) ou à valider (au seuil). Les holds statiques (gorge, fond, apnée) gardent la tenue du doigt, qui leur reste naturelle. + +### Corrigé +- **Défi de franchissement de gorge qui ne se terminait jamais** — sur les axes « franchissement gorge », le compteur de passages restait figé à 0 (position cible non définie côté contrôleur), donc le seuil de fin n'était jamais atteint et le défi s'enchaînait indéfiniment (deepthroat rapide sans fin visible). Position cible recâblée → le défi se conclut au nombre de franchissements annoncé. +- **Démarrage bloqué sur iOS** — après le décompte de mise en place, la séance pouvait rester coincée sur l'écran « PRÊT » sans bouton pour commencer (uniquement les sliders de volume). Un init non essentiel (wakelock / audio) qui échouait sur Safari/PWA interrompait `start()` avant le passage en lecture. Ces inits deviennent best-effort : la séance démarre toujours, au pire sans wakelock. + ## [0.5.1] — 2026-05-26 Itération de calibration et de polish autour des **défis intra-séance** introduits en 0.5.0 : refonte mécanique des builders en mode streaming (un builder par axe), banners et verdicts plus lisibles, gating profondeur/amplitude resserré, et plusieurs correctifs de progression (acquittement, anti-répétition, redondances). Plus une montée d'intensité visible sur les Supplier / Encore et un calibrage du `throat_pulse`. @@ -176,7 +187,8 @@ Grosse mise à jour du mode carrière : nouvelle enveloppe de difficulté, nouve ## [0.1.0] — 2026-05-08 - Premier release public : coach vocal rythmique hors-ligne pour Android, adult gate 18+, onboarding, mode carrière + scénarios, badges, profil/réputation. -[Non publié]: https://github.com/bbstudioapp/beatbitch/compare/v0.5.1...develop +[Non publié]: https://github.com/bbstudioapp/beatbitch/compare/v0.5.2...develop +[0.5.2]: https://github.com/bbstudioapp/beatbitch/releases/tag/v0.5.2 [0.5.1]: https://github.com/bbstudioapp/beatbitch/releases/tag/v0.5.1 [0.5.0]: https://github.com/bbstudioapp/beatbitch/releases/tag/v0.5.0 [0.4.2]: https://github.com/bbstudioapp/beatbitch/releases/tag/v0.4.2 diff --git a/README.de.md b/README.de.md index fc93108..b235c28 100644 --- a/README.de.md +++ b/README.de.md @@ -1,6 +1,6 @@ # BeatBitch -![version](https://img.shields.io/badge/version-0.5.1-orange) +![version](https://img.shields.io/badge/version-0.5.2-orange) ![platform](https://img.shields.io/badge/platform-Android%20%7C%20Windows%20%7C%20Linux%20%7C%20iOS%20%7C%20Web-blue) ![offline](https://img.shields.io/badge/100%25-offline-blue) ![no tracking](https://img.shields.io/badge/no-tracking-success) diff --git a/README.fr.md b/README.fr.md index 2057e3e..6a9702c 100644 --- a/README.fr.md +++ b/README.fr.md @@ -1,6 +1,6 @@ # BeatBitch -![version](https://img.shields.io/badge/version-0.5.1-orange) +![version](https://img.shields.io/badge/version-0.5.2-orange) ![platform](https://img.shields.io/badge/platform-Android%20%7C%20Windows%20%7C%20Linux%20%7C%20iOS%20%7C%20Web-blue) ![offline](https://img.shields.io/badge/100%25-offline-blue) ![no tracking](https://img.shields.io/badge/no-tracking-success) diff --git a/README.md b/README.md index 45ca627..a25dc89 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # BeatBitch -![version](https://img.shields.io/badge/version-0.5.1-orange) +![version](https://img.shields.io/badge/version-0.5.2-orange) ![platform](https://img.shields.io/badge/platform-Android%20%7C%20Windows%20%7C%20Linux%20%7C%20iOS%20%7C%20Web-blue) ![offline](https://img.shields.io/badge/100%25-offline-blue) ![no tracking](https://img.shields.io/badge/no-tracking-success) diff --git a/rhythm_coach/README.de.md b/rhythm_coach/README.de.md index 9b838ce..93a28a4 100644 --- a/rhythm_coach/README.de.md +++ b/rhythm_coach/README.de.md @@ -1,6 +1,6 @@ # BeatBitch -![version](https://img.shields.io/badge/version-0.5.1-orange) +![version](https://img.shields.io/badge/version-0.5.2-orange) ![platform](https://img.shields.io/badge/platform-Android%20%7C%20Windows%20%7C%20Linux-blue) ![offline](https://img.shields.io/badge/100%25-offline-blue) diff --git a/rhythm_coach/README.fr.md b/rhythm_coach/README.fr.md index 2f1a3af..9231e90 100644 --- a/rhythm_coach/README.fr.md +++ b/rhythm_coach/README.fr.md @@ -1,6 +1,6 @@ # BeatBitch -![version](https://img.shields.io/badge/version-0.5.1-orange) +![version](https://img.shields.io/badge/version-0.5.2-orange) ![platform](https://img.shields.io/badge/platform-Android%20%7C%20Windows%20%7C%20Linux-blue) ![offline](https://img.shields.io/badge/100%25-offline-blue) diff --git a/rhythm_coach/README.md b/rhythm_coach/README.md index 7e482b5..c657186 100644 --- a/rhythm_coach/README.md +++ b/rhythm_coach/README.md @@ -1,6 +1,6 @@ # BeatBitch -![version](https://img.shields.io/badge/version-0.5.1-orange) +![version](https://img.shields.io/badge/version-0.5.2-orange) ![platform](https://img.shields.io/badge/platform-Android%20%7C%20Windows%20%7C%20Linux-blue) ![offline](https://img.shields.io/badge/100%25-offline-blue) diff --git a/rhythm_coach/pubspec.yaml b/rhythm_coach/pubspec.yaml index 9ad5f5a..f9dfdae 100644 --- a/rhythm_coach/pubspec.yaml +++ b/rhythm_coach/pubspec.yaml @@ -1,7 +1,7 @@ name: beat_bitch description: An offline rhythmic voice coach for Android. publish_to: 'none' -version: 0.5.1+12 +version: 0.5.2+13 environment: sdk: '>=3.3.0 <4.0.0'