Skip to content

Roadmap : plan de relance Redface — audit et modernisation #241

@XaaT

Description

@XaaT

Roadmap : plan de relance Redface

Issue générée par Claude (Opus 4.6) à la demande de @XaaT, après un audit complet du repo, des branches, des issues et des dépendances. L'objectif est de proposer un plan structuré pour remettre Redface sur les rails.


État des lieux

Ce qui va bien

  • L'app fonctionne, est publiée sur le Play Store (v5.1.0)
  • CI/CD en place (GitHub Actions, signing automatique)
  • Architecture DI propre (Dagger 2)
  • Support AndroidX et Material à jour
  • Communauté active (issues récentes, utilisateurs qui remontent des bugs)

Ce qui bloque

  • 49 issues ouvertes dont ~40 datent de 2016 (beaucoup probablement obsolètes)
  • 4 PRs mortes (2019-2021), jamais mergées ni fermées
  • Branches divergentes : master et develop ont divergé silencieusement (master a rollback SDK 36, hotfix sans backport)
  • Vieilles branches de migration abandonnées (okhttp3, butterknife, dependencies-cleanup — toutes 2016-2019)
  • Dette technique critique sur les dépendances cœur (voir ci-dessous)
  • minSdk 16 (Android 4.1, 2012) — impose multidex et bloque l'accès aux API modernes

Dette technique — dépendances

Lib Version actuelle Dernière stable Âge Impact
Retrofit 1.9.0 2.11+ 10 ans API totalement incompatible, bloque toute évolution réseau
OkHttp 3.14.9 4.12+ 7 ans Pas de TLS 1.3, pas de HTTP/2 push, EOL
RxJava 1.3.8 3.x 8 ans Déprécié, plus maintenu
Glide 4.9.0 4.16+ 5 ans Bugs images probables (#239, #237)
Firebase BOM 28.4.2 33+ 6 ans Crashlytics v1 en fin de vie
ButterKnife 10.2.0 Déprécié ViewBinding le remplace nativement
Otto 1.3.5 12 ans Square l'a abandonné pour RxJava

Plan proposé

Phase 0 — Hygiène du repo

Prérequis à tout travail. Pas de code, juste du ménage.

Phase 1 — Quick wins (bugs critiques)

Corriger les bugs qui font fuir les utilisateurs. Maximum de valeur, minimum d'effort.

Phase 2 — Fondations

Moderniser la base pour débloquer le reste. Chaque étape est indépendante et mergeable seule.

2a. Remonter minSdk 16 → 29 (Android 10)

  • Voir le commentaire dédié ci-dessous pour la comparaison 29 / 30 / 31
  • Supprime multidex, débloque Scoped Storage natif, TLS 1.3 garanti, dark theme système
  • Simplifie massivement le code de gestion des permissions et du stockage

2b. OkHttp 3.14 → 4.x

  • Migration douce : l'API est quasi-compatible (okhttp3 reste le même package)
  • Débloque TLS 1.3 (requis par de plus en plus de serveurs)
  • Meilleur support HTTP/2
  • Prérequis pour Retrofit 2 à terme

2c. Glide 4.9 → 4.16

  • Corrige potentiellement les 403 images
  • Meilleure gestion du cache et de la mémoire
  • Support des formats modernes (WebP, AVIF)

2d. Firebase BOM 28 → 33+

  • Crashlytics SDK v2 (l'ancien est en dépréciation)
  • Meilleure intégration avec les outils Firebase
  • Correctifs de sécurité

2e. ButterKnife → ViewBinding

  • Migration fichier par fichier, pas de big bang
  • ViewBinding est généré par le build system, zéro runtime
  • Chaque fichier migré = un commit atomique

Phase 3 — Architecture nouvelle génération

Pour le nouveau code uniquement. L'existant reste en place et migre progressivement.

  • Nouveau code en Kotlin — Java et Kotlin cohabitent parfaitement. Pas de migration forcée de l'existant.
  • Coroutines pour l'async — Introduire progressivement à côté de RxJava 1 (les deux peuvent coexister via kotlinx-coroutines-rx1). Les nouveaux écrans utilisent les coroutines, l'existant garde RxJava.
  • ViewModel + StateFlow pour les nouveaux écrans — Remplace le pattern DataPresenter/Otto. Plus de lifecycle leaks.
  • Jetpack Compose pour les nouveaux écrans — Le rendu des posts reste en WebView (HTML/BBCode trop complexe pour Compose), mais les écrans de navigation, settings, profil etc. peuvent être en Compose.
  • Navigation Component — Simplifier la navigation entre les 13 activités. Potentiellement passer en single-activity à terme.

Phase 4 — Fonctionnalités

Une fois les fondations posées, ces features deviennent beaucoup plus simples.

  • Pouvoir voir les messages de citations #235/Pouvoir voir les messages qui nous ont cité #143 Voir les messages qui nous citent — Demande récurrente depuis 2016. Nécessite un endpoint HFR ou du parsing côté client.
  • Couleur de la barre de navigation #240 Couleur barre de navigation — Edge-to-edge propre (plus de opt-out) avec barre de navigation thématique
  • Prise en charge des Alertes Qualitay #126 Support des Alertes Qualitay — Intégration possible avec le Worker de hfr-redflag : partager le cache D1 pour afficher les posts alertés directement dans Redface
  • Notifications enrichies — Aperçu du message dans la notif, actions rapides (répondre, marquer lu)
  • Mode hors-ligne — Cache local des topics favoris pour lecture déconnectée (Room + le cache existant)
  • Intégration écosystème HFR :
    • hfr-redkit : préférences partagées via MPStorage
    • hfr-redhost : upload d'images natif dans l'app
    • hfr-redflag : indicateur visuel des posts alertés

Phase 5 — Migration long terme

Chantiers de fond, à mener progressivement sur plusieurs mois.

  • Retrofit 1.9 → 2.x — Le plus gros chantier. Chaque endpoint migré individuellement. Stratégie : créer un nouveau ApiServiceV2 en parallèle, migrer endpoint par endpoint, supprimer l'ancien quand tout est porté.
  • RxJava 1 → Coroutines/Flow — Suit naturellement la migration Retrofit (Retrofit 2 supporte nativement les suspend functions)
  • Java → Kotlin — Fichier par fichier, en commençant par les modèles (data classes), puis les utilitaires, puis les fragments. Android Studio fait 80% du travail automatiquement.
  • Otto → pas de remplacement — Les events Otto sont remplacés par des StateFlow dans les ViewModels ou des callbacks directs. Pas besoin d'un event bus quand l'architecture est réactive.

Principes

  1. Chaque phase est optionnelle et indépendante — On peut s'arrêter à n'importe quelle phase et l'app est dans un meilleur état qu'avant
  2. Pas de big bang — Chaque changement est un commit/PR atomique, testable, revertable
  3. Le code existant n'est pas l'ennemi — On ne réécrit pas ce qui marche. On modernise ce qu'on touche.
  4. Nouveau code = nouvelles pratiques — Kotlin, Coroutines, Compose pour tout ce qu'on écrit from scratch
  5. L'utilisateur d'abord — Phase 1 (bugs) avant Phase 2 (modernisation). Toujours.

Ressources

  • Audit dépendances complet : voir MEMORY.md sur la branche xat/ai-workspace
  • Analyse des branches : même fichier
  • Inventaire des issues : 49 ouvertes, triées par date et pertinence

Cette issue a été générée par Claude (Opus 4.6) via Claude Code + MCP, à la demande de @XaaT. Le plan est une proposition — toute discussion, critique ou réorientation est bienvenue.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions