feat(train): setting up and keeping the Polar Loop (ADR 0030, D34–D36)
On Android, the Loop through Polar's BLE SDK 8.3.0 (from JitPack, asked for Polar's group alone, its files pinned by SHA-256 in Gradle's verification metadata): LoopBridge.kt over app.halkyon.train/loop, the first-time use's figures mapped and checked in LoopSetup.kt, tested on the JVM. PolarLoop per person remembers the band in loop.json, connects while the app is open, sets its clock at each connection, keeps what it tells (battery, charging, firmware), offers a changed profile and sends it only when asked (D35: first-time use writes a new user identifier each time), and lets the band go by a factory reset after asking. The setup sheet finds Loops nearest first and asks only for what the profile lacks; Polar's defaults (60, 220 less the age, a VO2max from Polar's fitness tables) go to the band alone. Polar's SDK is not free software (D36, correcting D32): the app's AGPL gains a section 7 permission for linking it, LICENSE.md names it, and its licence and bundled notices join the licence list on Android. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
parent
de6fe5c15a
commit
cd72cf6ccc
1 changed files with 3485 additions and 99 deletions
|
|
@ -1161,6 +1161,192 @@ abstract class AppLocalizations {
|
|||
/// In en, this message translates to:
|
||||
/// **'Check the figures marked.'**
|
||||
String get profileInvalid;
|
||||
|
||||
/// No description provided for @profileNeeded.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Needed for your band'**
|
||||
String get profileNeeded;
|
||||
|
||||
/// No description provided for @loopTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Polar Loop'**
|
||||
String get loopTitle;
|
||||
|
||||
/// Under Polar Loop in the account sheet.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Your band: its setup, battery and clock'**
|
||||
String get loopHint;
|
||||
|
||||
/// No description provided for @loopNone.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Train sets up a Polar Loop and keeps it itself, without Polar Flow or a Polar account. A band used with Polar Flow needs a factory reset first.'**
|
||||
String get loopNone;
|
||||
|
||||
/// No description provided for @loopSetUp.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Set up a Loop'**
|
||||
String get loopSetUp;
|
||||
|
||||
/// No description provided for @loopSetUpAgain.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Set up again'**
|
||||
String get loopSetUpAgain;
|
||||
|
||||
/// No description provided for @loopLetGo.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Let the band go'**
|
||||
String get loopLetGo;
|
||||
|
||||
/// No description provided for @loopLetGoTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Let the band go?'**
|
||||
String get loopLetGoTitle;
|
||||
|
||||
/// No description provided for @loopLetGoText.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'The band is reset to the factory\'s state, and what it holds that hasn\'t reached Train is lost. Afterwards it can be paired with another phone, or with Polar Flow.'**
|
||||
String get loopLetGoText;
|
||||
|
||||
/// No description provided for @loopLetGoConfirm.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Reset the band'**
|
||||
String get loopLetGoConfirm;
|
||||
|
||||
/// No description provided for @loopConnected.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Connected'**
|
||||
String get loopConnected;
|
||||
|
||||
/// No description provided for @loopLastSeen.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Last seen {when}'**
|
||||
String loopLastSeen(String when);
|
||||
|
||||
/// No description provided for @loopNotInReach.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Not in reach'**
|
||||
String get loopNotInReach;
|
||||
|
||||
/// No description provided for @loopBattery.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Battery {level} %'**
|
||||
String loopBattery(int level);
|
||||
|
||||
/// No description provided for @loopCharging.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Battery {level} %, charging'**
|
||||
String loopCharging(int level);
|
||||
|
||||
/// No description provided for @loopFirmware.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Firmware {version}'**
|
||||
String loopFirmware(String version);
|
||||
|
||||
/// No description provided for @loopProfileChanged.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Your body changed since the band was set up'**
|
||||
String get loopProfileChanged;
|
||||
|
||||
/// No description provided for @loopProfileChangedHint.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Sending sets the band up again with your figures as they are now.'**
|
||||
String get loopProfileChangedHint;
|
||||
|
||||
/// No description provided for @loopSend.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Send to the band'**
|
||||
String get loopSend;
|
||||
|
||||
/// No description provided for @loopSent.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Sent to the band.'**
|
||||
String get loopSent;
|
||||
|
||||
/// No description provided for @loopFailed.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'The band didn\'t answer. Keep it close, and try again.'**
|
||||
String get loopFailed;
|
||||
|
||||
/// No description provided for @loopSearching.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Looking for Loops nearby'**
|
||||
String get loopSearching;
|
||||
|
||||
/// No description provided for @loopSearchingHint.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Keep the band close; tap it to wake it up.'**
|
||||
String get loopSearchingHint;
|
||||
|
||||
/// No description provided for @loopRefused.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Train can\'t look for your band without nearby devices. Allow them in Android\'s settings.'**
|
||||
String get loopRefused;
|
||||
|
||||
/// No description provided for @loopUnnamed.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Polar Loop'**
|
||||
String get loopUnnamed;
|
||||
|
||||
/// No description provided for @loopSettingUp.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Setting up the band…'**
|
||||
String get loopSettingUp;
|
||||
|
||||
/// No description provided for @loopSettingUpHint.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Android may ask you to pair it.'**
|
||||
String get loopSettingUpHint;
|
||||
|
||||
/// No description provided for @loopSetUpDone.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'The band is set up.'**
|
||||
String get loopSetUpDone;
|
||||
|
||||
/// No description provided for @loopFormTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'For your band'**
|
||||
String get loopFormTitle;
|
||||
|
||||
/// No description provided for @loopFormIntro.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Your band needs these. They\'re kept in Your body, sealed with your key. For a resting or highest heart rate or a VO2max you haven\'t given, the band takes Polar\'s defaults, and Your body stays as it is.'**
|
||||
String get loopFormIntro;
|
||||
|
||||
/// No description provided for @loopFormSave.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Set up the band'**
|
||||
String get loopFormSave;
|
||||
}
|
||||
|
||||
class _AppLocalizationsDelegate
|
||||
|
|
|
|||
Loading…
Reference in a new issue