Files
FitnessDroid/doc/activities-plan.md
claude 2f6c55e967
All checks were successful
release / build-release (push) Successful in 4m10s
Etapp 3-feedback: GPS-väntfas, offline-kö för aktiviteter, teknisk logg
1. Start väntar på GPS-fix: klockan startar vid första fixen eller via
   'Starta ändå'-knappen (fasen SEARCHING_GPS → ACTIVE); tid utan fix
   räknas inte längre
2. Offline-sparning: aktiviteter (spårade + manuellt loggade) köas i Room
   (pending_activity, migration v5) och synkas av samma FIFO-kö som passen
   (OpKind.ADD_ACTIVITY); 'väntar på synk'-sektion i aktivitetslistan
3. Teknisk logg (TrackLog): ringbuffert med GPS-fixar (accepterade/förkastade
   + noggrannhet), fasbyten och sparningar — expanderbar på spårskärmen med
   'Dela loggen'-knapp för enkel fältfelsökning

Version 0.8.0

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C2GA94E1f3cmrvdQLQhYdg
2026-08-25 08:55:34 +02:00

110 lines
5.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) *(kod klar; efter fälttest 2026-08-24/25: GPS-väntfas med starta ändå, offline-kö för aktiviteter, teknisk logg med delning, manifest-fix för platsbehörighet på Android 12+)*
- [ ] Etapp 4 — Mål & mätare
- [ ] Etapp 5 — Steg & telefondata
- [ ] Etapp 6 — Statistik & polish
Google Fit-importen byggs efter etapp 6 som separat arbete.