diff --git a/src/main/java/envoy/client/data/Chat.java b/src/main/java/envoy/client/data/Chat.java
index f10e816..49083a7 100644
--- a/src/main/java/envoy/client/data/Chat.java
+++ b/src/main/java/envoy/client/data/Chat.java
@@ -3,7 +3,7 @@ package envoy.client.data;
import java.io.IOException;
import java.io.Serializable;
-import envoy.client.net.Client;
+import envoy.client.net.WriteProxy;
import envoy.client.ui.list.ComponentListModel;
import envoy.data.Message;
import envoy.data.Message.MessageStatus;
@@ -52,22 +52,20 @@ public class Chat implements Serializable {
* {@code READ} starting from the bottom and stopping once a read message is
* found.
*
- * @param client the client instance used to notify the server about the message
- * status changes
+ * @param writeProxy the write proxy instance used to notify the server about
+ * the message status changes
* @throws IOException if a {@link MessageStatusChangeEvent} could not be
* delivered to the server
* @since Envoy v0.3-alpha
*/
- public void read(Client client) throws IOException {
+ public void read(WriteProxy writeProxy) throws IOException {
for (int i = model.size() - 1; i >= 0; --i) {
final Message m = model.get(i);
if (m.getSenderId() == recipient.getId()) {
if (m.getStatus() == MessageStatus.READ) break;
else {
m.setStatus(MessageStatus.READ);
-
- // TODO: Cache events in offline mode
- client.sendEvent(new MessageStatusChangeEvent(m));
+ writeProxy.writeMessageStatusChangeEvent(new MessageStatusChangeEvent(m));
}
}
}
diff --git a/src/main/java/envoy/client/ui/ChatWindow.java b/src/main/java/envoy/client/ui/ChatWindow.java
index 3abd54a..7d537bf 100644
--- a/src/main/java/envoy/client/ui/ChatWindow.java
+++ b/src/main/java/envoy/client/ui/ChatWindow.java
@@ -16,6 +16,7 @@ import envoy.client.data.LocalDb;
import envoy.client.event.MessageCreationEvent;
import envoy.client.event.ThemeChangeEvent;
import envoy.client.net.Client;
+import envoy.client.net.WriteProxy;
import envoy.client.ui.list.ComponentList;
import envoy.client.ui.settings.SettingsScreen;
import envoy.client.util.EnvoyLog;
@@ -39,8 +40,9 @@ import envoy.event.MessageStatusChangeEvent;
public class ChatWindow extends JFrame {
// User specific objects
- private Client client;
- private LocalDb localDb;
+ private Client client;
+ private WriteProxy writeProxy;
+ private LocalDb localDb;
// GUI components
private JPanel contentPane = new JPanel();
@@ -211,7 +213,7 @@ public class ChatWindow extends JFrame {
// Listen to received messages
EventBus.getInstance().register(MessageCreationEvent.class, (evt) -> {
- Message message = ((MessageCreationEvent) evt).get();
+ Message message = ((MessageCreationEvent) evt).get();
Chat chat = localDb.getChats().stream().filter(c -> c.getRecipient().getId() == message.getSenderId()).findFirst().get();
chat.appendMessage(message);
@@ -301,8 +303,7 @@ public class ChatWindow extends JFrame {
.build();
// Send message
- // TODO: Store offline messages
- client.sendMessage(message);
+ writeProxy.writeMessage(message);
// Add message to PersistentLocalDb and update UI
currentChat.appendMessage(message);
@@ -345,7 +346,7 @@ public class ChatWindow extends JFrame {
private void readCurrentChat() {
try {
- currentChat.read(client);
+ currentChat.read(writeProxy);
messageList.synchronizeModel();
} catch (IOException e) {
e.printStackTrace();
@@ -354,24 +355,23 @@ public class ChatWindow extends JFrame {
}
/**
- * Sets the {@link Client} used by this {@link ChatWindow}.
+ * Initializes the components responsible server communication and
+ * persistence.
+ *
+ * This will trigger the display of the contact list.
*
- * @param client the {@link Client} used to send and receive messages
- * @since Envoy v0.2-alpha
+ * @param client the client used to send and receive messages
+ * @param localDb the local database used to manage stored messages
+ * and users
+ * @param writeProxy the write proxy used to send messages and status change
+ * events to the server or cache them inside the local
+ * database
+ * @since Envoy v0.3-alpha
*/
- public void setClient(Client client) { this.client = client; }
-
- /**
- * Sets the {@link LocalDb} used by this {@link ChatWindow}. After
- * invoking this
- * method, users and chats will be loaded from the database into the GUI.
- *
- * @param localDb the {@link LocalDb} used to manage stored messages
- * and users
- * @since Envoy v0.2-alpha
- */
- public void setLocalDB(LocalDb localDb) {
- this.localDb = localDb;
+ public void initContent(Client client, LocalDb localDb, WriteProxy writeProxy) {
+ this.client = client;
+ this.localDb = localDb;
+ this.writeProxy = writeProxy;
loadUsersAndChats();
}
}
diff --git a/src/main/java/envoy/client/ui/Startup.java b/src/main/java/envoy/client/ui/Startup.java
index 1a38da9..1c68e41 100644
--- a/src/main/java/envoy/client/ui/Startup.java
+++ b/src/main/java/envoy/client/ui/Startup.java
@@ -15,6 +15,7 @@ import envoy.client.Config;
import envoy.client.Settings;
import envoy.client.data.*;
import envoy.client.net.Client;
+import envoy.client.net.WriteProxy;
import envoy.client.util.EnvoyLog;
import envoy.data.LoginCredentials;
import envoy.data.Message;
@@ -148,14 +149,19 @@ public class Startup {
JOptionPane.WARNING_MESSAGE);
}
- // Save all users to the local database
- if (client.isOnline()) localDb.setUsers(client.getUsers());
+ // Initialize write proxy
+ final WriteProxy writeProxy = client.createWriteProxy(localDb);
+
+ // Save all users to the local database and flush cache
+ if (client.isOnline()) {
+ localDb.setUsers(client.getUsers());
+ writeProxy.flushCache();
+ }
// Display ChatWindow and StatusTrayIcon
EventQueue.invokeLater(() -> {
try {
- chatWindow.setClient(client);
- chatWindow.setLocalDB(localDb);
+ chatWindow.initContent(client, localDb, writeProxy);
try {
new StatusTrayIcon(chatWindow).show();