Repository navigation
Vital detail screens: readings table below the chart + cross-strap provenance fix - #190
Merged
Merged
Conversation
TheBoroer
force-pushed
the
feat/vital-readings-table
branch
2 times, most recently
from
July 10, 2026 05:11
194cca0 to
2ffed5e
Compare
TheBoroer
marked this pull request as ready for review
July 10, 2026 05:11
TheBoroer
force-pushed
the
feat/vital-readings-table
branch
from
July 10, 2026 05:19
2ffed5e to
e0519bf
Compare
…-table # Conflicts: # project.yml
DX23876
pushed a commit
to DX23876/noop
that referenced
this pull request
Jul 22, 2026
…ovenance fix (ryanbr#190) * Vital detail screens: readings table below the chart * fix: resolve cross-strap -noop siblings to On-device + repair StrandTests TEST_HOST
simoncad7
pushed a commit
to simoncad7/noop
that referenced
this pull request
Aug 17, 2026
…ovenance fix (ryanbr#190) * Vital detail screens: readings table below the chart * fix: resolve cross-strap -noop siblings to On-device + repair StrandTests TEST_HOST
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this PR does
Two things, one per commit:
1. Vital detail screens: readings table below the chart
Every vital detail screen (Steps, HR, SpO2, Skin Temp, Vitality, Calories, …) now shows a scrollable readings table below the chart — one row per day with the formatted value, unit, and the source/device that reading actually came from. Previously the detail screens were chart-only; there was no way to inspect individual readings or see which source contributed a given day.
HealthScreen.kt—VitalDetailModelgainsreadings: List<VitalReading>(day, value, source); each metric key maps its resolved series into rows.steps_estreads throughresolvedSeries(...)with the strap-anchored resolver (strapDeviceId = vm.activeStrapId), so rows carry per-day provenance and respect the active strap after a swap.MetricExplorerView.swift— same table, same per-row source labels, mirrored layout so both platforms stay in lockstep.-nooprow shows "On-device", not the raw device id.2. Cross-strap provenance fix ("On-device" instead of raw device id)
Scores banked under a previous strap id showed the raw device id in the Today provenance badge instead of "On-device".
provenanceDisplayLabelcompared against the current strap's exact"$deviceId-noop", so after a strap swap (e.g. WHOOP 4.0 → 5.0) any-noop-suffixed source from the old strap fell through to the verbatim fallback. Both twins (Kotlin resolver inTodayScreen.ktand the Swift twin) now suffix-match-noopand resolve to "On-device".Screenshot
Resting Heart Rate detail screen on-device — readings table below the chart, one row per day with per-row provenance (mix of "Whoop" and "On-device" labels resolving correctly):
Type of change
How it was tested
Not on the BLE path — UI + resolution only. Both features pinned in twin suites so the platforms can't drift:
VitalReadingsTableTest.kt(table rows, per-row source labels, strap-anchored steps series) +TodayExplainabilityTest.kt(cross-strap sibling cases) —./gradlew testFullDebugUnitTestpassesVitalReadingsTableTests.swift+TodayExplainabilityTests.swift— StrandTests run under the upstreamTEST_HOSTfix (Fix sleep-merge richness precedence + sourceCandidates canonical-import order (iOS twin of #240) #241); new suites passresolvedSeriessignature)::app:testFullDebugUnitTest --tests '*VitalReadingsTableTest'— BUILD SUCCESSFULNote:
testScoreState_carryWithinCap_isFreshLastNightandtestScoreState_staleCarry_relabelsLatestSleepfail, but this is pre-existing latent breakage (LocalizedStringKey formatting) unmasked once StrandTests can run at all (theTEST_HOSTfix, now upstream via #241) — unrelated to this diff. Follow-up PR incoming.Checklist
swift testinPackages/<name>)android/(./gradlew testFullDebugUnitTest)StrandDesigntokens — no hardcoded colors, fonts, or spacingdocs/CONTRIBUTING.mdStrand.xcodeproj/) or any secrets/keystoresRelated issues