Skip to content

feat: bootstrap hilt wiring#58

Merged
XaaT merged 2 commits intomainfrom
pr-50-hilt-bootstrap
Apr 23, 2026
Merged

feat: bootstrap hilt wiring#58
XaaT merged 2 commits intomainfrom
pr-50-hilt-bootstrap

Conversation

@XaaT
Copy link
Copy Markdown
Contributor

@XaaT XaaT commented Apr 20, 2026

Action par GPT-5 Codex (demandée par @XaaT)

Closes #50

Summary

  • ajoute le bootstrap Hilt minimal côté app et :core:data
  • introduit RedfaceApplication avec @HiltAndroidApp
  • marque MainActivity en @AndroidEntryPoint pour préparer l’injection future côté navigation / ViewModel
  • ajoute des bindings de base dans :core:data (Clock, Dispatchers.IO, Dispatchers.Default)
  • extrait le wiring Hilt/KSP dans build-logic via deux convention plugins dédiés

Notes

  • scope volontairement minimal : pas de modules Hilt par feature, pas de faux repositories, pas de @HiltViewModel tant qu’aucun ViewModel réel n’existe
  • bump Hilt vers 2.59.2 dans le version catalog : c’est la première ligne stable qui supporte AGP 9, déjà utilisé par le repo
  • le premier point d’injection utile est l’application ; l’activité est rendue Hilt-ready pour les prochains écrans stateful

Validation run

  • docker run --rm --security-opt label=disable -v /work/xaat/redface2:/workspace -w /workspace ghcr.io/cirruslabs/android-sdk:36@sha256:f9b3ea9ed2b5fc9522adae82c7b4622ab7aa54207ef532c8e615a347dca08f31 ./gradlew :app:assembleDebug
  • docker run --rm --security-opt label=disable -v /work/xaat/redface2:/workspace -w /workspace ghcr.io/cirruslabs/android-sdk:36@sha256:f9b3ea9ed2b5fc9522adae82c7b4622ab7aa54207ef532c8e615a347dca08f31 ./gradlew detektAll lintDebug testDebugUnitTest :app:assembleDebug

Sources

Co-Authored-By: GPT-5 Codex <noreply@openai.com>
@XaaT
Copy link
Copy Markdown
Contributor Author

XaaT commented Apr 22, 2026

Action par Claude Opus 4.7 (1M context) (demandée par @XaaT)

Peer review — 4 findings avant merge

[Haute] DispatchersQualifiers.kt placé dans :core:data

core/data/src/main/java/fr/forumhfr/redface2/core/data/di/DispatchersQualifiers.kt

Dès qu'un ViewModel d'une feature voudra @IoDispatcher ou @DefaultDispatcher, il devra importer depuis fr.forumhfr.redface2.core.data.di.* — or le test Konsist ArchitectureKonsistTest.kt a fr.forumhfr.redface2.core.data. dans forbiddenImplementationImports. La CI cassera sur la première feature qui injecte un dispatcher.

Fix : déplacer DispatchersQualifiers.kt (et le provider Main quand il sera ajouté, cf. finding suivant) vers :core:domain, qui est l'emplacement naturel (les interfaces de repositories y vivront avec ces signatures).

[Haute] @MainDispatcher manquant

Seulement @IoDispatcher + @DefaultDispatcher déclarés. Le dispatcher Main est canonique sur Android (coordination UI, callbacks de navigation) — son absence forcera des injections ad-hoc plus tard, incohérentes avec le reste.

Fix :

@Qualifier @Retention(AnnotationRetention.BINARY)
annotation class MainDispatcher

Et dans PlatformBindingsModule :

@Provides @Singleton @MainDispatcher
fun provideMainDispatcher(): CoroutineDispatcher = Dispatchers.Main.immediate

Note : Dispatchers.Main.immediate (pas Dispatchers.Main nu) pour éviter la frame de délai parasite côté UI.

[Moyenne] Version Hilt 2.59.2 vs stack verrouillée 2.57

gradle/libs.versions.toml

La stack canonique annonce Hilt 2.57. La PR bump à 2.59.2 sans documentation. Si intentionnel : mettre à jour stack.md + CHANGELOG. Sinon : aligner sur 2.57.

[Moyenne] RedfaceApplication.clock public + smoke test Log.d

app/src/main/java/fr/forumhfr/redface2/RedfaceApplication.kt

@Inject lateinit var clock: Clock est exposé publiquement sur l'Application, et utilisé pour un Log.d qui n'a pas sa place en production. Mauvaise pratique (l'Application n'est pas un point d'injection général) et couplage involontaire.

Fix : passer private (ce qui casse l'injection lateinit var → utiliser un @EntryPoint si vraiment besoin d'accéder au graph depuis l'Application), ou supprimer complètement l'injection et le log de debug.


Points forts

  • Convention plugins séparés redface.android.hilt.application / .library : opt-in propre, pas d'injection forcée dans tous les modules
  • KSP exclusif (pas KAPT) : aligné Kotlin 2.3
  • RedfaceApplication : @HiltAndroidApp, hérite Application, référencé dans le manifest — correct
  • MainActivity : @AndroidEntryPoint, modifications minimales

Les 2 findings haute priorité sont triviaux à corriger (déplacement de fichier + 1 qualifier). Une fois appliqués, la PR est merge-ready.

Co-Authored-By: GPT-5 Codex <noreply@openai.com>
@XaaT
Copy link
Copy Markdown
Contributor Author

XaaT commented Apr 22, 2026

Action par Claude Opus 4.7 (demandée par @XaaT)

Fixes appliqués (commit 1b3cfca) :

  • DispatchersQualifiers déplacé de :core:data vers :core:domain/coroutines/
  • @MainDispatcher ajouté (provider Dispatchers.Main.immediate)
  • javax.inject exposé en api() depuis :core:domain
  • RedfaceApplication réduit à @HiltAndroidApp class RedfaceApplication : Application()
  • Hilt 2.59.2 documenté dans stack.md + CHANGELOG

Status : CI ✅, en attente de review humaine.

Note workflow : en parallèle, tout a été consolidé sur la branche internal (HEAD d4d53cd) pour continuer le dev et builder l'AAB de test — elle contient PR#57 HEAD + PR#58 HEAD + fix NoActionBar/statusBarsPadding + PR#62. Cette PR reste la voie canonique vers main une fois la review passée.

@XaaT XaaT mentioned this pull request Apr 23, 2026
3 tasks
@XaaT XaaT merged commit 2ee2e0f into main Apr 23, 2026
1 check passed
XaaT added a commit that referenced this pull request Apr 24, 2026
Consolidation Phase 0+ → main.

Contient :
- runtime Material 3 et Hilt (fondations déjà mergées séparément via #57/#58)
- parser topic-first basé sur fixtures HFR réelles (khakha cat=13 post=84540)
- écran topic embarqué sur fixtures, rendu HTML Compose minimal
- fix insets / status bar pour l'APK de test
- icône placeholder (drapeau HFR, fond blanc)
- `.gitignore` pour les dossiers `*_files` générés par les sauvegardes navigateur

Dette architecturale tracée #65 (ViewModel manquant, fixtures dans `:core:domain`, Jsoup dans `:feature:topic`, assets dupliqués). Résorption avant reproduction du pattern, per ADR-011.

Refs #15, #3, #49, #50. Supersedes #61, #62, #64, #69.

Co-Authored-By: GPT-5 Codex <noreply@openai.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@XaaT XaaT deleted the pr-50-hilt-bootstrap branch April 24, 2026 19:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Phase 0 — Hilt wiring bootstrap

1 participant