|
@@ -18,77 +18,67 @@ import java.awt.TrayIcon;
|
|
|
import java.awt.TrayIcon.MessageType;
|
|
|
import java.awt.event.ActionEvent;
|
|
|
import java.io.IOException;
|
|
|
-import java.util.ResourceBundle;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
+import javax.inject.Inject;
|
|
|
+import javax.inject.Named;
|
|
|
+import javax.inject.Singleton;
|
|
|
import javax.script.ScriptEngine;
|
|
|
import javax.script.ScriptEngineManager;
|
|
|
import javax.script.ScriptException;
|
|
|
import javax.swing.SwingUtilities;
|
|
|
|
|
|
import org.apache.commons.lang3.SystemUtils;
|
|
|
+import org.cryptomator.ui.settings.Localization;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
import javafx.application.Platform;
|
|
|
import javafx.stage.Stage;
|
|
|
|
|
|
+@Singleton
|
|
|
public final class TrayIconUtil {
|
|
|
|
|
|
- private static TrayIconUtil INSTANCE;
|
|
|
private static final Logger LOG = LoggerFactory.getLogger(TrayIconUtil.class);
|
|
|
|
|
|
- private final Stage mainApplicationWindow;
|
|
|
- private final ResourceBundle rb;
|
|
|
- private final Runnable exitCommand;
|
|
|
+ private final Stage mainWindow;
|
|
|
+ private final Localization localization;
|
|
|
|
|
|
- /**
|
|
|
- * This will add an icon to the system tray and modify the application shutdown procedure. Depending on
|
|
|
- * {@link Platform#isImplicitExit()} the application may still be running, allowing shutdown using the tray menu.
|
|
|
- */
|
|
|
- public synchronized static void init(Stage mainApplicationWindow, ResourceBundle rb, Runnable exitCommand) {
|
|
|
- if (INSTANCE == null && SystemTray.isSupported()) {
|
|
|
- INSTANCE = new TrayIconUtil(mainApplicationWindow, rb, exitCommand);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private TrayIconUtil(Stage mainApplicationWindow, ResourceBundle rb, Runnable exitCommand) {
|
|
|
- this.mainApplicationWindow = mainApplicationWindow;
|
|
|
- this.rb = rb;
|
|
|
- this.exitCommand = exitCommand;
|
|
|
-
|
|
|
- initTrayIcon();
|
|
|
+ @Inject
|
|
|
+ public TrayIconUtil(@Named("mainWindow") Stage mainWindow, Localization localization) {
|
|
|
+ this.mainWindow = mainWindow;
|
|
|
+ this.localization = localization;
|
|
|
}
|
|
|
|
|
|
- private void initTrayIcon() {
|
|
|
- final TrayIcon trayIcon = createTrayIcon();
|
|
|
+ public void initTrayIcon(Runnable exitCommand) {
|
|
|
+ final TrayIcon trayIcon = createTrayIcon(exitCommand);
|
|
|
try {
|
|
|
SystemTray.getSystemTray().add(trayIcon);
|
|
|
- mainApplicationWindow.setOnCloseRequest((e) -> {
|
|
|
+ mainWindow.setOnCloseRequest((e) -> {
|
|
|
if (Platform.isImplicitExit()) {
|
|
|
exitCommand.run();
|
|
|
} else {
|
|
|
- mainApplicationWindow.close();
|
|
|
+ mainWindow.close();
|
|
|
this.showTrayNotification(trayIcon);
|
|
|
}
|
|
|
});
|
|
|
} catch (SecurityException | AWTException ex) {
|
|
|
// not working? then just go ahead and close the app
|
|
|
- mainApplicationWindow.setOnCloseRequest((ev) -> {
|
|
|
+ mainWindow.setOnCloseRequest((ev) -> {
|
|
|
exitCommand.run();
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private TrayIcon createTrayIcon() {
|
|
|
+ private TrayIcon createTrayIcon(Runnable exitCommand) {
|
|
|
final PopupMenu popup = new PopupMenu();
|
|
|
|
|
|
- final MenuItem showItem = new MenuItem(rb.getString("tray.menu.open"));
|
|
|
+ final MenuItem showItem = new MenuItem(localization.getString("tray.menu.open"));
|
|
|
showItem.addActionListener(this::restoreFromTray);
|
|
|
popup.add(showItem);
|
|
|
|
|
|
- final MenuItem exitItem = new MenuItem(rb.getString("tray.menu.quit"));
|
|
|
- exitItem.addActionListener(this::quitFromTray);
|
|
|
+ final MenuItem exitItem = new MenuItem(localization.getString("tray.menu.quit"));
|
|
|
+ exitItem.addActionListener(e -> exitCommand.run());
|
|
|
popup.add(exitItem);
|
|
|
|
|
|
final Image image;
|
|
@@ -98,7 +88,7 @@ public final class TrayIconUtil {
|
|
|
image = Toolkit.getDefaultToolkit().getImage(TrayIconUtil.class.getResource("/tray_icon.png"));
|
|
|
}
|
|
|
|
|
|
- return new TrayIcon(image, rb.getString("app.name"), popup);
|
|
|
+ return new TrayIcon(image, localization.getString("app.name"), popup);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -120,8 +110,8 @@ public final class TrayIconUtil {
|
|
|
private void showTrayNotification(TrayIcon trayIcon) {
|
|
|
final Runnable notificationCmd;
|
|
|
if (SystemUtils.IS_OS_MAC_OSX) {
|
|
|
- final String title = rb.getString("tray.infoMsg.title");
|
|
|
- final String msg = rb.getString("tray.infoMsg.msg.osx");
|
|
|
+ final String title = localization.getString("tray.infoMsg.title");
|
|
|
+ final String msg = localization.getString("tray.infoMsg.msg.osx");
|
|
|
final String notificationCenterAppleScript = String.format("display notification \"%s\" with title \"%s\"", msg, title);
|
|
|
notificationCmd = () -> {
|
|
|
try {
|
|
@@ -137,8 +127,8 @@ public final class TrayIconUtil {
|
|
|
}
|
|
|
};
|
|
|
} else {
|
|
|
- final String title = rb.getString("tray.infoMsg.title");
|
|
|
- final String msg = rb.getString("tray.infoMsg.msg");
|
|
|
+ final String title = localization.getString("tray.infoMsg.title");
|
|
|
+ final String msg = localization.getString("tray.infoMsg.msg");
|
|
|
notificationCmd = () -> {
|
|
|
trayIcon.displayMessage(title, msg, MessageType.INFO);
|
|
|
};
|
|
@@ -150,13 +140,9 @@ public final class TrayIconUtil {
|
|
|
|
|
|
private void restoreFromTray(ActionEvent event) {
|
|
|
Platform.runLater(() -> {
|
|
|
- mainApplicationWindow.show();
|
|
|
- mainApplicationWindow.requestFocus();
|
|
|
+ mainWindow.show();
|
|
|
+ mainWindow.requestFocus();
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- private void quitFromTray(ActionEvent event) {
|
|
|
- exitCommand.run();
|
|
|
- }
|
|
|
-
|
|
|
}
|