diff --git a/src/main/java/fr/insa/clavardator/chat/ChatHistory.java b/src/main/java/fr/insa/clavardator/chat/ChatHistory.java index 490a75a..cde4d05 100644 --- a/src/main/java/fr/insa/clavardator/chat/ChatHistory.java +++ b/src/main/java/fr/insa/clavardator/chat/ChatHistory.java @@ -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)); } diff --git a/src/main/java/fr/insa/clavardator/ui/chat/ChatController.java b/src/main/java/fr/insa/clavardator/ui/chat/ChatController.java index addb641..c9effb7 100644 --- a/src/main/java/fr/insa/clavardator/ui/chat/ChatController.java +++ b/src/main/java/fr/insa/clavardator/ui/chat/ChatController.java @@ -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); + if (this.remoteUser != null) { + final ChatHistory oldHistory = this.remoteUser.getHistory(); + oldHistory.removeHistoryLoadedListener(onHistoryLoaded); + oldHistory.removeMessageAddedListener(onMessageAdded); + } + final ChatHistory history = remoteUser.getHistory(); - history.addHistoryLoadedListener(this::onHistoryLoaded); - history.addMessageAddedListener(this::onMessageAdded); + history.addHistoryLoadedListener(onHistoryLoaded); + history.addMessageAddedListener(onMessageAdded); history.load(); + this.remoteUser = remoteUser; } - private void onHistoryLoaded(PeerUser user, ArrayList messages) { + private final ChatHistory.HistoryLoadedCallback onHistoryLoaded = (PeerUser user, ArrayList 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) {