From ea535922f7653ac217e9ffa6a48cc56f7970a426 Mon Sep 17 00:00:00 2001 From: SATHVIK SVS Date: Sun, 9 Aug 2026 17:35:20 +0530 Subject: [PATCH 1/5] a 13-week activity heatmap on the workouts screen The session feed is reverse-chronological, so it can show you what you did but never the shape of a quarter: where the gaps are, and whether the rhythm is holding. This adds a Monday-aligned day grid above the feed, shaded by the calories burned in logged workouts. Notes on the choices that aren't obvious: - The board is deliberately independent of the Today/Week/Month/3M selector. It stays a fixed 13-week reference while the feed below it filters, so on the Today tab you still see the quarter instead of only an empty state. - Shade is scaled to the user's own 90th-percentile day (floored at 250 kcal) rather than fixed thresholds, which would leave a beginner's grid permanently cold and an endurance athlete's permanently maxed. The percentile rather than the max keeps one exceptional session from flattening everything else. - Data comes from getSessions() with an explicit window, not getWorkouts(range: 'quarter'): that tops out at 90 days and a Monday-aligned 13-week grid needs up to 97, which would leave the oldest column silently short. Unconfirmed auto-detections and live sessions are filtered out so the grid agrees with the feed and the training summary. - Days after today render as nothing rather than empty wells, because an empty well reads as a day you skipped. - The ramp's interpolation factors differ per palette. coralSoft sits close to coral on paper and far below it on char, so one shared set of factors produced a lopsided ramp on dark (2.48:1 between levels 0-1 vs 1.29:1 between 3-4). Both are now within a 1.55 spread, asserted by test. Verification: 34 tests covering the calendar layer (DST transitions, local-day bucketing, streak edges), the ramp (monotonic luminance and minimum step in both palettes), and the widget. Run on an iPhone 17 Pro simulator in both themes -- screenshots in the PR. Simulator data is synthetic. --- .gitignore | 8 + docs/calorie-heatmap-ios-dark.png | Bin 0 -> 111302 bytes docs/calorie-heatmap-ios-light.png | Bin 0 -> 109590 bytes docs/calorie-heatmap-preview.svg | 419 +++++++++++++++ lib/ui/workouts/calorie_heatmap.dart | 727 +++++++++++++++++++++++++++ lib/ui/workouts/workouts_screen.dart | 38 ++ test/calorie_heatmap_test.dart | 521 +++++++++++++++++++ 7 files changed, 1713 insertions(+) create mode 100644 docs/calorie-heatmap-ios-dark.png create mode 100644 docs/calorie-heatmap-ios-light.png create mode 100644 docs/calorie-heatmap-preview.svg create mode 100644 lib/ui/workouts/calorie_heatmap.dart create mode 100644 test/calorie_heatmap_test.dart diff --git a/.gitignore b/.gitignore index f1331ae5..b61a91a4 100644 --- a/.gitignore +++ b/.gitignore @@ -90,3 +90,11 @@ lib/firebase_options.dart # Local agent worktrees and execution ledgers. /.worktrees/ /.superpowers/ + +.codegraph/ + +# Rendered previews of docs/*.svg — regenerate from the svg rather than +# committing them. The svg IS the source; these are just what gets pasted +# into Discord/issues, and they're ~750kb a piece. +docs/*.gif +docs/*.mp4 diff --git a/docs/calorie-heatmap-ios-dark.png b/docs/calorie-heatmap-ios-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..169d2761adbc34b7b222af991dbf4e162e087119 GIT binary patch literal 111302 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%0AVcmM>Ee~YPvWMAb zYjG0L25-Vt*dV-DG=t|a8)8e`McS6h)H7t?Usd5`fh{sq({)RxV?|AKjioewpX>pX z-z71ZJ&aeB5-5{L_U>LK5bL#U*qHG!GoK*I%%~w!lZ31DcLa9iL~ZS`r;W~s{*e+$ zzQFQ12zS?{h!LN63j-%fKB62-V3&JH*En5KOyj*ioF_zfJw(jM#EB!IP`ub6idKEikGUH`X$B+Tc-){|go7 z5U>s1vjfZg1woMYF_LP9k4lh@g`7;j<6#j!ayOpQ`bzx|38`X@QVJa-OdG}C7>HI9 zUQ2pjmui1u@OjjWKxm~YEVPQhajR+zkv84=6nU91c}>V=$=S{M0}9Vw&m9|vc7I;V z$YS{zWhRrR0i;eIzO2@-{+a*yUk3_+3&|BP5f`5;l>iP4GHEG% za5aZQ$P^D1pDMX-F{DjgNY=I{inhQ*svEnh*(Bm+PR_<^%QSt2h}n3_*m9YWPkTgT z_f)(Btrml-{U5_=(8<5#gCa2S0oAo|S}N#?b6b^VJ@*qr5QN210EgZ9X z7rCPMGjkeHlU>>J(e?boBPY5$5w!@K+*u4s2Aln9T$Dk^;oMN+l6?5{vC}`!p+71w zpETzNDEz7MJNA^jZS7#;ayd6?b&$1D!cD)E&ggq;iD!?F9$|=W!E32L#6jjx>(C0> ziUYfqYP4$fclQO3mk(%Oiy{2`bv#mOgn zlp1c4AJgdxilcBV^fP)sG%Np`i0*)ZT5>xd5bpjEe)&KH?f~C7S|4ktRG}Tsa>xB> za_wUH5P(u)j?fQ`Z>Nxeg&zd&bnkbp8V+dx&Z^h$? z&9p^}CP!BBno;le&dVw114>`9;q28!9t}Dqt2e=Cj@D6ykA}>+(vH?2?+arTVMMS= zbYL*%D#70hXHpSDkP2YNN)=GqVo+yB8YHBJgd{_-mr*l3l2pF5LmPm}sWe4`;K(y= z%MEhjG_~s^<&NP^t6UmfH4Xg)DbaV8qXCJ^_1dSQhxD=Sl|=&U1pe8K!IXle<%NKc zf1Qqqt<$w{)+&Upjj3C-!)E|ul%K?L-CUm?6E$eARu?GPH$K-LYf#@V^OT0n&Qv_$RUzBWK~H*Zvg$KL zUD&oRSoVxT5YHIXSJm&?qbUKrn>wrhXUH0Q)UIjdHW!$@oNt^x=hRTlLR($m>RnDt zP8OyMFTo@F(mcOB-c9fspSfv;&n5-?r=BlTH9K&+Y(r?A%E&S;1PS$$pUFfpjChmNo*;M5zE8NmgXLuy5k(ti4(uk zyjZ)_-aUanY7wmQGBX!N<`ktttEcCAKGKNe-hZGuJ>3p6^sY&u`!qR3E>6gx3%f7W zLCe9^<&IcGa(iM8)oZDYxcDr6dv;CHj(}j+hyXUd-#-2UkmSowypZ8j%bkCxk-oiX z_IcTL-NcNS>A_yRQ2cb&mu53lHwgb%0z~L>(D~_r54Gfa9Qbcv;z&3ZEWSWD<11NNNQ3A+x5b;9I z^17y5^K#MVorAdl(;^~Vm2CdOU<8^!AshvS{^6+^8MWl+iN$4@JfIIG{L<8m=#vm_ z(nlx#trFs%nNStrM5#y{3EJ?ICI3n`MKZkY6}_Rlc^r6(5}D3y)ZO3nJ*dUe*PI*Q zW9G^Z8wMJ*h*}yw`F}=)5Y}iwgHE1s{8j}7^Jr+W(&%e9r#>H>0pe=?lT}v(M4Yb z^DLmAmB+ zdcq_;f~?PqiSOc$jo5LrVU4=7L$|)x<*84gqhLz}{3{^~ilSo=6p}WK2lWohfft~P9C#XauNgo9JQwt zy5X@P9*ut1alPFw8Z%Fa75IEQ&bs^94g>$cbbE^ixSg6lFL0@M624g%@it!z>+|30 q#W*F%{%;!TKMJ`wKkj$@ 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 j4>0p*w=xAlk8U5H +OpenStrap — Activity heatmap (proposal) + + + + + + + + + + + + + + + + +ACTIVITY · 13 WEEKS + +i + + + + 0 + 5,400 + 10,200 + 14,600 + 17,900 + 19,900 + 21,000 + 21,340 + + kcal + 54 sessions · 5-day streak + + + + 780 + kcal + Fri 23 May · Run · 52 min + + + +Mar +Apr +May +Jun + +M +W +F + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Less + + + + + +More +kcal per day + +Shade = calories burned that day, scaled to your own 90th-percentile day. + + diff --git a/lib/ui/workouts/calorie_heatmap.dart b/lib/ui/workouts/calorie_heatmap.dart new file mode 100644 index 00000000..e8381ef6 --- /dev/null +++ b/lib/ui/workouts/calorie_heatmap.dart @@ -0,0 +1,727 @@ +// The workouts activity heatmap — 13 weeks of daily workout calorie burn as a +// Monday-aligned day grid. It answers the one question the reverse-chron +// session feed structurally cannot: where the gaps are, and what the training +// rhythm actually looks like. +// +// This file's pure layer (below) is deliberately separable from the widget: day +// bucketing, the intensity scale and the streak are all calendar arithmetic, +// and calendar arithmetic is where this kind of grid goes wrong. + +import 'dart:math' as math; + +import 'package:flutter/material.dart'; + +// design.dart re-exports the theme tokens (Palette, AppColors, Sp, Motion) and +// AppText alongside the bento/controls widgets. +import '../design/design.dart'; + +/// The fill for a 0..4 intensity level, resolved against a SPECIFIC palette. +/// +/// One construction serves both modes because `ink` flips with the palette: +/// blending it into `coralDeep` DEEPENS the top bucket on paper and BRIGHTENS +/// it on char, so "hotter" reads correctly either way without a second ramp. +/// +/// Level 0 is `surfaceSunk` — a well, deliberately not on the coral ramp at +/// all, so a rest day never looks like a faint training day. +/// +/// Guarded by the contrast tests in test/calorie_heatmap_test.dart, which +/// assert monotonic luminance and a minimum separation between every adjacent +/// pair in both palettes. +Color heatColorIn(Palette p, int level) { + // The interpolation factors differ by mode, and they have to. On paper, + // coralSoft is a pale tint sitting close to coral; on char it's a deep ember + // fill sitting far below it — so the same t lands at a very different + // perceptual position. Sharing one set of factors produces a ramp that + // spends most of its range between levels 0 and 1 and almost none between 3 + // and 4 (measured 2.48:1 vs 1.29:1 on char). These are tuned per palette for + // even spacing; the evenness test is what pins them. + final dark = p.isDark; + switch (level.clamp(0, 4)) { + case 0: + return p.surfaceSunk; + case 1: + return Color.lerp(p.coralSoft, p.coral, dark ? 0.25 : 0.38)!; + case 2: + return Color.lerp(p.coralSoft, p.coral, dark ? 0.62 : 0.70)!; + case 3: + return p.coral; + default: + return Color.lerp(p.coralDeep, p.ink, dark ? 0.30 : 0.18)!; + } +} + +/// The fill for a 0..4 intensity level in the CURRENT theme. +Color heatColor(int level) => heatColorIn(AppColors.active, level); + +/// One cell of the grid — a single LOCAL calendar day. +class HeatDay { + /// Local midnight for this day. + final DateTime date; + + /// Calories burned across every session that STARTED on this day. + final int kcal; + + /// How many sessions landed here (a day can hold more than one). + final int sessions; + + /// Summed active minutes for the day. + final int durationMin; + + /// This day hasn't happened yet (the tail of the current week). The grid + /// draws nothing here — an empty well would read as a day you skipped. + final bool isFuture; + + const HeatDay({ + required this.date, + this.kcal = 0, + this.sessions = 0, + this.durationMin = 0, + this.isFuture = false, + }); +} + +/// The kcal value that saturates the ramp — the 90th percentile of days you +/// actually trained, never below [floor]. +/// +/// Relative rather than absolute on purpose. Fixed thresholds leave a beginner's +/// grid permanently cold and an endurance athlete's permanently maxed; scaling +/// to your own distribution makes the shading mean the same thing for both. The +/// percentile (not the max) keeps one exceptional session from flattening the +/// quarter, and the floor stops three easy walks from all reading as max effort. +int heatScale(List days, {int floor = 250}) { + final trained = [ + for (final d in days) + if (d.kcal > 0) d.kcal, + ]..sort(); + if (trained.isEmpty) return floor; + // Nearest-rank percentile: the smallest value with >= 90% of samples at or + // below it. + final rank = ((0.9 * trained.length).ceil() - 1).clamp(0, trained.length - 1); + final p90 = trained[rank]; + return p90 < floor ? floor : p90; +} + +/// Bucket a day's burn into 0..4 against [scale] from [heatScale]. +/// +/// 0 is reserved for "didn't train" and is never reachable by a nonzero burn: +/// a rest day and a very light day must read differently or the grid stops +/// answering the question it exists for. 1..4 split the scale into quarters, +/// with everything past the p90 absorbed by the top bucket. +int heatLevel(int kcal, int scale) { + if (kcal <= 0) return 0; + if (scale <= 0) return 4; // degenerate scale — don't divide, just saturate + final t = kcal / scale; + if (t <= 0.25) return 1; + if (t <= 0.50) return 2; + if (t <= 0.75) return 3; + return 4; +} + +/// Consecutive trained days ending at [today] — or at yesterday, when today +/// hasn't been trained yet. +/// +/// The yesterday allowance matters: a streak that resets at midnight would tell +/// you you'd broken it before you'd had a chance to train that day. +int currentStreak(List days, {required DateTime today}) { + final t = DateTime(today.year, today.month, today.day); + final trained = { + for (final d in days) + if (d.kcal > 0) d.date, + }; + + // Anchor on today if it's trained, else on yesterday; if neither, no streak. + final yesterday = DateTime(t.year, t.month, t.day - 1); + var cursor = trained.contains(t) + ? t + : trained.contains(yesterday) + ? yesterday + : null; + if (cursor == null) return 0; + + var n = 0; + while (trained.contains(cursor)) { + n++; + cursor = DateTime(cursor!.year, cursor.month, cursor.day - 1); + } + return n; +} + +/// A month name pinned to the grid column where that month starts. +class MonthLabel { + /// Zero-based week column. + final int column; + + /// Short month name, e.g. 'Mar'. + final String text; + + const MonthLabel(this.column, this.text); +} + +/// Where to write month names above the grid. +/// +/// The board shows rhythm but not *when*: a three-week gap is meaningless if +/// you can't tell whether it was March or May. A label is emitted for the first +/// column of each month — keyed off each column's Monday, so a month is named +/// once, at the week it takes over, and never repeated. +List monthLabels(List days) { + final out = []; + int? lastMonth; + for (var col = 0; col * 7 < days.length; col++) { + final monday = days[col * 7].date; + if (monday.month != lastMonth) { + out.add(MonthLabel(col, _mon[monday.month - 1])); + lastMonth = monday.month; + } + } + return out; +} + +/// Comma-group an integer: 22140 -> "22,140". +/// +/// Local rather than a package: `intl` isn't a dependency here, and every other +/// stat in the app is small enough to render as a bare int. A 13-week calorie +/// total is the first five-figure number on a card, and an ungrouped run of +/// digits is measurably harder to read at a glance. +String groupThousands(int n) { + final neg = n < 0; + final digits = n.abs().toString(); + final buf = StringBuffer(); + for (var i = 0; i < digits.length; i++) { + // Comma before every group of three counted from the RIGHT — i.e. wherever + // the remaining digit count is a positive multiple of three. + if (i > 0 && (digits.length - i) % 3 == 0) buf.write(','); + buf.write(digits[i]); + } + return neg ? '-$buf' : buf.toString(); +} + +/// Narrow a `getSessions()` result to the sessions the grid should shade. +/// +/// That call deliberately merges unconfirmed auto-detected bouts in with saved +/// ones, which is right for the suggestions flow and wrong here: shading a +/// detection would put a day on the grid that the feed and the training summary +/// both omit, while the "Suggested workouts" card for it is still sitting above +/// asking to be confirmed. Live sessions are held back for a different reason — +/// their calorie tally isn't final, so they'd shade in as an artificially cold +/// day and then jump when the session ends. +List> loggedForHeatmap( + List> sessions) => + [ + for (final w in sessions) + if (w['source'] != 'auto' && + w['status'] != 'detected' && + w['status'] != 'live') + w, + ]; + +/// Build the [weeks]x7 grid ending on the Sunday that closes [today]'s week. +/// +/// Days are stepped via `DateTime(y, m, d + i)` rather than +/// `add(Duration(days: 1))` on purpose: Duration arithmetic is absolute, so +/// across a DST transition it lands at 23:00 or 01:00 of the neighbouring day +/// and the grid silently repeats or skips a date. The constructor normalises +/// overflowing day numbers and always yields local midnight. +List buildHeatDays( + List> workouts, { + required DateTime today, + int weeks = 13, +}) { + final t = DateTime(today.year, today.month, today.day); + // weekday: Mon=1 .. Sun=7, so (7 - weekday) reaches this week's Sunday. + final end = DateTime(t.year, t.month, t.day + (7 - t.weekday)); + final start = DateTime(end.year, end.month, end.day - (weeks * 7 - 1)); + + // Tally by local day key first, so multiple sessions on one date collapse + // into a single cell rather than the last one winning. + final kcal = {}; + final count = {}; + final mins = {}; + + for (final w in workouts) { + final startTs = (w['start_ts'] as num?)?.toInt(); + if (startTs == null || startTs == 0) continue; + final local = + DateTime.fromMillisecondsSinceEpoch(startTs * 1000).toLocal(); + final key = DateTime(local.year, local.month, local.day); + kcal[key] = (kcal[key] ?? 0) + ((w['calories'] as num?)?.round() ?? 0); + count[key] = (count[key] ?? 0) + 1; + mins[key] = (mins[key] ?? 0) + ((w['duration_min'] as num?)?.round() ?? 0); + } + + final out = []; + for (var i = 0; i < weeks * 7; i++) { + final d = DateTime(start.year, start.month, start.day + i); + out.add(HeatDay( + date: d, + kcal: kcal[d] ?? 0, + sessions: count[d] ?? 0, + durationMin: mins[d] ?? 0, + isFuture: d.isAfter(t), + )); + } + return out; +} + +// ───────────────────────────────────────────────────────────────────────────── +// Widget +// ───────────────────────────────────────────────────────────────────────────── + +/// Widest a 3-letter month label gets at 9px — reserved so a label pinned +/// to the right edge stays fully on the card. +const double _monthLabelWidth = 24.0; + +const _dow = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; +const _mon = [ + 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', + 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', +]; + +String _readoutDate(DateTime d) => + '${_dow[d.weekday - 1]} ${d.day} ${_mon[d.month - 1]}'; + +String _cellKey(DateTime d) => 'heat-${d.year.toString().padLeft(4, '0')}' + '-${d.month.toString().padLeft(2, '0')}' + '-${d.day.toString().padLeft(2, '0')}'; + +/// The activity heatmap tile — a Monday-aligned day grid of workout calorie +/// burn, with a header that swaps between the window total and a tapped day. +/// +/// Takes an already-built [days] grid rather than raw workouts so the whole +/// calendar layer stays independently testable. +class CalorieHeatmapCard extends StatefulWidget { + final List days; + final DateTime today; + + const CalorieHeatmapCard({ + super.key, + required this.days, + required this.today, + }); + + @override + State createState() => _CalorieHeatmapCardState(); +} + +class _CalorieHeatmapCardState extends State + with TickerProviderStateMixin { + DateTime? _selected; + + /// Staggered reveal — runs once, then holds. + late final AnimationController _reveal = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 700), + ); + + /// The peak day's ember breath. Repeats for as long as the card is mounted, + /// so it is created ONLY when motion is allowed — see [_syncPulse]. + AnimationController? _pulse; + bool _startedReveal = false; + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + final reduce = MediaQuery.maybeDisableAnimationsOf(context) ?? false; + if (!_startedReveal) { + _startedReveal = true; + reduce ? _reveal.value = 1.0 : _reveal.forward(); + } + _syncPulse(reduce); + } + + @override + void didUpdateWidget(covariant CalorieHeatmapCard old) { + super.didUpdateWidget(old); + // A refresh can slide the window past the selected day. build() already + // falls back to the summary, but the selection has to be released too or + // the peak pulse stays suppressed forever waiting on a day that is gone. + if (_selected != null && + !widget.days.any((d) => d.date == _selected)) { + _selected = null; + } + _syncPulse(MediaQuery.maybeDisableAnimationsOf(context) ?? false); + } + + void _syncPulse(bool reduce) { + // Silent while a cell is selected: the selection ring is the thing to look + // at then, and two competing attractors read as noise. + final wants = !reduce && _selected == null && _peak != null; + if (wants && _pulse == null) { + _pulse = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 1200), + )..repeat(reverse: true); + } else if (!wants && _pulse != null) { + _pulse!.dispose(); + _pulse = null; + } + } + + @override + void dispose() { + _reveal.dispose(); + _pulse?.dispose(); + super.dispose(); + } + + List get _drawn => + [for (final d in widget.days) if (!d.isFuture) d]; + + /// The single hottest day in the window, if anything was logged. + HeatDay? get _peak { + HeatDay? best; + for (final d in _drawn) { + if (d.kcal > 0 && (best == null || d.kcal > best.kcal)) best = d; + } + return best; + } + + void _toggle(HeatDay d) { + setState(() { + _selected = _selected == d.date ? null : d.date; + _syncPulse(MediaQuery.maybeDisableAnimationsOf(context) ?? false); + }); + } + + @override + Widget build(BuildContext context) { + final drawn = _drawn; + final total = drawn.fold(0, (a, d) => a + d.kcal); + final sessions = drawn.fold(0, (a, d) => a + d.sessions); + final streak = currentStreak(widget.days, today: widget.today); + final scale = heatScale(widget.days); + final peak = _peak; + + // Resolved by lookup rather than firstWhere: the window slides forward as + // days pass and on a refresh that crosses midnight the selected date can + // fall off the back of the board. Falling back to the summary is right — + // a phantom readout for a day no longer shown would be worse. + HeatDay? sel; + if (_selected != null) { + for (final d in widget.days) { + if (d.date == _selected) { + sel = d; + break; + } + } + } + + return BentoTile( + tone: BentoTone.paper, + accent: DomainAccent.strain, + padding: const EdgeInsets.all(Sp.x4), + child: Builder(builder: (context) { + final tone = ToneScope.of(context); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + const Expanded(child: TileHeader('Activity · 13 weeks')), + InfoDot( + title: 'Activity heatmap', + body: 'Every day of the last 13 weeks, shaded by the ' + 'calories you burned in logged workouts. Empty squares ' + 'are days you did not train.', + methodNote: 'Shade is scaled to your own 90th-percentile ' + 'day (currently $scale kcal), so it means the same ' + 'thing whatever your usual session looks like.', + ), + ], + ), + const SizedBox(height: Sp.x2), + AnimatedSwitcher( + duration: Motion.fast, + child: sel == null + ? _summary(tone, total, sessions, streak) + : _dayReadout(tone, sel), + ), + const SizedBox(height: Sp.x4), + _HeatGrid( + days: widget.days, + today: widget.today, + scale: scale, + selected: _selected, + peak: peak?.date, + reveal: _reveal, + pulse: _pulse, + onTap: _toggle, + ), + const SizedBox(height: Sp.x3), + _Legend(tone: tone), + ], + ); + }), + ); + } + + Widget _summary(ToneColors tone, int total, int sessions, int streak) => + Column( + key: const ValueKey('summary'), + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _bigValue(groupThousands(total), tone), + Text( + '$sessions sessions' + '${streak >= 2 ? ' · $streak-day streak' : ''}', + style: AppText.caption.copyWith(color: tone.fgMuted), + ), + ], + ); + + Widget _dayReadout(ToneColors tone, HeatDay d) => Column( + key: ValueKey('day-${d.date}'), + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _bigValue(d.kcal > 0 ? groupThousands(d.kcal) : '—', tone), + Text( + d.sessions == 0 + ? '${_readoutDate(d.date)} · No workout' + : '${_readoutDate(d.date)} · ' + '${d.sessions > 1 ? '${d.sessions} sessions · ' : ''}' + '${d.durationMin} min', + style: AppText.caption.copyWith(color: tone.fgMuted), + ), + ], + ); + + Widget _bigValue(String v, ToneColors tone) => Row( + crossAxisAlignment: CrossAxisAlignment.baseline, + textBaseline: TextBaseline.alphabetic, + children: [ + Text(v, style: AppText.metric.copyWith(color: tone.fg)), + const SizedBox(width: Sp.x2), + Text('kcal', style: AppText.label.copyWith(color: tone.fgMuted)), + ], + ); +} + +/// The 13x7 board. Weeks are columns (oldest left), weekdays are rows. +class _HeatGrid extends StatelessWidget { + final List days; + final DateTime today; + final int scale; + final DateTime? selected; + final DateTime? peak; + final Animation reveal; + final Animation? pulse; + final void Function(HeatDay) onTap; + + const _HeatGrid({ + required this.days, + required this.today, + required this.scale, + required this.selected, + required this.peak, + required this.reveal, + required this.pulse, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + final weeks = (days.length / 7).ceil(); + final t = DateTime(today.year, today.month, today.day); + + return LayoutBuilder(builder: (context, c) { + // Day-label gutter + inter-cell gaps come out of the available width + // first; whatever is left divides evenly across the week columns. + const gutter = 22.0, gap = 4.0; + final cell = + ((c.maxWidth - gutter - gap * (weeks - 1)) / weeks).clamp(9.0, 26.0); + final radius = cell * 0.3; + + final months = monthLabels(days); + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Month names, pinned to the left edge of the column each month + // starts in. A Stack rather than a Row because the labels are sparse + // and positional — they must line up with a specific week, not + // distribute across the row. + SizedBox( + width: c.maxWidth, + height: 13, + child: Stack( + children: [ + for (final m in months) + Positioned( + // Clamped, not dropped. A month that starts in the last + // column would otherwise run off the card — but skipping it + // leaves the weeks nearest today as the only unnamed + // stretch, which is the opposite of useful. Pinning it to + // the right edge keeps every month named. + left: math.min( + gutter + m.column * (cell + gap), + (c.maxWidth - _monthLabelWidth).clamp(0.0, c.maxWidth), + ), + top: 0, + child: Text( + m.text, + style: AppText.captionMuted + .copyWith(fontSize: 9, height: 1.2), + ), + ), + ], + ), + ), + const SizedBox(height: Sp.x1), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + width: gutter, + child: Column( + children: [ + for (var row = 0; row < 7; row++) + SizedBox( + height: cell + gap, + // Label alternate rows only (M/W/F) — seven stacked labels + // at this cell size is denser than the grid itself. + child: row.isOdd + ? const SizedBox.shrink() + : Align( + alignment: Alignment.centerLeft, + child: Text( + _dow[row][0], + style: AppText.captionMuted + .copyWith(fontSize: 9, height: 1), + ), + ), + ), + ], + ), + ), + Expanded( + child: Column( + children: [ + for (var row = 0; row < 7; row++) + Padding( + padding: const EdgeInsets.only(bottom: gap), + child: Row( + children: [ + for (var col = 0; col < weeks; col++) + Padding( + padding: EdgeInsets.only( + right: col == weeks - 1 ? 0 : gap), + child: _cell( + days[col * 7 + row], + cell.toDouble(), + radius.toDouble(), + col, + row, + t, + ), + ), + ], + ), + ), + ], + ), + ), + ], + ), + ], + ); + }); + } + + Widget _cell( + HeatDay d, double size, double radius, int col, int row, DateTime t) { + // A day that hasn't happened leaves a hole, not an empty well — an empty + // well would read as a day you skipped. + if (d.isFuture) return SizedBox(width: size, height: size); + + final isSelected = selected == d.date; + final isToday = d.date == t; + final isPeak = peak == d.date; + + // Diagonal reveal: later weeks and later weekdays start fractionally + // later, so the board lights up as one wave rather than all at once. + final delay = (col * 0.045 + row * 0.012).clamp(0.0, 0.6); + + return AnimatedBuilder( + animation: Listenable.merge([reveal, pulse]), + builder: (context, _) { + final p = ((reveal.value - delay) / 0.35).clamp(0.0, 1.0); + final eased = Curves.easeOutCubic.transform(p); + final glow = isPeak && pulse != null ? pulse!.value : 0.0; + + return Opacity( + opacity: eased, + child: Transform.scale( + scale: 0.55 + 0.45 * eased, + child: GestureDetector( + key: ValueKey(_cellKey(d.date)), + behavior: HitTestBehavior.opaque, + onTap: () => onTap(d), + child: AnimatedScale( + scale: isSelected ? 1.14 : 1.0, + duration: Motion.springy.d, + curve: Motion.springy.c, + child: Container( + width: size, + height: size, + decoration: BoxDecoration( + color: heatColor(heatLevel(d.kcal, scale)), + borderRadius: BorderRadius.circular(radius), + border: isSelected + ? Border.all(color: AppColors.ink, width: 2) + : isToday + ? Border.all( + color: AppColors.ink.withValues(alpha: 0.9), + width: 1.4) + : null, + boxShadow: glow > 0 + ? [ + BoxShadow( + color: AppColors.coral + .withValues(alpha: 0.10 + 0.28 * glow), + blurRadius: 4 + 10 * glow, + spreadRadius: 1 + 2 * glow, + ), + ] + : null, + ), + ), + ), + ), + ), + ); + }, + ); + } +} + +/// Less -> More swatches, plus the unit. +class _Legend extends StatelessWidget { + final ToneColors tone; + const _Legend({required this.tone}); + + @override + Widget build(BuildContext context) { + final style = AppText.caption.copyWith(fontSize: 10, color: tone.fgMuted); + return Row( + children: [ + Text('Less', style: style), + const SizedBox(width: Sp.x2), + for (var l = 0; l <= 4; l++) + Padding( + padding: const EdgeInsets.only(right: 4), + child: Container( + width: 10, + height: 10, + decoration: BoxDecoration( + color: heatColor(l), + borderRadius: BorderRadius.circular(3), + ), + ), + ), + const SizedBox(width: Sp.x1), + Text('More', style: style), + const Spacer(), + Text('kcal per day', style: style), + ], + ); + } +} diff --git a/lib/ui/workouts/workouts_screen.dart b/lib/ui/workouts/workouts_screen.dart index 5cbce1c2..7dcc9ffa 100644 --- a/lib/ui/workouts/workouts_screen.dart +++ b/lib/ui/workouts/workouts_screen.dart @@ -17,6 +17,7 @@ import '../../models/payloads.dart'; import '../../data/day_label.dart'; import '../../compute/manual_session.dart' show ManualWindowException; import '../../data/db.dart'; +import 'calorie_heatmap.dart'; import '../activity/live_session_screen.dart'; import '../activity/workout_share_card.dart'; import '../../theme/theme_switcher.dart'; @@ -145,6 +146,11 @@ class _WorkoutsScreenState extends State { RecordsData? _records; // for inline PR badges in the feed bool _loading = true; + /// The activity heatmap's own 13-week window — deliberately independent of + /// the range selector above, so the board stays a fixed reference point + /// while the feed below it filters. + List? _heat; + @override void initState() { super.initState(); @@ -165,11 +171,32 @@ class _WorkoutsScreenState extends State { try { recs = RecordsData.fromJson(await api.getRecords()); } catch (_) {} + + // The heatmap needs 13 Monday-aligned weeks — up to 97 days once the + // alignment is counted — which getWorkouts(range: 'quarter') cannot + // reach: that tops out at 90 and would leave the oldest column silently + // short of data. getSessions takes an explicit window and skips the + // per-session HR enrichment the grid has no use for. Fetched wide; days + // outside the board simply match no cell. + List? heat; + try { + final now = DateTime.now(); + final from = DateTime(now.year, now.month, now.day - 105); + final sessions = await api.getSessions( + from: from.millisecondsSinceEpoch ~/ 1000, + to: now.millisecondsSinceEpoch ~/ 1000, + ); + heat = buildHeatDays(loggedForHeatmap(sessions), today: now); + } catch (_) { + /* the board is an enrichment — the log still renders without it */ + } + if (mounted) { setState(() { _data = d; _suggestions = sug; _records = recs; + _heat = heat ?? _heat; _loading = false; }); } @@ -274,6 +301,17 @@ class _WorkoutsScreenState extends State { ).dsEnter(), const SizedBox(height: Sp.x4), ], + // Sits above the feed and OUTSIDE the range filter, so on the + // Today tab you still see the quarter's rhythm rather than only + // an empty state. Hidden entirely until there is something to + // shade — an all-empty board says nothing. + if (_heat != null && _heat!.any((d) => d.kcal > 0)) ...[ + CalorieHeatmapCard( + days: _heat!, + today: DateTime.now(), + ).dsEnter(), + const SizedBox(height: Sp.x4), + ], if (list.isEmpty) StateCard( icon: OsIcon.run, diff --git a/test/calorie_heatmap_test.dart b/test/calorie_heatmap_test.dart new file mode 100644 index 00000000..5e171e5f --- /dev/null +++ b/test/calorie_heatmap_test.dart @@ -0,0 +1,521 @@ +// The workouts activity heatmap's pure layer — day bucketing, the intensity +// scale, and the streak count. All of it is calendar arithmetic over LOCAL +// days, which is exactly where this kind of widget goes wrong: a grid keyed off +// UTC drifts a day for anyone east of Greenwich, and a grid built by adding +// Duration(days: 1) silently loses or repeats a day across a DST transition. +// These tests pin the geometry with an injected `today` so they don't depend on +// when the suite runs. + +import 'dart:math' as math; + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:openstrap_edge/theme/tokens.dart'; +import 'package:openstrap_edge/ui/workouts/calorie_heatmap.dart'; + +/// WCAG 2.1 relative luminance. +double _luminance(Color c) { + double channel(double v) { + final s = v / 255.0; + return s <= 0.03928 + ? s / 12.92 + : math.pow((s + 0.055) / 1.055, 2.4) as double; + } + + return 0.2126 * channel((c.r * 255).roundToDouble()) + + 0.7152 * channel((c.g * 255).roundToDouble()) + + 0.0722 * channel((c.b * 255).roundToDouble()); +} + +double _contrast(Color a, Color b) { + final la = _luminance(a), lb = _luminance(b); + return (math.max(la, lb) + 0.05) / (math.min(la, lb) + 0.05); +} + +void main() { + test('grid is weeks x 7 local days, Monday-aligned, ending on this Sunday', + () { + final today = DateTime(2026, 6, 10); // a Wednesday + final days = buildHeatDays(const [], today: today, weeks: 13); + + expect(days.length, 13 * 7); + expect(days.first.date.weekday, DateTime.monday); + expect(days.last.date.weekday, DateTime.sunday); + // Full weeks: the grid runs to the END of today's week, not to today. + expect(days.last.date, DateTime(2026, 6, 14)); + expect(days.first.date, DateTime(2026, 3, 16)); + }); + + test('sessions bucket into their LOCAL day; same-day sessions sum', () { + final today = DateTime(2026, 6, 10); + int ts(DateTime d) => d.millisecondsSinceEpoch ~/ 1000; + + final days = buildHeatDays([ + // Two efforts on the Monday — a morning run and an evening lift. + { + 'start_ts': ts(DateTime(2026, 6, 8, 7, 30)), + 'calories': 420, + 'duration_min': 45, + 'type': 'run', + }, + { + 'start_ts': ts(DateTime(2026, 6, 8, 18, 5)), + 'calories': 260, + 'duration_min': 30, + 'type': 'lift', + }, + { + 'start_ts': ts(DateTime(2026, 6, 9, 6, 0)), + 'calories': 310, + 'duration_min': 33, + 'type': 'ride', + }, + ], today: today, weeks: 13); + + final byDate = {for (final d in days) d.date: d}; + + final mon = byDate[DateTime(2026, 6, 8)]!; + expect(mon.kcal, 680, reason: 'both Monday sessions counted'); + expect(mon.sessions, 2); + expect(mon.durationMin, 75); + + final tue = byDate[DateTime(2026, 6, 9)]!; + expect(tue.kcal, 310); + expect(tue.sessions, 1); + + // A rest day is a real zero, not a gap in the list. + expect(byDate[DateTime(2026, 6, 7)]!.kcal, 0); + expect(byDate[DateTime(2026, 6, 7)]!.sessions, 0); + }); + + test('days after today are flagged future, today itself is not', () { + final today = DateTime(2026, 6, 10); // Wednesday + final days = buildHeatDays(const [], today: today, weeks: 13); + final byDate = {for (final d in days) d.date: d}; + + // Thu/Fri/Sat/Sun of the current week haven't happened. Drawing them as + // empty wells would read as "you skipped Saturday" — so they carry a flag + // the grid uses to render nothing at all. + expect(byDate[DateTime(2026, 6, 11)]!.isFuture, isTrue); + expect(byDate[DateTime(2026, 6, 14)]!.isFuture, isTrue); + + expect(byDate[DateTime(2026, 6, 10)]!.isFuture, isFalse, + reason: 'today is drawn — it is in progress, not unreachable'); + expect(byDate[DateTime(2026, 6, 9)]!.isFuture, isFalse); + expect(days.where((d) => d.isFuture).length, 4); + }); + + test('the grid keeps exactly one cell per date across a DST transition', () { + // Late March / early November span the EU and US clock changes. Whatever + // zone the suite runs in, every date must appear exactly once and the + // spacing must stay one calendar day. + for (final today in [DateTime(2026, 4, 8), DateTime(2026, 11, 11)]) { + final days = buildHeatDays(const [], today: today, weeks: 13); + final dates = days.map((d) => d.date).toList(); + + expect(dates.toSet().length, dates.length, reason: 'no repeated date'); + for (final d in dates) { + expect(d.hour, 0, reason: 'every cell sits at local midnight'); + } + for (var i = 1; i < dates.length; i++) { + final prev = dates[i - 1]; + expect(dates[i], DateTime(prev.year, prev.month, prev.day + 1), + reason: 'consecutive calendar days, no skips'); + } + } + }); + + test('scale is the p90 of TRAINED days, with a floor', () { + HeatDay d(int kcal) => HeatDay(date: DateTime(2026, 1, 1), kcal: kcal); + + // Ten trained days, 100..1000. Nearest-rank p90 lands on 900 — the scale + // deliberately ignores the single hardest day so one outlier session + // doesn't flatten the whole quarter into pale tints. + expect( + heatScale([for (var i = 1; i <= 10; i++) d(i * 100)]), + 900, + ); + + // Rest days must not drag the percentile down; only trained days count. + expect( + heatScale([...List.generate(50, (_) => d(0)), for (var i = 1; i <= 10; i++) d(i * 100)]), + 900, + ); + + // A beginner's light week would otherwise make a 70 kcal walk "max red". + expect(heatScale([d(50), d(60), d(70)]), 250, reason: 'floored'); + + // Nothing logged at all — still a usable divisor, never zero. + expect(heatScale(const []), 250); + expect(heatScale([d(0), d(0)]), 250); + }); + + test('level 0 means rest; 1..4 split the scale into quarters', () { + // Zero is its OWN bucket, not "the bottom of the ramp" — a rest day and a + // very light day must never paint the same, or the grid stops answering + // "where are my gaps". + expect(heatLevel(0, 800), 0); + expect(heatLevel(1, 800), 1); + + expect(heatLevel(200, 800), 1); // 25% — boundary belongs to the lower band + expect(heatLevel(201, 800), 2); + expect(heatLevel(400, 800), 2); + expect(heatLevel(401, 800), 3); + expect(heatLevel(600, 800), 3); + expect(heatLevel(601, 800), 4); + + // Above the p90 there is nowhere left to go — the top bucket absorbs it. + expect(heatLevel(5000, 800), 4); + + // A degenerate scale must not divide by zero. + expect(heatLevel(100, 0), 4); + expect(heatLevel(0, 0), 0); + }); + + test('streak counts consecutive trained days ending today or yesterday', () { + final today = DateTime(2026, 6, 10); // Wednesday + int ts(DateTime d) => d.millisecondsSinceEpoch ~/ 1000; + Map w(DateTime d) => + {'start_ts': ts(d), 'calories': 300, 'duration_min': 30}; + + // Mon, Tue, Wed(today) trained; Sunday off. + var days = buildHeatDays([ + w(DateTime(2026, 6, 8, 7)), + w(DateTime(2026, 6, 9, 7)), + w(DateTime(2026, 6, 10, 7)), + ], today: today); + expect(currentStreak(days, today: today), 3); + + // Today not trained YET, but yesterday was — the streak is still alive. + // Ending it at midnight would tell you that you broke it before you've + // even had a chance to train. + days = buildHeatDays([ + w(DateTime(2026, 6, 8, 7)), + w(DateTime(2026, 6, 9, 7)), + ], today: today); + expect(currentStreak(days, today: today), 2); + + // Neither today nor yesterday — the streak really is over. + days = buildHeatDays([ + w(DateTime(2026, 6, 6, 7)), + w(DateTime(2026, 6, 7, 7)), + ], today: today); + expect(currentStreak(days, today: today), 0); + + expect(currentStreak(buildHeatDays(const [], today: today), today: today), 0); + }); + + test('thousands are grouped so a 13-week total stays readable', () { + // A quarter's burn is a five-figure number. Every other stat in the app is + // three digits or fewer and renders as a bare int, which is why there was + // no grouping helper to reach for — at 22140 the run of digits is genuinely + // hard to parse at a glance. + expect(groupThousands(0), '0'); + expect(groupThousands(7), '7'); + expect(groupThousands(780), '780'); + expect(groupThousands(999), '999'); + expect(groupThousands(1000), '1,000'); + expect(groupThousands(1080), '1,080'); + expect(groupThousands(22140), '22,140'); + expect(groupThousands(1000000), '1,000,000'); + // Defensive: a negative can't arise from summed calories, but the helper + // must not mangle the sign if one ever does. + expect(groupThousands(-1080), '-1,080'); + }); + + test('month labels mark the column where each new month begins', () { + // Without these the grid shows rhythm but not WHEN — you can see a + // three-week gap and have no idea whether it was March or May. + final today = DateTime(2026, 6, 10); // grid: Mon 16 Mar .. Sun 14 Jun + final labels = monthLabels(buildHeatDays(const [], today: today)); + + // Column Mondays: 16/23/30 Mar, 6/13/20/27 Apr, 4/11/18/25 May, 1/8 Jun. + expect(labels.map((l) => l.column).toList(), [0, 3, 7, 11]); + expect(labels.map((l) => l.text).toList(), ['Mar', 'Apr', 'May', 'Jun']); + }); + + test('a month label is not repeated when a month spans the grid edge', () { + // A 4-week window sitting entirely inside one month must produce exactly + // one label, not one per column. + final labels = monthLabels( + buildHeatDays(const [], today: DateTime(2026, 6, 24), weeks: 3), + ); + expect(labels.length, 1); + expect(labels.single.text, 'Jun'); + expect(labels.single.column, 0); + }); + + test('only LOGGED sessions reach the grid — not detections or live', () { + // getSessions() merges unconfirmed auto-detected bouts in alongside saved + // ones. If those reached the grid it would disagree with both the feed and + // TrainingSummaryCard while the "Suggested workouts" cards still sat above + // it waiting to be confirmed — the same day would be shaded here and + // absent there. A live session has no final calorie tally yet, so it is + // held back too rather than shaded as a near-zero day. + final kept = loggedForHeatmap([ + {'id': 'a', 'calories': 300, 'status': 'complete'}, + {'id': 'auto_2026-06-08_123', 'source': 'auto', 'status': 'detected'}, + {'id': 'b', 'calories': 400, 'status': 'live'}, + {'id': 'c', 'calories': 500}, + ]); + + expect(kept.map((w) => w['id']), ['a', 'c']); + }); + + // The ramp is the whole feature: if two adjacent buckets read as one colour, + // the grid is decoration. Asserted numerically in BOTH palettes so a future + // token edit can't quietly collapse a step — the same reasoning as + // zone_contrast_test.dart. + group('intensity ramp stays readable', () { + // Below roughly this, two swatches sitting side by side stop being + // separable at a ~20px cell. + const minStep = 1.25; + + for (final entry in { + 'paper': kLightPalette, + 'char': kDarkPalette, + }.entries) { + final mode = entry.key; + final palette = entry.value; + + test('$mode: luminance is monotonic across levels 0..4', () { + final lums = [ + for (var l = 0; l <= 4; l++) _luminance(heatColorIn(palette, l)), + ]; + // Hotter reads DARKER on paper and BRIGHTER on char — one construction, + // inverted by the palette, because ink flips with the mode. + final ordered = palette.isDark + ? List.of(lums) + : List.of(lums.reversed); + for (var i = 1; i < ordered.length; i++) { + expect(ordered[i], greaterThan(ordered[i - 1]), + reason: '$mode ramp is not monotonic: $lums'); + } + }); + + for (var l = 1; l <= 4; l++) { + test('$mode: level ${l - 1} and $l are distinguishable', () { + final ratio = + _contrast(heatColorIn(palette, l), heatColorIn(palette, l - 1)); + expect(ratio, greaterThanOrEqualTo(minStep), + reason: '$mode L${l - 1}->L$l is only ' + '${ratio.toStringAsFixed(2)}:1 apart'); + }); + } + + test('$mode: steps are evenly spaced, not bunched at one end', () { + // A minimum step isn't sufficient on its own: a ramp can clear it and + // still be lopsided, spending most of its range between levels 0 and 1 + // and almost none between 3 and 4. Equal kcal differences should look + // like equal colour differences, so hold the spread between the widest + // and narrowest step. + final steps = [ + for (var l = 1; l <= 4; l++) + _contrast(heatColorIn(palette, l), heatColorIn(palette, l - 1)), + ]; + final spread = + steps.reduce(math.max) / steps.reduce(math.min); + expect(spread, lessThanOrEqualTo(1.55), + reason: '$mode ramp is lopsided — steps ' + '${steps.map((s) => s.toStringAsFixed(2)).toList()}'); + }); + + test('$mode: an empty day is distinct from the card behind it', () { + // Level 0 is a well, not the card — you have to be able to see the + // grid's shape even where nothing was logged. + final ratio = _contrast( + heatColorIn(palette, 0), + palette.isDark ? palette.surfaceAlt : palette.surface, + ); + expect(ratio, greaterThan(1.0), + reason: '$mode empty cell is invisible against the tile'); + }); + } + }); + + group('CalorieHeatmapCard', () { + tearDown(() => AppColors.active = kLightPalette); + + final today = DateTime(2026, 6, 10); // Wednesday + int ts(DateTime d) => d.millisecondsSinceEpoch ~/ 1000; + + List sample() => buildHeatDays([ + { + 'start_ts': ts(DateTime(2026, 6, 8, 7)), + 'calories': 300, + 'duration_min': 30, + }, + { + 'start_ts': ts(DateTime(2026, 6, 9, 7)), + 'calories': 780, + 'duration_min': 52, + }, + ], today: today); + + Widget shell(List days) => MaterialApp( + home: Scaffold( + body: SingleChildScrollView( + child: CalorieHeatmapCard(days: days, today: today), + ), + ), + ); + + // NOT pumpAndSettle: the peak-day ember pulse repeats for as long as the + // card is on screen, by design, so "settle" never arrives. Pump past the + // reveal and the header cross-fade instead. + Future settleAnimated(WidgetTester t) async { + await t.pump(); + await t.pump(const Duration(milliseconds: 900)); + } + + testWidgets('opens on the summary, not on a selected day', (t) async { + await t.pumpWidget(shell(sample())); + await settleAnimated(t); + + expect(find.text('1,080'), findsOneWidget, reason: '13-week total'); + expect(find.textContaining('2 sessions'), findsOneWidget); + expect(find.textContaining('2-day streak'), findsOneWidget); + }); + + testWidgets('tapping a day swaps the header to that day, and back', + (t) async { + await t.pumpWidget(shell(sample())); + await settleAnimated(t); + + await t.tap(find.byKey(const ValueKey('heat-2026-06-09'))); + await settleAnimated(t); + + expect(find.text('780'), findsOneWidget); + expect(find.textContaining('Tue 9 Jun'), findsOneWidget); + expect(find.text('1,080'), findsNothing, + reason: 'the summary yields to the day readout'); + + // Tapping the same cell again releases the selection. + await t.tap(find.byKey(const ValueKey('heat-2026-06-09'))); + await settleAnimated(t); + expect(find.text('1,080'), findsOneWidget); + }); + + testWidgets('a rest day reads as rest, not as a missing readout', + (t) async { + await t.pumpWidget(shell(sample())); + await settleAnimated(t); + + await t.tap(find.byKey(const ValueKey('heat-2026-06-07'))); + await settleAnimated(t); + + expect(find.textContaining('Sun 7 Jun'), findsOneWidget); + expect(find.textContaining('No workout'), findsOneWidget); + }); + + testWidgets('month names are rendered above the grid', (t) async { + await t.pumpWidget(shell(sample())); + await settleAnimated(t); + + // Grid runs Mon 16 Mar .. Sun 14 Jun 2026 for a today of 10 Jun. + for (final m in ['Mar', 'Apr', 'May', 'Jun']) { + expect(find.text(m), findsOneWidget, reason: '$m label missing'); + } + }); + + testWidgets('a month starting in the final column is still labelled', + (t) async { + // Wed 3 Jun 2026: the grid's last column opens on Mon 1 Jun, so June + // starts in the rightmost week. Dropping that label to avoid overflowing + // the card would leave the MOST RECENT weeks — the ones nearest today — + // as the only unnamed stretch of the board. + final today = DateTime(2026, 6, 3); + await t.pumpWidget(MaterialApp( + home: Scaffold( + body: SingleChildScrollView( + child: CalorieHeatmapCard( + days: buildHeatDays(const [], today: today), + today: today, + ), + ), + ), + )); + await settleAnimated(t); + + expect(find.text('Jun'), findsOneWidget); + expect(t.takeException(), isNull, reason: 'and it must not overflow'); + }); + + testWidgets('future days are not rendered at all', (t) async { + await t.pumpWidget(shell(sample())); + await settleAnimated(t); + + // Today exists... + expect(find.byKey(const ValueKey('heat-2026-06-10')), findsOneWidget); + // ...but the rest of the week hasn't happened, so there is no cell to + // mistake for a skipped day. + expect(find.byKey(const ValueKey('heat-2026-06-11')), findsNothing); + expect(find.byKey(const ValueKey('heat-2026-06-14')), findsNothing); + }); + + testWidgets('a selection that scrolls out of the window does not crash', + (t) async { + await t.pumpWidget(shell(sample())); + await settleAnimated(t); + await t.tap(find.byKey(const ValueKey('heat-2026-06-08'))); + await settleAnimated(t); + expect(find.textContaining('Mon 8 Jun'), findsOneWidget); + + // The card is rebuilt with a LATER window — a refresh crossing midnight, + // or simply a later session. The previously selected day is no longer on + // the board, and looking it up must not throw. + final later = DateTime(2026, 12, 9); + await t.pumpWidget(MaterialApp( + home: Scaffold( + body: SingleChildScrollView( + child: CalorieHeatmapCard( + days: buildHeatDays(const [], today: later), + today: later, + ), + ), + ), + )); + await settleAnimated(t); + + expect(t.takeException(), isNull); + // Falls back to the summary rather than showing a phantom day. + expect(find.textContaining('sessions'), findsOneWidget); + }); + + testWidgets('the board fits without overflowing a narrow phone', + (t) async { + // Cell size is derived from the available width but clamped at both + // ends, and a clamped-up minimum can push 13 columns wider than the row + // that holds them. Overflow paints a yellow-and-black banner over the + // card, so pin the narrow end. + t.view.physicalSize = const Size(320 * 3, 700 * 3); + t.view.devicePixelRatio = 3.0; + addTearDown(t.view.resetPhysicalSize); + addTearDown(t.view.resetDevicePixelRatio); + + await t.pumpWidget(shell(sample())); + await settleAnimated(t); + + expect(t.takeException(), isNull); + expect(find.byKey(const ValueKey('heat-2026-06-09')), findsOneWidget); + }); + + testWidgets('reduced motion leaves no animation running', (t) async { + await t.pumpWidget(MaterialApp( + home: MediaQuery( + data: const MediaQueryData(disableAnimations: true), + child: Scaffold( + body: SingleChildScrollView( + child: CalorieHeatmapCard(days: sample(), today: today), + ), + ), + ), + )); + // pumpAndSettle times out if any ticker keeps scheduling frames — the + // peak-day pulse repeats forever, so this is the assertion that it is + // genuinely suppressed rather than merely started at zero opacity. + await t.pumpAndSettle(); + expect(find.text('1,080'), findsOneWidget); + }); + }); +} From 3888f81d65311018ee8d01181f981654ef169b64 Mon Sep 17 00:00:00 2001 From: abdulsaheel Date: Sun, 9 Aug 2026 20:45:30 +0530 Subject: [PATCH 2/5] a confirmed workout is a logged workout MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The board filtered out anything with source 'auto', but that field records where a workout came from, not whether it is still a proposal — it stays 'auto' after you confirm a suggestion. So a workout sitting in the feed with an auto tag, counted by the training summary, painted as a rest day on the grid: the exact disagreement the filter exists to prevent, pointing the other way. Someone whose training is mostly detected-then-confirmed got a mostly empty board, or none at all, since the card stays hidden until a day has calories on it. Status alone is the test — only an unconfirmed bout is ever 'detected'. The old case set source and status together on one row, so it passed either way and never pinned the thing it was named for. The board's fetch also pulled every recent day's bundle. getSessions builds its detected half by decoding each day's payload — hr_curve, hypnogram, HRV, tens of KB a day — and the grid threw all of it away a line later, on every load and every pull-to-refresh. It asks for saved sessions only now. Cells carry a label too. Colour is the entire content of a heatmap, so without one the board was silent to a screen reader. --- lib/data/local_repository.dart | 12 +++- lib/data/local_repository_impl.dart | 14 ++++- lib/ui/workouts/calorie_heatmap.dart | 87 +++++++++++++++++----------- lib/ui/workouts/workouts_screen.dart | 6 ++ test/ai_briefing_test.dart | 7 ++- test/calorie_heatmap_test.dart | 23 ++++++++ test/get_sessions_merge_test.dart | 8 +++ 7 files changed, 119 insertions(+), 38 deletions(-) diff --git a/lib/data/local_repository.dart b/lib/data/local_repository.dart index de857c8b..7fbf5c1f 100644 --- a/lib/data/local_repository.dart +++ b/lib/data/local_repository.dart @@ -54,8 +54,16 @@ abstract class LocalRepository { throw UnimplementedError('re-layer: getSleep'); Future>> getStrain({int? from, int? to}) => throw UnimplementedError('re-layer: getStrain'); - Future>> getSessions({int? from, int? to}) => - throw UnimplementedError('re-layer: getSessions'); + /// Saved sessions in the window, merged with unconfirmed auto-detected bouts. + /// + /// Pass `includeDetected: false` when only saved sessions are wanted: the + /// detected half has to read every recent day bundle to find them, and those + /// rows carry the full hr_curve/hypnogram/HRV payload. + Future>> getSessions({ + int? from, + int? to, + bool includeDetected = true, + }) => throw UnimplementedError('re-layer: getSessions'); Future> getHistory({String range = '30d'}) => throw UnimplementedError('re-layer: getHistory'); diff --git a/lib/data/local_repository_impl.dart b/lib/data/local_repository_impl.dart index c83995c3..543add71 100644 --- a/lib/data/local_repository_impl.dart +++ b/lib/data/local_repository_impl.dart @@ -1237,7 +1237,11 @@ class LocalRepositoryImpl extends LocalRepository { } @override - Future>> getSessions({int? from, int? to}) async { + Future>> getSessions({ + int? from, + int? to, + bool includeDetected = true, + }) async { // Manual/live sessions (the sessions table) MERGED with auto-detected // workouts from the per-day bundle. Manual/saved WINS on overlap: a detected // bout overlapping a manual session is dropped here (and is already dropped @@ -1253,6 +1257,14 @@ class LocalRepositoryImpl extends LocalRepository { final manualRows = await LocalDb.sessionsInRange(fromSec, toSec); final manual = [for (final r in manualRows) _workoutOf(r)]; + // Finding the detected half means reading every recent day bundle, and + // recentDayResults does SELECT r.* — the whole hr_curve/hypnogram/HRV + // payload, tens of KB a day, across the isolate boundary and back through + // jsonDecode. A caller that only wants saved sessions must not pay that. + // Already newest-first — sessionsInRange orders by start_ts DESC, the same + // order the merged path sorts into below. + if (!includeDetected) return manual; + // Saved spans (manual) for overlap-dedup of detected bouts. final savedSpans = >[]; for (final w in manual) { diff --git a/lib/ui/workouts/calorie_heatmap.dart b/lib/ui/workouts/calorie_heatmap.dart index e8381ef6..c20f9b50 100644 --- a/lib/ui/workouts/calorie_heatmap.dart +++ b/lib/ui/workouts/calorie_heatmap.dart @@ -204,14 +204,21 @@ String groupThousands(int n) { /// asking to be confirmed. Live sessions are held back for a different reason — /// their calorie tally isn't final, so they'd shade in as an artificially cold /// day and then jump when the session ends. +/// +/// The test is `status`, NOT `source`. `source: 'auto'` records that a workout +/// ORIGINATED in the detector, and that stays true once the user confirms it: +/// the row `_logDetectedSession` saves carries `source: 'auto'` with +/// `status: 'done'`, and the feed renders it with an `auto` tag. Filtering on +/// source therefore drops real logged workouts, producing the very +/// disagreement this filter exists to prevent, only inverted — the day sits in +/// the feed and in the training summary but reads as a rest day on the grid. +/// Only the synthetic shape built for an UNCONFIRMED bout carries +/// `status: 'detected'`, so status alone is the complete test. List> loggedForHeatmap( List> sessions) => [ for (final w in sessions) - if (w['source'] != 'auto' && - w['status'] != 'detected' && - w['status'] != 'live') - w, + if (w['status'] != 'detected' && w['status'] != 'live') w, ]; /// Build the [weeks]x7 grid ending on the Sunday that closes [today]'s week. @@ -576,8 +583,8 @@ class _HeatGrid extends StatelessWidget { for (var row = 0; row < 7; row++) SizedBox( height: cell + gap, - // Label alternate rows only (M/W/F) — seven stacked labels - // at this cell size is denser than the grid itself. + // Label alternate rows only (M/W/F/S) — seven stacked + // labels at this cell size is denser than the grid itself. child: row.isOdd ? const SizedBox.shrink() : Align( @@ -655,33 +662,47 @@ class _HeatGrid extends StatelessWidget { key: ValueKey(_cellKey(d.date)), behavior: HitTestBehavior.opaque, onTap: () => onTap(d), - child: AnimatedScale( - scale: isSelected ? 1.14 : 1.0, - duration: Motion.springy.d, - curve: Motion.springy.c, - child: Container( - width: size, - height: size, - decoration: BoxDecoration( - color: heatColor(heatLevel(d.kcal, scale)), - borderRadius: BorderRadius.circular(radius), - border: isSelected - ? Border.all(color: AppColors.ink, width: 2) - : isToday - ? Border.all( - color: AppColors.ink.withValues(alpha: 0.9), - width: 1.4) - : null, - boxShadow: glow > 0 - ? [ - BoxShadow( - color: AppColors.coral - .withValues(alpha: 0.10 + 0.28 * glow), - blurRadius: 4 + 10 * glow, - spreadRadius: 1 + 2 * glow, - ), - ] - : null, + child: Semantics( + button: true, + selected: isSelected, + // Colour IS the content here, so a screen reader gets nothing + // from the grid without this. Read the day and its burn rather + // than the intensity level — "level 3 of 4" describes the + // rendering, not the training. + label: d.sessions == 0 + ? '${_readoutDate(d.date)}, no workout' + : '${_readoutDate(d.date)}, ${d.kcal} kcal, ' + '${d.sessions} ' + '${d.sessions == 1 ? 'session' : 'sessions'}, ' + '${d.durationMin} minutes', + child: AnimatedScale( + scale: isSelected ? 1.14 : 1.0, + duration: Motion.springy.d, + curve: Motion.springy.c, + child: Container( + width: size, + height: size, + decoration: BoxDecoration( + color: heatColor(heatLevel(d.kcal, scale)), + borderRadius: BorderRadius.circular(radius), + border: isSelected + ? Border.all(color: AppColors.ink, width: 2) + : isToday + ? Border.all( + color: AppColors.ink.withValues(alpha: 0.9), + width: 1.4) + : null, + boxShadow: glow > 0 + ? [ + BoxShadow( + color: AppColors.coral + .withValues(alpha: 0.10 + 0.28 * glow), + blurRadius: 4 + 10 * glow, + spreadRadius: 1 + 2 * glow, + ), + ] + : null, + ), ), ), ), diff --git a/lib/ui/workouts/workouts_screen.dart b/lib/ui/workouts/workouts_screen.dart index 8e440d6e..a5554af7 100644 --- a/lib/ui/workouts/workouts_screen.dart +++ b/lib/ui/workouts/workouts_screen.dart @@ -198,6 +198,11 @@ class _WorkoutsScreenState extends State { // short of data. getSessions takes an explicit window and skips the // per-session HR enrichment the grid has no use for. Fetched wide; days // outside the board simply match no cell. + // + // includeDetected: false because the grid shades saved sessions only. + // Leaving it on would read every recent day bundle — the whole hr_curve / + // hypnogram / HRV payload — on every load and every pull-to-refresh, just + // to build detections loggedForHeatmap discards a line later. List? heat; try { final now = DateTime.now(); @@ -205,6 +210,7 @@ class _WorkoutsScreenState extends State { final sessions = await api.getSessions( from: from.millisecondsSinceEpoch ~/ 1000, to: now.millisecondsSinceEpoch ~/ 1000, + includeDetected: false, ); heat = buildHeatDays(loggedForHeatmap(sessions), today: now); } catch (_) { diff --git a/test/ai_briefing_test.dart b/test/ai_briefing_test.dart index 9d4bd260..61540d84 100644 --- a/test/ai_briefing_test.dart +++ b/test/ai_briefing_test.dart @@ -31,8 +31,11 @@ class _FakeRepo extends LocalRepository { @override Future> getDaySleep(String date) async => daySleep; @override - Future>> getSessions({int? from, int? to}) async => - sessions; + Future>> getSessions({ + int? from, + int? to, + bool includeDetected = true, + }) async => sessions; } Map _sampleToday() => { diff --git a/test/calorie_heatmap_test.dart b/test/calorie_heatmap_test.dart index 5e171e5f..feb19a53 100644 --- a/test/calorie_heatmap_test.dart +++ b/test/calorie_heatmap_test.dart @@ -262,6 +262,29 @@ void main() { expect(kept.map((w) => w['id']), ['a', 'c']); }); + test('a CONFIRMED auto-detection is a logged workout and reaches the grid', + () { + // The row _logDetectedSession saves when the user taps Confirm on a + // suggestion. `source` stays 'auto' forever — it records where the workout + // came from, not whether it is still a proposal — while `status` moves to + // 'done'. Filtering on source would drop it, which is how a real workout + // ends up in the feed (tagged `auto`) and in TrainingSummaryCard while the + // grid shows that day as rest. Someone whose training is mostly + // detected-then-confirmed would get a near-empty board, and since the card + // is hidden until a day has kcal, no board at all. + final kept = loggedForHeatmap([ + { + 'id': 'auto:1749000000', + 'source': 'auto', + 'status': 'done', + 'calories': 480, + }, + {'id': 'manual-1', 'source': 'manual', 'status': 'done', 'calories': 300}, + ]); + + expect(kept.map((w) => w['id']), ['auto:1749000000', 'manual-1']); + }); + // The ramp is the whole feature: if two adjacent buckets read as one colour, // the grid is decoration. Asserted numerically in BOTH palettes so a future // token edit can't quietly collapse a step — the same reasoning as diff --git a/test/get_sessions_merge_test.dart b/test/get_sessions_merge_test.dart index 498c5479..71618655 100644 --- a/test/get_sessions_merge_test.dart +++ b/test/get_sessions_merge_test.dart @@ -98,6 +98,14 @@ void main() { // Sorted newest-first by start_ts: the later detected bout comes first. expect(sessions.first['start_ts'], base + 2000); + + // includeDetected: false skips the day-bundle scan entirely — saved + // sessions only, still newest-first. Callers with no use for the detected + // half must not pay to read every recent day's full payload. + final savedOnly = await repo.getSessions(includeDetected: false); + expect(savedOnly, hasLength(1)); + expect(savedOnly.single['id'], 'manual1'); + expect(savedOnly.any((s) => s['status'] == 'detected'), isFalse); }); } From 5ffa07f1f8ba9b66d83586dfc0917b49d4d19129 Mon Sep 17 00:00:00 2001 From: abdulsaheel Date: Sun, 9 Aug 2026 21:02:59 +0530 Subject: [PATCH 3/5] stop the whole board repainting to breathe one square MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The peak day's pulse repeats for as long as the card is mounted, and every one of the 91 cells had merged it into its AnimatedBuilder — so the entire grid rebuilt every frame, indefinitely, reallocating an Opacity, Transform, AnimatedScale, Container and BoxDecoration each time, to animate the single cell that actually reads the value. Only the peak subscribes now; the reveal stops notifying once it settles, so the rest go quiet after the intro. The grid also took its column count from a rounded-up week count, so a list that wasn't whole weeks indexed past the end, and the header announced 13 weeks whatever it had been handed. Both come off the list it was given now. Changing the range selector no longer refetches the board either. Its window is fixed and independent of that control, so the read could not have changed a cell. --- lib/ui/workouts/calorie_heatmap.dart | 45 +++++++++++++++++++--------- lib/ui/workouts/workouts_screen.dart | 30 +++++++++++-------- test/calorie_heatmap_test.dart | 25 ++++++++++++++++ 3 files changed, 73 insertions(+), 27 deletions(-) diff --git a/lib/ui/workouts/calorie_heatmap.dart b/lib/ui/workouts/calorie_heatmap.dart index c20f9b50..dc4e6189 100644 --- a/lib/ui/workouts/calorie_heatmap.dart +++ b/lib/ui/workouts/calorie_heatmap.dart @@ -397,6 +397,9 @@ class _CalorieHeatmapCardState extends State final streak = currentStreak(widget.days, today: widget.today); final scale = heatScale(widget.days); final peak = _peak; + // Derived, not hardcoded: `days` is a constructor argument, so a caller + // that builds a different span must not be described as 13 weeks. + final weeks = (widget.days.length / 7).ceil(); // Resolved by lookup rather than firstWhere: the window slides forward as // days pass and on a refresh that crosses midnight the selected date can @@ -423,10 +426,10 @@ class _CalorieHeatmapCardState extends State children: [ Row( children: [ - const Expanded(child: TileHeader('Activity · 13 weeks')), + Expanded(child: TileHeader('Activity · $weeks weeks')), InfoDot( title: 'Activity heatmap', - body: 'Every day of the last 13 weeks, shaded by the ' + body: 'Every day of the last $weeks weeks, shaded by the ' 'calories you burned in logged workouts. Empty squares ' 'are days you did not train.', methodNote: 'Shade is scaled to your own 90th-percentile ' @@ -607,19 +610,24 @@ class _HeatGrid extends StatelessWidget { padding: const EdgeInsets.only(bottom: gap), child: Row( children: [ + // weeks rounds UP, so a caller passing a part-week + // list would index past the end. buildHeatDays + // always emits whole weeks, but the widget takes + // any List. for (var col = 0; col < weeks; col++) - Padding( - padding: EdgeInsets.only( - right: col == weeks - 1 ? 0 : gap), - child: _cell( - days[col * 7 + row], - cell.toDouble(), - radius.toDouble(), - col, - row, - t, + if (col * 7 + row < days.length) + Padding( + padding: EdgeInsets.only( + right: col == weeks - 1 ? 0 : gap), + child: _cell( + days[col * 7 + row], + cell.toDouble(), + radius.toDouble(), + col, + row, + t, + ), ), - ), ], ), ), @@ -647,8 +655,17 @@ class _HeatGrid extends StatelessWidget { // later, so the board lights up as one wave rather than all at once. final delay = (col * 0.045 + row * 0.012).clamp(0.0, 0.6); + // Only the peak cell reads pulse.value, and the pulse repeats for as long + // as the card is mounted. Merging it into all 91 cells would rebuild the + // entire board every frame, forever, to breathe one square — each rebuild + // reallocating the Opacity/Transform/AnimatedScale/Container chain. `reveal` + // stops notifying once it settles, so subscribing the rest to it alone + // leaves them genuinely idle after the intro. + final animation = + isPeak && pulse != null ? Listenable.merge([reveal, pulse]) : reveal; + return AnimatedBuilder( - animation: Listenable.merge([reveal, pulse]), + animation: animation, builder: (context, _) { final p = ((reveal.value - delay) / 0.35).clamp(0.0, 1.0); final eased = Curves.easeOutCubic.transform(p); diff --git a/lib/ui/workouts/workouts_screen.dart b/lib/ui/workouts/workouts_screen.dart index a5554af7..fdc0157c 100644 --- a/lib/ui/workouts/workouts_screen.dart +++ b/lib/ui/workouts/workouts_screen.dart @@ -177,7 +177,7 @@ class _WorkoutsScreenState extends State { _load(); } - Future _load() async { + Future _load({bool refreshHeat = true}) async { final api = context.read().repo; if (api == null) return; setState(() => _loading = true); @@ -204,17 +204,19 @@ class _WorkoutsScreenState extends State { // hypnogram / HRV payload — on every load and every pull-to-refresh, just // to build detections loggedForHeatmap discards a line later. List? heat; - try { - final now = DateTime.now(); - final from = DateTime(now.year, now.month, now.day - 105); - final sessions = await api.getSessions( - from: from.millisecondsSinceEpoch ~/ 1000, - to: now.millisecondsSinceEpoch ~/ 1000, - includeDetected: false, - ); - heat = buildHeatDays(loggedForHeatmap(sessions), today: now); - } catch (_) { - /* the board is an enrichment — the log still renders without it */ + if (refreshHeat || _heat == null) { + try { + final now = DateTime.now(); + final from = DateTime(now.year, now.month, now.day - 105); + final sessions = await api.getSessions( + from: from.millisecondsSinceEpoch ~/ 1000, + to: now.millisecondsSinceEpoch ~/ 1000, + includeDetected: false, + ); + heat = buildHeatDays(loggedForHeatmap(sessions), today: now); + } catch (_) { + /* the board is an enrichment — the log still renders without it */ + } } if (mounted) { @@ -313,7 +315,9 @@ class _WorkoutsScreenState extends State { onChanged: (i) { setState(() => _range = i); Prefs.setInt(Prefs.workoutsRange, i); - _load(); + // The board's window is fixed and independent of this selector, + // so re-reading it here could not change a single cell. + _load(refreshHeat: false); }, ), const SizedBox(height: Sp.x2), diff --git a/test/calorie_heatmap_test.dart b/test/calorie_heatmap_test.dart index feb19a53..251a6005 100644 --- a/test/calorie_heatmap_test.dart +++ b/test/calorie_heatmap_test.dart @@ -505,6 +505,31 @@ void main() { expect(find.textContaining('sessions'), findsOneWidget); }); + testWidgets('a part-week list renders, and the header says its own span', + (t) async { + // `days` is a constructor argument, so the widget has to survive a list + // buildHeatDays didn't produce. The column count rounds UP, so the last + // column indexes past the end of a part-week list, and a header that + // hardcoded 13 would be describing a window the caller never asked for. + final days = buildHeatDays(const [], today: today, weeks: 3) + .take(17) // two whole weeks + 3 days + .toList(); + + await t.pumpWidget(MaterialApp( + home: Scaffold( + body: SingleChildScrollView( + child: CalorieHeatmapCard(days: days, today: today), + ), + ), + )); + await settleAnimated(t); + + expect(t.takeException(), isNull); + // TileHeader uppercases its label. + expect(find.textContaining('3 WEEKS'), findsOneWidget); + expect(find.textContaining('13 WEEKS'), findsNothing); + }); + testWidgets('the board fits without overflowing a narrow phone', (t) async { // Cell size is derived from the available width but clamped at both From fece4191c39904dbcbed98485b5d755c315f29be Mon Sep 17 00:00:00 2001 From: abdulsaheel Date: Sun, 9 Aug 2026 21:20:05 +0530 Subject: [PATCH 4/5] hand the board the day it was built for The grid was built against the clock read inside the load, but the card was handed a fresh one at build time. They agree until the next local midnight, and a screen left open across it got a board describing yesterday under today's clock: the new day still carried its future flag so no cell was drawn for it, the today ring matched nothing, and the streak was counted against a day the board did not contain. The anchor is stored beside the grid now and the two only ever move together. The reduced-motion test built its MediaQueryData from scratch, which resets size to zero and drops text scale, padding and brightness. It reads from the ambient one instead, so it keeps describing a real device. --- lib/ui/workouts/workouts_screen.dart | 22 +++++++++++++++++++--- test/calorie_heatmap_test.dart | 16 +++++++++++----- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/lib/ui/workouts/workouts_screen.dart b/lib/ui/workouts/workouts_screen.dart index fdc0157c..4c987e00 100644 --- a/lib/ui/workouts/workouts_screen.dart +++ b/lib/ui/workouts/workouts_screen.dart @@ -171,6 +171,13 @@ class _WorkoutsScreenState extends State { /// while the feed below it filters. List? _heat; + /// The day `_heat` was built against. The card has to be handed THIS, not a + /// fresh clock read: the two agree only until the next local midnight, and a + /// screen left open across it would flag the new day as still-in-the-future, + /// draw no cell for it, put the "today" ring on nothing, and count the streak + /// against a day the board does not contain. + DateTime? _heatToday; + @override void initState() { super.initState(); @@ -204,6 +211,7 @@ class _WorkoutsScreenState extends State { // hypnogram / HRV payload — on every load and every pull-to-refresh, just // to build detections loggedForHeatmap discards a line later. List? heat; + DateTime? heatToday; if (refreshHeat || _heat == null) { try { final now = DateTime.now(); @@ -214,6 +222,7 @@ class _WorkoutsScreenState extends State { includeDetected: false, ); heat = buildHeatDays(loggedForHeatmap(sessions), today: now); + heatToday = now; } catch (_) { /* the board is an enrichment — the log still renders without it */ } @@ -224,7 +233,12 @@ class _WorkoutsScreenState extends State { _data = d; _suggestions = sug; _records = recs; - _heat = heat ?? _heat; + // Grid and anchor move together or not at all — a board carrying one + // day's future flags under another day's clock is the bug. + if (heat != null) { + _heat = heat; + _heatToday = heatToday; + } _loading = false; }); } @@ -371,10 +385,12 @@ class _WorkoutsScreenState extends State { // Today tab you still see the quarter's rhythm rather than only // an empty state. Hidden entirely until there is something to // shade — an all-empty board says nothing. - if (_heat != null && _heat!.any((d) => d.kcal > 0)) ...[ + if (_heat != null && + _heatToday != null && + _heat!.any((d) => d.kcal > 0)) ...[ CalorieHeatmapCard( days: _heat!, - today: DateTime.now(), + today: _heatToday!, ).dsEnter(), const SizedBox(height: Sp.x4), ], diff --git a/test/calorie_heatmap_test.dart b/test/calorie_heatmap_test.dart index 251a6005..879a9f22 100644 --- a/test/calorie_heatmap_test.dart +++ b/test/calorie_heatmap_test.dart @@ -550,11 +550,17 @@ void main() { testWidgets('reduced motion leaves no animation running', (t) async { await t.pumpWidget(MaterialApp( - home: MediaQuery( - data: const MediaQueryData(disableAnimations: true), - child: Scaffold( - body: SingleChildScrollView( - child: CalorieHeatmapCard(days: sample(), today: today), + home: Builder( + // copyWith, not a bare MediaQueryData: constructing one from scratch + // resets size to zero and drops textScaler, padding and brightness, + // so the test would quietly stop describing a real device the moment + // the card reads any other MediaQuery field. + builder: (context) => MediaQuery( + data: MediaQuery.of(context).copyWith(disableAnimations: true), + child: Scaffold( + body: SingleChildScrollView( + child: CalorieHeatmapCard(days: sample(), today: today), + ), ), ), ), From ce501ea4bb477cbba1885c0ad5d86b2dd320f93b Mon Sep 17 00:00:00 2001 From: abdulsaheel Date: Sun, 9 Aug 2026 21:24:41 +0530 Subject: [PATCH 5/5] always re-read the board, and count one week as one week Skipping the board's read on a range-selector tap traded a correctness property for a query that was already cheap. The window doesn't depend on the selector but the table does, and the tap is one of the few things that re-reads at all: confirming a suggestion from the pushed "did you work out?" screen never reloads the workouts screen, so the next tap refreshed the feed and left the board still calling that day a rest day. The expensive part of the read was the day-bundle decode, and that had already gone. The derived week count also read "1 weeks" for any span under a fortnight, which is the derivation announcing itself in the one place it was added to help. --- lib/ui/workouts/calorie_heatmap.dart | 9 ++++-- lib/ui/workouts/workouts_screen.dart | 42 ++++++++++++++++------------ test/calorie_heatmap_test.dart | 22 +++++++++++++++ 3 files changed, 52 insertions(+), 21 deletions(-) diff --git a/lib/ui/workouts/calorie_heatmap.dart b/lib/ui/workouts/calorie_heatmap.dart index dc4e6189..dddc1874 100644 --- a/lib/ui/workouts/calorie_heatmap.dart +++ b/lib/ui/workouts/calorie_heatmap.dart @@ -398,8 +398,11 @@ class _CalorieHeatmapCardState extends State final scale = heatScale(widget.days); final peak = _peak; // Derived, not hardcoded: `days` is a constructor argument, so a caller - // that builds a different span must not be described as 13 weeks. + // that builds a different span must not be described as 13 weeks. Pluralised + // because the whole point is serving spans other than 13 — "1 weeks" would + // be the derivation announcing itself. final weeks = (widget.days.length / 7).ceil(); + final weekLabel = weeks == 1 ? '1 week' : '$weeks weeks'; // Resolved by lookup rather than firstWhere: the window slides forward as // days pass and on a refresh that crosses midnight the selected date can @@ -426,10 +429,10 @@ class _CalorieHeatmapCardState extends State children: [ Row( children: [ - Expanded(child: TileHeader('Activity · $weeks weeks')), + Expanded(child: TileHeader('Activity · $weekLabel')), InfoDot( title: 'Activity heatmap', - body: 'Every day of the last $weeks weeks, shaded by the ' + body: 'Every day of the last $weekLabel, shaded by the ' 'calories you burned in logged workouts. Empty squares ' 'are days you did not train.', methodNote: 'Shade is scaled to your own 90th-percentile ' diff --git a/lib/ui/workouts/workouts_screen.dart b/lib/ui/workouts/workouts_screen.dart index 4c987e00..81c1c871 100644 --- a/lib/ui/workouts/workouts_screen.dart +++ b/lib/ui/workouts/workouts_screen.dart @@ -184,7 +184,7 @@ class _WorkoutsScreenState extends State { _load(); } - Future _load({bool refreshHeat = true}) async { + Future _load() async { final api = context.read().repo; if (api == null) return; setState(() => _loading = true); @@ -210,22 +210,30 @@ class _WorkoutsScreenState extends State { // Leaving it on would read every recent day bundle — the whole hr_curve / // hypnogram / HRV payload — on every load and every pull-to-refresh, just // to build detections loggedForHeatmap discards a line later. + // + // Read on EVERY load, including a range-selector tap. The window doesn't + // depend on the selector but the table does, and a tap is one of the few + // paths that re-reads at all: a suggestion confirmed from the pushed + // "did you work out?" screen never reloads this one, so skipping the read + // would refresh the feed and leave the board still calling that day a + // rest day — the feed/board disagreement loggedForHeatmap exists to + // prevent, arriving from the caching side instead. What remains is one + // indexed query over sessions; the expensive part was the day-bundle + // decode, and includeDetected: false already removed it. List? heat; DateTime? heatToday; - if (refreshHeat || _heat == null) { - try { - final now = DateTime.now(); - final from = DateTime(now.year, now.month, now.day - 105); - final sessions = await api.getSessions( - from: from.millisecondsSinceEpoch ~/ 1000, - to: now.millisecondsSinceEpoch ~/ 1000, - includeDetected: false, - ); - heat = buildHeatDays(loggedForHeatmap(sessions), today: now); - heatToday = now; - } catch (_) { - /* the board is an enrichment — the log still renders without it */ - } + try { + final now = DateTime.now(); + final from = DateTime(now.year, now.month, now.day - 105); + final sessions = await api.getSessions( + from: from.millisecondsSinceEpoch ~/ 1000, + to: now.millisecondsSinceEpoch ~/ 1000, + includeDetected: false, + ); + heat = buildHeatDays(loggedForHeatmap(sessions), today: now); + heatToday = now; + } catch (_) { + /* the board is an enrichment — the log still renders without it */ } if (mounted) { @@ -329,9 +337,7 @@ class _WorkoutsScreenState extends State { onChanged: (i) { setState(() => _range = i); Prefs.setInt(Prefs.workoutsRange, i); - // The board's window is fixed and independent of this selector, - // so re-reading it here could not change a single cell. - _load(refreshHeat: false); + _load(); }, ), const SizedBox(height: Sp.x2), diff --git a/test/calorie_heatmap_test.dart b/test/calorie_heatmap_test.dart index 879a9f22..6f742800 100644 --- a/test/calorie_heatmap_test.dart +++ b/test/calorie_heatmap_test.dart @@ -530,6 +530,28 @@ void main() { expect(find.textContaining('13 WEEKS'), findsNothing); }); + testWidgets('a single-week board says "1 week", not "1 weeks"', (t) async { + // Three days still round up to one column, and deriving the count is + // pointless if the only spans it serves read as broken English. + await t.pumpWidget(MaterialApp( + home: Scaffold( + body: SingleChildScrollView( + child: CalorieHeatmapCard( + days: buildHeatDays(const [], today: today, weeks: 1) + .take(3) + .toList(), + today: today, + ), + ), + ), + )); + await settleAnimated(t); + + expect(t.takeException(), isNull); + expect(find.textContaining('1 WEEK'), findsOneWidget); + expect(find.textContaining('1 WEEKS'), findsNothing); + }); + testWidgets('the board fits without overflowing a narrow phone', (t) async { // Cell size is derived from the available width but clamped at both