Merge pull request #24 from informatik-ag-ngl/b/same_time_contact_addition

Fixed bug enabling contact duplication when two clients simultaneously add each other to their contact list
This commit is contained in:
delvh 2020-07-19 23:20:53 +02:00 committed by GitHub
commit e00fa592d6
1 changed files with 21 additions and 8 deletions

View File

@ -1,5 +1,6 @@
package envoy.client.ui.controller;
import java.util.function.Consumer;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -53,8 +54,18 @@ public class ContactSearchScene {
private LocalDB localDB;
private static EventBus eventBus = EventBus.getInstance();
private static final Logger logger = EnvoyLog.getLogger(ChatScene.class);
private Alert alert = new Alert(AlertType.CONFIRMATION);
private User currentlySelectedUser;
private final Consumer<ContactOperation> handler = e -> {
final var contact = e.get();
if (e.getOperationType() == ElementOperation.ADD) Platform
.runLater(() -> { userList.getItems().remove(contact); if (currentlySelectedUser.equals(contact) && alert.isShowing()) alert.close(); });
};
private static final EventBus eventBus = EventBus.getInstance();
private static final Logger logger = EnvoyLog.getLogger(ChatScene.class);
/**
* @param sceneContext enables the user to return to the chat scene
@ -72,6 +83,7 @@ public class ContactSearchScene {
searchBar.setClearButtonListener(e -> { searchBar.getTextField().clear(); userList.getItems().clear(); });
eventBus.register(UserSearchResult.class,
response -> Platform.runLater(() -> { userList.getItems().clear(); userList.getItems().addAll(response.get()); }));
eventBus.register(ContactOperation.class, handler);
}
/**
@ -108,20 +120,21 @@ public class ContactSearchScene {
private void userListClicked() {
final var user = userList.getSelectionModel().getSelectedItem();
if (user != null) {
final var alert = new Alert(AlertType.CONFIRMATION);
alert.setTitle("Add Contact to Contact List");
alert.setHeaderText("Add the user " + user.getName() + " to your contact list?");
currentlySelectedUser = user;
alert = new Alert(AlertType.CONFIRMATION);
alert.setTitle("Add User to Contact List");
alert.setHeaderText("Add the user " + currentlySelectedUser.getName() + " to your contact list?");
// Normally, this would be total BS (we are already on the FX Thread), however
// it could be proven that the creation of this dialog wrapped in
// Platform.runLater is less error-prone than without it
Platform.runLater(() -> alert.showAndWait().filter(btn -> btn == ButtonType.OK).ifPresent(btn -> {
final var event = new ContactOperation(user, ElementOperation.ADD);
final var event = new ContactOperation(currentlySelectedUser, ElementOperation.ADD);
// Sends the event to the server
eventBus.dispatch(new SendEvent(event));
// Removes the chosen user and updates the UI
userList.getItems().remove(user);
userList.getItems().remove(currentlySelectedUser);
eventBus.dispatch(event);
logger.log(Level.INFO, "Added user " + user);
logger.log(Level.INFO, "Added user " + currentlySelectedUser);
}));
}
}