Bygget ska bara gå på brasse-linux01 (label linux-amd64). Om jobbet ändå
hamnar på en arm64-runner avbryts det direkt, innan gradle startar, så att
Pi5:n inte OOM:ar och tar ner alla tjänster.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AFvSx1pF9pymyEuK7MFkEG
- ui/common/LiftStatusSheet.kt: ModalBottomSheet med vikt, est. 1RM, datum,
pass, anteckning, SegmentedButtons (Träning/Tävling/Räknas ej), kommentar,
Spara och topplista "näst i tur" för samma övning × reps (alla statusar, så
bortplockade lyft kan återställas). Lyft- och set-läge.
- Statistik → Personbästa: chips Alla giltiga · Tävling · Träning, ett
AssistChip per rekord (🎖️ på tävling) som öppnar arket.
- Passhistorik: tryck på ett set öppnar arket i set-läge; statusmärke visas.
- GymRepository: personalBestsDetailed(mode), pbCandidates, liftDetail,
setLiftStatus, setSessionSetStatus; PB-cachen uppdateras efter ändring.
HistorySet/SessionDetailExercise bär id, notes, status, exerciseTypeId.
Kräver gym-api med migration 20260906090000_AddLiftStatus.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AFvSx1pF9pymyEuK7MFkEG
Baserat på analys av verklig GPS-data (25 av 180 segment var ut-och-tillbaka-
spikar = 527 av 1090 m fejkdistans; filtret simulerat på datan: 9,1 → 5,4 km/h
= realistisk gångfart):
- 1 s-sampling + lag-buffrat spikfilter: en punkt committas först när nästa
setts; triangel-kollapser (ut ≥4 m och direkt tillbaka) slängs
- Douglas-Peucker-nedbantning (4 m) före sparning — 182 → 16 punkter i testet
- Start i READY (pausad): play → inställbar nedräkning (0–15 s, standard 3)
→ aktiv; paus/fortsätt med bruten positionskedja så pausförflyttning
inte räknas; tid ackumuleras bara i aktiv fas
- Stegräkning via TYPE_STEP_COUNTER under aktiv tid (ACTIVITY_RECOGNITION-
behörighet; steg sparas på aktiviteten och räknas i dagsmätaren/målen
när Health Connect saknas)
- Historikkarta: 🗺-knapp på spårade aktiviteter → OSM-karta med rutten
- Version 0.12.0
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C2GA94E1f3cmrvdQLQhYdg
- 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
- StepsSync: läser dagens + gårdagens stegsumma (StepsRecord.COUNT_TOTAL)
och upsertar till gym-API:t; synkas automatiskt (max var 10:e min) när
hemskärmen visas
- Inställningar → Stegsynk: status, aktivera-flöde (HC-permission),
Play-länk om Health Connect saknas, manuell synk
- Kcal-mätarens telefonrad visar nu riktiga steg + kcal (serverns
beräkning med dubbelräkningsskydd); stegmål får riktig data
- connect-client 1.1.0-alpha07 (nyare kräver AGP 8.9/compileSdk 36 —
toolchain-bump tas separat); HC-manifest (READ_STEPS, rationale-intents)
- Version 0.10.0
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C2GA94E1f3cmrvdQLQhYdg
- Målkort på Hem: alla mål med progress-bars (aktuellt/mål), tryck →
målskärmen med sätt/uppdatera/ta bort (metrik × period × värde)
- Metriker: aktiva kalorier, gympass, aktiviteter, distans km, steg
(stegdata kommer i etapp 5); perioder: dag/vecka/månad
- GymApi: goalsWithProgress (lokala periodstarter som instants) + setGoal
- Version 0.9.0
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C2GA94E1f3cmrvdQLQhYdg
GPS-drift vid stillastående gav fejkspår/-distans/-höjdmeter (och 2 km/h
snittfart från en soffa). Nu mäter accelerometern vibrationsmönstret
(glidande 4 s-fönster av |accel|−g): under tröskeln = stilla → kartpositionen
uppdateras men spårpunkter, distans och höjdmeter fryses. GPS-rutan visar
'stilla'. Övergångar loggas i tekniska loggen med uppmätt nivå.
Inställningar → GPS-spårning: av/på-switch + känslighet (0,35 m/s² standard,
justerbar 0,10–1,50). Version 0.8.4.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C2GA94E1f3cmrvdQLQhYdg
Användarens idé i sensorriktig variant: GPS:ens egen Doppler-fartmätning
(stabilare än positionerna) används som referens —
- Fartgrind: positionshopp som kräver > faktor × Doppler-fart förkastas
(t.ex. 100 m-hopp vid gångfart). Efter 4 förkastade i rad sätts ny
baslinje (tunnel/underfart) utan att distans räknas.
- Stillastående-filter: vandring < max(2 m, halva noggrannheten) räknas
varken som distans eller spårpunkt — ingen fejkdistans när man står still.
- Allt loggas i tekniska loggen (hopp, tillåten fart, förkastanden).
Justerbart i Inställningar → GPS-spårning: noggrannhetsgräns (35 m),
fartfaktor (2,0×), fartgolv (12 km/h). Version 0.8.3.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C2GA94E1f3cmrvdQLQhYdg
- onLocationChanged skrev tillbaka ett gammalt state-snapshot och nollade
SEARCHING→ACTIVE-övergången — klockan stod kvar på 00:00 trots fix
(syntes som dubbla 'aktiverad'-rader i loggen). Nu utgår slutskrivningen
från aktuellt state.
- Teknisk spårningslogg är nu en switch under Inställningar → Felsökning,
av som standard. Version 0.8.2.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C2GA94E1f3cmrvdQLQhYdg
Fälttest visade noll callbacks från råa GPS_PROVIDER på wheatek WP19 —
telefonen levererar via fused/network. Nu:
- Lyssning på gps + fused + network (FUSED_PROVIDER finns fr.o.m. API 31);
loggen visar vilka providers som finns/är på och varje fix per provider
- Kartan centreras direkt på senast kända position (lastKnownLocation) och
visar en positionsmarkör — ingen blå 0°,0°-ocean längre
- Spårpunkter filtreras på noggrannhet (≤35 m) istället för provider;
positionen på kartan uppdateras oavsett kvalitet
Version 0.8.1
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C2GA94E1f3cmrvdQLQhYdg
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
blessed-kotlin deklarerar ACCESS_FINE/COARSE_LOCATION med maxSdkVersion=30
och manifest-mergern ärvde in begränsningen — behörigheten fanns då inte
alls på Android 12+: ingen dialog och inget alternativ i appinställningarna.
tools:remove="android:maxSdkVersion" på våra deklarationer löser det.
Version 0.7.2.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C2GA94E1f3cmrvdQLQhYdg
Gitea har ingen runner-prioritet — med delade labels tog Pi5:n jobben på
slump och OOM:ade. Webb/gym-api-byggena måste samtidigt stanna på Pi5
(arm64-images + localhost-registry), så PC-runnern har nu en exklusiv
linux-amd64-label som bara FitnessDroid använder. Är datorn av köas bygget.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C2GA94E1f3cmrvdQLQhYdg
- aapt2-hantering villkorad på uname -m (arm64 = statisk binär, x86_64 =
Googles ur build-tools), AAPT2_BIN via GITHUB_ENV
- gradle-strypningen (workers=2 + nice) bara på arm64 — Pi5:n orkar inte
längre APK-bygget med alla tjänster igång (två OOM-krascher 2026-08-23/24)
- Release-uppladdningen provar gitea-d (Pi:ns dockernät) och faller tillbaka
på publika API-URL:en så steget funkar från båda noderna
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C2GA94E1f3cmrvdQLQhYdg
- 'Öppna appinställningarna'-knapp när plats- eller BT-behörighet saknas
(spårning, vågparning, vägning) — systemets platslista visar bara appar
som frågat, så det här är snabbaste vägen att slå på/av manuellt
- 'Försök igen'-knapp som ställer behörighetsfrågan på nytt
- POST_NOTIFICATIONS begärs bara på Android 13+ (fanns inte på 12)
- Typladdningen i spårskärmen kan inte längre hänga i evig spinner —
felmeddelande + försök igen vid nätfel. Version 0.7.1.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C2GA94E1f3cmrvdQLQhYdg
- TrackingService: foreground-service (location) med GPS-rutt, distans
(brusfiltrerad), höjdmeter (glidande medel + tröskel), tid och live-kcal
(ActivityKcal — Kotlin-port av serverns beräkning med tempokurvor)
- Spårningsskärm: osmdroid/OSM-livekarta med rutt-polyline för
distansaktiviteter; stor timer för tidsbaserade (rörelsespårning av,
RPE-slider i sammanfattningen); statistikrad tid/distans/fart/höjd/kcal/GPS
- Sammanfattning vid stopp: spara som source=tracked med encoded polyline,
aktivitetsgissning på tempo+höjd
- Starta aktivitet-knapp (GPS/timer per typ) + pågår-kort på hemskärmen
- osmdroid 6.1.20; permissions för plats/foreground-service/notiser; v0.7.0
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C2GA94E1f3cmrvdQLQhYdg
ViewModellen överlever i navigationsstacken, så nyloggade aktiviteter/pass
syntes inte förrän appen startades om. Nu hämtas dailySummary om varje gång
hemskärmen kommer tillbaka i fokus. Version 0.6.1.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C2GA94E1f3cmrvdQLQhYdg
- GymApi: activityTypes/activities/add/update/delete + dailySummary
- Aktivitetsskärm (Hem → Aktiviteter ❤️): logga med typväljare grupperad per
kategori, datum/tid-pickers, varaktighet, distans+höjdmeter för
distansbaserade, RPE-slider (talk test) för tidsbaserade; historik med
tempo och kcal; rätta/ta bort
- Kcal-mätaren använder serverns dailySummary (gym + aktiviteter + BMR) med
fallback till lokal beräkning mot äldre server
- Version 0.6.0
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C2GA94E1f3cmrvdQLQhYdg
- Profile/myProfile med heightCm/birthYear/sex (fallback mot äldre server),
updateProfile-mutation i GymApi
- Kroppsdata sparas lokalt och synkas: serverns värden vinner, lokala pushas
upp om servern är tom (migrerar vågens lokala data)
- Mifflin–St Jeor-BMR (data/Bmr.kt)
- Hemskärm: Dagens kalorier-kort — aktivt loggat (dagens pass), telefonen
(platshållare för etapp 5) och passivt (BMR-andel av dygnet, tickar per
minut). Uppmaning om kroppsdata saknas.
- Version 0.5.0
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C2GA94E1f3cmrvdQLQhYdg
Första testets uteblivna sammansättning berodde på att kroppsdatan inte var
ifylld — varningen var för diskret. Nu röd/tydlig med hänvisning till
Profil → Kroppsdata. Doc-noten rättad så orsaken inte påstås vara ramtiming
(merge-logiken finns kvar som robusthet).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C2GA94E1f3cmrvdQLQhYdg
Exingtech Y1/VScale skickar vikten först och kroppssammansättningen i en
senare ram — tidigare låste skärmen resultatet och kopplade ner vid första
publicerade mätningen, så bara vikten registrerades. Nu mergas ramarna
(ScaleMeasurement.mergeWith) och anslutningen hålls öppen tills en ram med
sammansättning kommit, max 20 s. UI visar 'väntar på muskler/fett/vatten'
under tiden och en förklaring om sammansättningen uteblir (kroppsdata saknas
/ vägde med strumpor).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C2GA94E1f3cmrvdQLQhYdg
Ny sammansättningskort i statistiken: senaste muskel/fett/vatten i % med
omräkning till faktisk vikt (vikt × % / 100), plus flerlinjes-graf över
tid som växlar mellan procent och kg. Version 0.3.2.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Kf4MAbZ3c3B4Xy5XfuGsCP
- Vikt-dialogen har datumknapp (kalender) för både ny mätning och rättning —
mätningar kan flyttas till rätt dag (skickas som 12:00 UTC så datumet
inte glider över tidszoner)
- Statistikfliken hämtar om mätningarna varje gång den öppnas
- Grafen sprider mätningar inom samma dygn på index istället för att
kollapsa till en punkt
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Kf4MAbZ3c3B4Xy5XfuGsCP
- Hälsningen använder profilens displayName (cachas lokalt)
- Skivkalkylatorn: obegränsat antal egna stänger med exakt vikt (13,7 kg
funkar) — läggs till/tas bort i inställningarna, visas som chips
- Profil: uppdatera kroppsvikten direkt i appen (decimalinmatning);
vikthistorik med uuid-baserad rättning och borttagning per mätning
(addBodyMeasurement med fallback till updateBodyWeight mot äldre API)
- Statistik: kroppsviktsgraf med råpunkter, glidande medelvärde (mjuk
linje) och streckad linjär trendlinje
- API:t har redan fälten muskel/fett/vatten-% för framtida kroppsanalys
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Kf4MAbZ3c3B4Xy5XfuGsCP
- Ark med skivorna per sida i standardfärger (25 röd, 20 blå, 15 gul,
10 grön, 5 vit, 2,5 svart, 1,25 grå), störst innerst mot låskragen
- Stångval: 20 kg / utan stång / egen vikt (sätts i inställningarna,
standard 15 kg)
- Textsammanfattning ('Per sida: 20 + 10 + 2,5 kg') och tydlig hint om
vikten inte går att lägga exakt med standardskivor
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Kf4MAbZ3c3B4Xy5XfuGsCP
- Trendstaplarna i en horisontellt scrollbar rad (38dp per stapel) med
volymsiffra ovanför och hel etikett under — startar på senaste perioden.
Fixar etikettröran på månad/halvår
- Ny period 'Totalt' (period=all, stöds redan av API:t; delta saknas per design)
- Tyst återinloggning provas nu även när tokens saknas helt och när JWT:n
hunnit gå ut vid nätfel under appstart
- Inställningstext: förtydligar att auto-återinloggning aktiveras vid
nästa inloggning (uppgifter sparas bara vid login)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Kf4MAbZ3c3B4Xy5XfuGsCP
- Statistikfliken: periodväljare (vecka/månad/halvår/år), KPI-kort med
delta mot förra perioden, volymtrend, kroppskarta fram/bak med värme
per muskelgrupp (Canvas), höjdpunkter och PB per övning/rep-antal
- Tyst återinloggning: uppgifter sparas AES/GCM-krypterat via Android
Keystore; när refresh avvisas provas nytt login innan utloggning —
'utloggad utan att appen märker det' försvinner. Manuell utloggning
rensar uppgifterna; toggle i inställningarna (på som standard)
- Inställningar: viktsteg för steppers (1,25/2,5/5 kg), API-url,
auto-återinloggning
- Version 0.3.0
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Kf4MAbZ3c3B4Xy5XfuGsCP
Varje övning listas med sina set (vikt×reps m.m.) och set som slår
cachade personbästat för samma rep-antal märks med trofé — även mot
tidigare set i samma pass. Personbästa cachas från API:t vid refresh
(cached_pb, Room v4).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Kf4MAbZ3c3B4Xy5XfuGsCP