Bläddra i källkod

Merge pull request #1427 from cryptomator/feature/#1323-singleQuitWindow

Show only one quit dialogue at a time
Armin Schrenk 4 år sedan
förälder
incheckning
82538091c9

+ 4 - 4
main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java

@@ -40,8 +40,8 @@ public class FxApplication extends Application {
 	private final Settings settings;
 	private final Lazy<MainWindowComponent> mainWindow;
 	private final Lazy<PreferencesComponent> preferencesWindow;
+	private final Lazy<QuitComponent> quitWindow;
 	private final Provider<UnlockComponent.Builder> unlockWindowBuilderProvider;
-	private final Provider<QuitComponent.Builder> quitWindowBuilderProvider;
 	private final Optional<TrayIntegrationProvider> trayIntegration;
 	private final Optional<UiAppearanceProvider> appearanceProvider;
 	private final VaultService vaultService;
@@ -50,12 +50,12 @@ public class FxApplication extends Application {
 	private final UiAppearanceListener systemInterfaceThemeListener = this::systemInterfaceThemeChanged;
 
 	@Inject
-	FxApplication(Settings settings, Lazy<MainWindowComponent> mainWindow, Lazy<PreferencesComponent> preferencesWindow, Provider<UnlockComponent.Builder> unlockWindowBuilderProvider, Provider<QuitComponent.Builder> quitWindowBuilderProvider, Optional<TrayIntegrationProvider> trayIntegration, Optional<UiAppearanceProvider> appearanceProvider, VaultService vaultService, LicenseHolder licenseHolder, ObservableSet<Stage> visibleStages) {
+	FxApplication(Settings settings, Lazy<MainWindowComponent> mainWindow, Lazy<PreferencesComponent> preferencesWindow, Provider<UnlockComponent.Builder> unlockWindowBuilderProvider, Lazy<QuitComponent> quitWindow, Optional<TrayIntegrationProvider> trayIntegration, Optional<UiAppearanceProvider> appearanceProvider, VaultService vaultService, LicenseHolder licenseHolder, ObservableSet<Stage> visibleStages) {
 		this.settings = settings;
 		this.mainWindow = mainWindow;
 		this.preferencesWindow = preferencesWindow;
 		this.unlockWindowBuilderProvider = unlockWindowBuilderProvider;
-		this.quitWindowBuilderProvider = quitWindowBuilderProvider;
+		this.quitWindow = quitWindow;
 		this.trayIntegration = trayIntegration;
 		this.appearanceProvider = appearanceProvider;
 		this.vaultService = vaultService;
@@ -109,7 +109,7 @@ public class FxApplication extends Application {
 
 	public void showQuitWindow(QuitResponse response) {
 		Platform.runLater(() -> {
-			quitWindowBuilderProvider.get().quitResponse(response).build().showQuitWindow();
+			quitWindow.get().showQuitWindow(response);
 			LOG.debug("Showing QuitWindow");
 		});
 	}

+ 4 - 0
main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java

@@ -88,4 +88,8 @@ abstract class FxApplicationModule {
 		return builder.build();
 	}
 
+	@Provides
+	static QuitComponent provideQuitComponent(QuitComponent.Builder builder) {
+		return builder.build();
+	}
 }

+ 4 - 5
main/ui/src/main/java/org/cryptomator/ui/quit/QuitComponent.java

@@ -5,7 +5,6 @@
  *******************************************************************************/
 package org.cryptomator.ui.quit;
 
-import dagger.BindsInstance;
 import dagger.Lazy;
 import dagger.Subcomponent;
 import org.cryptomator.ui.common.FxmlFile;
@@ -25,7 +24,10 @@ public interface QuitComponent {
 	@FxmlScene(FxmlFile.QUIT)
 	Lazy<Scene> scene();
 
-	default Stage showQuitWindow() {
+	QuitController controller();
+
+	default Stage showQuitWindow(QuitResponse response) {
+		controller().updateQuitRequest(response);
 		Stage stage = window();
 		stage.setScene(scene().get());
 		stage.show();
@@ -36,9 +38,6 @@ public interface QuitComponent {
 	@Subcomponent.Builder
 	interface Builder {
 
-		@BindsInstance
-		Builder quitResponse(QuitResponse response);
-
 		QuitComponent build();
 	}
 

+ 24 - 8
main/ui/src/main/java/org/cryptomator/ui/quit/QuitController.java

@@ -16,6 +16,8 @@ import javafx.stage.Stage;
 import java.awt.desktop.QuitResponse;
 import java.util.Collection;
 import java.util.concurrent.ExecutorService;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
 @QuitScoped
@@ -24,26 +26,40 @@ public class QuitController implements FxController {
 	private static final Logger LOG = LoggerFactory.getLogger(QuitController.class);
 
 	private final Stage window;
-	private final QuitResponse response;
 	private final ObservableList<Vault> unlockedVaults;
 	private final ExecutorService executorService;
 	private final VaultService vaultService;
+	private final AtomicReference<QuitResponse> quitResponse = new AtomicReference<>();
 	public Button lockAndQuitButton;
 
 	@Inject
-	QuitController(@QuitWindow Stage window, QuitResponse response, ObservableList<Vault> vaults, ExecutorService executorService, VaultService vaultService) {
+	QuitController(@QuitWindow Stage window, ObservableList<Vault> vaults, ExecutorService executorService, VaultService vaultService) {
 		this.window = window;
-		this.response = response;
 		this.unlockedVaults = vaults.filtered(Vault::isUnlocked);
 		this.executorService = executorService;
 		this.vaultService = vaultService;
+		window.setOnCloseRequest(windowEvent -> cancel());
+	}
+
+	public void updateQuitRequest(QuitResponse newResponse) {
+		var oldResponse = quitResponse.getAndSet(newResponse);
+		if (oldResponse != null) {
+			oldResponse.cancelQuit();
+		}
+	}
+
+	private void respondToQuitRequest(Consumer<QuitResponse> action) {
+		var response = quitResponse.getAndSet(null);
+		if (response != null) {
+			action.accept(response);
+		}
 	}
 
 	@FXML
 	public void cancel() {
 		LOG.info("Quitting application canceled by user.");
 		window.close();
-		response.cancelQuit();
+		respondToQuitRequest(QuitResponse::cancelQuit);
 	}
 
 	@FXML
@@ -56,16 +72,16 @@ public class QuitController implements FxController {
 			LOG.info("Locked {}", lockAllTask.getValue().stream().map(Vault::getDisplayName).collect(Collectors.joining(", ")));
 			if (unlockedVaults.isEmpty()) {
 				window.close();
-				response.performQuit();
+				respondToQuitRequest(QuitResponse::performQuit);
 			}
 		});
 		lockAllTask.setOnFailed(evt -> {
 			LOG.warn("Locking failed", lockAllTask.getException());
 			lockAndQuitButton.setDisable(false);
 			lockAndQuitButton.setContentDisplay(ContentDisplay.TEXT_ONLY);
-			// TODO: show force lock or force quit scene (and DO NOT cancelQuit() here!)
-			// see https://github.com/cryptomator/cryptomator/blob/1.4.16/main/ui/src/main/java/org/cryptomator/ui/model/Vault.java#L151-L163
-			response.cancelQuit();
+			// TODO: show force lock or force quit scene (and DO NOT cancelQuit() here!) (see https://github.com/cryptomator/cryptomator/pull/1416)
+			window.close();
+			respondToQuitRequest(QuitResponse::cancelQuit);
 		});
 		executorService.execute(lockAllTask);
 	}