mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge.git
synced 2026-07-31 07:44:24 +02:00
Health Connect enforces hard min/max bounds on each record-type field; a single out-of-range value caused the record constructor to throw and killed the entire batch insert. The trigger was a Garmin Venu 3 producing HRV > 200 ms, but several syncers shared the same gap (no upper bound, only > 0 or no validation at all). Add explicit per-syncer numeric guards matching the bounds enforced by HC's record constructors, drop out-of-range samples, log them with the existing [HC_SYNC] prefix, and continue the sync. Bounds applied (per-record HC enforcement): - HRV: 1..200 ms - VO2Max: 0..100 ml/kg/min - Weight: 0..1000 kg - BloodGlucose: 0..900.91 mg/dL (= 50 mmol/L) -- previously unvalidated - RespiratoryRate: 0..1000 breaths/min - HeartRate / RestingHR: 1..300 / 0..300 bpm (widened from 20..250 to match HC's contract; downstream consumers can apply physiological filters) - SpO2: 0..100 % - Steps: 1..1000000 per record - ActiveCalories: 0..1000000 kcal per record - Distance: 0..1000000 m per record - Skin temperature delta: -30..30 °C - Body temperature: existing physiological clamp 25..45 °C kept (HC has no enforced bound) Add Logger.skipOutOfRange extension in syncers/SyncerLogging.kt and relax HC_SYNC_TAG visibility from private to internal so syncers can share it. HeartRateSync aggregates dropped-sample counts into one summary log line per slice rather than per-sample, to avoid log spam from glitchy firmware. convertSample visibility relaxed from protected to internal in the two abstract base syncers so the new boundary tests can call it directly. 30 new unit tests in SyncerRangeValidationTest cover boundary conditions per syncer.