Fix message duplication with multiple users

This commit is contained in:
Arnaud Vergnet 2020-12-18 11:07:51 +01:00
parent 73bf24fa81
commit aed165108c
2 changed files with 23 additions and 11 deletions

View file

@ -3,12 +3,10 @@ package fr.insa.clavardator.chat;
import fr.insa.clavardator.db.DatabaseController;
import fr.insa.clavardator.users.CurrentUser;
import fr.insa.clavardator.users.PeerUser;
import fr.insa.clavardator.util.Log;
import javafx.application.Platform;
import java.util.ArrayList;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import java.util.*;
public class ChatHistory {
private final DatabaseController db;
@ -28,10 +26,18 @@ public class ChatHistory {
historyListener.add(listener);
}
public void removeHistoryLoadedListener(HistoryLoadedCallback listener) {
historyListener.remove(listener);
}
public void addMessageAddedListener(MessageAddedCallback listener) {
messageListener.add(listener);
}
public void removeMessageAddedListener(MessageAddedCallback listener) {
messageListener.remove(listener);
}
private void notifyHistoryLoaded() {
historyListener.forEach(l -> l.onHistoryLoaded(user, history));
}

View file

@ -46,32 +46,38 @@ public class ChatController implements Initializable {
}
public void setRemoteUser(PeerUser remoteUser) {
this.remoteUser = remoteUser;
this.chatFooterController.setRemoteUser(remoteUser);
this.chatHeaderController.setRemoteUser(remoteUser);
setState(State.LOADING);
final ChatHistory history = remoteUser.getHistory();
history.addHistoryLoadedListener(this::onHistoryLoaded);
history.addMessageAddedListener(this::onMessageAdded);
history.load();
if (this.remoteUser != null) {
final ChatHistory oldHistory = this.remoteUser.getHistory();
oldHistory.removeHistoryLoadedListener(onHistoryLoaded);
oldHistory.removeMessageAddedListener(onMessageAdded);
}
private void onHistoryLoaded(PeerUser user, ArrayList<Message> messages) {
final ChatHistory history = remoteUser.getHistory();
history.addHistoryLoadedListener(onHistoryLoaded);
history.addMessageAddedListener(onMessageAdded);
history.load();
this.remoteUser = remoteUser;
}
private final ChatHistory.HistoryLoadedCallback onHistoryLoaded = (PeerUser user, ArrayList<Message> messages) -> {
if (user.equals(remoteUser)) {
messageList.setItems(FXCollections.observableArrayList(messages));
messageList.scrollTo(messageList.getItems().size() - 1);
setState(State.DONE);
}
}
};
private void onMessageAdded(PeerUser user, Message message) {
private final ChatHistory.MessageAddedCallback onMessageAdded = (PeerUser user, Message message) -> {
Log.v(this.getClass().getSimpleName(), "Message added: " + message.getText());
Platform.runLater(() -> {
messageList.getItems().add(message);
messageList.scrollTo(messageList.getItems().size() - 1);
});
}
};
private void setState(State state) {
switch (state) {