-
Notifications
You must be signed in to change notification settings - Fork 0
Documentation
K3 Typing est une application Android native développée en Kotlin, conçue pour l'entraînement à la dactylographie. Elle intègre un moteur de synthèse vocale (TTS) pour assister l'utilisateur et un système de suivi des performances (vitesse et précision).
L'application suit les principes de l'architecture MVVM (Model-View-ViewModel) recommandée par Google, garantissant une séparation stricte des responsabilités et une meilleure testabilité.
- View (UI) : Développée intégralement avec Jetpack Compose. Elle est réactive et observe les états exposés par le ViewModel.
- ViewModel : Agit comme médiateur. Il gère la logique métier, l'initialisation du moteur Text-To-Speech et la communication avec la base de données via des Coroutines.
- Model : Géré par la bibliothèque Room, assurant la persistance des données localement dans une base SQLite.
L'application utilise une base de données relationnelle locale pour stocker les textes d'entraînement et les résultats des utilisateurs.
Représente un texte disponible pour l'entraînement.
-
idText(Long) : Clé primaire auto-générée. -
title(String) : Titre de l'exercice. -
content(String) : Corps du texte à saisir. -
category(String) : Classification (phrases, histoires, textes personnalisées). -
difficulty(Int) : Niveau de difficulté (1 à 5).
Enregistre les performances d'une session de test.
-
textId(Long) : Clé étrangère liée àTextEntity. -
Contrainte :
ON DELETE CASCADE(si un texte est supprimé, ses statistiques le sont aussi). -
wpm(Double) : Mots par minute. -
accuracy(Double) : Précision en pourcentage. -
duration(Long) : Temps total en millisecondes. -
timeStamp(Long) : Date de la session.
L'interface TypingDao définit les interactions SQL :
-
insertText/insertSession: Insertion de données. -
getTextsByCategory: Filtrage dynamique des textes. -
getAllSessions: Récupération de l'historique trié par date décroissante.
La base de données est implémentée via un Singleton thread-safe. Un RoomDatabase.Callback est utilisé pour pré-peupler la base lors du premier lancement avec des exemples de textes (Contes, phrases simples, etc.).
Le MainViewModel centralise les opérations lourdes et maintient l'état de l'interface.
L'application implémente TextToSpeech.OnInitListener.
-
Vitesse de lecture : Fixée à
$0.65f$ pour une élocution claire et adaptée à la saisie. -
Transcription de la ponctuation : Avant la lecture, les symboles sont convertis en mots (ex:
.devient "point",?devient "point d'interrogation") pour guider précisément l'utilisateur.
Le ViewModel utilise StateFlow pour exposer les données :
-
texts: Liste des textes filtrés par la catégorie active. -
sessions: Liste exhaustive des performances passées. Toutes les opérations de base de données sont lancées dans leviewModelScopepour éviter de bloquer le thread principal (UI).
L'UI est découpée en modules fonctionnels dans MainActivity.kt.
Permet la navigation et le choix de l'exercice :
-
Système de puces (
FilterChip) : Filtre en temps réel les textes par catégorie. - Cartes interactives : Affiche un aperçu du texte et son titre.
- Navigation : Accès direct vers l'ajout de texte personnalisé ou l'écran des statistiques.
C'est le composant central gérant la logique de saisie :
-
Segmentation intelligente : Le texte est découpé en phrases via une expression régulière (
(?<=[.!?])\s+). L'utilisateur progresse phrase par phrase. - Normalisation des caractères : Une fonction de nettoyage convertit les caractères spéciaux (apostrophes courbes, ligatures comme œ) en caractères standards pour éviter les erreurs de frappe injustifiées.
-
Validation visuelle : Le champ de saisie (
OutlinedTextField) utilise l'étatisErrorpour devenir rouge instantanément en cas de faute. -
Calcul des scores : À la fin de l'exercice, la vitesse est calculée comme suit :
$$WPM = \frac{(\text{Nombre de mots})}{\text{Durée en minutes}}$$
Un formulaire simple permettant d'étendre la bibliothèque de l'application. Les textes sont automatiquement classés dans la catégorie "textes personnalisées" et persistent en base de données.
Affiche l'historique des sessions sous forme de liste chronologique. Chaque session affiche la vitesse (WPM), la précision et l'identifiant du texte lié.
- Langage : Kotlin
- UI Framework : Jetpack Compose (Material 3)
- Base de données : Room SQLite
- Gestion des Threads : Kotlin Coroutines & Flow
- SDK Minimum : API 21+ (Android 5.0)