SPB Git forge

spb/ka-android

Public
4commits 1branches 0releases
1.6 MBsize
maindefault branch
1 mo agolast push
Kotlin 100%
7.1 KB · 138 lines markdown
Rendered Raw Blame History
1# KA Android — la super-app Groupe-KA23Portage Android natif complet de l'app iOS « KA » : tout l'écosystème Groupe-KA4(12 univers ·Ka) dans une seule app **Kotlin + Jetpack Compose**, compilée en5ligne de commande (aucun Android Studio requis). **v2.0.0** = refonte majeure6alignée sur le build 6 iOS (AUDIT-REFONTE.md §5) : carte Mapbox 2D/3D,7galeries, recherches sauvegardées + alertes honnêtes, historique, collections8éditoriales, playground API·Ka.910## Build1112```bash13export JAVA_HOME=$(brew --prefix openjdk@21)14# local.properties doit pointer vers le SDK :15#   sdk.dir=/opt/homebrew/share/android-commandlinetools16./gradlew test               # 22 tests JVM (adaptateurs + clustering + stores)17./gradlew assembleDebug      # → app/build/outputs/apk/debug/app-debug.apk18./gradlew assembleRelease    # → app/build/outputs/apk/release/app-release.apk (SIGNÉ)19```2021Trio de versions éprouvé : **Gradle 8.13 + AGP 8.9.2 + Kotlin 2.1.20**22(plugin Compose intégré), Compose BOM 2024.09.03, **MapLibre GL 10.3.1**,23minSdk 26, target/compileSdk 34. Portrait-first (téléphones).2425### Signature release (APK téléchargeable publiquement)2627Le keystore est à la racine : `ka-release.keystore`28- alias : `ka`29- **storepass / keypass : `ka-groupe-2026`**30- certificat : CN=Groupe KA, RSA 2048, validité 10 000 jours.3132`assembleRelease` signe automatiquement (signingConfig `release` dans33`app/build.gradle.kts`). ⚠️ Conserver ce keystore : toute mise à jour de34l'app doit être signée avec la même clé.3536## La carte (pièce maîtresse, onglet « Carte »)3738`ui/MapScreen.kt` — **MapLibre GL Android** (libre) rendant le style officiel39**Mapbox streets-v12** (`Mapbox.getInstance(ctx, token, WellKnownTileServer.Mapbox)`40+ `mapbox://styles/mapbox/streets-v12` ; token public déjà exposé sur41lou-ka.com) :4243- **Bascule 2D/3D** : pitch 0° ↔ 60° animé + couche `fill-extrusion` des44  bâtiments (source composite, `source-layer building`, hauteur interpolée au45  zoom) — même recette que Ka Maps web.46- **Marqueurs-pilules avec PRIX** teintés par univers (bitmaps dessinés au47  Canvas, cache), badge circulaire pour les groupes.48- **Clustering par grille** : `core/ClusterEngine.kt` (pur, testé, miroir49  exact d'iOS) — ~9×9 cellules sur la région, plafond 150 rendus, dégroupage50  par zoom au tap.51- **« Rechercher dans cette zone »** : bbox RÉEL côté API52  (`/api/listings.geojson?bbox=w,s,e,n` lou-ka/immo-ka,53  `/api/jobs.geojson` job-ka — vérifiés) ; resto-ka/sorti-ka : liste +54  filtre client sur la région.55- **Fiche compacte** au tap → fiche complète (l'état de la carte — caméra,56  items, chips — est conservé via `MapStateHolder`), **bascule liste/carte**57  synchronisée, chips par univers aux couleurs officielles.5859## Refonte v2 (parité iOS build 6)6061- **Fiches** : galerie multi-photos (`images[]` → `KAItem.imageURLs`, pager +62  compteur + **plein écran zoomable** pincement/double-tap), **itinéraire**63  (intent `geo:`), **semblables** (même univers/ville), provenance datée64  (`Source : <hôte>`), enregistrement dans l'historique.65- **Recherche** : tri (pertinence / prix ↑ / prix ↓), **sauvegarde + alerte**66  (🔔), partage de la recherche.67- **Alertes honnêtes** : `core/RecentsStore.kt` recompte le champ `total`68  réel de l'API à l'ouverture (`UniverseService.total`) et affiche le delta69  « +N » — jamais de faux chiffre. « Marquer comme vues » replie le delta.70- **Historique consulté** : 30 derniers, dédupliqués, persistés.71- **Accueil** : bande « Reprendre » (recherches sauvegardées avec badge +N,72  derniers consultés), **collections éditoriales** ×4 (les mêmes requêtes73  réelles qu'iOS : sorties gratuites, soldes d'épicerie, autos < 15 000 $74  ≥ 2015, 4½ récents).75- **Profil** : hub « Mes contenus » (Favoris / Historique / Recherches &76  alertes avec badge).77- **Navigation** : Accueil · Recherche · Explorer · **Carte** · Profil78  (Favoris accessibles depuis le Profil, comme sur iOS).7980## Fix Trouve-Ka8182`/api/search` **exige `q`** (422 sinon). `UniverseService.fetch` garde le cas83(retour vide sans appel réseau) et l'explorateur Trouve-Ka est « recherche84d'abord » : aucun fetch initial, état vide dédié « Cherchez le web québécois ».85Items sous la clé `results`.8687## Playground API·Ka8889`ui/ApiKaPlaygroundScreen.kt` — l'univers API·Ka est un playground natif :90charge `https://www.api-ka.com/openapi.json` **en direct**, liste les91endpoints **GET** (chemin, résumé, paramètres), génère le formulaire92(paramètres query et path, requis marqués \*), **Envoyer** → statut HTTP +93latence ms + **réponse JSON colorisée** (clés lime, chaînes vertes, nombres94orange) **pliable**, et **« Copier en curl »**.9596## Architecture — miroir de l'app iOS (`~/Desktop/KA`)9798| iOS (SwiftUI)               | Android (Compose)                                   |99|-----------------------------|-----------------------------------------------------|100| `Core/Ecosystem.swift`      | `core/Ecosystem.kt` — 12 univers config-driven, galeries `imageURLs` |101| `Core/Services.swift`       | `core/Services.kt` — cache disque hors ligne, fetch, `total()`, `mapItems()` bbox geojson, liveTotal, AgentService SSE |102| `Core/KAFilters.swift`      | `core/Filters.kt`                                    |103| `Core/FavoritesStore.swift` | `core/FavoritesStore.kt`                             |104| `Core/RecentsStore.swift`   | `core/RecentsStore.kt` + `Editorial`                 |105| `Features/MapView.swift`    | `ui/MapScreen.kt` + `core/ClusterEngine.kt`          |106| `Core/KAID.swift`           | `auth/KaId.kt` — SSO Custom Tabs, client `ka-android` |107| `Design/Theme.swift`        | `ui/theme/Theme.kt` — éditorial sharp, clair par défaut |108| `Features/*`                | `ui/*Screen.kt`                                      |109110Icône : « liquid glass » (KA verre lime sur fond blanc, perles des univers) —111mipmaps générés depuis `docs/icon-glass-1024.png` d'iOS.112113## Ajouter un univers114115Une entrée dans `Ecosystem.all` (`core/Ecosystem.kt`) : identité, config116d'API, lambda de mapping. La grille, la recherche, l'accueil, les compteurs,117la fiche — et la carte si l'API expose lat/lng — suivent automatiquement.118119## Écarts vs iOS (v2)120121- Localisation « ma position » non incluse (aucune permission de localisation122  demandée) — la carte démarre sur Québec.123- Widgets iOS sans équivalent.124- SF Symbols → Material Icons ; haptique simplifiée.125- MapLibre 10.3.1 (packages `com.mapbox.mapboxsdk.*`) : dernière lignée qui126  résout nativement les URL `mapbox://` du style officiel via127  `WellKnownTileServer.Mapbox` — MapLibre 11 les a retirées.128129## Tests (22, tous verts)130131- `AdapterTests` (12) : mappings d'univers (mêmes échantillons que132  `KATests.swift`), URLs de liste, favoris/collections + persistance.133- `RefonteTests` (10) : clustering (regroupement/centroïde, plafond 150,134  items sans coordonnées), historique (déduplication, plafond 30,135  persistance), alertes (markSeen replie le delta, somme des alertes136  actives seulement), galerie ≤ 10 images http, garde Trouve-Ka sans137  réseau, collections éditoriales pointant vers de vrais univers.138