Browse Source

Add ConnectionListener + improve network classes + first work on username change impl

Yohan Simard 3 years ago
parent
commit
b75cd6de1a

+ 2
- 0
.idea/clavardator.iml View File

@@ -0,0 +1,2 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<module type="JAVA_MODULE" version="4" />

+ 3
- 12
.idea/codeStyles/Project.xml View File

@@ -3,18 +3,9 @@
3 3
     <JetCodeStyleSettings>
4 4
       <option name="PACKAGES_TO_USE_STAR_IMPORTS">
5 5
         <value>
6
-          <package name="java.util" alias="false" withSubpackages="false" />
7
-          <package name="kotlinx.android.synthetic" alias="false" withSubpackages="true" />
8
-          <package name="io.ktor" alias="false" withSubpackages="true" />
9
-        </value>
10
-      </option>
11
-      <option name="PACKAGES_IMPORT_LAYOUT">
12
-        <value>
13
-          <package name="" alias="false" withSubpackages="true" />
14
-          <package name="java" alias="false" withSubpackages="true" />
15
-          <package name="javax" alias="false" withSubpackages="true" />
16
-          <package name="kotlin" alias="false" withSubpackages="true" />
17
-          <package name="" alias="true" withSubpackages="true" />
6
+          <package name="java.util" withSubpackages="false" static="false" />
7
+          <package name="kotlinx.android.synthetic" withSubpackages="true" static="false" />
8
+          <package name="io.ktor" withSubpackages="true" static="false" />
18 9
         </value>
19 10
       </option>
20 11
     </JetCodeStyleSettings>

+ 1
- 1
.idea/compiler.xml View File

@@ -1,6 +1,6 @@
1 1
 <?xml version="1.0" encoding="UTF-8"?>
2 2
 <project version="4">
3 3
   <component name="CompilerConfiguration">
4
-    <bytecodeTargetLevel target="11" />
4
+    <bytecodeTargetLevel target="14" />
5 5
   </component>
6 6
 </project>

+ 1
- 1
.idea/misc.xml View File

@@ -9,7 +9,7 @@
9 9
   <component name="FrameworkDetectionExcludesConfiguration">
10 10
     <file type="web" url="file://$PROJECT_DIR$" />
11 11
   </component>
12
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="11" project-jdk-type="JavaSDK">
12
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_14" default="true" project-jdk-name="11" project-jdk-type="JavaSDK">
13 13
     <output url="file://$PROJECT_DIR$/out" />
14 14
   </component>
15 15
 </project>

+ 7
- 3
src/main/java/fr/insa/clavardator/MainApp.java View File

@@ -12,6 +12,8 @@ import javafx.stage.Stage;
12 12
 
