Fixed state errors in offline mode (#116)
* Display all contacts as offline while in offline mode * Update message status to sent after relaying message cache
This commit is contained in:
		@@ -21,8 +21,8 @@ import envoy.event.MessageStatusChangeEvent;
 | 
			
		||||
public abstract class LocalDb {
 | 
			
		||||
 | 
			
		||||
	protected User								user;
 | 
			
		||||
	protected Map<String, User>					users	= new HashMap<>();
 | 
			
		||||
	protected List<Chat>						chats	= new ArrayList<>();
 | 
			
		||||
	protected Map<String, User>					users			= new HashMap<>();
 | 
			
		||||
	protected List<Chat>						chats			= new ArrayList<>();
 | 
			
		||||
	protected IdGenerator						idGenerator;
 | 
			
		||||
	protected Cache<Message>					messageCache	= new Cache<>();
 | 
			
		||||
	protected Cache<MessageStatusChangeEvent>	statusCache		= new Cache<>();
 | 
			
		||||
@@ -143,4 +143,19 @@ public abstract class LocalDb {
 | 
			
		||||
	 * @since Envoy v0.3-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public void setStatusCache(Cache<MessageStatusChangeEvent> statusCache) { this.statusCache = statusCache; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Searches for a message by ID.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param id the ID of the message to search for
 | 
			
		||||
	 * @return the message with the corresponding ID, or {@code null} if no message
 | 
			
		||||
	 *         has been found
 | 
			
		||||
	 * @since Envoy v0.1-beta
 | 
			
		||||
	 */
 | 
			
		||||
	public Message getMessage(long id) {
 | 
			
		||||
		for (Chat c : chats)
 | 
			
		||||
			for (Message m : c.getModel())
 | 
			
		||||
				if (m.getId() == id) return m;
 | 
			
		||||
		return null;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -47,6 +47,9 @@ public class WriteProxy {
 | 
			
		||||
			try {
 | 
			
		||||
				logger.finer("Sending cached " + msg);
 | 
			
		||||
				client.sendMessage(msg);
 | 
			
		||||
 | 
			
		||||
				// Update message state to SENT in local db
 | 
			
		||||
				localDb.getMessage(msg.getId()).nextStatus();
 | 
			
		||||
			} catch (IOException e) {
 | 
			
		||||
				logger.log(Level.SEVERE, "Could not send cached message", e);
 | 
			
		||||
			}
 | 
			
		||||
 
 | 
			
		||||
@@ -522,28 +522,6 @@ public class ChatWindow extends JFrame {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Initializes the elements of the user list by downloading them from the
 | 
			
		||||
	 * server.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @since Envoy v0.1-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	private void loadUsersAndChats() {
 | 
			
		||||
		new Thread(() -> {
 | 
			
		||||
			localDb.getUsers().values().forEach(user -> {
 | 
			
		||||
				userListModel.addElement(user);
 | 
			
		||||
 | 
			
		||||
				// Check if user exists in local DB
 | 
			
		||||
				if (localDb.getChats().stream().filter(c -> c.getRecipient().getId() == user.getId()).count() == 0)
 | 
			
		||||
					localDb.getChats().add(new Chat(user));
 | 
			
		||||
			});
 | 
			
		||||
			SwingUtilities.invokeLater(() -> userList.setModel(userListModel));
 | 
			
		||||
 | 
			
		||||
			revalidate();
 | 
			
		||||
			repaint();
 | 
			
		||||
		}).start();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private void readCurrentChat() {
 | 
			
		||||
		try {
 | 
			
		||||
			currentChat.read(writeProxy);
 | 
			
		||||
@@ -590,7 +568,21 @@ public class ChatWindow extends JFrame {
 | 
			
		||||
		this.client		= client;
 | 
			
		||||
		this.localDb	= localDb;
 | 
			
		||||
		this.writeProxy	= writeProxy;
 | 
			
		||||
		loadUsersAndChats();
 | 
			
		||||
 | 
			
		||||
		// Load users and chats
 | 
			
		||||
		new Thread(() -> {
 | 
			
		||||
			localDb.getUsers().values().forEach(user -> {
 | 
			
		||||
				userListModel.addElement(user);
 | 
			
		||||
 | 
			
		||||
				// Check if user exists in local DB
 | 
			
		||||
				if (localDb.getChats().stream().noneMatch(c -> c.getRecipient().getId() == user.getId()))
 | 
			
		||||
					localDb.getChats().add(new Chat(user));
 | 
			
		||||
			});
 | 
			
		||||
			SwingUtilities.invokeLater(() -> userList.setModel(userListModel));
 | 
			
		||||
 | 
			
		||||
			revalidate();
 | 
			
		||||
			repaint();
 | 
			
		||||
		}).start();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +17,7 @@ import envoy.client.net.Client;
 | 
			
		||||
import envoy.client.net.WriteProxy;
 | 
			
		||||
import envoy.data.Config;
 | 
			
		||||
import envoy.data.Message;
 | 
			
		||||
import envoy.data.User.UserStatus;
 | 
			
		||||
import envoy.exception.EnvoyException;
 | 
			
		||||
import envoy.util.EnvoyLog;
 | 
			
		||||
 | 
			
		||||
@@ -113,7 +114,7 @@ public class Startup {
 | 
			
		||||
		} catch (Exception e) {
 | 
			
		||||
			e.printStackTrace();
 | 
			
		||||
			JOptionPane.showMessageDialog(null,
 | 
			
		||||
					"Error while loading local database: " + e + "\nChats might not be stored locally.",
 | 
			
		||||
					"Error while loading local database: " + e + "\nChats will not be stored locally.",
 | 
			
		||||
					"Local DB error",
 | 
			
		||||
					JOptionPane.WARNING_MESSAGE);
 | 
			
		||||
		}
 | 
			
		||||
@@ -121,10 +122,15 @@ public class Startup {
 | 
			
		||||
		// Initialize write proxy
 | 
			
		||||
		final WriteProxy writeProxy = client.createWriteProxy(localDb);
 | 
			
		||||
 | 
			
		||||
		// Save all users to the local database and flush cache
 | 
			
		||||
		if (client.isOnline()) {
 | 
			
		||||
 | 
			
		||||
			// Save all users to the local database and flush cache
 | 
			
		||||
			localDb.setUsers(client.getUsers());
 | 
			
		||||
			writeProxy.flushCache();
 | 
			
		||||
		} else {
 | 
			
		||||
 | 
			
		||||
			// Set all contacts to offline mode
 | 
			
		||||
			localDb.getUsers().values().stream().filter(u -> u != localDb.getUser()).forEach(u -> u.setStatus(UserStatus.OFFLINE));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Display ChatWindow and StatusTrayIcon
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user