Files
FitnessDroid/doc/plan.md
claude a99c11524b
All checks were successful
release / build-release (push) Successful in 6m30s
doc: plan för openScale BT-vågsintegration (GPL-relicens, alla drivrutiner)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Kf4MAbZ3c3B4Xy5XfuGsCP
2026-07-26 11:24:19 +02:00

90 lines
4.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.

# FitnessDroid — plan
## Mål
En modern Android-app (Android 12+) som pratar med gym-API:t
(`https://gymapi.brasse-pc.eu/graphql`) och på sikt kan allt som webbens
gym-del i brasse-pc.eu-v2 kan: pass, loggning av lyft, statistik, PB,
mallar, grunddata och profil.
## Stack
| Del | Val |
|-----|-----|
| Språk/UI | Kotlin + Jetpack Compose + Material 3 (dynamiska färger) |
| minSdk / target | 31 (Android 12) / 35 |
| Nätverk | OkHttp + kotlinx.serialization, handskrivna GraphQL-queries (samma strängar som webbens `gymTrackerApi.js`) |
| Auth | JWT + refresh-token-rotation + sessions-id, lagras i DataStore, auto-refresh 2 min före utgång |
| Bygge | Gradle 8.9 wrapper, AGP 8.7.3, Kotlin 2.0.21, JDK 17 |
| Signering | `signing/` (gitignorerad) lokalt, Actions-secrets (`KEYSTORE_B64`, `KEYSTORE_PASSWORD`) i CI — samma signatur överallt |
## Leverans
- **VS Code-task `build`** → signerad APK i `build/FitnessDroid.apk`
- **CI (Gitea Actions på Pi5/arm64)** → rullande `latest`-release med
`FitnessDroid.apk` på släppsidan vid varje push till `main`.
arm64-knep: statiskt byggd aapt2 via `android.aapt2FromMavenOverride`.
- versionCode = CI-byggnummer (`GITHUB_RUN_NUMBER`) så uppdateringar alltid räknas uppåt.
## Milstolpar
1. **Grund + login** *(klar 2026-07-23)*
Projektskelett som kompilerar, inloggning mot API:t med sessions-
återställning vid appstart, hemskärm som visar profilen.
2. **Aktivt pass** *(klar 2026-07-24)* — passläge med en övning i taget
(svep), ±steppers och ett-trycks setloggning med förifyllda värden,
vilotimer (helskärm/banner + larm/vibration/visuell/inget — inställbart),
offline-först via Room + synk-kö med statusindikatorer, övningsväljare
med muskelfilter, bottenrad-navigation med start-FAB och minispelare.
API-tillägg: `MuscleGroup.iconKey`, `ExerciseType.defaultRestSeconds`.
*Polering 2026-07-24/25:* rätta/ta bort loggade set, passdetaljvy i
historiken, övningshistorik i passläget (tidigare pass + tyngsta 3 mån),
avsluta-överblick med redigerbar start/varaktighet (date/time-pickers,
hopfällt bakom "Ändra tid"), kcal-summering med "Hur räknas detta?"
(MET × kroppsvikt × timmar, även i historiken) och 🏆-markering av
nya personbästa per rep-antal (PB-cache i Room).
3. **Statistik + robust inloggning** *(klar 2026-07-25, version 0.3.0)*
statistikfliken med periodväljare (vecka/månad/halvår/år/totalt),
KPI-kort med delta mot förra perioden, scrollbar volymtrend,
kroppskarta (fram/bak, volymvärme per muskelgrupp), höjdpunkter och
PB-lista per övning. Tyst återinloggning: uppgifterna sparas
AES-krypterat via Android Keystore och appen loggar in igen automatiskt
när servern avvisat sessionen (aktiveras vid inloggning; toggle i
inställningarna). Utökade inställningar: viktsteg (1,25/2,5/5 kg),
API-url, auto-återinloggning, egna stångvikter.
*Dessutom:* **in-app-uppdatering** (CI publicerar version.json;
hemskärmskort laddar ner, sha256-verifierar och installerar),
**skivkalkylator** (tryck på vikten i aktiva setet; stång 20/0/egna,
skivor i standardfärger), **passlängd** i historiken, och
**kroppsviktspårning**: API-modellen BodyMeasurement (uuid, datum,
vikt + muskel/fett/vatten-% för framtiden), uppdatera/rätta/ta bort
mätningar från profilen med datumväljare, viktgraf i statistiken med
glidande medelvärde och linjär trendlinje. Profilens bodyWeightKg
speglar alltid senaste mätningen.
4. **BT-våg via openScale-drivrutiner** *(planerad)* — hämta vägningar
(vikt + %muskler/fett/vatten) direkt från en Bluetooth-våg genom att
bädda in openScales drivrutiner. Kräver relicens till GPL-3.0. Full plan:
[`doc/openscale-integration.md`](openscale-integration.md).
5. **Passhistorik** — lista, visa, redigera och ta bort tidigare pass.
4. **Logga lyft (snabbloggning) + PB** — enkel lyftlogg och PB-matrisen.
5. **Statistik** — perioder (vecka/månad/halvår/år), KPI-kort, trenddiagram,
muskelfördelning, aktivitets-heatmap.
6. **Mallar** — skapa/redigera mallar, starta pass från mall med
auto-progression, spara pass som mall.
7. **Grunddata + profil** — CRUD för muskelgrupper/muskler/övningar,
kroppsvikt.
## Roadmap / möjliga utbyggnader (ej beslutade)
- Offlineläge: logga pass utan nät, synka när nätet är tillbaka
- Notis med pågående pass + vilotimer (foreground service)
- Wear OS-följeslagare / komplikationer
- Widget med veckans volym/streak
- CSV-import som i webben
- R8/minify för mindre APK (nu ~43 MB p.g.a. icons-extended)
## Öppna frågor
- Ska appen på sikt gå över till Apollo Kotlin med schemagenererade typer?
- Behövs stöd för flera konton/servrar?