Prechádzať zdrojové kódy

partial revert of dd3c969f, now using Application.launch(MainApp.class) again

Sebastian Stenzel 6 rokov pred
rodič
commit
6677079623

+ 38 - 16
main/launcher/src/main/java/org/cryptomator/launcher/Cryptomator.java

@@ -5,10 +5,13 @@
  *******************************************************************************/
 package org.cryptomator.launcher;
 
+import javafx.application.Application;
 import javafx.application.Platform;
+import javafx.stage.Stage;
 import org.apache.commons.lang3.SystemUtils;
 import org.cryptomator.logging.DebugMode;
 import org.cryptomator.logging.LoggerConfiguration;
+import org.cryptomator.ui.controllers.MainController;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -31,15 +34,13 @@ public class Cryptomator {
 	private final DebugMode debugMode;
 	private final IpcFactory ipcFactory;
 	private final Optional<String> applicationVersion;
-	private final CountDownLatch shutdownLatch;
 
 	@Inject
-	Cryptomator(LoggerConfiguration logConfig, DebugMode debugMode, IpcFactory ipcFactory, @Named("applicationVersion") Optional<String> applicationVersion, @Named("shutdownLatch") CountDownLatch shutdownLatch) {
+	Cryptomator(LoggerConfiguration logConfig, DebugMode debugMode, IpcFactory ipcFactory, @Named("applicationVersion") Optional<String> applicationVersion) {
 		this.logConfig = logConfig;
 		this.debugMode = debugMode;
 		this.ipcFactory = ipcFactory;
 		this.applicationVersion = applicationVersion;
-		this.shutdownLatch = shutdownLatch;
 	}
 
 	public static void main(String[] args) {
@@ -90,22 +91,43 @@ public class Cryptomator {
 
 	/**
 	 * Launches the JavaFX application and waits until shutdown is requested.
-	 *
-	 * @implNote This method blocks until {@link #shutdownLatch} reached zero.
 	 */
 	private void runGuiApplication() {
-		try {
-			debugMode.initialize();
-			CleanShutdownPerformer.registerShutdownHook();
-			Platform.startup(() -> {
-				assert Platform.isFxApplicationThread();
-				FxApplication app = CRYPTOMATOR_COMPONENT.fxApplicationComponent().application();
-				app.start();
-			});
-			shutdownLatch.await();
-		} catch (InterruptedException e) {
-			Thread.currentThread().interrupt();
+		debugMode.initialize();
+		CleanShutdownPerformer.registerShutdownHook();
+		Application.launch(MainApp.class);
+//			Platform.startup(() -> {
+//				assert Platform.isFxApplicationThread();
+//				FxApplication app = CRYPTOMATOR_COMPONENT.fxApplicationComponent().application();
+//				app.start();
+//			});
+	}
+
+
+	// We need a separate FX Application class, until we can use the module system. See https://stackoverflow.com/q/54756176/4014509
+	public static class MainApp extends Application {
+
+		@Override
+		public void start(Stage primaryStage) {
+			LOG.info("JavaFX application started.");
+			primaryStage.setMinWidth(652.0);
+			primaryStage.setMinHeight(440.0);
+
+			FxApplicationComponent fxApplicationComponent = CRYPTOMATOR_COMPONENT.fxApplicationComponent() //
+					.fxApplication(this) //
+					.mainWindow(primaryStage) //
+					.build();
+
+			MainController mainCtrl = fxApplicationComponent.fxmlLoader().load("/fxml/main.fxml");
+			mainCtrl.initStage(primaryStage);
+			primaryStage.show();
 		}
+
+		@Override
+		public void stop() {
+			LOG.info("JavaFX application stopped.");
+		}
+
 	}
 
 }

+ 1 - 1
main/launcher/src/main/java/org/cryptomator/launcher/CryptomatorComponent.java

@@ -16,6 +16,6 @@ public interface CryptomatorComponent {
 
 	Cryptomator application();
 
-	FxApplicationComponent fxApplicationComponent();
+	FxApplicationComponent.Builder fxApplicationComponent();
 
 }

+ 0 - 7
main/launcher/src/main/java/org/cryptomator/launcher/CryptomatorModule.java

@@ -16,13 +16,6 @@ import java.util.concurrent.CountDownLatch;
 @Module
 class CryptomatorModule {
 
-	@Provides
-	@Singleton
-	@Named("shutdownLatch")
-	static CountDownLatch provideShutdownLatch() {
-		return new CountDownLatch(1);
-	}
-
 	@Provides
 	@Singleton
 	static Settings provideSettings(SettingsProvider settingsProvider) {

+ 0 - 40
main/launcher/src/main/java/org/cryptomator/launcher/FxApplication.java

@@ -1,40 +0,0 @@
-package org.cryptomator.launcher;
-
-import javafx.application.Application;
-import javafx.stage.Stage;
-import org.cryptomator.common.FxApplicationScoped;
-import org.cryptomator.ui.controllers.MainController;
-import org.cryptomator.ui.controllers.ViewControllerLoader;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-
-@FxApplicationScoped
-public class FxApplication extends Application {
-
-	private static final Logger LOG = LoggerFactory.getLogger(FxApplication.class);
-
-	private final Stage primaryStage;
-	private final ViewControllerLoader fxmlLoader;
-
-	@Inject
-	FxApplication(@Named("mainWindow") Stage primaryStage, ViewControllerLoader fxmlLoader) {
-		this.primaryStage = primaryStage;
-		this.fxmlLoader = fxmlLoader;
-	}
-
-	public void start() {
-		LOG.info("Starting GUI...");
-		start(primaryStage);
-	}
-
-	@Override
-	public void start(Stage primaryStage) {
-		MainController mainCtrl = fxmlLoader.load("/fxml/main.fxml");
-		mainCtrl.initStage(primaryStage);
-		primaryStage.show();
-	}
-
-}

+ 21 - 1
main/launcher/src/main/java/org/cryptomator/launcher/FxApplicationComponent.java

@@ -5,13 +5,33 @@
  *******************************************************************************/
 package org.cryptomator.launcher;
 
+import dagger.BindsInstance;
 import dagger.Subcomponent;
+import javafx.application.Application;
+import javafx.stage.Stage;
 import org.cryptomator.common.FxApplicationScoped;
+import org.cryptomator.logging.DebugMode;
+import org.cryptomator.ui.controllers.ViewControllerLoader;
+
+import javax.inject.Named;
 
 @FxApplicationScoped
 @Subcomponent(modules = FxApplicationModule.class)
 interface FxApplicationComponent {
 
-	FxApplication application();
+	ViewControllerLoader fxmlLoader();
+
+	@Subcomponent.Builder
+	interface Builder {
+
+		@BindsInstance
+		Builder fxApplication(Application application);
+
+		@BindsInstance
+		Builder mainWindow(@Named("mainWindow") Stage mainWindow);
+
+		FxApplicationComponent build();
+
+	}
 
 }

+ 2 - 21
main/launcher/src/main/java/org/cryptomator/launcher/FxApplicationModule.java

@@ -5,12 +5,8 @@
  *******************************************************************************/
 package org.cryptomator.launcher;
 
-import dagger.Binds;
 import dagger.Module;
 import dagger.Provides;
-import javafx.application.Application;
-import javafx.application.Platform;
-import javafx.stage.Stage;
 import org.cryptomator.common.FxApplicationScoped;
 import org.cryptomator.ui.UiModule;
 
@@ -18,28 +14,13 @@ import javax.inject.Named;
 import java.util.function.Consumer;
 
 @Module(includes = {UiModule.class})
-abstract class FxApplicationModule {
+class FxApplicationModule {
 
 	@Provides
 	@FxApplicationScoped
 	@Named("shutdownTaskScheduler")
-	static Consumer<Runnable> provideShutdownTaskScheduler() {
+	Consumer<Runnable> provideShutdownTaskScheduler() {
 		return CleanShutdownPerformer::scheduleShutdownTask;
 	}
 
-	@Provides
-	@FxApplicationScoped
-	@Named("mainWindow")
-	static Stage providePrimaryStage() {
-		Stage stage = new Stage();
-		stage.setMinWidth(652.0);
-		stage.setMinHeight(440.0);
-		return stage;
-	}
-
-	@Binds
-	@FxApplicationScoped
-	abstract Application bindApplication(FxApplication application);
-
-
 }

+ 3 - 6
main/ui/src/main/java/org/cryptomator/ui/controllers/MainController.java

@@ -78,7 +78,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutorService;
 import java.util.stream.Stream;
 
@@ -100,7 +99,6 @@ public class MainController implements ViewController {
 	private final ViewControllerLoader viewControllerLoader;
 	private final ObjectProperty<ViewController> activeController = new SimpleObjectProperty<>();
 	private final ObservableList<Vault> vaults;
-	private final CountDownLatch shutdownLatch;
 	private final BooleanBinding areAllVaultsLocked;
 	private final ObjectProperty<Vault> selectedVault = new SimpleObjectProperty<>();
 	private final ObjectExpression<Vault.State> selectedVaultState = ObjectExpression.objectExpression(EasyBind.select(selectedVault).selectObject(Vault::stateProperty));
@@ -114,7 +112,7 @@ public class MainController implements ViewController {
 
 	@Inject
 	public MainController(@Named("mainWindow") Stage mainWindow, ExecutorService executorService, @Named("launchEventQueue") BlockingQueue<AppLaunchEvent> launchEventQueue, ExitUtil exitUtil, Localization localization,
-						  VaultFactory vaultFactoy, ViewControllerLoader viewControllerLoader, UpgradeStrategies upgradeStrategies, VaultList vaults, AutoUnlocker autoUnlocker, @Named("shutdownLatch") CountDownLatch shutdownLatch) {
+						  VaultFactory vaultFactoy, ViewControllerLoader viewControllerLoader, UpgradeStrategies upgradeStrategies, VaultList vaults, AutoUnlocker autoUnlocker) {
 		this.mainWindow = mainWindow;
 		this.executorService = executorService;
 		this.launchEventQueue = launchEventQueue;
@@ -123,7 +121,6 @@ public class MainController implements ViewController {
 		this.vaultFactoy = vaultFactoy;
 		this.viewControllerLoader = viewControllerLoader;
 		this.vaults = vaults;
-		this.shutdownLatch = shutdownLatch;
 
 		// derived bindings:
 		this.isShowingSettings = Bindings.equal(SettingsController.class, EasyBind.monadic(activeController).map(ViewController::getClass));
@@ -234,13 +231,13 @@ public class MainController implements ViewController {
 				if (tryAgainButtonType.equals(btnType)) {
 					gracefulShutdown();
 				} else if (forceShutdownButtonType.equals(btnType)) {
-					shutdownLatch.countDown();
+					Platform.runLater(Platform::exit);
 				} else {
 					return;
 				}
 			});
 		} else {
-			shutdownLatch.countDown();
+			Platform.runLater(Platform::exit);
 		}
 	}
 

+ 0 - 3
main/ui/src/test/java/org/cryptomator/ui/controls/SecPasswordFieldTest.java

@@ -1,7 +1,6 @@
 package org.cryptomator.ui.controls;
 
 import javafx.application.Platform;
-import javafx.embed.swing.JFXPanel;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Assumptions;
 import org.junit.jupiter.api.BeforeAll;
@@ -9,12 +8,10 @@ import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 
-import javax.swing.SwingUtilities;
 import java.awt.GraphicsEnvironment;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
-
 class SecPasswordFieldTest {
 
 	private SecPasswordField pwField = new SecPasswordField();