Travail 3 : Appli Android
But du travail
- Relier avec une libraire de BD
- Couche de service et tests unitaires
- Ajouter un tiroir de navigation avec options de suppressions des sujets et des votes
Git et suivi du code
Tu auras un lien GitHub Classroom pour le TP3. Tu pourras y copier ton TP2.
2 points Un minimum de 5 commits de tailles comparables (il n'y a pas un commit avec tout dedans et les autres vides) décrivant l'avancement du projet dans un français correct (passe Word). Ces points sont conditionnés à la remise d'au moins un commit par semaine de cours.
Librairie d'accès à la base de données
- Une librairie complète fournissant une base de données SQLite avec Room et ses méthodes est fournie sur Jitpack.
- Tu peux te référer à cette recette pour voir comment l'importer.
- Le documentation de la librairie est disponible ici
Pour tester, tu peux exécuter le code suivant depuis ton projet :
val database : SujetVoteDataBase = UtilitaireBD.get(this.applicationContext)
val dao : SujetVoteDAO = database.dao()
val sujet = Sujet()
sujet.contenu = "test"
dao.ajouterSujet(sujet)
Une fois le code exécuté, tu peux regarder la BD dans ton émulateur : View -> Tool Windows -> App Inspection -> Database Inspector
(puis double-clique sur la bd Sujet par exemple pour l'inspecter).
Classe de service
Pour la plupart des applications, il est recommandé de créer une classe de service pour y regrouper les règles de validation, tri, filtrage etc. Ce qu'on appelle parfois la logique applicative ou parfois la logique d'affaires.
1 point Créer une classe de service en changeant Dupont par ton nom en t'inspirant du fichier suivant:
class DupontService(db: SujetVoteDataBase) {
private val database : SujetVoteDataBase = db
private val dao : SujetVoteDAO = database.dao()
fun ajouterSujet(contenu: String){
// validation du contenu
if (contenu.length == 0){
throw IllegalArgumentException("Sujet vide")
}
if (contenu.length < 5){
throw IllegalArgumentException("Sujet trop court, 5 min")
}
val existant : Optional<Sujet> = dao.sujetParContenu(contenu)
if (existant.isPresent){
throw IllegalArgumentException("Sujet déjà existant")
}
// Tout va bien, on peut ajouter le sujet dans la BD
val sujet = Sujet()
sujet.contenu = contenu
dao.ajouterSujet(sujet)
}
fun ajouterVote(vote: Vote){
// TODO à faire plus des tests JUnit
throw UnsupportedOperationException()
}
fun listeSujets(): List<Sujet>{
throw UnsupportedOperationException()
}
fun moyenneVotes(id: Long): Double{
throw UnsupportedOperationException()
}
fun distributionVotes(id: Long): Map<Int, Int>{
throw UnsupportedOperationException()
}
fun supprimerTousLesSujets(){
throw UnsupportedOperationException()
}
fun supprimerTousLesVotes(){
throw UnsupportedOperationException()
}
fun sujetParId(id: Long): Sujet? {
throw UnsupportedOperationException()
}
}
Dans le reste du code, tu pourras l'utiliser en créant une instance du service:
val service : DupontService = DupontService(UtilitaireBD.get(this.getApplicationContext()))
service.ajouterSujet("Sujet 3")
Création d'un sujet
Le code ainsi que les tests pour la création d'un sujet sont fournis. Vous devez intégrer la création d'un sujet dans l'interface graphique.
- 1 point Un sujet est créé dans l'écran de création en utilisant le contenu du champ texte.
- 1 point Un message indiquant la raison de l'erreur est affiché si la création échoue ("sujet vide", "sujet trop court", "sujet existant").
Affichage de la liste des sujets
- 1 point Au niveau service, vous devez vous assurez de renvoyer la liste triée par nombre de votes descendant.
- 1 point Vous devez écrire les tests pour votre méthode de service.
- 2 points Vous devez intégrer la liste dans l'écran d'accueil de l'application.
Ajout d'un vote
- 2 points Au niveau service, vous devez vous assurez qu'il n'y a pas de vote existant pour ce sujet et cette personne. Assurez-vous de lancer une exception significative si c'est le cas. Vous devez également vous assurer que le nom du votant fait au minimum 4 caractères imprimables (pas des espaces).
- 1 point Vous devez écrire les tests pour votre méthode de service.
- 1 point Vous devez intégrer l'ajout d'un vote dans l'écran correspondant de l'interface graphique. Si le vote est créé avec succès, l'application doit revenir à l'écran d'accueil.
- 1 point Vous devez fournir un message significatif en cas d'erreur (déjà voté ou nom trop court ou vide).
Écran de résultats
- 1 point Niveau service, vous devez programmer les différentes méthodes pour la moyenne et la distribution.
- 2 points Vous devez écrire les tests pour vos méthodes de service.
- 2 points Vous devez intégrer les appels dans l'écran de résultats.
Tiroir de navigation
Vous devez implémenter un tiroir de navigation qui contient les options suivantes :
- 1 point Navigation vers la page d'accueil "Accueil"
- 1 point Navigation vers la page d'ajout d'un sujet "Ajouter un sujet"
- 0,5 point Suppression de tous les votes "Suppr. les votes". On doit retourner à la liste des sujets si on y est pas déjà.
- 0,5 point Suppression de toutes les sujets "Suppr. les sujets". On doit retourner à la liste des sujets si on y est pas déjà.
Autres éléments à considérer :
- 1 point Le tiroir de navigation doit être disponible dans toutes les activités
- 1 point Vous devez écrire les tests pour vos méthodes de service (suppression sujets et votes).
- 1 point L'interface doit se mettre à jour. L'ordre est mis à jour si on supprime les votes, la liste à l'écran est vidée si on supprime les sujets.
Fonctionnement global
5 points négatifs Fonctionnement correct et sans plantage. Ce pointage fonctionne en négatif. Si l'application fonctionne correctement en tout temps, vous conservez votre note. Dans le cas contraire, vous perdez des points avec un maximum de 5.
- Plantage de l'application -1 point
- Interface illisible -1 point
- Information affichée incohérente -1 point
- Autres cas...