diff --git a/client/src/main/java/envoy/client/Main.java b/client/src/main/java/envoy/client/Main.java index 6119062..842e37d 100644 --- a/client/src/main/java/envoy/client/Main.java +++ b/client/src/main/java/envoy/client/Main.java @@ -17,7 +17,7 @@ import envoy.client.ui.Startup; * @author Kai S. K. Engelbart * @since Envoy Client v0.1-beta */ -public class Main { +public final class Main { private static final boolean debug = false; diff --git a/client/src/main/java/envoy/client/data/ClientConfig.java b/client/src/main/java/envoy/client/data/ClientConfig.java index 3a18f08..60196de 100644 --- a/client/src/main/java/envoy/client/data/ClientConfig.java +++ b/client/src/main/java/envoy/client/data/ClientConfig.java @@ -3,10 +3,8 @@ package envoy.client.data; import static java.util.function.Function.identity; import java.io.File; -import java.util.logging.Level; import envoy.data.Config; -import envoy.data.ConfigItem; /** * Implements a configuration specific to the Envoy Client with default values @@ -19,7 +17,7 @@ import envoy.data.ConfigItem; * @author Kai S. K. Engelbart * @since Envoy Client v0.1-beta */ -public class ClientConfig extends Config { +public final class ClientConfig extends Config { private static ClientConfig config; @@ -33,15 +31,13 @@ public class ClientConfig extends Config { } private ClientConfig() { - items.put("server", new ConfigItem<>("server", "s", identity(), null, true)); - items.put("port", new ConfigItem<>("port", "p", Integer::parseInt, null, true)); - items.put("localDB", new ConfigItem<>("localDB", "db", File::new, new File("localDB"), true)); - items.put("ignoreLocalDB", new ConfigItem<>("ignoreLocalDB", "nodb", Boolean::parseBoolean, false, false)); - items.put("homeDirectory", new ConfigItem<>("homeDirectory", "h", File::new, new File(System.getProperty("user.home"), ".envoy"), true)); - items.put("fileLevelBarrier", new ConfigItem<>("fileLevelBarrier", "fb", Level::parse, Level.OFF, true)); - items.put("consoleLevelBarrier", new ConfigItem<>("consoleLevelBarrier", "cb", Level::parse, Level.OFF, true)); - items.put("user", new ConfigItem<>("user", "u", identity())); - items.put("password", new ConfigItem<>("password", "pw", identity())); + super(".envoy"); + put("server", "s", identity()); + put("port", "p", Integer::parseInt); + put("localDB", "db", File::new); + put("ignoreLocalDB", "nodb", Boolean::parseBoolean); + put("user", "u", identity()); + put("password", "pw", identity()); } /** @@ -68,24 +64,6 @@ public class ClientConfig extends Config { */ public Boolean isIgnoreLocalDB() { return (Boolean) items.get("ignoreLocalDB").get(); } - /** - * @return the directory in which all local files are saves - * @since Envoy Client v0.2-alpha - */ - public File getHomeDirectory() { return (File) items.get("homeDirectory").get(); } - - /** - * @return the minimal {@link Level} to log inside the log file - * @since Envoy Client v0.2-alpha - */ - public Level getFileLevelBarrier() { return (Level) items.get("fileLevelBarrier").get(); } - - /** - * @return the minimal {@link Level} to log inside the console - * @since Envoy Client v0.2-alpha - */ - public Level getConsoleLevelBarrier() { return (Level) items.get("consoleLevelBarrier").get(); } - /** * @return the user name * @since Envoy Client v0.3-alpha diff --git a/client/src/main/java/envoy/client/data/GroupChat.java b/client/src/main/java/envoy/client/data/GroupChat.java index 6592e8e..39f5bd7 100644 --- a/client/src/main/java/envoy/client/data/GroupChat.java +++ b/client/src/main/java/envoy/client/data/GroupChat.java @@ -17,11 +17,11 @@ import envoy.event.GroupMessageStatusChange; * Project: envoy-client
* File: GroupChat.java
* Created: 05.07.2020
- * + * * @author Maximilian Käfer * @since Envoy Client v0.1-beta */ -public class GroupChat extends Chat { +public final class GroupChat extends Chat { private final User sender; @@ -41,13 +41,10 @@ public class GroupChat extends Chat { public void read(WriteProxy writeProxy) throws IOException { for (int i = messages.size() - 1; i >= 0; --i) { final GroupMessage gmsg = (GroupMessage) messages.get(i); - if (gmsg.getSenderID() != sender.getID()) { - if (gmsg.getMemberStatuses().get(sender.getID()) == MessageStatus.READ) break; - else { - gmsg.getMemberStatuses().replace(sender.getID(), MessageStatus.READ); - writeProxy - .writeMessageStatusChange(new GroupMessageStatusChange(gmsg.getID(), MessageStatus.READ, Instant.now(), sender.getID())); - } + if (gmsg.getSenderID() != sender.getID()) if (gmsg.getMemberStatuses().get(sender.getID()) == MessageStatus.READ) break; + else { + gmsg.getMemberStatuses().replace(sender.getID(), MessageStatus.READ); + writeProxy.writeMessageStatusChange(new GroupMessageStatusChange(gmsg.getID(), MessageStatus.READ, Instant.now(), sender.getID())); } } unreadAmount = 0; diff --git a/client/src/main/java/envoy/client/data/Settings.java b/client/src/main/java/envoy/client/data/Settings.java index 07bb354..1191c7d 100644 --- a/client/src/main/java/envoy/client/data/Settings.java +++ b/client/src/main/java/envoy/client/data/Settings.java @@ -22,7 +22,7 @@ import envoy.util.SerializationUtils; * @author Kai S. K. Engelbart * @since Envoy Client v0.2-alpha */ -public class Settings { +public final class Settings { // Actual settings accessible by the rest of the application private Map> items; @@ -139,7 +139,9 @@ public class Settings { * before * @since Envoy Client v0.2-beta */ - public void setDownloadSavedWithoutAsking(boolean autosaveDownload) { ((SettingsItem) items.get("autoSaveDownloads")).set(autosaveDownload); } + public void setDownloadSavedWithoutAsking(boolean autosaveDownload) { + ((SettingsItem) items.get("autoSaveDownloads")).set(autosaveDownload); + } /** * @return the path where downloads should be saved diff --git a/client/src/main/java/envoy/client/data/SettingsItem.java b/client/src/main/java/envoy/client/data/SettingsItem.java index d74e222..9261242 100644 --- a/client/src/main/java/envoy/client/data/SettingsItem.java +++ b/client/src/main/java/envoy/client/data/SettingsItem.java @@ -17,7 +17,7 @@ import javax.swing.JComponent; * @author Kai S. K. Engelbart * @since Envoy Client v0.3-alpha */ -public class SettingsItem implements Serializable { +public final class SettingsItem implements Serializable { private T value; private String userFriendlyName, description; diff --git a/client/src/main/java/envoy/client/data/commands/SystemCommand.java b/client/src/main/java/envoy/client/data/commands/SystemCommand.java index 3f1a9a5..be13c83 100644 --- a/client/src/main/java/envoy/client/data/commands/SystemCommand.java +++ b/client/src/main/java/envoy/client/data/commands/SystemCommand.java @@ -24,7 +24,7 @@ import java.util.function.Supplier; * @author Leon Hofmeister * @since Envoy Client v0.2-beta */ -public class SystemCommand implements OnCall { +public final class SystemCommand implements OnCall { protected int relevance; diff --git a/client/src/main/java/envoy/client/data/commands/SystemCommandBuilder.java b/client/src/main/java/envoy/client/data/commands/SystemCommandBuilder.java index fde7ba2..4d996f5 100644 --- a/client/src/main/java/envoy/client/data/commands/SystemCommandBuilder.java +++ b/client/src/main/java/envoy/client/data/commands/SystemCommandBuilder.java @@ -14,7 +14,7 @@ import java.util.function.Consumer; * @author Leon Hofmeister * @since Envoy Client v0.2-beta */ -public class SystemCommandBuilder { +public final class SystemCommandBuilder { private int numberOfArguments; private Consumer> action; diff --git a/client/src/main/java/envoy/client/event/MessageCreationEvent.java b/client/src/main/java/envoy/client/event/MessageCreationEvent.java index 3238423..b9a4556 100644 --- a/client/src/main/java/envoy/client/event/MessageCreationEvent.java +++ b/client/src/main/java/envoy/client/event/MessageCreationEvent.java @@ -11,7 +11,7 @@ import envoy.event.Event; * @author Kai S. K. Engelbart * @since Envoy Client v0.2-alpha */ -public class MessageCreationEvent extends Event { +public final class MessageCreationEvent extends Event { private static final long serialVersionUID = 0L; diff --git a/client/src/main/java/envoy/client/event/MessageModificationEvent.java b/client/src/main/java/envoy/client/event/MessageModificationEvent.java index b2f114a..5f1c6f0 100644 --- a/client/src/main/java/envoy/client/event/MessageModificationEvent.java +++ b/client/src/main/java/envoy/client/event/MessageModificationEvent.java @@ -11,7 +11,7 @@ import envoy.event.Event; * @author Kai S. K. Engelbart * @since Envoy Client v0.2-alpha */ -public class MessageModificationEvent extends Event { +public final class MessageModificationEvent extends Event { private static final long serialVersionUID = 0L; diff --git a/client/src/main/java/envoy/client/event/SendEvent.java b/client/src/main/java/envoy/client/event/SendEvent.java index 8ea650b..f93e1d6 100644 --- a/client/src/main/java/envoy/client/event/SendEvent.java +++ b/client/src/main/java/envoy/client/event/SendEvent.java @@ -10,7 +10,7 @@ import envoy.event.Event; * @author: Maximilian Käfer * @since Envoy Client v0.3-alpha */ -public class SendEvent extends Event> { +public final class SendEvent extends Event> { private static final long serialVersionUID = 0L; diff --git a/client/src/main/java/envoy/client/event/ThemeChangeEvent.java b/client/src/main/java/envoy/client/event/ThemeChangeEvent.java index 572476b..1572b7a 100644 --- a/client/src/main/java/envoy/client/event/ThemeChangeEvent.java +++ b/client/src/main/java/envoy/client/event/ThemeChangeEvent.java @@ -10,7 +10,7 @@ import envoy.event.Event; * @author Kai S. K. Engelbart * @since Envoy Client v0.2-alpha */ -public class ThemeChangeEvent extends Event { +public final class ThemeChangeEvent extends Event { private static final long serialVersionUID = 0L; diff --git a/client/src/main/java/envoy/client/net/Client.java b/client/src/main/java/envoy/client/net/Client.java index 15e3c01..2cecde8 100644 --- a/client/src/main/java/envoy/client/net/Client.java +++ b/client/src/main/java/envoy/client/net/Client.java @@ -29,7 +29,7 @@ import envoy.util.SerializationUtils; * @author Leon Hofmeister * @since Envoy Client v0.1-alpha */ -public class Client implements Closeable { +public final class Client implements Closeable { // Connection handling private Socket socket; @@ -164,6 +164,13 @@ public class Client implements Closeable { // Process ProfilePicChanges receiver.registerProcessor(ProfilePicChange.class, eventBus::dispatch); + // Process requests to not send any more attachments as they will not be shown to + // other users + receiver.registerProcessor(NoAttachments.class, eventBus::dispatch); + + // Process group creation results - they might have been disabled on the server + receiver.registerProcessor(GroupCreationResult.class, eventBus::dispatch); + // Send event eventBus.register(SendEvent.class, evt -> { try { diff --git a/client/src/main/java/envoy/client/net/GroupMessageStatusChangeProcessor.java b/client/src/main/java/envoy/client/net/GroupMessageStatusChangeProcessor.java index ce3dc73..6f70ad6 100644 --- a/client/src/main/java/envoy/client/net/GroupMessageStatusChangeProcessor.java +++ b/client/src/main/java/envoy/client/net/GroupMessageStatusChangeProcessor.java @@ -12,14 +12,14 @@ import envoy.util.EnvoyLog; * Project: envoy-client
* File: GroupMessageStatusChangePocessor.java
* Created: 03.07.2020
- * + * * @author Maximilian Käfer * @since Envoy Client v0.1-beta */ -public class GroupMessageStatusChangeProcessor implements Consumer { +public final class GroupMessageStatusChangeProcessor implements Consumer { private static final Logger logger = EnvoyLog.getLogger(GroupMessageStatusChangeProcessor.class); - + @Override public void accept(GroupMessageStatusChange evt) { if (evt.get().ordinal() < MessageStatus.RECEIVED.ordinal()) logger.warning("Received invalid group message status change " + evt); diff --git a/client/src/main/java/envoy/client/net/MessageStatusChangeProcessor.java b/client/src/main/java/envoy/client/net/MessageStatusChangeProcessor.java index 106cda4..d983012 100644 --- a/client/src/main/java/envoy/client/net/MessageStatusChangeProcessor.java +++ b/client/src/main/java/envoy/client/net/MessageStatusChangeProcessor.java @@ -16,7 +16,7 @@ import envoy.util.EnvoyLog; * @author Kai S. K. Engelbart * @since Envoy Client v0.3-alpha */ -public class MessageStatusChangeProcessor implements Consumer { +public final class MessageStatusChangeProcessor implements Consumer { private static final Logger logger = EnvoyLog.getLogger(MessageStatusChangeProcessor.class); diff --git a/client/src/main/java/envoy/client/net/ReceivedGroupMessageProcessor.java b/client/src/main/java/envoy/client/net/ReceivedGroupMessageProcessor.java index 877d0f0..215c031 100644 --- a/client/src/main/java/envoy/client/net/ReceivedGroupMessageProcessor.java +++ b/client/src/main/java/envoy/client/net/ReceivedGroupMessageProcessor.java @@ -13,11 +13,11 @@ import envoy.util.EnvoyLog; * Project: envoy-client
* File: ReceivedGroupMessageProcessor.java
* Created: 13.06.2020
- * + * * @author Maximilian Käfer * @since Envoy Client v0.1-beta */ -public class ReceivedGroupMessageProcessor implements Consumer { +public final class ReceivedGroupMessageProcessor implements Consumer { private static final Logger logger = EnvoyLog.getLogger(ReceivedGroupMessageProcessor.class); diff --git a/client/src/main/java/envoy/client/net/ReceivedMessageProcessor.java b/client/src/main/java/envoy/client/net/ReceivedMessageProcessor.java index 84aa7dc..9cb6957 100644 --- a/client/src/main/java/envoy/client/net/ReceivedMessageProcessor.java +++ b/client/src/main/java/envoy/client/net/ReceivedMessageProcessor.java @@ -15,7 +15,7 @@ import envoy.event.EventBus; * @author Kai S. K. Engelbart * @since Envoy Client v0.3-alpha */ -public class ReceivedMessageProcessor implements Consumer { +public final class ReceivedMessageProcessor implements Consumer { @Override public void accept(Message message) { diff --git a/client/src/main/java/envoy/client/net/Receiver.java b/client/src/main/java/envoy/client/net/Receiver.java index fdfa1e8..e9ac48f 100644 --- a/client/src/main/java/envoy/client/net/Receiver.java +++ b/client/src/main/java/envoy/client/net/Receiver.java @@ -22,7 +22,9 @@ import envoy.util.SerializationUtils; * @author Kai S. K. Engelbart * @since Envoy Client v0.3-alpha */ -public class Receiver extends Thread { +public final class Receiver extends Thread { + + private boolean isAlive = true; private final InputStream in; private final Map, Consumer> processors = new HashMap<>(); @@ -49,7 +51,7 @@ public class Receiver extends Thread { @Override public void run() { - while (true) { + while (isAlive) try { // Read object length final byte[] lenBytes = new byte[4]; @@ -64,6 +66,12 @@ public class Receiver extends Thread { // Catch LV encoding errors if (len != bytesRead) { + // Server has stopped sending, i.e. because he went offline + if (bytesRead == -1) { + isAlive = false; + logger.log(Level.INFO, "Lost connection to the server. Exiting receiver..."); + continue; + } logger.log(Level.WARNING, String.format("LV encoding violated: expected %d bytes, received %d bytes. Discarding object...", len, bytesRead)); continue; @@ -87,7 +95,6 @@ public class Receiver extends Thread { } catch (final Exception e) { logger.log(Level.SEVERE, "Error on receiver thread", e); } - } } /** @@ -102,7 +109,7 @@ public class Receiver extends Thread { /** * Adds a map of object processors to this {@link Receiver}. - * + * * @param processors the processors to add the processors to add * @since Envoy Client v0.1-beta */ diff --git a/client/src/main/java/envoy/client/net/WriteProxy.java b/client/src/main/java/envoy/client/net/WriteProxy.java index 0eccf6a..06b72e2 100644 --- a/client/src/main/java/envoy/client/net/WriteProxy.java +++ b/client/src/main/java/envoy/client/net/WriteProxy.java @@ -22,7 +22,7 @@ import envoy.util.EnvoyLog; * @author Kai S. K. Engelbart * @since Envoy Client v0.3-alpha */ -public class WriteProxy { +public final class WriteProxy { private final Client client; private final LocalDB localDB; @@ -68,9 +68,7 @@ public class WriteProxy { * * @since Envoy Client v0.3-alpha */ - public void flushCache() { - localDB.getCacheMap().getMap().values().forEach(Cache::relay); - } + public void flushCache() { localDB.getCacheMap().getMap().values().forEach(Cache::relay); } /** * Delivers a message to the server if online. Otherwise the message is cached diff --git a/client/src/main/java/envoy/client/ui/ClearableTextField.java b/client/src/main/java/envoy/client/ui/ClearableTextField.java index fbe6926..9568629 100644 --- a/client/src/main/java/envoy/client/ui/ClearableTextField.java +++ b/client/src/main/java/envoy/client/ui/ClearableTextField.java @@ -22,7 +22,7 @@ import javafx.scene.layout.GridPane; * @author Leon Hofmeister * @since Envoy Client v0.1-beta */ -public class ClearableTextField extends GridPane { +public final class ClearableTextField extends GridPane { private final TextField textField; @@ -88,82 +88,82 @@ public class ClearableTextField extends GridPane { * @see javafx.scene.control.TextInputControl#promptTextProperty() * @since Envoy Client v0.1-beta */ - public final StringProperty promptTextProperty() { return textField.promptTextProperty(); } + public StringProperty promptTextProperty() { return textField.promptTextProperty(); } /** * @return the current prompt text * @see javafx.scene.control.TextInputControl#getPromptText() * @since Envoy Client v0.1-beta */ - public final String getPromptText() { return textField.getPromptText(); } + public String getPromptText() { return textField.getPromptText(); } /** * @param value the prompt text to display * @see javafx.scene.control.TextInputControl#setPromptText(java.lang.String) * @since Envoy Client v0.1-beta */ - public final void setPromptText(String value) { textField.setPromptText(value); } + public void setPromptText(String value) { textField.setPromptText(value); } /** * @return the current property of the tooltip * @see javafx.scene.control.Control#tooltipProperty() * @since Envoy Client v0.1-beta */ - public final ObjectProperty tooltipProperty() { return textField.tooltipProperty(); } + public ObjectProperty tooltipProperty() { return textField.tooltipProperty(); } /** * @param value the new tooltip * @see javafx.scene.control.Control#setTooltip(javafx.scene.control.Tooltip) * @since Envoy Client v0.1-beta */ - public final void setTooltip(Tooltip value) { textField.setTooltip(value); } + public void setTooltip(Tooltip value) { textField.setTooltip(value); } /** * @return the current tooltip * @see javafx.scene.control.Control#getTooltip() * @since Envoy Client v0.1-beta */ - public final Tooltip getTooltip() { return textField.getTooltip(); } + public Tooltip getTooltip() { return textField.getTooltip(); } /** * @return the current property of the context menu * @see javafx.scene.control.Control#contextMenuProperty() * @since Envoy Client v0.1-beta */ - public final ObjectProperty contextMenuProperty() { return textField.contextMenuProperty(); } + public ObjectProperty contextMenuProperty() { return textField.contextMenuProperty(); } /** * @param value the new context menu * @see javafx.scene.control.Control#setContextMenu(javafx.scene.control.ContextMenu) * @since Envoy Client v0.1-beta */ - public final void setContextMenu(ContextMenu value) { textField.setContextMenu(value); } + public void setContextMenu(ContextMenu value) { textField.setContextMenu(value); } /** * @return the current context menu * @see javafx.scene.control.Control#getContextMenu() * @since Envoy Client v0.1-beta */ - public final ContextMenu getContextMenu() { return textField.getContextMenu(); } + public ContextMenu getContextMenu() { return textField.getContextMenu(); } /** * @param value whether this ClearableTextField should be editable * @see javafx.scene.control.TextInputControl#setEditable(boolean) * @since Envoy Client v0.1-beta */ - public final void setEditable(boolean value) { textField.setEditable(value); } + public void setEditable(boolean value) { textField.setEditable(value); } /** * @return the current property whether this ClearableTextField is editable * @see javafx.scene.control.TextInputControl#editableProperty() * @since Envoy Client v0.1-beta */ - public final BooleanProperty editableProperty() { return textField.editableProperty(); } + public BooleanProperty editableProperty() { return textField.editableProperty(); } /** * @return whether this {@code ClearableTextField} is editable * @see javafx.scene.control.TextInputControl#isEditable() * @since Envoy Client v0.1-beta */ - public final boolean isEditable() { return textField.isEditable(); } + public boolean isEditable() { return textField.isEditable(); } } diff --git a/client/src/main/java/envoy/client/ui/IconUtil.java b/client/src/main/java/envoy/client/ui/IconUtil.java index f95d1a6..2da4d35 100644 --- a/client/src/main/java/envoy/client/ui/IconUtil.java +++ b/client/src/main/java/envoy/client/ui/IconUtil.java @@ -24,7 +24,7 @@ import envoy.util.EnvoyLog; * @author Kai S. K. Engelbart * @since Envoy Client v0.1-beta */ -public class IconUtil { +public final class IconUtil { private IconUtil() {} @@ -160,7 +160,7 @@ public class IconUtil { BufferedImage image = null; try { image = ImageIO.read(IconUtil.class.getResource(path)); - } catch (IOException e) { + } catch (final IOException e) { EnvoyLog.getLogger(IconUtil.class).log(Level.WARNING, String.format("Could not load image at path %s: ", path), e); } return image; diff --git a/client/src/main/java/envoy/client/ui/Startup.java b/client/src/main/java/envoy/client/ui/Startup.java index 464b8e3..7c2bff6 100644 --- a/client/src/main/java/envoy/client/ui/Startup.java +++ b/client/src/main/java/envoy/client/ui/Startup.java @@ -2,7 +2,6 @@ package envoy.client.ui; import java.io.File; import java.io.IOException; -import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; @@ -19,7 +18,6 @@ import envoy.data.GroupMessage; import envoy.data.Message; import envoy.event.GroupMessageStatusChange; import envoy.event.MessageStatusChange; -import envoy.exception.EnvoyException; import envoy.util.EnvoyLog; /** @@ -57,30 +55,13 @@ public final class Startup extends Application { @Override public void start(Stage stage) throws Exception { try { - // Load the configuration from client.properties first - final Properties properties = new Properties(); - properties.load(Startup.class.getClassLoader().getResourceAsStream("client.properties")); - config.load(properties); - - // Override configuration values with command line arguments - final String[] args = getParameters().getRaw().toArray(new String[0]); - if (args.length > 0) config.load(args); - - // Check if all mandatory configuration values have been initialized - if (!config.isInitialized()) throw new EnvoyException("Configuration is not fully initialized"); - } catch (final Exception e) { + config.loadAll(Startup.class, "client.properties", getParameters().getRaw().toArray(new String[0])); + EnvoyLog.initialize(config); + } catch (final IllegalStateException e) { new Alert(AlertType.ERROR, "Error loading configuration values:\n" + e); logger.log(Level.SEVERE, "Error loading configuration values: ", e); - e.printStackTrace(); System.exit(1); } - - // Setup logger for the envoy package - EnvoyLog.initialize(config); - EnvoyLog.attach("envoy"); - EnvoyLog.setFileLevelBarrier(config.getFileLevelBarrier()); - EnvoyLog.setConsoleLevelBarrier(config.getConsoleLevelBarrier()); - logger.log(Level.INFO, "Envoy starting..."); // Initialize the local database diff --git a/client/src/main/java/envoy/client/ui/StatusTrayIcon.java b/client/src/main/java/envoy/client/ui/StatusTrayIcon.java index 10c5300..6d51955 100644 --- a/client/src/main/java/envoy/client/ui/StatusTrayIcon.java +++ b/client/src/main/java/envoy/client/ui/StatusTrayIcon.java @@ -18,7 +18,7 @@ import envoy.event.EventBus; * @author Kai S. K. Engelbart * @since Envoy Client v0.2-alpha */ -public class StatusTrayIcon { +public final class StatusTrayIcon { /** * The {@link TrayIcon} provided by the System Tray API for controlling the @@ -85,12 +85,12 @@ public class StatusTrayIcon { public void show() { try { SystemTray.getSystemTray().add(trayIcon); - } catch (AWTException e) {} + } catch (final AWTException e) {} } /** * Removes the icon from the system tray. - * + * * @since Envoy Client v0.2-beta */ public void hide() { SystemTray.getSystemTray().remove(trayIcon); } diff --git a/client/src/main/java/envoy/client/ui/controller/ChatScene.java b/client/src/main/java/envoy/client/ui/controller/ChatScene.java index 173784f..83bb085 100644 --- a/client/src/main/java/envoy/client/ui/controller/ChatScene.java +++ b/client/src/main/java/envoy/client/ui/controller/ChatScene.java @@ -87,6 +87,12 @@ public final class ChatScene implements Restorable { @FXML private Button rotateButton; + @FXML + private Button messageSearchButton; + + @FXML + private Button newGroupButton; + @FXML private TextArea messageTextArea; @@ -108,9 +114,6 @@ public final class ChatScene implements Restorable { @FXML private Label topBarStatusLabel; - @FXML - private Button messageSearchButton; - @FXML private ImageView clientProfilePic; @@ -129,7 +132,7 @@ public final class ChatScene implements Restorable { private AudioRecorder recorder; private boolean recording; private Attachment pendingAttachment; - private boolean postingPermanentlyDisabled; + private boolean postingPermanentlyDisabled; private final SystemCommandsMap messageTextAreaCommands = new SystemCommandsMap(); @@ -237,6 +240,21 @@ public final class ChatScene implements Restorable { break; } }); + + // Disable attachment button if server says attachments will be filtered out + eventBus.register(NoAttachments.class, e -> { + Platform.runLater(() -> { + attachmentButton.setDisable(true); + voiceButton.setDisable(true); + final var alert = new Alert(AlertType.ERROR); + alert.setTitle("No attachments possible"); + alert.setHeaderText("Your current server does not support attachments."); + alert.setContentText("If this is unplanned, please contact your server administrator."); + alert.showAndWait(); + }); + }); + + eventBus.register(GroupCreationResult.class, e -> Platform.runLater(() -> { newGroupButton.setDisable(!e.get()); })); } /** diff --git a/client/src/main/java/envoy/client/ui/controller/ContactSearchScene.java b/client/src/main/java/envoy/client/ui/controller/ContactSearchScene.java index 3e6071a..63f16b0 100644 --- a/client/src/main/java/envoy/client/ui/controller/ContactSearchScene.java +++ b/client/src/main/java/envoy/client/ui/controller/ContactSearchScene.java @@ -6,10 +6,8 @@ import java.util.logging.Logger; import javafx.application.Platform; import javafx.fxml.FXML; -import javafx.scene.control.Alert; +import javafx.scene.control.*; import javafx.scene.control.Alert.AlertType; -import javafx.scene.control.ButtonType; -import javafx.scene.control.ListView; import envoy.client.data.LocalDB; import envoy.client.event.SendEvent; @@ -20,6 +18,7 @@ import envoy.client.ui.listcell.ListCellFactory; import envoy.data.User; import envoy.event.ElementOperation; import envoy.event.EventBus; +import envoy.event.GroupCreationResult; import envoy.event.contact.ContactOperation; import envoy.event.contact.UserSearchRequest; import envoy.event.contact.UserSearchResult; @@ -42,7 +41,7 @@ import envoy.util.EnvoyLog; * @author Leon Hofmeister * @since Envoy Client v0.1-beta */ -public class ContactSearchScene { +public final class ContactSearchScene { @FXML private ClearableTextField searchBar; @@ -50,6 +49,9 @@ public class ContactSearchScene { @FXML private ListView userList; + @FXML + private Button newGroupButton; + private SceneContext sceneContext; private LocalDB localDB; @@ -86,6 +88,7 @@ public class ContactSearchScene { eventBus.register(UserSearchResult.class, response -> Platform.runLater(() -> { userList.getItems().clear(); userList.getItems().addAll(response.get()); })); eventBus.register(ContactOperation.class, handler); + eventBus.register(GroupCreationResult.class, e -> Platform.runLater(() -> { newGroupButton.setDisable(!e.get()); })); } /** diff --git a/client/src/main/java/envoy/client/ui/controller/GroupCreationScene.java b/client/src/main/java/envoy/client/ui/controller/GroupCreationScene.java index 71c7dd4..da9e997 100644 --- a/client/src/main/java/envoy/client/ui/controller/GroupCreationScene.java +++ b/client/src/main/java/envoy/client/ui/controller/GroupCreationScene.java @@ -21,6 +21,7 @@ import envoy.data.Group; import envoy.data.User; import envoy.event.EventBus; import envoy.event.GroupCreation; +import envoy.event.GroupCreationResult; import envoy.util.Bounds; /** @@ -39,7 +40,7 @@ import envoy.util.Bounds; * @author Maximilian Käfer * @since Envoy Client v0.1-beta */ -public class GroupCreationScene { +public final class GroupCreationScene { @FXML private Button createButton; @@ -54,6 +55,8 @@ public class GroupCreationScene { private LocalDB localDB; + private String groupName; + private static final EventBus eventBus = EventBus.getInstance(); @FXML @@ -61,6 +64,18 @@ public class GroupCreationScene { userList.setCellFactory(new ListCellFactory<>(ContactControl::new)); userList.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); groupNameField.setClearButtonListener(e -> { groupNameField.getTextField().clear(); createButton.setDisable(true); }); + eventBus.register(GroupCreationResult.class, e -> Platform.runLater(() -> { + if (e.get()) new Alert(AlertType.INFORMATION, String.format("Group '%s' successfully created.", groupName)).showAndWait(); + else { + createButton.setDisable(true); + final var alert = new Alert(AlertType.ERROR); + alert.setTitle("Groups are not allowed"); + alert.setHeaderText("Cannot create group as your current server disabled this feature"); + alert.setContentText("If this is unplanned, please contact your server administrator."); + alert.showAndWait(); + sceneContext.pop(); + } + })); } /** @@ -119,10 +134,7 @@ public class GroupCreationScene { alert.setTitle("Create Group?"); alert.setHeaderText("Proceed?"); alert.showAndWait().filter(btn -> btn == ButtonType.OK).ifPresent(btn -> createGroup(name)); - } else { - new Alert(AlertType.INFORMATION, String.format("Group '%s' successfully created.", name)).showAndWait(); - createGroup(name); - } + } else createGroup(name); } /** @@ -133,9 +145,9 @@ public class GroupCreationScene { * @since Envoy Client v0.1-beta */ private void createGroup(String name) { + groupName = name; eventBus.dispatch(new SendEvent( new GroupCreation(name, userList.getSelectionModel().getSelectedItems().stream().map(User::getID).collect(Collectors.toSet())))); - sceneContext.pop(); } /** diff --git a/client/src/main/java/envoy/client/ui/controller/SettingsScene.java b/client/src/main/java/envoy/client/ui/controller/SettingsScene.java index b8802fd..03c1048 100644 --- a/client/src/main/java/envoy/client/ui/controller/SettingsScene.java +++ b/client/src/main/java/envoy/client/ui/controller/SettingsScene.java @@ -18,7 +18,7 @@ import envoy.client.ui.settings.*; * @author Kai S. K. Engelbart * @since Envoy Client v0.1-beta */ -public class SettingsScene { +public final class SettingsScene { @FXML private ListView settingsList; diff --git a/client/src/main/java/envoy/client/ui/listcell/ChatControl.java b/client/src/main/java/envoy/client/ui/listcell/ChatControl.java index 8e2a698..027527b 100644 --- a/client/src/main/java/envoy/client/ui/listcell/ChatControl.java +++ b/client/src/main/java/envoy/client/ui/listcell/ChatControl.java @@ -23,7 +23,7 @@ import envoy.data.Group; * @author Leon Hofmeister * @since Envoy Client v0.1-beta */ -public class ChatControl extends HBox { +public final class ChatControl extends HBox { /** * @param chat the chat to display @@ -36,7 +36,7 @@ public class ChatControl extends HBox { ImageView contactProfilePic; if (chat.getRecipient() instanceof Group) contactProfilePic = new ImageView(IconUtil.loadIconThemeSensitive("group_icon", 32)); else contactProfilePic = new ImageView(IconUtil.loadIconThemeSensitive("user_icon", 32)); - Rectangle clip = new Rectangle(); + final var clip = new Rectangle(); clip.setWidth(32); clip.setHeight(32); clip.setArcHeight(32); @@ -44,7 +44,7 @@ public class ChatControl extends HBox { contactProfilePic.setClip(clip); getChildren().add(contactProfilePic); // spacing - Region leftSpacing = new Region(); + final var leftSpacing = new Region(); leftSpacing.setPrefSize(8, 0); leftSpacing.setMinSize(8, 0); leftSpacing.setMaxSize(8, 0); diff --git a/client/src/main/java/envoy/client/ui/listcell/ContactControl.java b/client/src/main/java/envoy/client/ui/listcell/ContactControl.java index eb4a483..99415cb 100644 --- a/client/src/main/java/envoy/client/ui/listcell/ContactControl.java +++ b/client/src/main/java/envoy/client/ui/listcell/ContactControl.java @@ -18,7 +18,7 @@ import envoy.data.User; * @author Kai S. K. Engelbart * @since Envoy Client v0.2-beta */ -public class ContactControl extends VBox { +public final class ContactControl extends VBox { /** * @param contact the contact to display @@ -36,9 +36,7 @@ public class ContactControl extends VBox { final var statusLabel = new Label(status); statusLabel.getStyleClass().add(status.toLowerCase()); getChildren().add(statusLabel); - } else { - getChildren().add(new Label(contact.getContacts().size() + " members")); - } + } else getChildren().add(new Label(contact.getContacts().size() + " members")); getStyleClass().add("listElement"); } } diff --git a/client/src/main/java/envoy/client/ui/listcell/MessageControl.java b/client/src/main/java/envoy/client/ui/listcell/MessageControl.java index 9b66c6c..95676ea 100644 --- a/client/src/main/java/envoy/client/ui/listcell/MessageControl.java +++ b/client/src/main/java/envoy/client/ui/listcell/MessageControl.java @@ -24,7 +24,6 @@ import envoy.client.data.Settings; import envoy.client.ui.AudioControl; import envoy.client.ui.IconUtil; import envoy.client.ui.SceneContext; - import envoy.data.GroupMessage; import envoy.data.Message; import envoy.data.Message.MessageStatus; @@ -42,7 +41,7 @@ import envoy.util.EnvoyLog; * @author Maximilian Käfer * @since Envoy Client v0.1-beta */ -public class MessageControl extends Label { +public final class MessageControl extends Label { private boolean ownMessage; @@ -179,7 +178,7 @@ public class MessageControl extends Label { } /** - * @param localDB the localDB used by the current user + * @param localDB the localDB used by the current user * @since Envoy Client v0.2-beta */ public static void setLocalDB(LocalDB localDB) { MessageControl.localDB = localDB; } diff --git a/client/src/main/java/envoy/client/ui/settings/BugReportPane.java b/client/src/main/java/envoy/client/ui/settings/BugReportPane.java index 6a3ca59..211d8d8 100644 --- a/client/src/main/java/envoy/client/ui/settings/BugReportPane.java +++ b/client/src/main/java/envoy/client/ui/settings/BugReportPane.java @@ -21,7 +21,7 @@ import envoy.event.IssueProposal; * @author Leon Hofmeister * @since Envoy Client v0.2-beta */ -public class BugReportPane extends OnlyIfOnlineSettingsPane { +public final class BugReportPane extends OnlyIfOnlineSettingsPane { private final Label titleLabel = new Label("Suggest a title for the bug:"); private final TextField titleTextField = new TextField(); diff --git a/client/src/main/java/envoy/client/ui/settings/DownloadSettingsPane.java b/client/src/main/java/envoy/client/ui/settings/DownloadSettingsPane.java index cce597e..fe358c1 100644 --- a/client/src/main/java/envoy/client/ui/settings/DownloadSettingsPane.java +++ b/client/src/main/java/envoy/client/ui/settings/DownloadSettingsPane.java @@ -17,7 +17,7 @@ import envoy.client.ui.SceneContext; * @author Leon Hofmeister * @since Envoy Client v0.2-beta */ -public class DownloadSettingsPane extends SettingsPane { +public final class DownloadSettingsPane extends SettingsPane { /** * Constructs a new {@code DownloadSettingsPane}. diff --git a/client/src/main/java/envoy/client/ui/settings/GeneralSettingsPane.java b/client/src/main/java/envoy/client/ui/settings/GeneralSettingsPane.java index 36755a9..bf48b5f 100644 --- a/client/src/main/java/envoy/client/ui/settings/GeneralSettingsPane.java +++ b/client/src/main/java/envoy/client/ui/settings/GeneralSettingsPane.java @@ -16,7 +16,7 @@ import envoy.event.EventBus; * @author Kai S. K. Engelbart * @since Envoy Client v0.1-beta */ -public class GeneralSettingsPane extends SettingsPane { +public final class GeneralSettingsPane extends SettingsPane { /** * @since Envoy Client v0.1-beta diff --git a/client/src/main/java/envoy/client/ui/settings/UserSettingsPane.java b/client/src/main/java/envoy/client/ui/settings/UserSettingsPane.java index 098abac..d752c43 100644 --- a/client/src/main/java/envoy/client/ui/settings/UserSettingsPane.java +++ b/client/src/main/java/envoy/client/ui/settings/UserSettingsPane.java @@ -35,7 +35,7 @@ import envoy.util.EnvoyLog; * @author Leon Hofmeister * @since Envoy Client v0.2-beta */ -public class UserSettingsPane extends OnlyIfOnlineSettingsPane { +public final class UserSettingsPane extends OnlyIfOnlineSettingsPane { private boolean profilePicChanged, usernameChanged, validPassword; private byte[] currentImageBytes; diff --git a/client/src/main/java/envoy/client/util/IssueUtil.java b/client/src/main/java/envoy/client/util/IssueUtil.java index c4f3e6e..6c6e165 100644 --- a/client/src/main/java/envoy/client/util/IssueUtil.java +++ b/client/src/main/java/envoy/client/util/IssueUtil.java @@ -10,7 +10,7 @@ package envoy.client.util; * @author Leon Hofmeister * @since Envoy Client v0.2-beta */ -public class IssueUtil { +public final class IssueUtil { /** * diff --git a/client/src/main/java/envoy/client/util/ReflectionUtil.java b/client/src/main/java/envoy/client/util/ReflectionUtil.java index 92c243a..abdfd51 100644 --- a/client/src/main/java/envoy/client/util/ReflectionUtil.java +++ b/client/src/main/java/envoy/client/util/ReflectionUtil.java @@ -15,7 +15,7 @@ import javafx.scene.Node; * @author Leon Hofmeister * @since Envoy Client v0.2-beta */ -public class ReflectionUtil { +public final class ReflectionUtil { private ReflectionUtil() {} diff --git a/client/src/main/resources/client.properties b/client/src/main/resources/client.properties index 25f1ffd..6f3d633 100644 --- a/client/src/main/resources/client.properties +++ b/client/src/main/resources/client.properties @@ -1,4 +1,6 @@ -server=localhost -port=8080 -localDB=localDB -consoleLevelBarrier=FINER +server=localhost +port=8080 +localDB=localDB +consoleLevelBarrier=FINER +fileLevelBarrier=OFF +ignoreLocalDB=false diff --git a/client/src/main/resources/fxml/ChatScene.fxml b/client/src/main/resources/fxml/ChatScene.fxml index 5bf8cd1..5b6bf77 100644 --- a/client/src/main/resources/fxml/ChatScene.fxml +++ b/client/src/main/resources/fxml/ChatScene.fxml @@ -62,7 +62,7 @@ -