Fixed threading issue when receiving unread messages
This commit is contained in:
		@@ -51,16 +51,17 @@ public class Client implements Closeable {
 | 
			
		||||
	 * will block for up to 5 seconds. If the handshake does exceed this time limit,
 | 
			
		||||
	 * an exception is thrown.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param credentials the login credentials of the user
 | 
			
		||||
	 * @param localDb     the local database used to persist the current
 | 
			
		||||
	 *                    {@link IdGenerator}
 | 
			
		||||
	 * @return a message cache containing all unread messages from the server that
 | 
			
		||||
	 *         can be relayed after initialization
 | 
			
		||||
	 * @param credentials          the login credentials of the user
 | 
			
		||||
	 * @param localDb              the local database used to persist the current
 | 
			
		||||
	 *                             {@link IdGenerator}
 | 
			
		||||
	 * @param receivedMessageCache a message cache containing all unread messages
 | 
			
		||||
	 *                             from the server that can be relayed after
 | 
			
		||||
	 *                             initialization
 | 
			
		||||
	 * @throws Exception if the online mode could not be entered or the request
 | 
			
		||||
	 *                   failed for some other reason
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public Cache<Message> onlineInit(LoginCredentials credentials, LocalDb localDb) throws Exception {
 | 
			
		||||
	public void onlineInit(LoginCredentials credentials, LocalDb localDb, Cache<Message> receivedMessageCache) throws Exception {
 | 
			
		||||
		// Establish TCP connection
 | 
			
		||||
		logger.info(String.format("Attempting connection to server %s:%d...", config.getServer(), config.getPort()));
 | 
			
		||||
		socket = new Socket(config.getServer(), config.getPort());
 | 
			
		||||
@@ -69,13 +70,10 @@ public class Client implements Closeable {
 | 
			
		||||
		// Create message receiver
 | 
			
		||||
		receiver = new Receiver(socket.getInputStream());
 | 
			
		||||
 | 
			
		||||
		// Create cache for unread messages
 | 
			
		||||
		final Cache<Message> cache = new Cache<>();
 | 
			
		||||
 | 
			
		||||
		// Register user creation processor, contact list processor and message cache
 | 
			
		||||
		receiver.registerProcessor(User.class, sender -> { logger.info("Acquired user object " + sender); this.sender = sender; });
 | 
			
		||||
		receiver.registerProcessor(Contacts.class, contacts -> { logger.info("Acquired contacts object " + contacts); this.contacts = contacts; });
 | 
			
		||||
		receiver.registerProcessor(Message.class, cache);
 | 
			
		||||
		receiver.registerProcessor(Message.class, receivedMessageCache);
 | 
			
		||||
 | 
			
		||||
		// Start receiver
 | 
			
		||||
		new Thread(receiver).start();
 | 
			
		||||
@@ -104,7 +102,7 @@ public class Client implements Closeable {
 | 
			
		||||
		receiver.registerProcessor(Message.class, receivedMessageProcessor);
 | 
			
		||||
 | 
			
		||||
		// Relay cached unread messages
 | 
			
		||||
		cache.setProcessor(receivedMessageProcessor);
 | 
			
		||||
		receivedMessageCache.setProcessor(receivedMessageProcessor);
 | 
			
		||||
 | 
			
		||||
		// Process message status changes
 | 
			
		||||
		receiver.registerProcessor(MessageStatusChangeEvent.class, new MessageStatusChangeEventProcessor());
 | 
			
		||||
@@ -117,8 +115,6 @@ public class Client implements Closeable {
 | 
			
		||||
 | 
			
		||||
		// Request a generator if none is present or the existing one is consumed
 | 
			
		||||
		if (!localDb.hasIdGenerator() || !localDb.getIdGenerator().hasNext()) requestIdGenerator();
 | 
			
		||||
 | 
			
		||||
		return cache;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
 
 | 
			
		||||
@@ -106,11 +106,11 @@ public class Startup {
 | 
			
		||||
		// Acquire the client user (with ID) either from the server or from the local
 | 
			
		||||
		// database, which triggers offline mode
 | 
			
		||||
		Client			client	= new Client();
 | 
			
		||||
		Cache<Message>	cache	= null;
 | 
			
		||||
		Cache<Message>	cache	= new Cache<>();
 | 
			
		||||
		try {
 | 
			
		||||
			// Try entering online mode first
 | 
			
		||||
			localDb.loadIdGenerator();
 | 
			
		||||
			cache = client.onlineInit(credentials, localDb);
 | 
			
		||||
			client.onlineInit(credentials, localDb, cache);
 | 
			
		||||
		} catch (Exception e1) {
 | 
			
		||||
			logger.warning("Could not connect to server. Trying offline mode...");
 | 
			
		||||
			e1.printStackTrace();
 | 
			
		||||
@@ -162,6 +162,9 @@ public class Startup {
 | 
			
		||||
			try {
 | 
			
		||||
				chatWindow.initContent(client, localDb, writeProxy);
 | 
			
		||||
 | 
			
		||||
				// Relay unread messages from cache
 | 
			
		||||
				if (cache != null) cache.relay();
 | 
			
		||||
 | 
			
		||||
				try {
 | 
			
		||||
					new StatusTrayIcon(chatWindow).show();
 | 
			
		||||
 | 
			
		||||
@@ -180,9 +183,6 @@ public class Startup {
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		// Relay unread messages from cache
 | 
			
		||||
		if (cache != null) cache.relay();
 | 
			
		||||
 | 
			
		||||
		// Save Settings and PersistentLocalDb on shutdown
 | 
			
		||||
		Runtime.getRuntime().addShutdownHook(new Thread(() -> {
 | 
			
		||||
			try {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user