SPB Git

spb/ka-android

Public
4.6 KB

# 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

bash
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 » sur JsonElement (miroir de JSONValue) : 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 de images[], 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-out liveTotal (/api/stats, /api/status pour trouve-ka), SSE OkHttp pour KA Agent (POST https://www.api-ka.com/api/agent/chat, events delta/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 par ka-android://auth/callback (intent-filter, launchMode=singleTask), puis échange {ka_token} sur https://www.api-ka.com/api/ios/auth/exchange (accepte l'audience ka-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.

Files · 03c470c527c310a4d208f3c0d0517b62a233fdfc
Menu

Theme