diff --git a/runelite-client/src/main/java/net/runelite/client/Notifier.java b/runelite-client/src/main/java/net/runelite/client/Notifier.java index 5a5b0c5ea4..66ada917a4 100644 --- a/runelite-client/src/main/java/net/runelite/client/Notifier.java +++ b/runelite-client/src/main/java/net/runelite/client/Notifier.java @@ -26,39 +26,40 @@ package net.runelite.client; import com.google.common.escape.Escaper; import com.google.common.escape.Escapers; +import com.google.inject.Inject; import java.awt.Toolkit; import java.awt.TrayIcon; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import javax.inject.Provider; +import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; import net.runelite.client.config.RuneLiteConfig; import net.runelite.client.util.OSType; +import net.runelite.client.ui.ClientUI; +@Singleton @Slf4j public class Notifier { - // Default timeout of notification in milliseconds private static final int DEFAULT_TIMEOUT = 10000; private static final String DOUBLE_QUOTE = "\""; - private static final Escaper SHELL_ESCAPE; - - static - { - final Escapers.Builder builder = Escapers.builder(); - builder.addEscape('"', "'"); - SHELL_ESCAPE = builder.build(); - } + private static final Escaper SHELL_ESCAPE = Escapers.builder() + .addEscape('"', "'") + .build(); private final String appName; - private final TrayIcon trayIcon; private final RuneLiteConfig runeLiteConfig; + private final Provider clientUI; - Notifier(final String appName, final TrayIcon trayIcon, final RuneLiteConfig runeliteConfig) + @Inject + private Notifier(final Provider clientUI, final RuneLiteConfig runeliteConfig, final RuneLiteProperties + runeLiteProperties) { - this.appName = appName; - this.trayIcon = trayIcon; + this.appName = runeLiteProperties.getTitle(); + this.clientUI = clientUI; this.runeLiteConfig = runeliteConfig; } @@ -69,6 +70,28 @@ public class Notifier public void notify(String message, TrayIcon.MessageType type) { + if (!runeLiteConfig.enableTrayNotifications()) + { + return; + } + + final ClientUI clientUI = this.clientUI.get(); + + if (clientUI == null) + { + return; + } + + if (!runeLiteConfig.sendNotificationsWhenFocused() && clientUI.isFocused()) + { + return; + } + + if (runeLiteConfig.requestFocusOnNotification()) + { + clientUI.requestFocus(); + } + sendNotification(appName, message, type, null); if (runeLiteConfig.enableNotificationSound()) @@ -105,9 +128,16 @@ public class Notifier final String message, final TrayIcon.MessageType type) { - if (trayIcon != null) + final ClientUI clientUI = this.clientUI.get(); + + if (clientUI == null) { - trayIcon.displayMessage(title, message, type); + return; + } + + if (clientUI.getTrayIcon() != null) + { + clientUI.getTrayIcon().displayMessage(title, message, type); } } diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLite.java b/runelite-client/src/main/java/net/runelite/client/RuneLite.java index 3320e7507b..a3e6af2849 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -98,7 +98,6 @@ public class RuneLite Client client; ClientUI gui; - Notifier notifier; public static void main(String[] args) throws Exception { @@ -161,9 +160,6 @@ public class RuneLite eventBus.register(gui); eventBus.register(pluginManager); - // Setup the notifier - notifier = new Notifier(properties.getTitle(), gui.getTrayIcon(), runeliteConfig); - // Tell the plugin manager if client is outdated or not pluginManager.setOutdated(isOutdated); @@ -219,12 +215,6 @@ public class RuneLite this.client = client; } - @VisibleForTesting - public void setNotifier(Notifier notifier) - { - this.notifier = notifier; - } - public static Injector getInjector() { return injector; diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java b/runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java index a901557d8a..24c49fd308 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLiteModule.java @@ -73,12 +73,6 @@ public class RuneLiteModule extends AbstractModule return runelite.gui; } - @Provides - Notifier provideNotifier(RuneLite runeLite) - { - return runeLite.notifier; - } - @Provides @Singleton RuneLiteConfig provideConfig(ConfigManager configManager) diff --git a/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java b/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java index 9604c7d9bb..c579bb264e 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java @@ -76,6 +76,16 @@ public interface RuneLiteConfig extends Config return false; } + @ConfigItem( + keyName = "notificationTray", + name = "Enable tray notifications", + description = "Enables tray notifications" + ) + default boolean enableTrayNotifications() + { + return true; + } + @ConfigItem( keyName = "notificationSound", name = "Enable sound on notifications", @@ -85,4 +95,24 @@ public interface RuneLiteConfig extends Config { return true; } -} + + @ConfigItem( + keyName = "notificationFocused", + name = "Send notifications when focused", + description = "Toggles idle notifications for when the client is focused" + ) + default boolean sendNotificationsWhenFocused() + { + return false; + } + + @ConfigItem( + keyName = "notificationRequestFocus", + name = "Request focus on notification", + description = "Toggles window focus request" + ) + default boolean requestFocusOnNotification() + { + return true; + } +} \ No newline at end of file diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/PluginManagerTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/PluginManagerTest.java index 67e0d58cde..da87c58bc3 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/PluginManagerTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/PluginManagerTest.java @@ -43,7 +43,6 @@ import java.util.Objects; import java.util.Set; import joptsimple.OptionSet; import net.runelite.api.Client; -import net.runelite.client.Notifier; import net.runelite.client.RuneLite; import net.runelite.client.RuneLiteModule; import net.runelite.client.ui.ClientUI; @@ -74,9 +73,6 @@ public class PluginManagerTest @Mock Client client; - @Mock - Notifier notifier; - @Before public void before() throws IOException { @@ -88,7 +84,6 @@ public class PluginManagerTest runelite = injector.getInstance(RuneLite.class); runelite.setGui(clientUi); - runelite.setNotifier(notifier); // Find plugins we expect to have pluginClasses = new HashSet<>();