Navigation

Écrans, flows, deep linking et bottom navigation.


Bottom Navigation

L’application utilise une barre de navigation en bas avec 4 onglets principaux + les réglages accessibles depuis chaque écran.

┌───────────┬───────────┬───────────┬───────────┐
│  Drapeaux │  Forum    │  Recherche│  Messages  │
│  (accueil)│           │           │            │
└───────────┴───────────┴───────────┴────────────┘

Drapeaux est l’écran d’accueil. C’est le point d’entrée principal — la plupart des utilisateurs HFR ouvrent l’app pour vérifier “quoi de neuf sur mes topics suivis”.


graph TB
    LOGIN[Auth / Login] --> HOME

    subgraph HOME["Bottom Navigation"]
        FLAGS["Drapeaux (accueil)"]
        FORUM[Forum]
        SEARCH[Recherche]
        MSGS[Messages]
    end

    FLAGS -->|"tri: date / catégorie"| FLAGS
    FLAGS -->|"filtre: tous / cyan / favori / rouge"| FLAGS
    FLAGS --> TOPIC

    FORUM --> CATS[Catégories]
    CATS --> SUBCATS[Sous-catégories]
    SUBCATS --> TOPICLIST[Liste de topics]
    TOPICLIST --> TOPIC
    TOPICLIST --> NEWTOPIC["Créer un topic"]

    SEARCH --> RESULTS[Résultats]
    RESULTS --> TOPIC

    MSGS --> TABMP["MPs classiques"]
    MSGS --> TABMULTI["MultiMPs (vue drapeaux)"]
    TABMP --> CONV[Conversation]
    TABMP --> NEWMP["Nouveau MP"]
    TABMULTI --> CONVMULTI["Conversation groupe"]
    TABMULTI --> NEWMULTI["Nouveau MultiMP"]
    CONV --> REPLYMP[Reply MP]
    CONVMULTI --> REPLYMULTI[Reply MultiMP]
    CONVMULTI --> QUOTEMULTI["Quote → Reply"]

    TOPIC --> REPLY[Reply]
    TOPIC --> EDIT["Edit post"]
    TOPIC --> EDITFP["Edit FP (sujet, contenu, sondage)"]
    TOPIC --> QUOTE["Quote → Reply"]
    TOPIC --> IMAGE[ImageViewer fullscreen]

    NEWTOPIC --> TOPIC

    style FLAGS fill:#00bcd4,color:#fff
    style FORUM fill:#4caf50,color:#fff
    style SEARCH fill:#ff9800,color:#fff
    style MSGS fill:#9c27b0,color:#fff
    style TOPIC fill:#e74c3c,color:#fff

Écrans en détail

Drapeaux (accueil)

L’écran le plus important de l’app. Affiche les topics suivis par l’utilisateur.

Tri :

  • Par date (défaut) : tous les topics mélangés, triés par dernier message
  • Par catégorie : groupes par cat/subcat, chaque groupe trie par date

Filtres :

  • Tous : tous les drapeaux confondus
  • Cyan : topics où l’utilisateur a participé
  • Favori : topics marqués d’une étoile jaune
  • Rouge : marque de lecture (dernière position lue)

Actions sur un topic :

  • Tap → ouvrir le topic à la dernière position non lue
  • Long press → menu contextuel (retirer drapeau, copier URL, partager)
  • Swipe → retirer le drapeau (avec undo)

Topic (lecture)

L’écran central de l’app. Affiche les posts d’un topic avec pagination.

Navigation dans le topic :

  • Scroll vertical pour lire les posts
  • Boutons page précédente / suivante
  • Saut direct à une page (champ numéro)
  • Saut au premier / dernier post
  • Indicateur de page courante / total

Actions sur un post :

  • Quoter → ouvre l’éditeur avec la citation pré-remplie
  • Editer (si c’est notre post) → ouvre l’éditeur avec le contenu actuel
  • Editer le FP (si isFirstPostOwner) → éditeur spécial avec sujet + sondage
  • Copier le texte
  • Voir l’image en plein écran
  • Partager le lien du post

Forum (catégories)

Navigation hiérarchique dans le forum.

Catégories
  └── Hardware
       ├── HFR
       ├── Overclocking
       └── ...
  └── Programmation
       ├── C/C++
       ├── Java
       └── ...

