Grund: Compose-app med login mot gym-API:t, VS Code-task och CI-release
Some checks failed
release / build-release (push) Failing after 1m42s

- Kotlin + Jetpack Compose + Material 3, minSdk 31 (Android 12)
- GraphQL-klient (OkHttp) med login/refresh/validate/logout som webben
- Tokenlagring i DataStore, auto-refresh av JWT
- Signering via gitignorerad signing/ lokalt och Actions-secrets i CI
- VS Code build-task -> build/FitnessDroid.apk
- Gitea Actions: bygger APK på Pi5 (arm64, aapt2-override) och publicerar
  rullande latest-release

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Kf4MAbZ3c3B4Xy5XfuGsCP
This commit is contained in:
2026-07-23 11:59:21 +02:00
commit 777f627888
33 changed files with 1816 additions and 0 deletions

74
README.md Normal file
View File

@@ -0,0 +1,74 @@
# 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`).
## 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 på Pi5-runnern (arm64)
vid varje push till `main` och lägger den på den rullande `latest`-releasen.
Eftersom Googles aapt2 bara finns för x86_64 använder bygget en statiskt byggd
arm64-aapt2 via `android.aapt2FromMavenOverride`.
Mer om arkitektur och planer: [`doc/plan.md`](doc/plan.md) och
[wikin](https://gitea.brasse-pc.eu/brasse/FitnessDroid/wiki).