Browse Source

Fix message duplication with multiple users

Arnaud Vergnet 3 years ago
parent
commit
aed165108c

+ 10
- 4
src/main/java/fr/insa/clavardator/chat/ChatHistory.java View File

@@ -3,12 +3,10 @@ package fr.insa.clavardator.chat;
3 3
 import fr.insa.clavardator.db.DatabaseController;
4 4
 import fr.insa.clavardator.users.CurrentUser;
5 5
 import fr.insa.clavardator.users.PeerUser;
6
+import fr.insa.clavardator.util.Log;
6 7
 import javafx.application.Platform;
7 8
 
8
-import java.util.ArrayList;
9
-import java.util.Date;
10
-import java.util.Timer;
11
-import java.util.TimerTask;
9
+import java.util.*;
12 10
 
13 11
 public class ChatHistory {
14 12
 	private final DatabaseController db;
@@ -28,10 +26,18 @@ public class ChatHistory {
28 26
 		historyListener.add(listener);
29 27
 	}
30 28
 
29
+	public void removeHistoryLoadedListener(HistoryLoadedCallback listener) {
30
+		historyListener.remove(listener);
31
+	}
32
+
31 33
 	public void addMessageAddedListener(MessageAddedCallback listener) {
32 34
 		messageListener.add(listener);
33 35
 	}
34 36
 
37
+	public void removeMessageAddedListener(MessageAddedCallback listener) {
38
+		messageListener.remove(listener);
39
+	}
40
+
35 41
 	private void notifyHistoryLoaded() {
36 42
 		historyListener.forEach(l -> l.onHistoryLoaded(user, history));
37 43
 	}

+ 13
- 7
src/main/java/fr/insa/clavardator/ui/chat/ChatController.java View File

@@ -46,32 +46,38 @@ public class ChatController implements Initializable {
46 46
 	}
47 47
 
48 48
 	public void setRemoteUser(PeerUser remoteUser) {
49
-		this.remoteUser = remoteUser;
50 49
 		this.chatFooterController.setRemoteUser(remoteUser);
51 50
 		this.chatHeaderController.setRemoteUser(remoteUser);
52 51
 		setState(State.LOADING);
53 52
 
53
+		if (this.remoteUser != null) {
54
+			final ChatHistory oldHistory = this.remoteUser.getHistory();
55
+			oldHistory.removeHistoryLoadedListener(onHistoryLoaded);
56
+			oldHistory.removeMessageAddedListener(onMessageAdded);
57
+		}
58
+
54 59
 		final ChatHistory history = remoteUser.getHistory();
55
-		history.addHistoryLoadedListener(this::onHistoryLoaded);
56
-		history.addMessageAddedListener(this::onMessageAdded);
60
+		history.addHistoryLoadedListener(onHistoryLoaded);
61
+		history.addMessageAddedListener(onMessageAdded);
57 62
 		history.load();
63
+		this.remoteUser = remoteUser;
58 64
 	}
59 65
 
60
-	private void onHistoryLoaded(PeerUser user, ArrayList<Message> messages) {
66
+	private final ChatHistory.HistoryLoadedCallback onHistoryLoaded = (PeerUser user, ArrayList<Message> messages) -> {
61 67
 		if (user.equals(remoteUser)) {
62 68
 			messageList.setItems(FXCollections.observableArrayList(messages));
63 69
 			messageList.scrollTo(messageList.getItems().size() - 1);
64 70
 			setState(State.DONE);
65 71
 		}
66
-	}
72
+	};
67 73
 
68
-	private void onMessageAdded(PeerUser user, Message message) {
74
+	private final ChatHistory.MessageAddedCallback onMessageAdded = (PeerUser user, Message message) -> {
69 75
 		Log.v(this.getClass().getSimpleName(), "Message added: " + message.getText());
70 76
 		Platform.runLater(() -> {
71 77
 			messageList.getItems().add(message);
72 78
 			messageList.scrollTo(messageList.getItems().size() - 1);
73 79
 		});
74
-	}
80
+	};
75 81
 
76 82
 	private void setState(State state) {
77 83
 		switch (state) {

Loading…
Cancel
Save