All checks were successful
release / build-release (push) Successful in 6m30s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Kf4MAbZ3c3B4Xy5XfuGsCP
90 lines
4.7 KiB
Markdown
90 lines
4.7 KiB
Markdown
# 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?
|