diff --git a/src/main/java/envoy/client/net/Client.java b/src/main/java/envoy/client/net/Client.java index 7aaf28b..9f9dad7 100644 --- a/src/main/java/envoy/client/net/Client.java +++ b/src/main/java/envoy/client/net/Client.java @@ -60,13 +60,15 @@ public class Client implements Closeable { * @param receivedMessageCache a message cache containing all unread messages * from the server that can be relayed after * initialization + * @param receivedMessageStatusChangeEventCache an event cache containing all received messageStatusChangeEvents from the server that can be relayed after initialization * @throws TimeoutException if the server could not be reached * @throws IOException if the login credentials could not be * written * @throws InterruptedException if the current thread is interrupted while * waiting for the handshake response */ - public void performHandshake(LoginCredentials credentials, Cache receivedMessageCache) + public void performHandshake(LoginCredentials credentials, Cache receivedMessageCache, + Cache receivedMessageStatusChangeEventCache) throws TimeoutException, IOException, InterruptedException { if (online) throw new IllegalStateException("Handshake has already been performed successfully"); // Establish TCP connection @@ -80,6 +82,7 @@ public class Client implements Closeable { // Register user creation processor, contact list processor and message cache receiver.registerProcessor(User.class, sender -> { this.sender = sender; contacts = sender.getContacts(); }); receiver.registerProcessor(Message.class, receivedMessageCache); + receiver.registerProcessor(MessageStatusChangeEvent.class, receivedMessageStatusChangeEventCache); receiver.registerProcessor(HandshakeRejectionEvent.class, evt -> { rejected = true; eventBus.dispatch(evt); }); rejected = false; @@ -123,22 +126,27 @@ public class Client implements Closeable { * @param receivedMessageCache a message cache containing all unread messages * from the server that can be relayed after * initialization + * @param receivedMessageStatusChangeEventCache an event cache containing all received messageStatusChangeEvents from the server that can be relayed after initialization * @throws IOException if no {@link IDGenerator} is present and none could be * requested from the server * @since Envoy Client v0.2-alpha */ - public void initReceiver(LocalDB localDB, Cache receivedMessageCache) throws IOException { + public void initReceiver(LocalDB localDB, Cache receivedMessageCache, + Cache receivedMessageStatusChangeEventCache) throws IOException { checkOnline(); // Process incoming messages final ReceivedMessageProcessor receivedMessageProcessor = new ReceivedMessageProcessor(); + final MessageStatusChangeEventProcessor messageStatusChangeEventProcessor = new MessageStatusChangeEventProcessor(); + receiver.registerProcessor(Message.class, receivedMessageProcessor); // Relay cached unread messages receivedMessageCache.setProcessor(receivedMessageProcessor); // Process message status changes - receiver.registerProcessor(MessageStatusChangeEvent.class, new MessageStatusChangeEventProcessor()); + receiver.registerProcessor(MessageStatusChangeEvent.class, messageStatusChangeEventProcessor); + receivedMessageStatusChangeEventCache.setProcessor(messageStatusChangeEventProcessor); // Process user status changes receiver.registerProcessor(UserStatusChangeEvent.class, eventBus::dispatch); diff --git a/src/main/java/envoy/client/ui/Startup.java b/src/main/java/envoy/client/ui/Startup.java index aff8801..dbadfc3 100644 --- a/src/main/java/envoy/client/ui/Startup.java +++ b/src/main/java/envoy/client/ui/Startup.java @@ -16,6 +16,7 @@ import envoy.client.net.Client; import envoy.client.ui.SceneContext.SceneInfo; import envoy.client.ui.controller.LoginScene; import envoy.data.Message; +import envoy.event.MessageStatusChangeEvent; import envoy.exception.EnvoyException; import envoy.util.EnvoyLog; @@ -27,13 +28,15 @@ import envoy.util.EnvoyLog; * Created: 26.03.2020
* * @author Kai S. K. Engelbart + * @author Maximilian Käfer * @since Envoy Client v0.1-beta */ public final class Startup extends Application { private LocalDB localDB; private Client client; - private Cache cache; + private Cache messageCache; + private Cache messageStatusCache; private static final ClientConfig config = ClientConfig.getInstance(); private static final Logger logger = EnvoyLog.getLogger(Startup.class); @@ -87,14 +90,15 @@ public final class Startup extends Application { // Initialize client and unread message cache client = new Client(); - cache = new Cache<>(); + messageCache = new Cache<>(); + messageStatusCache = new Cache<>(); stage.setTitle("Envoy"); stage.getIcons().add(IconUtil.load("/icons/envoy_logo.png")); final var sceneContext = new SceneContext(stage); sceneContext.load(SceneInfo.LOGIN_SCENE); - sceneContext.getController().initializeData(client, localDB, cache, sceneContext); + sceneContext.getController().initializeData(client, localDB, messageCache, messageStatusCache, sceneContext); } /** diff --git a/src/main/java/envoy/client/ui/controller/LoginScene.java b/src/main/java/envoy/client/ui/controller/LoginScene.java index 5f6c5aa..6717661 100644 --- a/src/main/java/envoy/client/ui/controller/LoginScene.java +++ b/src/main/java/envoy/client/ui/controller/LoginScene.java @@ -21,6 +21,7 @@ import envoy.data.User; import envoy.data.User.UserStatus; import envoy.event.EventBus; import envoy.event.HandshakeRejectionEvent; +import envoy.event.MessageStatusChangeEvent; import envoy.exception.EnvoyException; import envoy.util.EnvoyLog; @@ -30,6 +31,7 @@ import envoy.util.EnvoyLog; * Created: 03.04.2020
* * @author Kai S. K. Engelbart + * @author Maximilian Käfer * @since Envoy Client v0.1-beta */ public final class LoginScene { @@ -55,6 +57,7 @@ public final class LoginScene { private Client client; private LocalDB localDB; private Cache receivedMessageCache; + private Cache receivedMessageStatusChangeEventCache; private SceneContext sceneContext; private static final Logger logger = EnvoyLog.getLogger(LoginScene.class); @@ -77,14 +80,17 @@ public final class LoginScene { * @param localDB the local database used for offline login * @param receivedMessageCache the cache storing messages received during * the handshake + * @param receivedMessageStatusChangeEventCache the cache storing messageStatusChangeEvents received during handshake * @param sceneContext the scene context used to initialize the chat * scene * @since Envoy Client v0.1-beta */ - public void initializeData(Client client, LocalDB localDB, Cache receivedMessageCache, SceneContext sceneContext) { + public void initializeData(Client client, LocalDB localDB, Cache receivedMessageCache, + Cache receivedMessageStatusChangeEventCache, SceneContext sceneContext) { this.client = client; this.localDB = localDB; this.receivedMessageCache = receivedMessageCache; + this.receivedMessageStatusChangeEventCache = receivedMessageStatusChangeEventCache; this.sceneContext = sceneContext; // Prepare handshake @@ -129,9 +135,9 @@ public final class LoginScene { private void performHandshake(LoginCredentials credentials) { try { - client.performHandshake(credentials, receivedMessageCache); + client.performHandshake(credentials, receivedMessageCache, receivedMessageStatusChangeEventCache); if (client.isOnline()) { - client.initReceiver(localDB, receivedMessageCache); + client.initReceiver(localDB, receivedMessageCache, receivedMessageStatusChangeEventCache); loadChatScene(); } } catch (IOException | InterruptedException | TimeoutException e) { @@ -193,6 +199,7 @@ public final class LoginScene { // Relay unread messages from cache if (receivedMessageCache != null && client.isOnline()) receivedMessageCache.relay(); + if (receivedMessageStatusChangeEventCache != null && client.isOnline()) receivedMessageStatusChangeEventCache.relay(); } private void clearPasswordFields() {