KA Android — la super-app Groupe-KA
Portage Android natif complet de l'app iOS « KA » : tout l'écosystème Groupe-KA (12 univers ·Ka) dans une seule app Kotlin + Jetpack Compose, compilée en ligne de commande (aucun Android Studio requis).
Build
export JAVA_HOME=$(brew --prefix openjdk@21)
# local.properties doit pointer vers le SDK :
# sdk.dir=/opt/homebrew/share/android-commandlinetools
./gradlew assembleDebug # → app/build/outputs/apk/debug/app-debug.apk
./gradlew test # tests JVM des adaptateurs d'univers (12 tests)Trio de versions éprouvé : Gradle 8.13 + AGP 8.9.2 + Kotlin 2.1.20 (plugin Compose intégré à Kotlin 2.x), Compose BOM 2024.09.03, minSdk 26, target/compileSdk 34. Portrait-first (téléphones).
Architecture — miroir exact de l'app iOS (~/Desktop/KA)
| iOS (SwiftUI) | Android (Compose) |
|---|---|
Core/Ecosystem.swift |
core/Ecosystem.kt — les 12 univers config-driven |
Core/Services.swift |
core/Services.kt — client JSON + cache disque, fetch univers, liveTotal, AgentService SSE, menus resto, Vrai-Prix |
Core/KAFilters.swift |
core/Filters.kt — catalogue de filtres métier |
Core/FavoritesStore.swift |
core/FavoritesStore.kt — collections multi-univers persistées (JSON) |
Core/KAID.swift |
auth/KaId.kt — SSO hub via Chrome Custom Tabs (client ka-android, scheme ka-android://auth/callback, échange vérifié sur api-ka) |
Design/Theme.swift |
ui/theme/Theme.kt — papier/encre, carte à ombre décalée dure, wordmarks « Lou[Ka] » (-2°), chips mono |
Features/* |
ui/*Screen.kt — Accueil vivant, Recherche fan-out, grille Univers + explorateur + fiche, Vrai-Prix natif, menus resto, Favoris, Profil, chat KA Agent |
App/KAApp.swift |
MainActivity.kt + KAApp.kt — 5 onglets + bulle Agent flottante, onboarding |
Le thème clair est le défaut (papier #f5f3ee / encre #141814) ; sombre
et automatique dans Profil → Apparence. Tous les textes sont en français.
Le cœur : core/ (pur JVM, testable sans Android)
Json.kt— lecture « au mieux » surJsonElement(miroir deJSONValue) :str(),num(),.text(string / nombre formaté / liste jointe).Ecosystem.kt— chaque univers = id, wordmark, tagline, accent hex, domaine, unité,listPath/itemsKey/searchParam, clés de stats, et mapping JSON → KAItem avec toutes les subtilités iOS : première image http deimages[], seuils anti-placeholders (prix ≤ 0,2 $ épicerie, ≤ 50 $ loyer, ≤ 1000 $ propriété, salaires > 20 000 $/an ou > 10 $/h), prix barré Food·Ka, fourchettes salariales Job·Ka, plateformes + abonnés cumulés + liens Créa·Ka, strip-HTML Trouve·Ka.Services.kt— cache disque par URL (l'app sert la dernière copie hors ligne), fan-outliveTotal(/api/stats,/api/statuspour trouve-ka), SSE OkHttp pour KA Agent (POST https://www.api-ka.com/api/agent/chat, eventsdelta/tool/done/error).
Ajouter un univers
Ajouter une entrée dans Ecosystem.all (core/Ecosystem.kt) : identité,
config d'API et lambda de mapping. Rien d'autre — la grille, la recherche
universelle, l'accueil, les compteurs et la fiche le prennent en charge
automatiquement. (Ajouter des filtres métier dans core/Filters.kt et une
icône dans universeIcon() si souhaité.)
Écarts volontaires vs iOS (v1)
- Carte unifiée absente : la MapView iOS (MapKit) n'est pas portée —
prévue pour une version ultérieure (Google Maps/MapLibre à trancher).
Les latitudes/longitudes sont déjà mappées dans
KAItem. - Widgets : pas d'équivalent des widgets iOS (KAWidgets) en v1.
- Le SSO utilise Chrome Custom Tabs (au lieu d'
ASWebAuthenticationSession) ; le retour se fait parka-android://auth/callback(intent-filter,launchMode=singleTask), puis échange{ka_token}surhttps://www.api-ka.com/api/ios/auth/exchange(accepte l'audienceka-android). - Haptique légère (API Compose) plutôt que le moteur riche d'iOS.
- Icônes Material en remplacement des SF Symbols (mapping dans
universeIcon).
Tests
app/src/test/java/com/groupeka/ka/AdapterTests.kt — mêmes échantillons JSON
que KATests.swift iOS : mapping Lou·Ka/Auto·Ka/Job·Ka/Food·Ka/Créa·Ka/
Trouve·Ka, première image de images[], accents uniques (12 univers),
construction d'URL de liste (query embarquée upcoming=true préservée),
favoris/collections + persistance.