Creating message notifications only if ChatWindow has lost focus
StatusTray injects a WindowFocusListener into ChatWindow in its constructor and does only react to received messages if ChatWindow has currently lost focus.
This commit is contained in:
		| @@ -63,9 +63,9 @@ public class Startup { | ||||
|  | ||||
| 		EventQueue.invokeLater(() -> { | ||||
| 			try { | ||||
| 				ChatWindow frame = new ChatWindow(client, localDB); | ||||
| 				new StatusTrayIcon().show(); | ||||
| 				frame.setVisible(true); | ||||
| 				ChatWindow chatWindow = new ChatWindow(client, localDB); | ||||
| 				new StatusTrayIcon(chatWindow).show(); | ||||
| 				chatWindow.setVisible(true); | ||||
| 			} catch (Exception e) { | ||||
| 				e.printStackTrace(); | ||||
| 			} | ||||
|   | ||||
| @@ -8,6 +8,8 @@ import java.awt.SystemTray; | ||||
| import java.awt.Toolkit; | ||||
| import java.awt.TrayIcon; | ||||
| import java.awt.TrayIcon.MessageType; | ||||
| import java.awt.event.WindowAdapter; | ||||
| import java.awt.event.WindowEvent; | ||||
| import java.util.HashSet; | ||||
| import java.util.Set; | ||||
|  | ||||
| @@ -16,6 +18,7 @@ import envoy.client.event.EventBus; | ||||
| import envoy.client.event.EventHandler; | ||||
| import envoy.client.event.MessageCreationEvent; | ||||
| import envoy.exception.EnvoyException; | ||||
| import envoy.schema.Message; | ||||
|  | ||||
| /** | ||||
|  * Project: <strong>envoy-client</strong><br> | ||||
| @@ -34,6 +37,12 @@ public class StatusTrayIcon implements EventHandler { | ||||
| 	 */ | ||||
| 	private TrayIcon trayIcon; | ||||
|  | ||||
| 	/** | ||||
| 	 * A received {@link Message} is only displayed as a system tray notification if | ||||
| 	 * this variable is set to {@code true}. | ||||
| 	 */ | ||||
| 	private boolean displayMessages = false; | ||||
|  | ||||
| 	/** | ||||
| 	 * Creates a {@link StatusTrayIcon} with the Envoy logo, a tool tip and a pop-up | ||||
| 	 * menu. | ||||
| @@ -41,11 +50,11 @@ public class StatusTrayIcon implements EventHandler { | ||||
| 	 * @throws EnvoyException if the currently used OS does not support the System | ||||
| 	 *                        Tray API | ||||
| 	 */ | ||||
| 	public StatusTrayIcon() throws EnvoyException { | ||||
| 	public StatusTrayIcon(ChatWindow chatWindow) throws EnvoyException { | ||||
| 		if (!SystemTray.isSupported()) throw new EnvoyException("The Envoy tray icon is not supported."); | ||||
|  | ||||
| 		ClassLoader loader = Thread.currentThread().getContextClassLoader(); | ||||
| 		Image img = Toolkit.getDefaultToolkit().createImage(loader.getResource("envoy_logo.png")); | ||||
| 		ClassLoader	loader	= Thread.currentThread().getContextClassLoader(); | ||||
| 		Image		img		= Toolkit.getDefaultToolkit().createImage(loader.getResource("envoy_logo.png")); | ||||
| 		trayIcon = new TrayIcon(img, "Envoy Client"); | ||||
| 		trayIcon.setImageAutoSize(true); | ||||
| 		trayIcon.setToolTip("You are notified if you have unread messages."); | ||||
| @@ -57,6 +66,22 @@ public class StatusTrayIcon implements EventHandler { | ||||
| 		popup.add(exitMenuItem); | ||||
|  | ||||
| 		trayIcon.setPopupMenu(popup); | ||||
|  | ||||
| 		// Only display messages if the chat window is not focused | ||||
| 		chatWindow.addWindowFocusListener(new WindowAdapter() { | ||||
|  | ||||
| 			@Override | ||||
| 			public void windowGainedFocus(WindowEvent e) { | ||||
| 				displayMessages = false; | ||||
| 			} | ||||
|  | ||||
| 			@Override | ||||
| 			public void windowLostFocus(WindowEvent e) { | ||||
| 				displayMessages = true; | ||||
| 			} | ||||
| 		}); | ||||
|  | ||||
| 		// Start processing message events | ||||
| 		EventBus.getInstance().register(this); | ||||
| 	} | ||||
|  | ||||
| @@ -83,7 +108,9 @@ public class StatusTrayIcon implements EventHandler { | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public void handle(Event<?> event) { | ||||
| 		trayIcon.displayMessage("New message received", ((MessageCreationEvent) event).get().getContent().get(0).getText(), MessageType.INFO); | ||||
| 		System.out.println("Message received. Displaying message: " + displayMessages); | ||||
| 		if (displayMessages) | ||||
| 			trayIcon.displayMessage("New message received", ((MessageCreationEvent) event).get().getContent().get(0).getText(), MessageType.INFO); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
|   | ||||
		Reference in New Issue
	
	Block a user