Files
FitnessDroid/doc/activities-plan.md
claude 1d28388150
All checks were successful
release / build-release (push) Successful in 4m17s
Etapp 6: konditionssektion ❤️ i statistiken + README
- Statistikfliken: Kondition & aktiviteter-kort för vald period — KPI
  (antal/distans/tid/kcal), km per vecka-staplar och per typ-lista
- README: aktiviteter/kcal-mätare/mål-avsnitt
- Version 0.11.0 — hela aktivitetsplanen (etapp 1–6) därmed kodkomplett

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C2GA94E1f3cmrvdQLQhYdg
2026-08-26 12:16:20 +02:00

110 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Aktiviteter, kcal-mätare & mål — plan
*Godkänd 2026-08-23. Samma plan finns i brasse-pc.eu-v2:
`docs/gym-activities-plan.md` — uppdatera båda vid ändringar.*
Cardio/fristående aktiviteter (promenad, jogg, vandring, fäktning/HEMA m.m.)
som eget koncept vid sidan av gympass, en daglig kcal-mätare på hemskärmen,
mål (dag/vecka/månad) och GPS-livespårning. Kondition markeras med ❤️.
## Grundkoncept
- **Pass** (finns): gympass med övningar/set.
- **Aktivitet** (nytt): något man gör över tid. Har tid, ev. distans/höjd/
rutt, kcal, ansträngning (RPE) och källa (manuellt/spårat/telefon/import).
### Aktivitetsbibliotek
~60 kurerade aktiviteter från **Compendium of Physical Activities**
(publika MET-standarden), seedade i gym-API:t:
`key, namnSv, namnEn, met, kategori, isDistanceBased, iconKey, googleFitType`.
Google Fit-typmappningen gör framtida import rak. Stadspromenad, jogg,
skogsvandring och HEMA/fäktning får tempo-/RPE-justerade MET-kurvor.
### Kcal-modellen
Kräver längd/födelseår/kön i API:t (gamla "milstolpe 5" ur
`openscale-integration.md` bakas in i etapp 1).
- **Passivt:** BMR (MifflinSt Jeor: `10·vikt + 6.25·längd 5·ålder + k`,
k = +5 man / 161 kvinna), fylls på linjärt över dygnet.
- **Aktivt loggat:** gympass (befintlig MET-modell) + aktiviteter
(MET × vikt × timmar; distansaktiviteter justeras efter verkligt tempo och
höjdmeter, icke-distans efter RPE-slidern). Netto-kcal (MET1) används så
BMR inte dubbelräknas.
- **Telefon-auto:** steg + externa pass via **Health Connect**, med
dubbelräkningsskydd (steg under egen loggad aktivitet räknas inte).
- **RPE-slider:** "ingen ansträngning" → "kan inte prata mer än ett par ord"
(talk test) → intensitetsfaktor på aktivitetens MET.
- **Aktivitetsgissning:** tempo + höjdprofil ⇒ promenad (<~6,5 km/h)/jogg/
vandring (lågt tempo + höjdmeter); stillastående + timer ⇒ fäktning/HEMA.
### Mätaren på hemskärmen
Dagens kcal överst på Hem, tredelad: **aktivt loggat / telefon / passivt**.
Mål visas som progress-bars/mätare under.
## Datamodell (gym-API, EF-migrationer körs vid deploy)
- `User` + `HeightCm` (double?), `BirthYear` (int?), `Sex` (string? "male"/"female")
- `ActivityType` — seedad tabell (se ovan), utökningsbar
- `Activity` — Guid id, userId, activityTypeId, startedAt, durationSeconds,
distanceMeters?, elevationGainMeters?, estimatedKcal, rpe? (010),
source (`manual`/`tracked`/`phone`/`imported`), routePolyline?
(Google encoded), externalId? (dedup vid import), notes?
- `DailySteps` — userId, date, steps (upsert från appen)
- `Goal` — metric (`KCAL`/`GYM_SESSIONS`/`STEPS`/`ACTIVITIES`/`DISTANCE_KM`)
× period (`DAY`/`WEEK`/`MONTH`), targetValue; max ett mål per metrik+period
- GraphQL: `activityTypes`, `activities(from,to)`, `addActivity`/`update`/
`delete`, `upsertDailySteps`, `goals` + `setGoal`/`deleteGoal`,
`myProfile`/`updateProfile` (+längd/år/kön), `dailySummary(date)`
(kcal-tredelningen serverberäknad så app+webb delar logik)
## Tagna designbeslut (2026-08-23)
| Fråga | Beslut |
|---|---|
| Karta i appen | **osmdroid + OpenStreetMap** (inga nycklar, GPL-vänligt) |
| Steg/telefondata | **Health Connect** (även vägen för Google Fit-import) |
| Ruttlagring | **Encoded polyline + sammanfattning** på servern |
| Aktivitetsbibliotek | **~60 kurerade** ur MET-kompendiet |
## Etapper
Leveransordning per etapp: **backend → CI grönt → webb → CI grönt → app →
användartest**. Endast ETT Pi5-bygge åt gången — polla CI och vänta hellre
för länge. (Path-filter: gym-api triggas av `backend-gym-traker/**`,
frontend av `src/**` m.fl., FitnessDroid av varje push till main.)
1. **Profil & kalorigrund** — API: HeightCm/BirthYear/Sex + `updateProfile`.
Webb: profilfält. App: kroppsdata synkas mot servern (lokal cache kvar),
BMR, kcal-mätare v1 på hemskärmen (passivt + gympass).
2. **Aktiviteter: bibliotek + manuell logg** — API: ActivityType (seed) +
Activity CRUD + `dailySummary`. Webb: aktivitetsflik ❤️ (logga/lista/
rätta). App: aktivitetsflik med bibliotek, manuell loggning
(tid/distans/RPE), kcal in i mätaren.
3. **Live-spårning (GPS)** — App: starta aktivitet, foreground-service,
osmdroid-livekarta, live kcal/distans/tempo/höjdmeter; icke-distansläge
(timer + RPE efteråt); aktivitetsgissning; polyline till servern.
Webb: Leaflet-karta i aktivitetsdetalj.
4. **Mål & mätare** — API: Goal CRUD. App: målkort med progress på Hem
(dag/vecka/månad × kcal/pass/steg/aktiviteter/km). Webb: målinställningar
+ progress.
5. **Steg & telefondata** — API: DailySteps. App: Health Connect-permissions,
daglig stegsynk, auto-aktiviteter från HC ("telefon"-källa), mätarens
tredelning komplett. Webb: stegvisning.
6. **Statistik & polish** — ❤️-sektion i statistiken (app+webb):
distans/tempo-trender per typ, vecko-km; dokumentation; Google
Fit-importens grund (source/externalId/typmappning/HC) verifierad klar.
## Status
- [x] Etapp 1 — Profil & kalorigrund *(kod klar 2026-08-23: backend a1cd4d3, webb 560894c, app — väntar på användartest + omdeploy av gym-api/frontend-containrarna)*
- [x] Etapp 2 — Aktiviteter: bibliotek + manuell logg *(kod klar 2026-08-23: backend 9a81cf6, webb — aktivitetsflik, app 0.6.0; väntar på användartest)*
- [x] Etapp 3 — Live-spårning (GPS) *(klar & fälttestad 2026-08-26: GPS-väntfas, providerlyssning gps/fused/network, fartgrind (Doppler), rörelsevakt (accelerometer), offline-kö, teknisk logg — GPS-filter justerbara i inställningarna)*
- [x] Etapp 4 — Mål & mätare *(kod klar 2026-08-26: Goal-modell + goalsWithProgress i API:t, målsektion i webbens aktivitetsflik, målkort med progress-bars på appens hemskärm + målskärm; väntar på användartest)*
- [x] Etapp 5 — Steg & telefondata *(kod klar 2026-08-26: DailySteps + upsert i API:t med telefon-kcal (0.00038 kcal/steg/kg, dubbelräkningsskydd mot gång/löp/vandringsaktiviteter), Health Connect-läsning i appen (connect-client 1.1.0-alpha07 — nyare kräver AGP 8.9/SDK 36), aktivering under Inställningar → Stegsynk; webben behövde ingen ändring. Väntar på användartest)*
- [x] Etapp 6 — Statistik & polish *(kod klar 2026-08-26: konditionssektion ❤️ i både appens och webbens statistik (KPI, km/vecka, per typ), README uppdaterad. Google Fit-importens grund verifierad: source=imported, externalId-dedup, googleFitType-mappning i biblioteket och Health Connect-läsning på plats)*
Google Fit-importen byggs som separat arbete — all grund finns: source=imported, externalId-dedup i addActivity, googleFitType-mappning per aktivitetstyp och Health Connect-integrationen i appen.