From a2816277bf2ed6523edf206a3f47a1d4e5c6a207 Mon Sep 17 00:00:00 2001 From: Martin Beyer Date: Tue, 26 May 2020 14:00:25 +0200 Subject: [PATCH] Refactor unlock Window in preparation of #1203 --- .../addvaultwizard/AddVaultSuccessController.java | 3 ++- .../org/cryptomator/ui/fxapp/FxApplication.java | 4 ++-- .../org/cryptomator/ui/launcher/UiLauncher.java | 6 +++--- .../mainwindow/VaultDetailLockedController.java | 7 +++++-- .../ui/migration/MigrationSuccessController.java | 8 ++++++-- .../ui/traymenu/TrayMenuController.java | 3 ++- .../cryptomator/ui/unlock/UnlockComponent.java | 15 +++++++-------- .../org/cryptomator/ui/unlock/UnlockModule.java | 11 ++++++++--- 8 files changed, 35 insertions(+), 22 deletions(-) diff --git a/main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultSuccessController.java b/main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultSuccessController.java index 08ae84369..905efeb6d 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultSuccessController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultSuccessController.java @@ -9,6 +9,7 @@ import org.cryptomator.ui.common.FxController; import org.cryptomator.ui.fxapp.FxApplication; import javax.inject.Inject; +import java.util.Optional; @AddVaultWizardScoped public class AddVaultSuccessController implements FxController { @@ -27,7 +28,7 @@ public class AddVaultSuccessController implements FxController { @FXML public void unlockAndClose() { close(); - fxApplication.startUnlockWorkflow(vault.get()); + fxApplication.startUnlockWorkflow(vault.get(), Optional.of(window)); } @FXML 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 c197ecf87..3172b6288 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 @@ -96,9 +96,9 @@ public class FxApplication extends Application { }); } - public void startUnlockWorkflow(Vault vault) { + public void startUnlockWorkflow(Vault vault, Optional owner) { Platform.runLater(() -> { - unlockWindowBuilderProvider.get().vault(vault).build().startUnlockWorkflow(); + unlockWindowBuilderProvider.get().vault(vault).owner(owner).build().startUnlockWorkflow(); LOG.debug("Showing UnlockWindow for {}", vault.getDisplayableName()); }); } 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 c67f0dfeb..d689b4ae2 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 @@ -65,15 +65,15 @@ public class UiLauncher { Collection vaultsToAutoUnlock = vaults.filtered(this::shouldAttemptAutoUnlock); if (!vaultsToAutoUnlock.isEmpty()) { fxApplicationStarter.get(hasTrayIcon).thenAccept(app -> { - for (Vault vault : vaultsToAutoUnlock){ - app.startUnlockWorkflow(vault); + for (Vault vault : vaultsToAutoUnlock) { + app.startUnlockWorkflow(vault, Optional.empty()); } }); } launchEventHandler.startHandlingLaunchEvents(hasTrayIcon); } - + private boolean shouldAttemptAutoUnlock(Vault vault) { return vault.isLocked() && vault.getVaultSettings().unlockAfterStartup().get(); } diff --git a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailLockedController.java b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailLockedController.java index 8161d1365..55720521b 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailLockedController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailLockedController.java @@ -5,6 +5,7 @@ import javafx.beans.property.ObjectProperty; import javafx.beans.property.ReadOnlyObjectProperty; import javafx.beans.property.SimpleBooleanProperty; import javafx.fxml.FXML; +import javafx.stage.Stage; import org.cryptomator.common.vaults.Vault; import org.cryptomator.keychain.KeychainManager; import org.cryptomator.ui.common.FxController; @@ -22,14 +23,16 @@ public class VaultDetailLockedController implements FxController { private final FxApplication application; private final VaultOptionsComponent.Builder vaultOptionsWindow; private final Optional keychainManagerOptional; + private final Stage mainWindow; private final BooleanExpression passwordSaved; @Inject - VaultDetailLockedController(ObjectProperty vault, FxApplication application, VaultOptionsComponent.Builder vaultOptionsWindow, Optional keychainManagerOptional) { + VaultDetailLockedController(ObjectProperty vault, FxApplication application, VaultOptionsComponent.Builder vaultOptionsWindow, Optional keychainManagerOptional, @MainWindow Stage mainWindow) { this.vault = vault; this.application = application; this.vaultOptionsWindow = vaultOptionsWindow; this.keychainManagerOptional = keychainManagerOptional; + this.mainWindow = mainWindow; if (keychainManagerOptional.isPresent()) { this.passwordSaved = BooleanExpression.booleanExpression(EasyBind.select(vault).selectObject(v -> keychainManagerOptional.get().getPassphraseStoredProperty(v.getId()))); } else { @@ -39,7 +42,7 @@ public class VaultDetailLockedController implements FxController { @FXML public void unlock() { - application.startUnlockWorkflow(vault.get()); + application.startUnlockWorkflow(vault.get(), Optional.of(mainWindow)); } @FXML diff --git a/main/ui/src/main/java/org/cryptomator/ui/migration/MigrationSuccessController.java b/main/ui/src/main/java/org/cryptomator/ui/migration/MigrationSuccessController.java index 6a64e5509..e0135f8b9 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/migration/MigrationSuccessController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/migration/MigrationSuccessController.java @@ -5,8 +5,10 @@ import javafx.stage.Stage; import org.cryptomator.common.vaults.Vault; import org.cryptomator.ui.common.FxController; import org.cryptomator.ui.fxapp.FxApplication; +import org.cryptomator.ui.mainwindow.MainWindow; import javax.inject.Inject; +import java.util.Optional; @MigrationScoped public class MigrationSuccessController implements FxController { @@ -14,18 +16,20 @@ public class MigrationSuccessController implements FxController { private final FxApplication fxApplication; private final Stage window; private final Vault vault; + private final Stage mainWindow; @Inject - MigrationSuccessController(FxApplication fxApplication, @MigrationWindow Stage window, @MigrationWindow Vault vault) { + MigrationSuccessController(FxApplication fxApplication, @MigrationWindow Stage window, @MigrationWindow Vault vault, @MainWindow Stage mainWindow) { this.fxApplication = fxApplication; this.window = window; this.vault = vault; + this.mainWindow = mainWindow; } @FXML public void unlockAndClose() { close(); - fxApplication.startUnlockWorkflow(vault); + fxApplication.startUnlockWorkflow(vault, Optional.of(mainWindow)); } @FXML diff --git a/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayMenuController.java b/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayMenuController.java index 58c0f3bda..af12beebe 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayMenuController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayMenuController.java @@ -15,6 +15,7 @@ import java.awt.PopupMenu; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.EventObject; +import java.util.Optional; import java.util.ResourceBundle; import java.util.function.Consumer; @@ -103,7 +104,7 @@ class TrayMenuController { } private void unlockVault(Vault vault) { - fxApplicationStarter.get(true).thenAccept(app -> app.startUnlockWorkflow(vault)); + fxApplicationStarter.get(true).thenAccept(app -> app.startUnlockWorkflow(vault, Optional.empty())); } private void lockVault(Vault vault) { diff --git a/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockComponent.java b/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockComponent.java index f321f5890..18ae3b5f0 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockComponent.java +++ b/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockComponent.java @@ -6,18 +6,14 @@ package org.cryptomator.ui.unlock; import dagger.BindsInstance; -import dagger.Lazy; import dagger.Subcomponent; -import javafx.scene.Scene; import javafx.stage.Stage; -import org.cryptomator.ui.common.FxmlFile; -import org.cryptomator.ui.common.FxmlScene; import org.cryptomator.common.vaults.Vault; -import java.util.concurrent.Executor; +import javax.inject.Named; +import java.util.Optional; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; -import java.util.concurrent.FutureTask; @UnlockScoped @Subcomponent(modules = {UnlockModule.class}) @@ -26,7 +22,7 @@ public interface UnlockComponent { ExecutorService defaultExecutorService(); UnlockWorkflow unlockWorkflow(); - + default Future startUnlockWorkflow() { UnlockWorkflow workflow = unlockWorkflow(); defaultExecutorService().submit(workflow); @@ -35,10 +31,13 @@ public interface UnlockComponent { @Subcomponent.Builder interface Builder { - + @BindsInstance Builder vault(@UnlockWindow Vault vault); + @BindsInstance + Builder owner(@Named("unlockWindowOwner") Optional owner); + UnlockComponent build(); } diff --git a/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockModule.java b/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockModule.java index a126f4be3..e07583c84 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockModule.java +++ b/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockModule.java @@ -56,7 +56,7 @@ abstract class UnlockModule { } }); } - + @Provides @UnlockScoped static AtomicReference providePassword(@Named("savedPassword") Optional storedPassword) { @@ -80,11 +80,16 @@ abstract class UnlockModule { @Provides @UnlockWindow @UnlockScoped - static Stage provideStage(StageFactory factory, @UnlockWindow Vault vault) { + static Stage provideStage(StageFactory factory, @UnlockWindow Vault vault, @Named("unlockWindowOwner") Optional owner) { Stage stage = factory.create(); stage.setTitle(vault.getDisplayableName()); stage.setResizable(false); - stage.initModality(Modality.APPLICATION_MODAL); + if (owner.isPresent()) { + stage.initOwner(owner.get()); + stage.initModality(Modality.WINDOW_MODAL); + } else { + stage.initModality(Modality.APPLICATION_MODAL); + } return stage; }