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

View File

@ -1,5 +1,6 @@
package envoy.client.ui.controller; package envoy.client.ui.controller;
import java.util.function.Consumer;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@ -53,7 +54,17 @@ public class ContactSearchScene {
private LocalDB localDB; private LocalDB localDB;
private static EventBus eventBus = EventBus.getInstance(); 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); private static final Logger logger = EnvoyLog.getLogger(ChatScene.class);
/** /**
@ -72,6 +83,7 @@ public class ContactSearchScene {
searchBar.setClearButtonListener(e -> { searchBar.getTextField().clear(); userList.getItems().clear(); }); searchBar.setClearButtonListener(e -> { searchBar.getTextField().clear(); userList.getItems().clear(); });
eventBus.register(UserSearchResult.class, eventBus.register(UserSearchResult.class,
response -> Platform.runLater(() -> { userList.getItems().clear(); userList.getItems().addAll(response.get()); })); 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() { private void userListClicked() {
final var user = userList.getSelectionModel().getSelectedItem(); final var user = userList.getSelectionModel().getSelectedItem();
if (user != null) { if (user != null) {
final var alert = new Alert(AlertType.CONFIRMATION); currentlySelectedUser = user;
alert.setTitle("Add Contact to Contact List"); alert = new Alert(AlertType.CONFIRMATION);
alert.setHeaderText("Add the user " + user.getName() + " to your contact list?"); 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 // 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 // it could be proven that the creation of this dialog wrapped in
// Platform.runLater is less error-prone than without it // Platform.runLater is less error-prone than without it
Platform.runLater(() -> alert.showAndWait().filter(btn -> btn == ButtonType.OK).ifPresent(btn -> { 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 // Sends the event to the server
eventBus.dispatch(new SendEvent(event)); eventBus.dispatch(new SendEvent(event));
// Removes the chosen user and updates the UI // Removes the chosen user and updates the UI
userList.getItems().remove(user); userList.getItems().remove(currentlySelectedUser);
eventBus.dispatch(event); eventBus.dispatch(event);
logger.log(Level.INFO, "Added user " + user); logger.log(Level.INFO, "Added user " + currentlySelectedUser);
})); }));
} }
} }