Chaque catégorie affiche le nombre de topics et l’activité récente.

Création de topic

Formulaire complet :

  • Catégorie : sélecteur hiérarchique
  • Sous-catégorie : dépend de la catégorie choisie
  • Sujet : titre du topic
  • Contenu : éditeur BBCode avec toolbar
  • Sondage (optionnel) : question + options + choix multiple oui/non
  • Preview : avant-première du rendu BBCode

Messages

Deux onglets :

MPs classiques :

  • Inbox : liste des conversations 1-to-1, triées par date
  • Chaque MP affiche : sujet, correspondant, date, lu/non-lu
  • Nouveau MP : destinataire + sujet + contenu

MultiMPs :

  • Vue style drapeaux : fils de groupe triés par dernier message
  • État lu/non-lu géré via MPStorage (données synchronisées depuis un MP HFR dédié, cachées en Room)
  • Chaque MultiMP se comporte comme un topic : pagination, quote, reply
  • Nouveau MultiMP : destinataires (2+) + sujet + contenu

Recherche

  • Recherche dans les topics (titre) et dans les posts (contenu)
  • Filtres : catégorie, auteur, date
  • Résultats avec preview du contexte

Deep Linking

Les URLs HFR doivent ouvrir directement le bon écran dans l’app.

Pattern URL Écran cible
forum.hardware.fr/forum1.php?cat=X&post=Y&page=Z Topic page Z
forum.hardware.fr/forum1.php?cat=X&post=Y Topic page 1
forum.hardware.fr/forum2.php?config=hfr.inc&cat=X&subcat=Y Liste topics
forum.hardware.fr/forum1f.php Drapeaux
forum.hardware.fr/forum1.php?cat=X&post=Y#t12345 Post spécifique (traitement custom, voir ci-dessous)

Implémentation via Compose Navigation deep links :

composable(
    route = "topic/{cat}/{post}/{page}",
    deepLinks = listOf(
        navDeepLink {
            uriPattern = "https://forum.hardware.fr/forum1.php?cat={cat}&post={post}&page={page}"
        }
    ),
) { backStackEntry ->
    TopicScreen(
        cat = backStackEntry.arguments?.getString("cat")?.toInt() ?: 0,
        post = backStackEntry.arguments?.getString("post")?.toInt() ?: 0,
        page = backStackEntry.arguments?.getString("page")?.toInt() ?: 1,
    )
}

Cas particulier : lien vers un post spécifique

Compose Navigation ne supporte pas les fragments (#t{numreponse}) dans les deep links. Les URLs de type forum.hardware.fr/forum1.php?cat=X&post=Y#t12345 nécessitent un traitement custom dans MainActivity :

// MainActivity.kt
private fun handleDeepLink(intent: Intent) {
    val uri = intent.data ?: return
    val fragment = uri.fragment // "t2781509"
    val scrollToPost = fragment?.removePrefix("t")?.toIntOrNull()

    val cat = uri.getQueryParameter("cat")
    val post = uri.getQueryParameter("post")
    val page = uri.getQueryParameter("page") ?: "1"

    navController.navigate(
        "topic/$cat/$post/$page" +
            (scrollToPost?.let { "?scrollTo=$it" } ?: "")
    )
}

La route Topic accepte un paramètre optionnel scrollTo :

topic/{cat}/{post}/{page}?scrollTo={numreponse}

Le TopicScreen reçoit le numreponse cible et scroll jusqu’au bon post après chargement de la page.


Back Stack

Le back stack est géré par Compose Navigation avec des règles spécifiques :

  • Bottom nav : chaque onglet conserve son propre back stack
  • Retour depuis un topic : retour à la liste (drapeaux, forum, recherche) à la même position de scroll
  • Retour depuis reply/edit : retour au topic à la même page
  • Deep link : back → écran d’accueil (drapeaux)
graph LR
    A["Drapeaux"] --> B["Topic (page 3)"]
    B --> C["Quote → Reply"]
    C -->|"Back"| B
    B -->|"Back"| A
    A -->|"Back"| EXIT["Quitter l'app"]

Haut de page

Redface 2 — Specs v0.3.1 — Un projet communautaire pour Hardware.fr

This site uses Just the Docs, a documentation theme for Jekyll.