- 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
113 lines
4.9 KiB
Markdown
113 lines
4.9 KiB
Markdown
# FitnessDroid
|
||
|
||
Android-klient för gym-API:t på `https://gymapi.brasse-pc.eu/graphql` — samma
|
||
backend som gym-delen i [brasse-pc.eu-v2](https://gitea.brasse-pc.eu/brasse/brasse-pc.eu-v2).
|
||
|
||
- **Kräver Android 12 eller nyare** (minSdk 31)
|
||
- Kotlin + Jetpack Compose + Material 3 (Material You-dynamiska färger)
|
||
- GraphQL över OkHttp, tokenlagring i DataStore
|
||
|
||
## Installera appen på telefonen
|
||
|
||
Ladda ner `FitnessDroid.apk` från [släppsidan](https://gitea.brasse-pc.eu/brasse/FitnessDroid/releases)
|
||
(`latest` byggs om vid varje push till `main`), öppna filen på telefonen och
|
||
tillåt installation från okänd källa. Uppdateringar installeras ovanpå — samma
|
||
signeringsnyckel används av CI och lokala byggen.
|
||
|
||
## Bygga själv
|
||
|
||
### Förutsättningar (Arch/Garuda)
|
||
|
||
```bash
|
||
sudo pacman -S jdk17-openjdk android-tools
|
||
```
|
||
|
||
Android SDK behövs också (platform 35 laddas ner automatiskt av bygget om
|
||
licensen är accepterad). Peka ut din SDK i `local.properties` i repo-roten:
|
||
|
||
```properties
|
||
sdk.dir=/home/<du>/Android/Sdk
|
||
```
|
||
|
||
### Bygg
|
||
|
||
```bash
|
||
git clone https://gitea.brasse-pc.eu/brasse/FitnessDroid.git && cd FitnessDroid
|
||
./gradlew :app:assembleRelease # signerad release-APK
|
||
# APK: app/build/outputs/apk/release/app-release.apk
|
||
```
|
||
|
||
I VS Code: kör build-tasken (`Ctrl+Skift+B`) — den lägger APK:n i
|
||
`build/FitnessDroid.apk`. Tasken `installera på telefon (adb)` installerar den
|
||
direkt på en ansluten telefon med USB-felsökning på.
|
||
|
||
### Testa mot API:t
|
||
|
||
Logga in med ditt vanliga gym-konto (LDAP). API-url:en går att ändra under
|
||
"Avancerat" på inloggningsskärmen (standard: `https://gymapi.brasse-pc.eu/graphql`).
|
||
|
||
## Rekordstatus: träning / tävling / räknas ej
|
||
|
||
Under **Statistik → Personbästa** finns växeln *Alla giltiga · Tävling · Träning*. Tryck på
|
||
ett rekord så öppnas ett ark med vikt, est. 1RM, datum, pass och anteckning, där lyftet kan
|
||
märkas som **Träning**, **Tävling** eller **Räknas ej** (fusk, felregistrerat, ej godkänt)
|
||
med en kommentar. Under arket visas topplistan för samma övning × reps ("näst i tur"),
|
||
så ett bortplockat lyft kan väljas och återställas. Samma ark öppnas när man trycker på
|
||
ett set i passhistoriken. "Räknas ej" tas ur rekord, 1RM och PB-höjdpunkter på servern
|
||
(kod: `ui/common/LiftStatusSheet.kt`, API: `setLiftStatus`/`setSessionSetStatus`).
|
||
|
||
## Signeringsnyckeln
|
||
|
||
Nyckeln är **inte** incheckad (repot är publikt). Lokalt ligger den i
|
||
`signing/fitnessdroid.jks` + `signing/keystore.properties` (gitignorerade);
|
||
CI får samma nyckel via Actions-secrets `KEYSTORE_B64` och
|
||
`KEYSTORE_PASSWORD`. Finns ingen nyckel signeras release-bygget med
|
||
debug-nyckeln så att en färsk klon ändå kan bygga — men den APK:n kan inte
|
||
uppdatera en installation från släppsidan (annan signatur).
|
||
|
||
Skapa en ny nyckel (om `signing/` saknas):
|
||
|
||
```bash
|
||
keytool -genkeypair -keystore signing/fitnessdroid.jks -alias fitnessdroid \
|
||
-keyalg RSA -keysize 2048 -validity 10950 -dname "CN=FitnessDroid, O=brasse-pc.eu"
|
||
# och skriv motsvarande signing/keystore.properties (storeFile/storePassword/keyAlias/keyPassword)
|
||
```
|
||
|
||
## CI
|
||
|
||
`.gitea/workflows/release.yaml` bygger en signerad APK vid varje push till
|
||
`main` och lägger den på den rullande `latest`-releasen. Bygget körs på
|
||
runnern `brasse-linux01-runner` (x86_64, label `linux-amd64`) — Pi5:n orkar
|
||
inte APK-bygget. Workflowen är ändå arkitekturvillkorad: på arm64 används en
|
||
statiskt byggd aapt2 via `android.aapt2FromMavenOverride`.
|
||
|
||
## Aktiviteter, kcal-mätare & mål
|
||
|
||
Utöver gympass loggar appen **aktiviteter** (promenad, löpning, vandring,
|
||
fäktning/HEMA m.fl. — ~64 typer ur MET-kompendiet) med GPS-livespårning
|
||
(osmdroid/OSM-karta, fartgrind mot GPS-hopp, accelerometer-rörelsevakt),
|
||
RPE-slider för tidsbaserade aktiviteter och offline-kö. Hemskärmen visar
|
||
**dagens kalorier** (aktivt loggat / telefonens steg via Health Connect /
|
||
passiv BMR) och **mål** med progress (kcal, pass, steg, aktiviteter, km —
|
||
per dag/vecka/månad). Statistiken har en konditionssektion ❤️.
|
||
Plan & detaljer: [`doc/activities-plan.md`](doc/activities-plan.md).
|
||
|
||
## Bluetooth-våg
|
||
|
||
Appen kan hämta vägningar (vikt + muskel/fett/vatten-%) direkt från en
|
||
BLE-personvåg med [openScale](https://github.com/oliexdev/openScale)s
|
||
drivrutiner (vendrade under `app/src/main/java/com/health/openscale/`).
|
||
Koppla vågen under *Inställningar → Bluetooth-våg* och väg dig från profilen.
|
||
Först ut: Biltema 84-1002 (PT-727), som är en Exingtech Y1 ("VScale").
|
||
Detaljer: [`doc/openscale-integration.md`](doc/openscale-integration.md).
|
||
|
||
## Licens
|
||
|
||
GPL-3.0 (se [`LICENSE`](LICENSE)). Relicensierad från och med BT-vågstödet —
|
||
openScales drivrutiner är GPL-3.0, vilket kräver att hela appen är det.
|
||
BLE-biblioteket [Blessed-Kotlin](https://github.com/weliem/blessed-kotlin)
|
||
är MIT.
|
||
|
||
Mer om arkitektur och planer: [`doc/plan.md`](doc/plan.md) och
|
||
[wikin](https://gitea.brasse-pc.eu/brasse/FitnessDroid/wiki).
|