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.db.DatabaseController;
|
||||||
import fr.insa.clavardator.users.CurrentUser;
|
import fr.insa.clavardator.users.CurrentUser;
|
||||||
import fr.insa.clavardator.users.PeerUser;
|
import fr.insa.clavardator.users.PeerUser;
|
||||||
|
import fr.insa.clavardator.util.Log;
|
||||||
import javafx.application.Platform;
|
import javafx.application.Platform;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.Timer;
|
|
||||||
import java.util.TimerTask;
|
|
||||||
|
|
||||||
public class ChatHistory {
|
public class ChatHistory {
|
||||||
private final DatabaseController db;
|
private final DatabaseController db;
|
||||||
|
@ -28,10 +26,18 @@ public class ChatHistory {
|
||||||
historyListener.add(listener);
|
historyListener.add(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void removeHistoryLoadedListener(HistoryLoadedCallback listener) {
|
||||||
|
historyListener.remove(listener);
|
||||||
|
}
|
||||||
|
|
||||||
public void addMessageAddedListener(MessageAddedCallback listener) {
|
public void addMessageAddedListener(MessageAddedCallback listener) {
|
||||||
messageListener.add(listener);
|
messageListener.add(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void removeMessageAddedListener(MessageAddedCallback listener) {
|
||||||
|
messageListener.remove(listener);
|
||||||
|
}
|
||||||
|
|
||||||
private void notifyHistoryLoaded() {
|
private void notifyHistoryLoaded() {
|
||||||
historyListener.forEach(l -> l.onHistoryLoaded(user, history));
|
historyListener.forEach(l -> l.onHistoryLoaded(user, history));
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,32 +46,38 @@ public class ChatController implements Initializable {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRemoteUser(PeerUser remoteUser) {
|
public void setRemoteUser(PeerUser remoteUser) {
|
||||||
this.remoteUser = remoteUser;
|
|
||||||
this.chatFooterController.setRemoteUser(remoteUser);
|
this.chatFooterController.setRemoteUser(remoteUser);
|
||||||
this.chatHeaderController.setRemoteUser(remoteUser);
|
this.chatHeaderController.setRemoteUser(remoteUser);
|
||||||
setState(State.LOADING);
|
setState(State.LOADING);
|
||||||
|
|
||||||
|
if (this.remoteUser != null) {
|
||||||
|
final ChatHistory oldHistory = this.remoteUser.getHistory();
|
||||||
|
oldHistory.removeHistoryLoadedListener(onHistoryLoaded);
|
||||||
|
oldHistory.removeMessageAddedListener(onMessageAdded);
|
||||||
|
}
|
||||||
|
|
||||||
final ChatHistory history = remoteUser.getHistory();
|
final ChatHistory history = remoteUser.getHistory();
|
||||||
history.addHistoryLoadedListener(this::onHistoryLoaded);
|
history.addHistoryLoadedListener(onHistoryLoaded);
|
||||||
history.addMessageAddedListener(this::onMessageAdded);
|
history.addMessageAddedListener(onMessageAdded);
|
||||||
history.load();
|
history.load();
|
||||||
|
this.remoteUser = remoteUser;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onHistoryLoaded(PeerUser user, ArrayList<Message> messages) {
|
private final ChatHistory.HistoryLoadedCallback onHistoryLoaded = (PeerUser user, ArrayList<Message> messages) -> {
|
||||||
if (user.equals(remoteUser)) {
|
if (user.equals(remoteUser)) {
|
||||||
messageList.setItems(FXCollections.observableArrayList(messages));
|
messageList.setItems(FXCollections.observableArrayList(messages));
|
||||||
messageList.scrollTo(messageList.getItems().size() - 1);
|
messageList.scrollTo(messageList.getItems().size() - 1);
|
||||||
setState(State.DONE);
|
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());
|
Log.v(this.getClass().getSimpleName(), "Message added: " + message.getText());
|
||||||
Platform.runLater(() -> {
|
Platform.runLater(() -> {
|
||||||
messageList.getItems().add(message);
|
messageList.getItems().add(message);
|
||||||
messageList.scrollTo(messageList.getItems().size() - 1);
|
messageList.scrollTo(messageList.getItems().size() - 1);
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
private void setState(State state) {
|
private void setState(State state) {
|
||||||
switch (state) {
|
switch (state) {
|
||||||
|
|
Loading…
Reference in a new issue