diff --git a/main/commons/src/main/java/org/cryptomator/common/LazyInitializer.java b/main/commons/src/main/java/org/cryptomator/common/LazyInitializer.java index eb7a9400f..1316c50d1 100644 --- a/main/commons/src/main/java/org/cryptomator/common/LazyInitializer.java +++ b/main/commons/src/main/java/org/cryptomator/common/LazyInitializer.java @@ -17,16 +17,17 @@ public final class LazyInitializer { * @return The initialized value */ public static T initializeLazily(AtomicReference reference, Supplier factory) { - final T existingInstance = reference.get(); - if (existingInstance != null) { - return existingInstance; + final T existing = reference.get(); + if (existing != null) { + return existing; } else { - final T newInstance = factory.get(); - if (reference.compareAndSet(null, newInstance)) { - return newInstance; - } else { - return reference.get(); - } + return reference.updateAndGet(currentValue -> { + if (currentValue == null) { + return factory.get(); + } else { + return currentValue; + } + }); } } diff --git a/main/ui/pom.xml b/main/ui/pom.xml index 2c261d3ad..6ceb70390 100644 --- a/main/ui/pom.xml +++ b/main/ui/pom.xml @@ -54,6 +54,11 @@ org.cryptomator frontend-webdav + + org.cryptomator + jni + 1.0.0-SNAPSHOT + diff --git a/main/ui/src/main/java/org/cryptomator/ui/CryptomatorComponent.java b/main/ui/src/main/java/org/cryptomator/ui/CryptomatorComponent.java index 095caeb89..e82e006e9 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/CryptomatorComponent.java +++ b/main/ui/src/main/java/org/cryptomator/ui/CryptomatorComponent.java @@ -8,10 +8,12 @@ *******************************************************************************/ package org.cryptomator.ui; +import java.util.Optional; import java.util.concurrent.ExecutorService; import javax.inject.Singleton; +import org.cryptomator.jni.MacFunctions; import org.cryptomator.ui.controllers.MainController; import org.cryptomator.ui.settings.Localization; import org.cryptomator.ui.util.AsyncTaskService; @@ -34,4 +36,7 @@ interface CryptomatorComponent { Localization localization(); ExitUtil exitUtil(); -} \ No newline at end of file + + Optional nativeMacFunctions(); + +} diff --git a/main/ui/src/main/java/org/cryptomator/ui/CryptomatorModule.java b/main/ui/src/main/java/org/cryptomator/ui/CryptomatorModule.java index b62f631c4..f4cc072ae 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/CryptomatorModule.java +++ b/main/ui/src/main/java/org/cryptomator/ui/CryptomatorModule.java @@ -8,6 +8,7 @@ *******************************************************************************/ package org.cryptomator.ui; +import java.util.Optional; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -19,6 +20,8 @@ import org.cryptomator.crypto.engine.impl.CryptoEngineModule; import org.cryptomator.frontend.FrontendFactory; import org.cryptomator.frontend.webdav.WebDavModule; import org.cryptomator.frontend.webdav.WebDavServer; +import org.cryptomator.jni.JniModule; +import org.cryptomator.jni.MacFunctions; import org.cryptomator.ui.model.VaultObjectMapperProvider; import org.cryptomator.ui.settings.Settings; import org.cryptomator.ui.settings.SettingsProvider; @@ -99,4 +102,10 @@ class CryptomatorModule { return closer.closeLater(webDavServer, WebDavServer::stop).get().orElseThrow(IllegalStateException::new); } + @Provides + @Singleton + Optional provideMacFunctions() { + return JniModule.macFunctions(); + } + } diff --git a/main/ui/src/main/java/org/cryptomator/ui/ExitUtil.java b/main/ui/src/main/java/org/cryptomator/ui/ExitUtil.java index ff0cbe0dd..7352d149c 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/ExitUtil.java +++ b/main/ui/src/main/java/org/cryptomator/ui/ExitUtil.java @@ -21,6 +21,7 @@ import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.IOException; +import java.util.Optional; import java.util.concurrent.TimeUnit; import javax.inject.Inject; @@ -32,6 +33,9 @@ import javax.script.ScriptException; import javax.swing.SwingUtilities; import org.apache.commons.lang3.SystemUtils; +import org.cryptomator.jni.JniException; +import org.cryptomator.jni.MacApplicationUiState; +import org.cryptomator.jni.MacFunctions; import org.cryptomator.ui.settings.Localization; import org.cryptomator.ui.settings.Settings; import org.slf4j.Logger; @@ -48,12 +52,14 @@ class ExitUtil { private final Stage mainWindow; private final Localization localization; private final Settings settings; + private final Optional macFunctions; @Inject - public ExitUtil(@Named("mainWindow") Stage mainWindow, Localization localization, Settings settings) { + public ExitUtil(@Named("mainWindow") Stage mainWindow, Localization localization, Settings settings, Optional macFunctions) { this.mainWindow = mainWindow; this.localization = localization; this.settings = settings; + this.macFunctions = macFunctions; } public void initExitHandler(Runnable exitCommand) { @@ -88,6 +94,7 @@ class ExitUtil { if (Platform.isImplicitExit()) { exitCommand.run(); } else { + macFunctions.map(MacFunctions::uiState).ifPresent(JniException.ignore(MacApplicationUiState::transformToAgentApplication)); mainWindow.close(); this.showTrayNotification(trayIcon); } @@ -189,6 +196,7 @@ class ExitUtil { private void restoreFromTray(ActionEvent event) { Platform.runLater(() -> { + macFunctions.map(MacFunctions::uiState).ifPresent(JniException.ignore(MacApplicationUiState::transformToForegroundApplication)); mainWindow.show(); mainWindow.requestFocus(); }); diff --git a/main/ui/src/main/java/org/cryptomator/ui/MainApplication.java b/main/ui/src/main/java/org/cryptomator/ui/MainApplication.java index d28721ffa..8e5f60b06 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/MainApplication.java +++ b/main/ui/src/main/java/org/cryptomator/ui/MainApplication.java @@ -15,6 +15,9 @@ import java.nio.file.Path; import java.util.concurrent.ExecutionException; import org.apache.commons.lang3.SystemUtils; +import org.cryptomator.jni.JniException; +import org.cryptomator.jni.MacApplicationUiState; +import org.cryptomator.jni.MacFunctions; import org.cryptomator.ui.controllers.MainController; import org.cryptomator.ui.util.ActiveWindowStyleSupport; import org.cryptomator.ui.util.DeferredCloser; @@ -67,6 +70,7 @@ public class MainApplication extends Application { } // show window and start observing its focus: + comp.nativeMacFunctions().map(MacFunctions::uiState).ifPresent(JniException.ignore(MacApplicationUiState::transformToForegroundApplication)); primaryStage.show(); ActiveWindowStyleSupport.startObservingFocus(primaryStage); comp.exitUtil().initExitHandler(this::quit);