瀏覽代碼

Integrate new lockWorkflow into application (gui and tray)

Armin Schrenk 4 年之前
父節點
當前提交
57bfa3276d

+ 5 - 2
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<MainWindowComponent> mainWindow;
 	private final Lazy<PreferencesComponent> preferencesWindow;
 	private final Provider<UnlockComponent.Builder> unlockWindowBuilderProvider;
+	private final Provider<LockComponent.Builder> lockWindowBuilderProvider;
 	private final Provider<QuitComponent.Builder> quitWindowBuilderProvider;
 	private final Optional<TrayIntegrationProvider> trayIntegration;
 	private final Optional<UiAppearanceProvider> appearanceProvider;
@@ -50,11 +52,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, Provider<LockComponent.Builder> lockWindowBuilderProvider, Provider<QuitComponent.Builder> quitWindowBuilderProvider, 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.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<Stage> owner) {
 		Platform.runLater(() -> {
-			//TODO
+			lockWindowBuilderProvider.get().vault(vault).owner(owner).build().startLockWorkflow();
 			LOG.debug("Locking vault {}", vault.getDisplayName());
 		});
 	}

+ 2 - 1
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

+ 1 - 1
main/ui/src/main/java/org/cryptomator/ui/lock/LockComponent.java

@@ -19,7 +19,7 @@ public interface LockComponent {
 
 	LockWorkflow lockWorkflow();
 
-	default Future<Boolean> startUnlockWorkflow() {
+	default Future<Boolean> startLockWorkflow() {
 		LockWorkflow workflow = lockWorkflow();
 		defaultExecutorService().submit(workflow);
 		return workflow;

+ 71 - 1
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<Boolean> {
 
+	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);
 	}
+
 }

+ 9 - 3
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> vault;
+	private final FxApplication application;
 	private final VaultService vaultService;
+	private final Stage mainWindow;
 	private final LoadingCache<Vault, VaultStatisticsComponent> vaultStats;
 	private final VaultStatisticsComponent.Builder vaultStatsBuilder;
 
 	@Inject
-	public VaultDetailUnlockedController(ObjectProperty<Vault> vault, VaultService vaultService, VaultStatisticsComponent.Builder vaultStatsBuilder) {
+	public VaultDetailUnlockedController(ObjectProperty<Vault> 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

+ 1 - 1
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) {