diff --git a/main/ui/src/main/java/org/cryptomator/ui/launcher/UiLauncher.java b/main/ui/src/main/java/org/cryptomator/ui/launcher/UiLauncher.java index fbf5d7100..538d69602 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/launcher/UiLauncher.java +++ b/main/ui/src/main/java/org/cryptomator/ui/launcher/UiLauncher.java @@ -1,42 +1,68 @@ package org.cryptomator.ui.launcher; import org.cryptomator.common.settings.Settings; +import org.cryptomator.jni.JniException; +import org.cryptomator.jni.MacApplicationUiState; +import org.cryptomator.jni.MacFunctions; import org.cryptomator.ui.fxapp.FxApplication; import org.cryptomator.ui.traymenu.TrayMenuComponent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.inject.Inject; import javax.inject.Singleton; +import java.awt.Desktop; import java.awt.SystemTray; +import java.awt.desktop.AppReopenedEvent; +import java.awt.desktop.AppReopenedListener; +import java.awt.desktop.SystemEventListener; +import java.util.Optional; @Singleton public class UiLauncher { + private static final Logger LOG = LoggerFactory.getLogger(UiLauncher.class); + private final Settings settings; private final TrayMenuComponent.Builder trayComponent; private final FxApplicationStarter fxApplicationStarter; private final AppLaunchEventHandler launchEventHandler; + private final Optional macFunctions; @Inject - public UiLauncher(Settings settings, TrayMenuComponent.Builder trayComponent, FxApplicationStarter fxApplicationStarter, AppLaunchEventHandler launchEventHandler) { + public UiLauncher(Settings settings, TrayMenuComponent.Builder trayComponent, FxApplicationStarter fxApplicationStarter, AppLaunchEventHandler launchEventHandler, Optional macFunctions) { this.settings = settings; this.trayComponent = trayComponent; this.fxApplicationStarter = fxApplicationStarter; this.launchEventHandler = launchEventHandler; + this.macFunctions = macFunctions; } public void launch() { - boolean hasTrayIcon = false; + final boolean hasTrayIcon; if (SystemTray.isSupported()) { trayComponent.build().addIconToSystemTray(); hasTrayIcon = true; + } else { + hasTrayIcon = false; } // show window on start? - if (!settings.startHidden().get()) { - fxApplicationStarter.get(hasTrayIcon).thenAccept(FxApplication::showMainWindow); + if (settings.startHidden().get()) { + LOG.debug("Hiding application..."); + macFunctions.map(MacFunctions::uiState).ifPresent(JniException.ignore(MacApplicationUiState::transformToAgentApplication)); + } else { + showMainWindowAsync(hasTrayIcon); } + // register app reopen listener + Desktop.getDesktop().addAppEventListener((AppReopenedListener) e -> showMainWindowAsync(hasTrayIcon)); + launchEventHandler.startHandlingLaunchEvents(hasTrayIcon); } + private void showMainWindowAsync(boolean hasTrayIcon) { + fxApplicationStarter.get(hasTrayIcon).thenAccept(FxApplication::showMainWindow); + } + } diff --git a/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayIconController.java b/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayIconController.java index bc9e5ca6a..ded374e8c 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayIconController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayIconController.java @@ -1,8 +1,6 @@ package org.cryptomator.ui.traymenu; import org.apache.commons.lang3.SystemUtils; -import org.cryptomator.jni.JniException; -import org.cryptomator.jni.MacApplicationUiState; import org.cryptomator.jni.MacFunctions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,8 +35,6 @@ public class TrayIconController { if (SystemUtils.IS_OS_WINDOWS) { // TODO: test on windows: is this a double click? trayIcon.addActionListener(trayMenuController::showMainWindow); - } else if (SystemUtils.IS_OS_MAC) { - macFunctions.map(MacFunctions::uiState).ifPresent(JniException.ignore(MacApplicationUiState::transformToAgentApplication)); } try {