Fix message duplication with multiple users
This commit is contained in:
parent
73bf24fa81
commit
aed165108c
2 changed files with 23 additions and 11 deletions
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue