Recherche par étiquette : a11y
2 articles
Eurogeo — apprenez drapeaux et capitales de l'Europe, hors ligne
Eurogeo est disponible sur le Google Play Store. C'est un quiz de géographie consacré à l'Europe.
Au programme de cette version : les drapeaux des pays, leurs capitales, et les liens entre les deux. De nouveaux défis se débloquent au fil des niveaux. Pas de compte à créer, pas d'écran inutile : on ouvre l'application et on joue.
La difficulté, niveau par niveau
Il y a dix-huit niveaux pour l'instant. Chaque niveau ajoute un nouveau type de question ou élargi la grille de réponses, pour augmenter le niveau de difficulté.
Un niveau se gagne au prix d'une série de bonnes réponses d'affilée, et ce prix est tiré au hasard dans une fourchette plutôt que fixé d'avance. Un coût fixe finit toujours par se deviner, et le joueur qui a compris que le jeu suivant tombe à la huitième bonne réponse se met à compter au lieu de jouer. Une mauvaise réponse remet le compteur à zéro, mais ne fait jamais perdre un niveau déjà acquis.
Sous le capot
Eurogeo est une application Kotlin Multiplatform, bâtie sur les mêmes bases que Carnet d'entraînement. Les couches domaine, données et présentation ne sont écrites qu'une fois, en Kotlin : les deux plateformes pilotent le même QuizViewModel. En revanche, chacune dessine sa propre interface — Jetpack Compose côté Android, SwiftUI côté iOS. Les métriques de texte, l'arbre d'accessibilité et le comportement des barres système sont ainsi ceux de la plateforme, pas une approximation.
Le contenu est embarqué dans l'application. Au premier lancement, il est chargé depuis des fichiers JSON vers une base de données locale Room 3 ; la progression, elle, vit dans DataStore. Le build de production passe par R8, qui réduit et obfusque le code, et les avertissements du compilateur sont traités comme des erreurs sur les deux plateformes — de quoi éviter que les API dépréciées ne s'accumulent en silence d'une version à l'autre.
Tout a été écrit en TDD. Avant chaque merge, près de trois cents tests instrumentés tournent sur un vrai téléphone et une vraie tablette. Les deux formats comptent : la mise en page bascule au-delà de 600 dp, et la tablette couvre donc des cas qu'un téléphone ne rencontrera jamais.
Accessibilité
Les couleurs sont mesurées, pas choisies à l'œil. Le quiz se joue par-dessus une photographie : l'opacité de chaque fond et la couleur de chaque texte sont calibrées sur la luminance mesurée de l'image, et un test fait échouer le build si les rapports de contraste WCAG ne sont pas tenus.
Les lecteurs d'écran, eux, ont leur propre vocabulaire. Les drapeaux sont étiquetés par leur apparence : TalkBack et VoiceOver peuvent en décrire un sans nommer le pays, donc sans vendre la mèche. Le score est annoncé sous forme de phrase — « Streak 13, best 42, level 3 » — et lu après la question et les choix, jamais avant.
Enfin, les cartes s'agrandissent avec la taille de texte du système au lieu de tronquer : un nom de pays n'est jamais coupé en fin de ligne. Et chaque zone tactile respecte le minimum de 48 dp.
Si vous aimez parcourir l'Europe pays par pays, Eurolinguo fait la même chose avec ses langues.
Carnet d'entraînement 2.0.0
Carnet d'entraînement est disponible sur le Google Play Store. C'est un carnet numérique pour noter l'entraînement que vous faites vraiment : séances, exercices, et séries en répétitions ou chronométrées, avec leur poids ou leur élastique. Le tout hors ligne : aucun compte, aucune connexion, aucun serveur.

Si la version commence à 2.0.0, c'est que ce n'est pas un coup d'essai. À l'origine, il y avait une application Android mono-plateforme, écrite il y a quelques années, avant ma formation officielle. La 2.0.0 en est une réécriture complète en Kotlin Multiplatform : une seule base de code pour Android, iOS et Desktop.
Sous le capot
L'application repose sur Compose Multiplatform et Kotlin 2.4, et toute l'interface utilisateur est partagée —
pas une ligne d'écran spécifique à une plateforme. Le projet est découpé en modules Gradle core:*
et feature:*, avec une direction de dépendance stricte : domain est du Kotlin pur, data
implémente les interfaces que domain déclare, et les features s'ignorent les unes les autres. Les
écrans suivent le patron MVI, l'injection passe par Koin, et les
données vivent dans SQLite en local via SQLDelight :
des requêtes typées, aucune réflexion, et le même schéma sur toutes les cibles. La navigation
s'appuie sur Navigation 3.
Le minuteur de repos aura été le problème multiplateforme le plus intéressant. Entre deux séries,
un compte à rebours qui ne tourne qu'au premier plan ne sert à rien : l'alarme est donc confiée au
système plutôt qu'à une coroutine, via un ordonnanceur expect/actual qui s'appuie sur
AlarmManager sur Android et sur une notification locale sur iOS. Elle sonne à la fin du repos,
que vous ayez changé d'application ou verrouillé l'écran — et si la permission d'alarme exacte est
refusée, elle bascule sur une alarme inexacte au lieu de planter.
Tout a été écrit en TDD, guidé par ZOMBIES : près de quatre fichiers Kotlin sur dix
sont des tests. Ils couvrent la logique métier, les ViewModels, les requêtes SQLDelight, le graphe
Koin, la navigation, et l'interface Compose elle-même via runComposeUiTest. Chaque build passe
par detekt, avec règles adaptées à Compose.
Accessibilité
L'accessibilité fait partie des tests, ce n'est pas une passe de finition : compatibilité TalkBack, zones tactiles et écrans qui tiennent aux plus grandes tailles de texte et d'affichage, thèmes clair et sombre, français et anglais, et des mises en page conçues pour la tablette et le mode paysage.
Vos séances restent sur votre appareil. Vous pouvez les exporter dans un fichier quand vous voulez, et les restaurer tout aussi facilement.
