From 57bfa3276dcd44f266021965f1b08fe01319554f Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Thu, 19 Nov 2020 11:42:00 +0100 Subject: [PATCH] Integrate new lockWorkflow into application (gui and tray) --- .../cryptomator/ui/fxapp/FxApplication.java | 7 +- .../ui/fxapp/FxApplicationModule.java | 3 +- .../cryptomator/ui/lock/LockComponent.java | 2 +- .../org/cryptomator/ui/lock/LockWorkflow.java | 72 ++++++++++++++++++- .../VaultDetailUnlockedController.java | 12 +++- .../ui/traymenu/TrayMenuController.java | 2 +- 6 files changed, 89 insertions(+), 9 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 643d7827d..18c9a499c 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 @@ -12,6 +12,7 @@ import org.cryptomator.integrations.uiappearance.UiAppearanceException; import org.cryptomator.integrations.uiappearance.UiAppearanceListener; import org.cryptomator.integrations.uiappearance.UiAppearanceProvider; import org.cryptomator.ui.common.VaultService; +import org.cryptomator.ui.lock.LockComponent; import org.cryptomator.ui.mainwindow.MainWindowComponent; import org.cryptomator.ui.preferences.PreferencesComponent; import org.cryptomator.ui.preferences.SelectedPreferencesTab; @@ -41,6 +42,7 @@ public class FxApplication extends Application { private final Lazy mainWindow; private final Lazy preferencesWindow; private final Provider unlockWindowBuilderProvider; + private final Provider lockWindowBuilderProvider; private final Provider quitWindowBuilderProvider; private final Optional trayIntegration; private final Optional appearanceProvider; @@ -50,11 +52,12 @@ public class FxApplication extends Application { private final UiAppearanceListener systemInterfaceThemeListener = this::systemInterfaceThemeChanged; @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, Provider lockWindowBuilderProvider, Provider quitWindowBuilderProvider, Optional trayIntegration, Optional appearanceProvider, VaultService vaultService, LicenseHolder licenseHolder, ObservableSet visibleStages) { this.settings = settings; this.mainWindow = mainWindow; this.preferencesWindow = preferencesWindow; this.unlockWindowBuilderProvider = unlockWindowBuilderProvider; + this.lockWindowBuilderProvider = lockWindowBuilderProvider; this.quitWindowBuilderProvider = quitWindowBuilderProvider; this.trayIntegration = trayIntegration; this.appearanceProvider = appearanceProvider; @@ -109,7 +112,7 @@ public class FxApplication extends Application { public void startLockWorkflow(Vault vault, Optional owner) { Platform.runLater(() -> { - //TODO + lockWindowBuilderProvider.get().vault(vault).owner(owner).build().startLockWorkflow(); LOG.debug("Locking vault {}", vault.getDisplayName()); }); } 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..39b3020be 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 @@ -11,6 +11,7 @@ import dagger.Provides; import org.apache.commons.lang3.SystemUtils; import org.cryptomator.ui.common.ErrorComponent; import org.cryptomator.ui.common.StageFactory; +import org.cryptomator.ui.lock.LockComponent; import org.cryptomator.ui.mainwindow.MainWindowComponent; import org.cryptomator.ui.preferences.PreferencesComponent; import org.cryptomator.ui.quit.QuitComponent; @@ -28,7 +29,7 @@ import java.io.UncheckedIOException; import java.util.Collections; import java.util.List; -@Module(includes = {UpdateCheckerModule.class}, subcomponents = {MainWindowComponent.class, PreferencesComponent.class, UnlockComponent.class, QuitComponent.class, ErrorComponent.class}) +@Module(includes = {UpdateCheckerModule.class}, subcomponents = {MainWindowComponent.class, PreferencesComponent.class, UnlockComponent.class, LockComponent.class, QuitComponent.class, ErrorComponent.class}) abstract class FxApplicationModule { @Provides diff --git a/main/ui/src/main/java/org/cryptomator/ui/lock/LockComponent.java b/main/ui/src/main/java/org/cryptomator/ui/lock/LockComponent.java index a348d4807..972ebc5f9 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/lock/LockComponent.java +++ b/main/ui/src/main/java/org/cryptomator/ui/lock/LockComponent.java @@ -19,7 +19,7 @@ public interface LockComponent { LockWorkflow lockWorkflow(); - default Future startUnlockWorkflow() { + default Future startLockWorkflow() { LockWorkflow workflow = lockWorkflow(); defaultExecutorService().submit(workflow); return workflow; diff --git a/main/ui/src/main/java/org/cryptomator/ui/lock/LockWorkflow.java b/main/ui/src/main/java/org/cryptomator/ui/lock/LockWorkflow.java index b038fea4b..381c6fdb9 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/lock/LockWorkflow.java +++ b/main/ui/src/main/java/org/cryptomator/ui/lock/LockWorkflow.java @@ -1,11 +1,81 @@ package org.cryptomator.ui.lock; +import org.cryptomator.common.vaults.Vault; +import org.cryptomator.common.vaults.VaultState; +import org.cryptomator.common.vaults.Volume; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.inject.Inject; import javafx.concurrent.Task; public class LockWorkflow extends Task { + private static final Logger LOG = LoggerFactory.getLogger(LockWorkflow.class); + + private final Vault vault; + + @Inject + public LockWorkflow(@LockWindow Vault vault) { + this.vault = vault; + } + @Override protected Boolean call() throws Exception { - return true; + // change vault state to processing -- done by overriding scheduled method of Task + if (attemptLock() || attemptForcedLock()) { + handleSuccess(); + return true; + } else { + //canceled -- for error the overriden failed() method is responsible + return false; + } } + + private boolean attemptLock() { + try { + vault.lock(false); + return true; + } catch (Volume.VolumeException e) { + e.printStackTrace(); + return false; + } + } + + private boolean attemptForcedLock() { + // show forcedLock dialogue + // wait for answer + // depening on answer do one of two things + // a) force Lock -> needs to throw exception on failure + // b) cancel + // if lock was performed over main window, show it again + return false; + } + + private void handleSuccess() { + LOG.info("Lock of {} succeeded.", vault.getDisplayName()); + // set vault state to locked + } + + @Override + protected void scheduled() { + vault.setState(VaultState.PROCESSING); + } + + @Override + protected void succeeded() { + vault.setState(VaultState.LOCKED); + } + + @Override + protected void failed() { + LOG.info("Failed to lock {}.", vault.getDisplayName()); + vault.setState(VaultState.UNLOCKED); + } + + @Override + protected void cancelled() { + vault.setState(VaultState.UNLOCKED); + } + } diff --git a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailUnlockedController.java b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailUnlockedController.java index 1806d9e5e..0af909bbc 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailUnlockedController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailUnlockedController.java @@ -6,25 +6,32 @@ import com.google.common.cache.LoadingCache; import org.cryptomator.common.vaults.Vault; import org.cryptomator.ui.common.FxController; import org.cryptomator.ui.common.VaultService; +import org.cryptomator.ui.fxapp.FxApplication; import org.cryptomator.ui.stats.VaultStatisticsComponent; import javax.inject.Inject; import javafx.beans.property.ObjectProperty; import javafx.beans.property.ReadOnlyObjectProperty; import javafx.fxml.FXML; +import javafx.stage.Stage; +import java.util.Optional; @MainWindowScoped public class VaultDetailUnlockedController implements FxController { private final ReadOnlyObjectProperty vault; + private final FxApplication application; private final VaultService vaultService; + private final Stage mainWindow; private final LoadingCache vaultStats; private final VaultStatisticsComponent.Builder vaultStatsBuilder; @Inject - public VaultDetailUnlockedController(ObjectProperty vault, VaultService vaultService, VaultStatisticsComponent.Builder vaultStatsBuilder) { + public VaultDetailUnlockedController(ObjectProperty vault, FxApplication application, VaultService vaultService, VaultStatisticsComponent.Builder vaultStatsBuilder, @MainWindow Stage mainWindow) { this.vault = vault; + this.application = application; this.vaultService = vaultService; + this.mainWindow = mainWindow; this.vaultStats = CacheBuilder.newBuilder().weakValues().build(CacheLoader.from(this::buildVaultStats)); this.vaultStatsBuilder = vaultStatsBuilder; } @@ -40,8 +47,7 @@ public class VaultDetailUnlockedController implements FxController { @FXML public void lock() { - vaultService.lock(vault.get(), false); - // TODO count lock attempts, and allow forced lock + application.startLockWorkflow(vault.get(), 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 51f7c2225..a65f1e493 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 @@ -108,7 +108,7 @@ class TrayMenuController { } private void lockVault(Vault vault) { - fxApplicationStarter.get(true).thenAccept(app -> app.getVaultService().lock(vault, false)); + fxApplicationStarter.get(true).thenAccept(app -> app.startLockWorkflow(vault, Optional.empty())); } private void lockAllVaults(ActionEvent actionEvent) {