From a71f8b350ee665ea4930a42ebc7a4ee293376213 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Fri, 20 Nov 2020 16:12:49 +0100 Subject: [PATCH 1/4] Show only one quit dialogue at a time --- .../cryptomator/ui/fxapp/FxApplication.java | 35 ++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java b/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java index 650254649..3c2db73ce 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java +++ b/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java @@ -26,6 +26,8 @@ import javafx.application.Application; import javafx.application.Platform; import javafx.beans.binding.Bindings; import javafx.beans.binding.BooleanBinding; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; import javafx.beans.value.ObservableValue; import javafx.collections.ObservableSet; import javafx.stage.Stage; @@ -49,6 +51,9 @@ public class FxApplication extends Application { private final BooleanBinding hasVisibleStages; private final UiAppearanceListener systemInterfaceThemeListener = this::systemInterfaceThemeChanged; + private volatile boolean quitDialogueIsShowing; + private ObjectProperty quitStage; + @Inject FxApplication(Settings settings, Lazy mainWindow, Lazy preferencesWindow, Provider unlockWindowBuilderProvider, Provider quitWindowBuilderProvider, Optional trayIntegration, Optional appearanceProvider, VaultService vaultService, LicenseHolder licenseHolder, ObservableSet visibleStages) { this.settings = settings; @@ -61,6 +66,8 @@ public class FxApplication extends Application { this.vaultService = vaultService; this.licenseHolder = licenseHolder; this.hasVisibleStages = Bindings.isNotEmpty(visibleStages); + this.quitDialogueIsShowing = false; + this.quitStage = new SimpleObjectProperty<>(null); } public void start() { @@ -107,11 +114,29 @@ public class FxApplication extends Application { }); } - public void showQuitWindow(QuitResponse response) { - Platform.runLater(() -> { - quitWindowBuilderProvider.get().quitResponse(response).build().showQuitWindow(); - LOG.debug("Showing QuitWindow"); - }); + public synchronized void showQuitWindow(QuitResponse response) { + //TODO: manage a list of quit responses and execute for all the same actions? + if (quitDialogueIsShowing) { + if (quitStage.isNotNull().get()) { + Platform.runLater(() -> { + quitStage.get().requestFocus(); + LOG.debug("Focus QuitWindow"); + }); + } + } else { + quitDialogueIsShowing = true; + Platform.runLater(() -> { + var window = quitWindowBuilderProvider.get().quitResponse(response).build().showQuitWindow(); + quitStage.set(window); + var originalListener = window.getOnCloseRequest(); + window.setOnCloseRequest(windowEvent -> { + originalListener.handle(windowEvent); + quitStage.set(null); + }); + LOG.debug("Showing QuitWindow"); + }); + } + } public VaultService getVaultService() { From c6b786a771824444fabf764a10abfcee3128fa1f Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Tue, 24 Nov 2020 13:34:12 +0100 Subject: [PATCH 2/4] Reworked implemenation by using dagger now: * create and inject QuitResponse container * QuitComponent manges now if quit window needs to be created * controller only handles the most recent QuitResponse --- .../cryptomator/ui/fxapp/FxApplication.java | 45 +++++-------------- .../ui/fxapp/FxApplicationModule.java | 12 +++++ .../cryptomator/ui/quit/QuitComponent.java | 19 +++++--- .../cryptomator/ui/quit/QuitController.java | 19 ++++---- .../org/cryptomator/ui/quit/QuitModule.java | 8 ++++ 5 files changed, 55 insertions(+), 48 deletions(-) diff --git a/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java b/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java index 3c2db73ce..b05a6687f 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java +++ b/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java @@ -26,13 +26,12 @@ import javafx.application.Application; import javafx.application.Platform; import javafx.beans.binding.Bindings; import javafx.beans.binding.BooleanBinding; -import javafx.beans.property.ObjectProperty; -import javafx.beans.property.SimpleObjectProperty; import javafx.beans.value.ObservableValue; import javafx.collections.ObservableSet; import javafx.stage.Stage; import java.awt.desktop.QuitResponse; import java.util.Optional; +import java.util.concurrent.atomic.AtomicReference; @FxApplicationScoped public class FxApplication extends Application { @@ -42,32 +41,29 @@ public class FxApplication extends Application { private final Settings settings; private final Lazy mainWindow; private final Lazy preferencesWindow; + private final Lazy quitWindow; private final Provider unlockWindowBuilderProvider; - private final Provider quitWindowBuilderProvider; private final Optional trayIntegration; private final Optional appearanceProvider; private final VaultService vaultService; private final LicenseHolder licenseHolder; private final BooleanBinding hasVisibleStages; private final UiAppearanceListener systemInterfaceThemeListener = this::systemInterfaceThemeChanged; - - private volatile boolean quitDialogueIsShowing; - private ObjectProperty quitStage; + private final AtomicReference quitResponse; @Inject - FxApplication(Settings settings, Lazy mainWindow, Lazy preferencesWindow, Provider unlockWindowBuilderProvider, Provider quitWindowBuilderProvider, Optional trayIntegration, Optional appearanceProvider, VaultService vaultService, LicenseHolder licenseHolder, ObservableSet visibleStages) { + FxApplication(Settings settings, Lazy mainWindow, Lazy preferencesWindow, Provider unlockWindowBuilderProvider, Lazy quitWindow, Optional trayIntegration, Optional appearanceProvider, VaultService vaultService, LicenseHolder licenseHolder, ObservableSet visibleStages, AtomicReference quitResponse) { 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; this.licenseHolder = licenseHolder; this.hasVisibleStages = Bindings.isNotEmpty(visibleStages); - this.quitDialogueIsShowing = false; - this.quitStage = new SimpleObjectProperty<>(null); + this.quitResponse = quitResponse; } public void start() { @@ -114,29 +110,12 @@ public class FxApplication extends Application { }); } - public synchronized void showQuitWindow(QuitResponse response) { - //TODO: manage a list of quit responses and execute for all the same actions? - if (quitDialogueIsShowing) { - if (quitStage.isNotNull().get()) { - Platform.runLater(() -> { - quitStage.get().requestFocus(); - LOG.debug("Focus QuitWindow"); - }); - } - } else { - quitDialogueIsShowing = true; - Platform.runLater(() -> { - var window = quitWindowBuilderProvider.get().quitResponse(response).build().showQuitWindow(); - quitStage.set(window); - var originalListener = window.getOnCloseRequest(); - window.setOnCloseRequest(windowEvent -> { - originalListener.handle(windowEvent); - quitStage.set(null); - }); - LOG.debug("Showing QuitWindow"); - }); - } - + public void showQuitWindow(QuitResponse response) { + quitResponse.set(response); + Platform.runLater(() -> { + quitWindow.get().showQuitWindow(); + LOG.debug("Showing QuitWindow"); + }); } public VaultService getVaultService() { diff --git a/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java b/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java index a6297ce4a..549ea4536 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java +++ b/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java @@ -22,15 +22,23 @@ import javafx.collections.FXCollections; import javafx.collections.ObservableSet; import javafx.scene.image.Image; import javafx.stage.Stage; +import java.awt.desktop.QuitResponse; import java.io.IOException; import java.io.InputStream; import java.io.UncheckedIOException; import java.util.Collections; import java.util.List; +import java.util.concurrent.atomic.AtomicReference; @Module(includes = {UpdateCheckerModule.class}, subcomponents = {MainWindowComponent.class, PreferencesComponent.class, UnlockComponent.class, QuitComponent.class, ErrorComponent.class}) abstract class FxApplicationModule { + @Provides + @FxApplicationScoped + static AtomicReference provideQuitResponse() { + return new AtomicReference<>(); + } + @Provides @FxApplicationScoped static ObservableSet provideVisibleStages() { @@ -88,4 +96,8 @@ abstract class FxApplicationModule { return builder.build(); } + @Provides + static QuitComponent provideQuitComponent(QuitComponent.Builder builder) { + return builder.build(); + } } diff --git a/main/ui/src/main/java/org/cryptomator/ui/quit/QuitComponent.java b/main/ui/src/main/java/org/cryptomator/ui/quit/QuitComponent.java index 23ddf311a..eadd32052 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/quit/QuitComponent.java +++ b/main/ui/src/main/java/org/cryptomator/ui/quit/QuitComponent.java @@ -5,15 +5,14 @@ *******************************************************************************/ package org.cryptomator.ui.quit; -import dagger.BindsInstance; import dagger.Lazy; import dagger.Subcomponent; import org.cryptomator.ui.common.FxmlFile; import org.cryptomator.ui.common.FxmlScene; +import javafx.beans.property.ObjectProperty; import javafx.scene.Scene; import javafx.stage.Stage; -import java.awt.desktop.QuitResponse; @QuitScoped @Subcomponent(modules = {QuitModule.class}) @@ -25,9 +24,18 @@ public interface QuitComponent { @FxmlScene(FxmlFile.QUIT) Lazy scene(); + ObjectProperty provideStageProperty(); + default Stage showQuitWindow() { - Stage stage = window(); - stage.setScene(scene().get()); + var stageProperty = provideStageProperty(); + Stage stage; + if (stageProperty.isNull().get()) { + stage = window(); + stage.setScene(scene().get()); + stageProperty.set(stage); + } else { + stage = stageProperty.get(); + } stage.show(); stage.requestFocus(); return stage; @@ -36,9 +44,6 @@ public interface QuitComponent { @Subcomponent.Builder interface Builder { - @BindsInstance - Builder quitResponse(QuitResponse response); - QuitComponent build(); } diff --git a/main/ui/src/main/java/org/cryptomator/ui/quit/QuitController.java b/main/ui/src/main/java/org/cryptomator/ui/quit/QuitController.java index 130556ef2..583e9c010 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/quit/QuitController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/quit/QuitController.java @@ -16,6 +16,7 @@ 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.stream.Collectors; @QuitScoped @@ -24,26 +25,28 @@ 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 unlockedVaults; private final ExecutorService executorService; private final VaultService vaultService; + private final AtomicReference quitResponse; public Button lockAndQuitButton; @Inject - QuitController(@QuitWindow Stage window, QuitResponse response, ObservableList vaults, ExecutorService executorService, VaultService vaultService) { + QuitController(@QuitWindow Stage window, ObservableList vaults, ExecutorService executorService, VaultService vaultService, AtomicReference quitResponse) { this.window = window; - this.response = response; this.unlockedVaults = vaults.filtered(Vault::isUnlocked); this.executorService = executorService; this.vaultService = vaultService; + this.quitResponse = quitResponse; + window.setOnCloseRequest(windowEvent -> cancel()); } @FXML public void cancel() { LOG.info("Quitting application canceled by user."); window.close(); - response.cancelQuit(); + quitResponse.get().cancelQuit(); + quitResponse.set(null); } @FXML @@ -56,16 +59,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(); + quitResponse.getAndSet(null).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(); + quitResponse.getAndSet(null).cancelQuit(); }); executorService.execute(lockAllTask); } diff --git a/main/ui/src/main/java/org/cryptomator/ui/quit/QuitModule.java b/main/ui/src/main/java/org/cryptomator/ui/quit/QuitModule.java index 9c779f434..75408165e 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/quit/QuitModule.java +++ b/main/ui/src/main/java/org/cryptomator/ui/quit/QuitModule.java @@ -13,6 +13,8 @@ import org.cryptomator.ui.common.FxmlScene; import org.cryptomator.ui.common.StageFactory; import javax.inject.Provider; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; import javafx.scene.Scene; import javafx.stage.Modality; import javafx.stage.Stage; @@ -22,6 +24,12 @@ import java.util.ResourceBundle; @Module abstract class QuitModule { + @Provides + @QuitScoped + static ObjectProperty provideStageProperty() { + return new SimpleObjectProperty<>(); + } + @Provides @QuitWindow @QuitScoped From 4779bbf415e849b5fb3cf72197e827575678c0b1 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Tue, 24 Nov 2020 15:04:09 +0100 Subject: [PATCH 3/4] Don't bother FxApplication with stuff that is meant to be dealt with internally within QuitComponent --- .../cryptomator/ui/fxapp/FxApplication.java | 8 ++---- .../ui/fxapp/FxApplicationModule.java | 8 ------ .../cryptomator/ui/quit/QuitComponent.java | 18 +++++-------- .../cryptomator/ui/quit/QuitController.java | 27 ++++++++++++++----- .../org/cryptomator/ui/quit/QuitModule.java | 6 ----- 5 files changed, 28 insertions(+), 39 deletions(-) diff --git a/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java b/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java index b05a6687f..5c6b6e368 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java +++ b/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java @@ -31,7 +31,6 @@ import javafx.collections.ObservableSet; import javafx.stage.Stage; import java.awt.desktop.QuitResponse; import java.util.Optional; -import java.util.concurrent.atomic.AtomicReference; @FxApplicationScoped public class FxApplication extends Application { @@ -49,10 +48,9 @@ public class FxApplication extends Application { private final LicenseHolder licenseHolder; private final BooleanBinding hasVisibleStages; private final UiAppearanceListener systemInterfaceThemeListener = this::systemInterfaceThemeChanged; - private final AtomicReference quitResponse; @Inject - FxApplication(Settings settings, Lazy mainWindow, Lazy preferencesWindow, Provider unlockWindowBuilderProvider, Lazy quitWindow, Optional trayIntegration, Optional appearanceProvider, VaultService vaultService, LicenseHolder licenseHolder, ObservableSet visibleStages, AtomicReference quitResponse) { + FxApplication(Settings settings, Lazy mainWindow, Lazy preferencesWindow, Provider unlockWindowBuilderProvider, Lazy quitWindow, Optional trayIntegration, Optional appearanceProvider, VaultService vaultService, LicenseHolder licenseHolder, ObservableSet visibleStages) { this.settings = settings; this.mainWindow = mainWindow; this.preferencesWindow = preferencesWindow; @@ -63,7 +61,6 @@ public class FxApplication extends Application { this.vaultService = vaultService; this.licenseHolder = licenseHolder; this.hasVisibleStages = Bindings.isNotEmpty(visibleStages); - this.quitResponse = quitResponse; } public void start() { @@ -111,9 +108,8 @@ public class FxApplication extends Application { } public void showQuitWindow(QuitResponse response) { - quitResponse.set(response); Platform.runLater(() -> { - quitWindow.get().showQuitWindow(); + quitWindow.get().showQuitWindow(response); LOG.debug("Showing QuitWindow"); }); } diff --git a/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java b/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java index 549ea4536..5b4e16ffb 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java +++ b/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java @@ -22,23 +22,15 @@ import javafx.collections.FXCollections; import javafx.collections.ObservableSet; import javafx.scene.image.Image; import javafx.stage.Stage; -import java.awt.desktop.QuitResponse; import java.io.IOException; import java.io.InputStream; import java.io.UncheckedIOException; import java.util.Collections; import java.util.List; -import java.util.concurrent.atomic.AtomicReference; @Module(includes = {UpdateCheckerModule.class}, subcomponents = {MainWindowComponent.class, PreferencesComponent.class, UnlockComponent.class, QuitComponent.class, ErrorComponent.class}) abstract class FxApplicationModule { - @Provides - @FxApplicationScoped - static AtomicReference provideQuitResponse() { - return new AtomicReference<>(); - } - @Provides @FxApplicationScoped static ObservableSet provideVisibleStages() { diff --git a/main/ui/src/main/java/org/cryptomator/ui/quit/QuitComponent.java b/main/ui/src/main/java/org/cryptomator/ui/quit/QuitComponent.java index eadd32052..e100c52e9 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/quit/QuitComponent.java +++ b/main/ui/src/main/java/org/cryptomator/ui/quit/QuitComponent.java @@ -10,9 +10,9 @@ import dagger.Subcomponent; import org.cryptomator.ui.common.FxmlFile; import org.cryptomator.ui.common.FxmlScene; -import javafx.beans.property.ObjectProperty; import javafx.scene.Scene; import javafx.stage.Stage; +import java.awt.desktop.QuitResponse; @QuitScoped @Subcomponent(modules = {QuitModule.class}) @@ -24,18 +24,12 @@ public interface QuitComponent { @FxmlScene(FxmlFile.QUIT) Lazy scene(); - ObjectProperty provideStageProperty(); + QuitController controller(); - default Stage showQuitWindow() { - var stageProperty = provideStageProperty(); - Stage stage; - if (stageProperty.isNull().get()) { - stage = window(); - stage.setScene(scene().get()); - stageProperty.set(stage); - } else { - stage = stageProperty.get(); - } + default Stage showQuitWindow(QuitResponse response) { + controller().updateQuitRequest(response); + Stage stage = window(); + stage.setScene(scene().get()); stage.show(); stage.requestFocus(); return stage; diff --git a/main/ui/src/main/java/org/cryptomator/ui/quit/QuitController.java b/main/ui/src/main/java/org/cryptomator/ui/quit/QuitController.java index 583e9c010..12ddbbca3 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/quit/QuitController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/quit/QuitController.java @@ -17,6 +17,7 @@ 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 @@ -28,25 +29,37 @@ public class QuitController implements FxController { private final ObservableList unlockedVaults; private final ExecutorService executorService; private final VaultService vaultService; - private final AtomicReference quitResponse; + private final AtomicReference quitResponse = new AtomicReference<>(); public Button lockAndQuitButton; @Inject - QuitController(@QuitWindow Stage window, ObservableList vaults, ExecutorService executorService, VaultService vaultService, AtomicReference quitResponse) { + QuitController(@QuitWindow Stage window, ObservableList vaults, ExecutorService executorService, VaultService vaultService) { this.window = window; this.unlockedVaults = vaults.filtered(Vault::isUnlocked); this.executorService = executorService; this.vaultService = vaultService; - this.quitResponse = quitResponse; window.setOnCloseRequest(windowEvent -> cancel()); } + public void updateQuitRequest(QuitResponse newResponse) { + var oldResponse = quitResponse.getAndSet(newResponse); + if (oldResponse != null) { + oldResponse.cancelQuit(); + } + } + + private void respondToQuitRequest(Consumer 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(); - quitResponse.get().cancelQuit(); - quitResponse.set(null); + respondToQuitRequest(QuitResponse::cancelQuit); } @FXML @@ -59,7 +72,7 @@ public class QuitController implements FxController { LOG.info("Locked {}", lockAllTask.getValue().stream().map(Vault::getDisplayName).collect(Collectors.joining(", "))); if (unlockedVaults.isEmpty()) { window.close(); - quitResponse.getAndSet(null).performQuit(); + respondToQuitRequest(QuitResponse::performQuit); } }); lockAllTask.setOnFailed(evt -> { @@ -68,7 +81,7 @@ public class QuitController implements FxController { lockAndQuitButton.setContentDisplay(ContentDisplay.TEXT_ONLY); // TODO: show force lock or force quit scene (and DO NOT cancelQuit() here!) (see https://github.com/cryptomator/cryptomator/pull/1416) window.close(); - quitResponse.getAndSet(null).cancelQuit(); + respondToQuitRequest(QuitResponse::cancelQuit); }); executorService.execute(lockAllTask); } diff --git a/main/ui/src/main/java/org/cryptomator/ui/quit/QuitModule.java b/main/ui/src/main/java/org/cryptomator/ui/quit/QuitModule.java index 75408165e..5047427af 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/quit/QuitModule.java +++ b/main/ui/src/main/java/org/cryptomator/ui/quit/QuitModule.java @@ -24,12 +24,6 @@ import java.util.ResourceBundle; @Module abstract class QuitModule { - @Provides - @QuitScoped - static ObjectProperty provideStageProperty() { - return new SimpleObjectProperty<>(); - } - @Provides @QuitWindow @QuitScoped From 62ade6113b1a087d08632c3f7e4cd486989f27eb Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Tue, 24 Nov 2020 15:07:23 +0100 Subject: [PATCH 4/4] cleanup [ci skip] --- main/ui/src/main/java/org/cryptomator/ui/quit/QuitModule.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/main/ui/src/main/java/org/cryptomator/ui/quit/QuitModule.java b/main/ui/src/main/java/org/cryptomator/ui/quit/QuitModule.java index 5047427af..9c779f434 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/quit/QuitModule.java +++ b/main/ui/src/main/java/org/cryptomator/ui/quit/QuitModule.java @@ -13,8 +13,6 @@ import org.cryptomator.ui.common.FxmlScene; import org.cryptomator.ui.common.StageFactory; import javax.inject.Provider; -import javafx.beans.property.ObjectProperty; -import javafx.beans.property.SimpleObjectProperty; import javafx.scene.Scene; import javafx.stage.Modality; import javafx.stage.Stage;