13 13
 public class MainApp extends Application {
14 14
 
15
+	NetDiscoverer netDiscoverer;
16
+
15 17
 	public static void main(String[] args) {
16 18
 		launch(args);
17 19
 	}
@@ -34,16 +36,18 @@ public class MainApp extends Application {
34 36
 		stage.setMaximized(true);
35 37
 		stage.show();
36 38
 
39
+		netDiscoverer = new NetDiscoverer();
40
+
37 41
 		// Network discovery test
38
-		NetDiscoverer.discoverActiveUsers("Broadcast",
42
+		netDiscoverer.discoverActiveUsers("Broadcast",
39 43
 				(ipAddr, data) -> System.out.println("User detected at address : " + ipAddr.toString()),
40 44
 				Throwable::printStackTrace);
41
-		NetDiscoverer.startDiscoveryListening("Yohan", null, Throwable::printStackTrace);
45
+		netDiscoverer.startDiscoveryListening("Yohan", null, Throwable::printStackTrace);
42 46
 	}
43 47
 
44 48
 	@Override
45 49
 	public void stop() throws Exception {
46
-		NetDiscoverer.stopDiscovery();
50
+		netDiscoverer.stopDiscovery();
47 51
 		super.stop();
48 52
 	}
49 53
 }

+ 6
- 3
src/main/java/fr/insa/clavardator/chat/Message.java View File

@@ -1,14 +1,13 @@
1 1
 package fr.insa.clavardator.chat;
2 2
 
3
-import fr.insa.clavardator.users.CurrentUser;
4 3
 import fr.insa.clavardator.users.User;
5 4
 
6 5
 import java.io.Serializable;
7 6
 
8 7
 public class Message implements Serializable {
9
-	private String text;
10
-	private final User recipient;
8
+	private final String text;
11 9
 	private final User sender;
10
+	private final User recipient;
12 11
 
13 12
 	public Message(User sender, User recipient) {
14 13
 		this(sender, recipient, "");
@@ -27,4 +26,8 @@ public class Message implements Serializable {
27 26
 	public User getSender() {
28 27
 		return sender;
29 28
 	}
29
+
30
+	public User getRecipient() {
31
+		return recipient;
32
+	}
30 33
 }

+ 67
- 0
src/main/java/fr/insa/clavardator/network/ConnectionListener.java View File

@@ -0,0 +1,67 @@
1
+package fr.insa.clavardator.network;
2
+
3
+import fr.insa.clavardator.users.ActiveUser;
4
+import fr.insa.clavardator.util.ErrorCallback;
5
+
6
+import java.io.IOException;
7
+import java.net.ServerSocket;
8
+import java.net.Socket;
9
+
10
+public class ConnectionListener {
11
+	Acceptor acceptor = null;
12
+
13
+	ConnectionListener() {
14
+	}
15
+
16
+	public void acceptConnection(NewConnectionCallback callback, ErrorCallback errorCallback) {
17
+		if (acceptor != null) {
18
+			acceptor.stopAccepting();
19
+		}
20
+		acceptor = new Acceptor(callback, errorCallback);
21
+	}
22
+
23
+	public void stopAccepting() {
24
+		acceptor.stopAccepting();
25
+	}
26
+
27
+
28
+	private static class Acceptor extends Thread {
29
+		private boolean shouldStop = false;
30
+		NewConnectionCallback callback;
31
+		ErrorCallback errorCallback;
32
+		ServerSocket server;
33
+
34
+		public Acceptor(NewConnectionCallback callback, ErrorCallback errorCallback) {
35
+			this.callback = callback;
36
+			this.errorCallback = errorCallback;
37
+		}
38
+
39
+		@Override
40
+		public void run() {
41
+			try {
42
+				server = new ServerSocket(PeerConnection.TCP_PORT);
43
+				while (!shouldStop) {
44
+					Socket clientSocket = server.accept();
45
+					ActiveUser newUser = new ActiveUser(clientSocket);
46
+					callback.onNewConnection(newUser);
47
+				}
48
+			} catch (IOException e) {
49
+				errorCallback.onError(e);
50
+			}
51
+
52
+		}
53
+
54
+		public void stopAccepting() {
55
+			shouldStop = true;
56
+			try {
57
+				server.close();
58
+			} catch (IOException ignored) {
59
+			}
60
+		}
61
+	}
62
+
63
+
64
+	interface NewConnectionCallback {
65
+		void onNewConnection(ActiveUser user);
66
+	}
67
+}

+ 49
- 29
src/main/java/fr/insa/clavardator/network/NetDiscoverer.java View File

@@ -16,11 +16,12 @@ public class NetDiscoverer {
16 16
 	private static final int BROADCAST_BUFFER_SIZE = 50;
17 17
 	private static final int RESPONSE_BUFFER_SIZE = 50;
18 18
 
19
-	private static DatagramSocket broadcastListener;
20
-	private static DatagramSocket responseListener;
21
-	private static boolean shouldStop = false;
19
+	private BroadcastSender broadcastSender;
20
+	private BroadcastListener socket;
21
+	private ResponseSender responseSender;
22
+	private ResponseListener responseListener;
22 23
 
23
-	private NetDiscoverer() {
24
+	public NetDiscoverer() {
24 25
 	}
25 26
 
26 27
 	/**
@@ -30,11 +31,13 @@ public class NetDiscoverer {
30 31
 	 * @param callback         function to call when a new user is discovered
31 32
 	 * @param errorCallback    function to call on error
32 33
 	 */
33
-	public static void discoverActiveUsers(String broadcastMessage, ResponseReceivedCallback callback, ErrorCallback errorCallback) {
34
-		ResponseListener receiver = new ResponseListener(callback, errorCallback);
35
-		BroadcastSender sender = new BroadcastSender(broadcastMessage, errorCallback);
36
-		receiver.start();
37
-		sender.start();
34
+	public void discoverActiveUsers(String broadcastMessage, ResponseReceivedCallback callback, ErrorCallback errorCallback) {
35
+		if (responseListener != null)
36
+			responseListener.stopListening();
37
+		responseListener = new ResponseListener(callback, errorCallback);
38
+		broadcastSender = new BroadcastSender(broadcastMessage, errorCallback);
39
+		responseListener.start();
40
+		broadcastSender.start();
38 41
 	}
39 42
 
40 43
 	/**
@@ -44,29 +47,31 @@ public class NetDiscoverer {
44 47
 	 * @param onBroadcastReceived The function to call on success
45 48
 	 * @param errorCallback       The function to call on error
46 49
 	 */
47
-	public static void startDiscoveryListening(String responseMessage, @Nullable BroadcastReceivedCallback onBroadcastReceived, @Nullable ErrorCallback errorCallback) {
48
-		BroadcastListener listener = new BroadcastListener((ipAddr, data) -> {
50
+	public void startDiscoveryListening(String responseMessage, @Nullable BroadcastReceivedCallback onBroadcastReceived, @Nullable ErrorCallback errorCallback) {
51
+		if (socket != null)
52
+			socket.stopListening();
53
+
54
+		socket = new BroadcastListener((ipAddr, data) -> {
49 55
 			if (onBroadcastReceived != null)
50 56
 				onBroadcastReceived.onBroadcastReceived(ipAddr, data);
51
-			ResponseSender sender = new ResponseSender(ipAddr, responseMessage, errorCallback);
52
-			sender.start();
57
+			responseSender = new ResponseSender(ipAddr, responseMessage, errorCallback);
58
+			responseSender.start();
53 59
 		}, e -> {
54 60
 			if (errorCallback != null)
55 61
 				errorCallback.onError(e);
56 62
 		});
57 63
 
58
-		listener.start();
64
+		socket.start();
59 65
 	}
60 66
 
61 67
 	/**
62 68
 	 * Stop network discovery and listening
63 69
 	 */
64
-	public static void stopDiscovery() {
65
-		shouldStop = true;
66
-		if (broadcastListener != null)
67
-			broadcastListener.close();
70
+	public void stopDiscovery() {
71
+		if (socket != null)
72
+			socket.stopListening();
68 73
 		if (responseListener != null)
69
-			responseListener.close();
74
+			responseListener.stopListening();
70 75
 	}
71 76
 
72 77
 
@@ -105,6 +110,8 @@ public class NetDiscoverer {
105 110
 	private static class BroadcastListener extends Thread {
106 111
 		private final BroadcastReceivedCallback callback;
107 112
 		private final ErrorCallback errorCallback;
113
+		private DatagramSocket socket;
114
+		private boolean shouldStop = false;
108 115
 
109 116
 		/**
110 117
 		 * Constructs a thread that sends a broadcast over the network, using all available interfaces
@@ -121,15 +128,15 @@ public class NetDiscoverer {
121 128
 		public void run() {
122 129
 			try {
123 130
 				while (!shouldStop) {
124
-					broadcastListener = new DatagramSocket(null);
125
-					broadcastListener.setOption(StandardSocketOptions.SO_REUSEPORT, true);
126
-					broadcastListener.setOption(StandardSocketOptions.SO_REUSEADDR, true);
127
-					broadcastListener.bind(new InetSocketAddress((InetAddress) null, DISCOVERY_PORT));
131
+					socket = new DatagramSocket(null);
132
+					socket.setOption(StandardSocketOptions.SO_REUSEPORT, true);
133
+					socket.setOption(StandardSocketOptions.SO_REUSEADDR, true);
134
+					socket.bind(new InetSocketAddress((InetAddress) null, DISCOVERY_PORT));
128 135
 
129 136
 					byte[] buffer = new byte[BROADCAST_BUFFER_SIZE];
130 137
 					DatagramPacket receivedPacket = new DatagramPacket(buffer, BROADCAST_BUFFER_SIZE);
131 138
 
132
-					broadcastListener.receive(receivedPacket);
139
+					socket.receive(receivedPacket);
133 140
 //					System.out.println("broadcast received from " + receivedPacket.getAddress().toString());
134 141
 					callback.onBroadcastReceived(receivedPacket.getAddress(), new String(receivedPacket.getData()));
135 142
 				}
@@ -139,6 +146,11 @@ public class NetDiscoverer {
139 146
 				}
140 147
 			}
141 148
 		}
149
+
150
+		public void stopListening() {
151
+			shouldStop = true;
152
+			socket.close();
153
+		}
142 154
 	}
143 155
 
144 156
 	private static class ResponseSender extends Thread {
@@ -175,6 +187,8 @@ public class NetDiscoverer {
175 187
 	private static class ResponseListener extends Thread {
176 188
 		private final ResponseReceivedCallback callback;
177 189
 		private final ErrorCallback errorCallback;
190
+		private DatagramSocket socket;
191
+		private boolean shouldStop = false;
178 192
 
179 193
 		/**
180 194
 		 * Constructs a thread that receives all UDP responses, until stopDiscovery() is called
@@ -191,14 +205,14 @@ public class NetDiscoverer {
191 205
 		public void run() {
192 206
 			try {
193 207
 				while (!shouldStop) {
194
-					responseListener = new DatagramSocket(null);
195
-					responseListener.setOption(StandardSocketOptions.SO_REUSEPORT, true);
196
-					responseListener.setOption(StandardSocketOptions.SO_REUSEADDR, true);
197
-					responseListener.bind(new InetSocketAddress((InetAddress) null, RESPONSE_PORT));
208
+					socket = new DatagramSocket(null);
209
+					socket.setOption(StandardSocketOptions.SO_REUSEPORT, true);
210
+					socket.setOption(StandardSocketOptions.SO_REUSEADDR, true);
211
+					socket.bind(new InetSocketAddress((InetAddress) null, RESPONSE_PORT));
198 212
 
199 213
 					byte[] buffer = new byte[RESPONSE_BUFFER_SIZE];
200 214
 					DatagramPacket receivedPacket = new DatagramPacket(buffer, RESPONSE_BUFFER_SIZE);
201
-					responseListener.receive(receivedPacket);
215
+					socket.receive(receivedPacket);
202 216
 //					System.out.println("response received from " + receivedPacket.getAddress().toString());
203 217
 					callback.onResponseReceived(receivedPacket.getAddress(), new String(receivedPacket.getData()));
204 218
 				}
@@ -208,6 +222,12 @@ public class NetDiscoverer {
208 222
 				}
209 223
 			}
210 224
 		}
225
+
226
+		public void stopListening() {
227
+			shouldStop = true;
228
+			socket.close();
229
+		}
230
+
211 231
 	}
212 232
 
213 233
 

+ 28
- 16
src/main/java/fr/insa/clavardator/network/PeerConnection.java View File

@@ -1,6 +1,5 @@
1 1
 package fr.insa.clavardator.network;
2 2
 
3
-import fr.insa.clavardator.chat.Message;
4 3
 import fr.insa.clavardator.util.ErrorCallback;
5 4
 import org.jetbrains.annotations.NotNull;
6 5
 import org.jetbrains.annotations.Nullable;
@@ -13,13 +12,21 @@ import java.net.InetAddress;
13 12
 import java.net.Socket;
14 13
 
15 14
 public class PeerConnection {
16
-	public static final short PORT = 31598;
15
+	public static final short TCP_PORT = 31598;
17 16
 
17
+	Socket socket;
18 18
 	private final ObjectOutputStream outputStream;
19 19
 	private final ObjectInputStream inputStream;
20
+	private boolean shouldStop = false;
20 21
 
21 22
 	public PeerConnection(InetAddress ipAddr) throws IOException {
22
-		Socket socket = new Socket(ipAddr, PORT);
23
+		socket = new Socket(ipAddr, TCP_PORT);
24
+		outputStream = new ObjectOutputStream(socket.getOutputStream());
25
+		inputStream = new ObjectInputStream(socket.getInputStream());
26
+	}
27
+
28
+	public PeerConnection(Socket socket) throws IOException {
29
+		this.socket = socket;
23 30
 		outputStream = new ObjectOutputStream(socket.getOutputStream());
24 31
 		inputStream = new ObjectInputStream(socket.getInputStream());
25 32
 	}
@@ -31,22 +38,30 @@ public class PeerConnection {
31 38
 	 * @param callback      The function to call on success
32 39
 	 * @param errorCallback The function to call on error
33 40
 	 */
34
-	public void sendMessage(Message message, MessageSentCallback callback, ErrorCallback errorCallback) {
41
+	public void send(Serializable message, MessageSentCallback callback, ErrorCallback errorCallback) {
35 42
 		Sender sender = new Sender(message, callback, errorCallback);
36 43
 		sender.start();
37 44
 	}
38 45
 
39 46
 	/**
40
-	 * Receives a message from the peer
47
+	 * Subscibe to all incoming messages from the peer
41 48
 	 *
42
-	 * @param callback      The function to call on success
49
+	 * @param callback      The function to call when a message is received
43 50
 	 * @param errorCallback The function to call on error
44 51
 	 */
45
-	public void receiveMessage(MessageReceivedCallback callback, ErrorCallback errorCallback) {
52
+	public void receive(MessageReceivedCallback callback, ErrorCallback errorCallback) {
46 53
 		Receiver receiver = new Receiver(callback, errorCallback);
47 54
 		receiver.start();
48 55
 	}
49 56
 
57
+	public void close() {
58
+		shouldStop = true;
59
+		try {
60
+			socket.close();
61
+		} catch (IOException ignored) {
62
+		}
63
+	}
64
+
50 65
 
51 66
 	private class Sender extends Thread {
52 67
 		private final Serializable message;
@@ -73,7 +88,7 @@ public class PeerConnection {
73 88
 				if (callback != null)
74 89
 					callback.onMessageSent();
75 90
 			} catch (IOException e) {
76
-				if (errorCallback != null)
91
+				if (errorCallback != null && !shouldStop)
77 92
 					errorCallback.onError(e);
78 93
 			}
79 94
 		}
@@ -83,6 +98,7 @@ public class PeerConnection {
83 98
 		private final MessageReceivedCallback callback;
84 99
 		private final ErrorCallback errorCallback;
85 100
 
101
+
86 102
 		/**
87 103
 		 * Constructs a thread that receives a message using the socket of the outer class
88 104
 		 *
@@ -97,15 +113,11 @@ public class PeerConnection {
97 113
 		@Override
98 114
 		public void run() {
99 115
 			try {
100
-				Object msg = inputStream.readObject();
101
-				if (msg.getClass().isInstance(Message.class)) {
102
-					callback.onMessageReceived((Message) msg);
103
-				} else {
104
-					if (errorCallback != null)
105
-						errorCallback.onError(new ClassCastException("The message received is not a valid Message object"));
116
+				while(!shouldStop) {
117
+					callback.onMessageReceived(inputStream.readObject());
106 118
 				}
107 119
 			} catch (IOException | ClassNotFoundException e) {
108
-				if (errorCallback != null)
120
+				if (errorCallback != null && !shouldStop)
109 121
 					errorCallback.onError(e);
110 122
 			}
111 123
 		}
@@ -113,7 +125,7 @@ public class PeerConnection {
113 125
 
114 126
 
115 127
 	public interface MessageReceivedCallback {
116
-		void onMessageReceived(Message msg);
128
+		void onMessageReceived(Object msg);
117 129
 	}
118 130
 
119 131
 	public interface MessageSentCallback {

+ 42
- 8
src/main/java/fr/insa/clavardator/users/ActiveUser.java View File

@@ -2,33 +2,67 @@ package fr.insa.clavardator.users;
2 2
 
3 3
 import fr.insa.clavardator.chat.Message;
4 4
 import fr.insa.clavardator.network.PeerConnection;
5
+import fr.insa.clavardator.util.ErrorCallback;
5 6
 
6 7
 import java.io.IOException;
7 8
 import java.net.InetAddress;
9
+import java.net.Socket;
8 10
 
9 11
 
10 12
 public class ActiveUser extends PeerUser {
11 13
 
12
-	private transient PeerConnection connection;
14
+	private final transient PeerConnection connection;
13 15
 
16
+	/**
17
+	 * Creates an active user and connects to him/her
18
+	 * @param username The username of the new user
19
+	 * @param ipAddr    The IP address of the new user
20
+	 * @throws IOException when an error occurs during the connection
21
+	 */
14 22
 	public ActiveUser(String username, InetAddress ipAddr) throws IOException {
15 23
 		super(username);
16 24
 		connection = new PeerConnection(ipAddr);
25
+		subscibeToMessages();
26
+		connection.send(new UsernameChange("", "currentUser.username"), null, null); // TODO: get currentUser + error handling
17 27
 	}
18 28
 
19
-	/**
20
-	 * @param message
21
-	 */
22
-	public void sendMessage(Message message) {
23
-//		connection.sendMessage(message);
29
+	public ActiveUser(Socket socket) throws IOException {
30
+		super("");
31
+		connection = new PeerConnection(socket);
32
+		subscibeToMessages();
24 33
 	}
25 34
 
35
+	private void subscibeToMessages() {
36
+		connection.receive(
37
+				msg -> {
38
+					if (msg.getClass().isInstance(UsernameChange.class)) {
39
+						setUsername(((UsernameChange)msg).getNewUsername());
40
+
41
+					} else if (msg.getClass().isInstance(Message.class)) {
42
+						// TODO
43
+					}
44
+				},
45
+				error -> {
46
+					// TODO
47
+				});
48
+	}
26 49
 
27 50
 	/**
28
-	 * @param message
51
+	 * Sends a message to this peer
52
+	 * @param message The message to send
53
+	 * @param callback The function to call when the message is sent
54
+	 * @param errorCallback The function to call on error
29 55
 	 */
30
-	public void onMessageSent(Message message) {
56
+	public void sendMessage(Message message, PeerConnection.MessageSentCallback callback, ErrorCallback errorCallback) {
57
+		connection.send(message, callback, errorCallback);
31 58
 	}
32 59
 
60
+	/**
61
+	 * Closes the connection with the user.
62
+	 * Must be called before exiting the app.
63
+	 */
64
+	public void destroy() {
65
+		connection.close();
66
+	}
33 67
 
34 68
 }

+ 0
- 11
src/main/java/fr/insa/clavardator/users/CurrentUser.java View File

@@ -1,18 +1,7 @@
1 1
 package fr.insa.clavardator.users;
2 2
 
3 3
 public class CurrentUser extends User {
4
-
5 4
 	public CurrentUser(String username, UserList userList) {
6 5
 		super(username);
7 6
 	}
8
-
9
-	/**
10
-	 * @param username
11
-	 */
12
-	public void changeUsername(String username) {
13
-		pcs.firePropertyChange("username", this.username, username);
14
-		this.username = username;
15
-	}
16
-
17
-
18 7
 }

+ 6
- 3
src/main/java/fr/insa/clavardator/users/User.java View File

@@ -22,13 +22,16 @@ public class User implements Serializable, Comparable<User> {
22 22
 		this.username = username;
23 23
 	}
24 24
 
25
-	/**
26
-	 * @return the current value of username
27
-	 */
25
+
28 26
 	public String getUsername() {
29 27
 		return username;
30 28
 	}
31 29
 
30
+	protected void setUsername(String newUsername) {
31
+		pcs.firePropertyChange("username", this.username, newUsername);
32
+		this.username = newUsername;
33
+	}
34
+
32 35
 
33 36
 	@Override
34 37
 	public int compareTo(@NotNull User o) {

+ 14
- 1
src/main/java/fr/insa/clavardator/users/UserList.java View File

@@ -15,6 +15,7 @@ public class UserList {
15 15
 	private ArrayList<ActiveUser> activeUsers;
16 16
 	private ArrayList<PeerUser> inactiveUsers;
17 17
 	private final DatabaseController db = new DatabaseController();
18
+	private final NetDiscoverer netDiscoverer = new NetDiscoverer();
18 19
 
19 20
 	// Make this class observable
20 21
 	private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
@@ -29,6 +30,18 @@ public class UserList {
29 30
 	}
30 31
 
31 32
 	/**
33
+	 * Close all running threads, sockets and db connection
34
+	 * Must be called before exiting the app
35
+	 */
36
+	public void destroy() {
37
+		netDiscoverer.stopDiscovery();
38
+//		db.close();
39
+		for (ActiveUser user : activeUsers) {
40
+			user.destroy();
41
+		}
42
+	}
43
+
44
+	/**
32 45
 	 * @param username
33 46
 	 * @return boolean
34 47
 	 */
@@ -50,7 +63,7 @@ public class UserList {
50 63
 	 *
51 64
 	 */
52 65
 	public void discoverActiveUsers(ErrorCallback errorCallback) {
53
-		NetDiscoverer.discoverActiveUsers("CLAVARDATOR_BROADCAST", (ipAddr, data) -> {
66
+		netDiscoverer.discoverActiveUsers("CLAVARDATOR_BROADCAST", (ipAddr, data) -> {
54 67
 			ActiveUser newUser = null;
55 68
 			try {
56 69
 				newUser = new ActiveUser("", ipAddr);  // TODO find username

+ 21
- 0
src/main/java/fr/insa/clavardator/users/UsernameChange.java View File

@@ -0,0 +1,21 @@
1
+package fr.insa.clavardator.users;
2
+
3
+import java.io.Serializable;
4
+
5
+public class UsernameChange implements Serializable {
6
+	private final String prevUsername; // Not sure if this is useful
7
+	private final String newUsername;
8
+
9
+	public UsernameChange(String previousUsername, String newUsername) {
10
+		this.prevUsername = previousUsername;
11
+		this.newUsername = newUsername;
12
+	}
13
+
14
+	public String getPreviousUsername() {
15
+		return prevUsername;
16
+	}
17
+
18
+	public String getNewUsername() {
19
+		return newUsername;
20
+	}
21
+}

Loading…
Cancel
Save