Précédemment, nous avons implémenté notre chat ainsi que toute son interface graphique. D'ailleurs, le résultat est plutôt sympa !
En revanche, nos utilisateurs ne peuvent toujours pas envoyer des messages... Remédions tout de suite à ce problème !
Ajoutez un message sur le Firestore
Afin que nos utilisateurs puissent réellement utiliser notre chat, et donc commencer à s'envoyer des messages entre eux, nous devons créer la requête correspondante sur le Firestore. Pour cela, reprenez la classe ChatRepository et modifiez-la comme ce qui suit.
Extrait de ChatRepository :
public final class ChatRepository {
private UserManager userManager;
private ChatRepository() { this.userManager = UserManager.getInstance(); }
...
public void createMessageForChat(String textMessage, String chat){
userManager.getUserData().addOnSuccessListener(user -> {
// Create the Message object
Message message = new Message(textMessage, user);
// Store Message to Firestore
this.getChatCollection()
.document(chat)
.collection(MESSAGE_COLLECTION)
.add(message);
});
}
}
Explications : Nous avons créé une méthode createMessageForChat()
dont l'objectif est de créer un message puis de le sauvegarder dans notre base de données.
Pour cela, nous avons besoin de l'UserManager afin de récupérer les informations de l'user actuellement connecté.
Dans un premier temps, nous créons un objet Message , composé d'un texte ainsi que d'un objet User correspondant à l'utilisateur qui a créé le message. Une fois l'objet Message créé, nous allons le sauvegarder dans la Collection Racine "chats" puis dans un Document dédié (Android, Firebase ou Bug) et enfin dans la Sous-Collection "messages".
Grâce à la méthode add()
appliquée directement sur une Collection, Firestore s'occupera d'ajouter un identifiant unique à notre message.
Nous devons encore modifier notre ChatManager avant de s'occuper de l'ui :
Extrait de ChatManager :
public class ChatManager {
...
public void createMessageForChat(String message, String chat){
chatRepository.createMessageForChat(message, chat);
}
}
Explications : Comme d'habitude notre manager appelle simplement notre repository afin de créer et sauvegarder le message en base de données.
Modifions maintenant notre activité MentorChatActivity afin d'exécuter cette requête quand un utilisateur clique sur le bouton "Envoyer".
Extrait de MentorChatActivity :
public class MentorChatActivity extends BaseActivity<ActivityMentorChatBinding> implements MentorChatAdapter.Listener {
...
private void setupListeners(){
// Send button
binding.sendButton.setOnClickListener(view -> { sendMessage(); });
...
}
...
private void sendMessage(){
// Check if user can send a message (Text not null + user logged)
boolean canSendMessage = !TextUtils.isEmpty(binding.chatEditText.getText()) && userManager.isCurrentUserLogged();
if (canSendMessage){
// Create a new message for the chat
chatManager.createMessageForChat(binding.chatEditText.getText().toString(), this.currentChatName);
// Reset text field
binding.chatEditText.setText("");
}
}
...
}
Explications : Nous implémentons ici le code qui sera appelé lors du clic de l'utilisateur sur le bouton "Envoyer".
Premièrement, nous vérifions si l'EditText contient bien du texte et si l'utilisateur actuel n'est pas vide également.
Puis, nous exécutons notre méthode via notre ChatManager qui appellera notre ChatRepository qui lancera la requête de création de message sur le Firestore.
Et enfin, nous effaçons le contenu de l'EditText pour des soucis esthétiques.
Essayez maintenant l'application !
Envoyez des messages depuis plusieurs comptes utilisateurs sur plusieurs chats, changez les paramètres de l'utilisateur (si il est mentor ou pas) et admirez le résultat.
Vous devriez également voir des nouveaux Documents créés depuis la console web de Firebase.
Votre mini-application FirebaseOC commence à devenir un peu "volumineuse" n'est-ce pas ?
Profitez donc de ce chapitre assez court pour relire l'ensemble de votre code et tenter de le comprendre un maximum.
N'hésitez pas à vous imprégner du code, à le modifier et pourquoi pas à l'améliorer... Appropriez-le vous, c'est très important. Practice Makes Perfect !
En résumé
L'envoi de messages dans la base de données fonctionne comme l'enregistrement d'un user, avec un format différent.
Pensez aux règles de votre chat avant d'envoyer un message sur Firestore (que celui-ci ne soit pas vide par exemple).