improve new user detection
This commit is contained in:
parent
ea311fbecb
commit
e6ab61a49c
2 changed files with 43 additions and 63 deletions
|
@ -59,13 +59,8 @@ public class UserListController implements Initializable {
|
||||||
Platform.runLater(() -> peerUserListView.getItems().add(user));
|
Platform.runLater(() -> peerUserListView.getItems().add(user));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onUserDisconnected(PeerUser user) {
|
|
||||||
Log.v(this.getClass().getSimpleName(), "Remove user from UI");
|
|
||||||
Platform.runLater(() -> peerUserListView.getItems().remove(user));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUserList(UserList userList) {
|
public void setUserList(UserList userList) {
|
||||||
this.userList = userList;
|
this.userList = userList;
|
||||||
userList.addActiveUsersObserver(this::onUserConnected, this::onUserDisconnected);
|
userList.addNewUserObserver(this::onUserConnected);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -19,8 +19,7 @@ public class UserList {
|
||||||
private final Map<Integer, PeerUser> inactiveUsers = new HashMap<>();
|
private final Map<Integer, PeerUser> inactiveUsers = new HashMap<>();
|
||||||
private final Map<Integer, PeerUser> activeUsers = new HashMap<>();
|
private final Map<Integer, PeerUser> activeUsers = new HashMap<>();
|
||||||
|
|
||||||
private final ArrayList<UserConnectionCallback> userConnectionObservers = new ArrayList<>();
|
private final ArrayList<UserConnectionCallback> newUsersObservers = new ArrayList<>();
|
||||||
private final ArrayList<UserDisconnectionCallback> userDisconnectionObservers = new ArrayList<>();
|
|
||||||
|
|
||||||
private final DatabaseController db = new DatabaseController();
|
private final DatabaseController db = new DatabaseController();
|
||||||
private final NetDiscoverer netDiscoverer = new NetDiscoverer();
|
private final NetDiscoverer netDiscoverer = new NetDiscoverer();
|
||||||
|
@ -33,30 +32,19 @@ public class UserList {
|
||||||
* Discover all active users over the network. Observers are notified for each user discovered.
|
* Discover all active users over the network. Observers are notified for each user discovered.
|
||||||
*
|
*
|
||||||
* @param errorCallback The function to call on error
|
* @param errorCallback The function to call on error
|
||||||
* @see UserList#addActiveUsersObserver(UserConnectionCallback, UserDisconnectionCallback)
|
* @see UserList#addNewUserObserver(UserConnectionCallback)
|
||||||
*/
|
*/
|
||||||
public void discoverActiveUsers(ErrorCallback errorCallback) {
|
public void discoverActiveUsers(ErrorCallback errorCallback) {
|
||||||
netDiscoverer.discoverActiveUsers("CLAVARDATOR_BROADCAST", (ipAddr, data) -> {
|
netDiscoverer.discoverActiveUsers("CLAVARDATOR_BROADCAST", (ipAddr, data) -> {
|
||||||
int id = getIdFromIp(ipAddr);
|
int id = getIdFromIp(ipAddr);
|
||||||
Log.v(this.getClass().getSimpleName(), "Discovered new user: " + id);
|
Log.v(this.getClass().getSimpleName(), "Discovered new user: " + id);
|
||||||
|
final PeerUser finalUser = createNewUser(id);
|
||||||
// If already connected, do not modify
|
if (finalUser != null) {
|
||||||
if (activeUsers.containsKey(id)) {
|
finalUser.connect(ipAddr, () -> {
|
||||||
return;
|
notifyNewUserObservers(finalUser);
|
||||||
|
finalUser.addObserver(evt -> userChangeObserver(finalUser, evt));
|
||||||
|
}, errorCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
PeerUser user = inactiveUsers.get(id);
|
|
||||||
if (user == null) {
|
|
||||||
// Username is set on TCP connection start
|
|
||||||
user = new PeerUser(id, "");
|
|
||||||
inactiveUsers.put(id, user);
|
|
||||||
}
|
|
||||||
PeerUser finalUser = user;
|
|
||||||
user.connect(ipAddr, () -> {
|
|
||||||
notifyConnectionObservers(finalUser);
|
|
||||||
finalUser.addObserver(evt -> userChangeObserver(finalUser, evt));
|
|
||||||
}, errorCallback);
|
|
||||||
|
|
||||||
}, errorCallback);
|
}, errorCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,32 +56,39 @@ public class UserList {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startUserListening(ErrorCallback errorCallback) {
|
public void startUserListening(ErrorCallback errorCallback) {
|
||||||
connectionListener.acceptConnection(clientSocket -> {
|
connectionListener.acceptConnection(
|
||||||
int id = getIdFromIp(clientSocket.getInetAddress());
|
(clientSocket) -> {
|
||||||
Log.v(this.getClass().getSimpleName(), "new connection from user: " + id);
|
int id = getIdFromIp(clientSocket.getInetAddress());
|
||||||
|
Log.v(this.getClass().getSimpleName(), "new connection from user: " + id);
|
||||||
|
final PeerUser finalUser = createNewUser(id);
|
||||||
|
if (finalUser != null) {
|
||||||
|
finalUser.connect(clientSocket, () -> {
|
||||||
|
notifyNewUserObservers(finalUser);
|
||||||
|
finalUser.addObserver(evt -> userChangeObserver(finalUser, evt));
|
||||||
|
}, errorCallback);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
errorCallback);
|
||||||
|
}
|
||||||
|
|
||||||
// If already connected, warn and return
|
private PeerUser createNewUser(int id) {
|
||||||
if (activeUsers.containsKey(id)) {
|
// If already connected, warn and return
|
||||||
Log.w(getClass().getSimpleName(), "An already connected user tried to initiate a new connection: user id " + id);
|
if (activeUsers.containsKey(id)) {
|
||||||
return;
|
Log.w(getClass().getSimpleName(),
|
||||||
}
|
"An already connected user tried to initiate a new connection: user id " + id);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
// Get the user if already existing
|
// Get the user if already existing
|
||||||
PeerUser user = inactiveUsers.get(id);
|
PeerUser user = inactiveUsers.get(id);
|
||||||
// else create it
|
// else create it
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
// Username is set on TCP connection start
|
// Username is set on TCP connection start
|
||||||
user = new PeerUser(id, "");
|
user = new PeerUser(id, "");
|
||||||
inactiveUsers.put(id, user);
|
inactiveUsers.put(id, user);
|
||||||
}
|
}
|
||||||
|
|
||||||
PeerUser finalUser = user;
|
return user;
|
||||||
user.connect(clientSocket, () -> {
|
|
||||||
notifyConnectionObservers(finalUser);
|
|
||||||
finalUser.addObserver(evt -> userChangeObserver(finalUser, evt));
|
|
||||||
}, errorCallback);
|
|
||||||
|
|
||||||
}, errorCallback);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void userChangeObserver(PeerUser user, PropertyChangeEvent evt) {
|
private void userChangeObserver(PeerUser user, PropertyChangeEvent evt) {
|
||||||
|
@ -117,11 +112,8 @@ public class UserList {
|
||||||
|
|
||||||
inactiveUsers.remove(id);
|
inactiveUsers.remove(id);
|
||||||
activeUsers.put(id, user);
|
activeUsers.put(id, user);
|
||||||
notifyConnectionObservers(user);
|
|
||||||
Log.v(getClass().getSimpleName(), "State of user " + id + " updated from " +
|
Log.v(getClass().getSimpleName(), "State of user " + id + " updated from " +
|
||||||
oldState.toString() + " to " + newState.toString());
|
oldState.toString() + " to " + newState.toString());
|
||||||
|
|
||||||
|
|
||||||
} else if (oldState == PeerUser.State.CONNECTED &&
|
} else if (oldState == PeerUser.State.CONNECTED &&
|
||||||
(newState == PeerUser.State.DISCONNECTED || newState == PeerUser.State.CONNECTING)) {
|
(newState == PeerUser.State.DISCONNECTED || newState == PeerUser.State.CONNECTING)) {
|
||||||
// Disconnection
|
// Disconnection
|
||||||
|
@ -136,25 +128,18 @@ public class UserList {
|
||||||
|
|
||||||
activeUsers.remove(id);
|
activeUsers.remove(id);
|
||||||
inactiveUsers.put(id, user);
|
inactiveUsers.put(id, user);
|
||||||
notifyDisconnectionObservers(user);
|
|
||||||
|
|
||||||
Log.v(getClass().getSimpleName(), "State of user " + id + " updated from " +
|
Log.v(getClass().getSimpleName(), "State of user " + id + " updated from " +
|
||||||
oldState.toString() + " to " + newState.toString());
|
oldState.toString() + " to " + newState.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addActiveUsersObserver(UserConnectionCallback connectionCallback, UserDisconnectionCallback disconnectionCallback) {
|
public void addNewUserObserver(UserConnectionCallback connectionCallback) {
|
||||||
userConnectionObservers.add(connectionCallback);
|
newUsersObservers.add(connectionCallback);
|
||||||
userDisconnectionObservers.add(disconnectionCallback);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void notifyConnectionObservers(PeerUser user) {
|
private void notifyNewUserObservers(PeerUser user) {
|
||||||
userConnectionObservers.forEach(callback -> callback.onUserConnected(user));
|
newUsersObservers.forEach(callback -> callback.onUserConnected(user));
|
||||||
}
|
|
||||||
|
|
||||||
private void notifyDisconnectionObservers(PeerUser user) {
|
|
||||||
userDisconnectionObservers.forEach(callback -> callback.onUserDisconnected(user));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue