diff --git a/main/ui/src/main/java/org/cryptomator/ui/common/VaultService.java b/main/ui/src/main/java/org/cryptomator/ui/common/VaultService.java index 8e3cabff0..3b4fdaa3e 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/common/VaultService.java +++ b/main/ui/src/main/java/org/cryptomator/ui/common/VaultService.java @@ -29,6 +29,22 @@ public class VaultService { this.executorService = executorService; } + public void reveal(Vault vault) { + executorService.execute(createRevealTask(vault)); + } + + /** + * Creates but doesn't start a reveal task. + * + * @param vault The vault to reveal + */ + public Task createRevealTask(Vault vault) { + Task task = new RevealVaultTask(vault); + task.setOnSucceeded(evt -> LOG.info("Revealed {}", vault.getDisplayableName())); + task.setOnFailed(evt -> LOG.error("Failed to reveal " + vault.getDisplayableName(), evt.getSource().getException())); + return task; + } + /** * Locks a vault in a background thread. * @@ -36,12 +52,28 @@ public class VaultService { * @param forced Whether to attempt a forced lock */ public void lock(Vault vault, boolean forced) { - Task task = new LockVaultTask(vault, forced); - task.setOnSucceeded(evt -> LOG.info("Locked {}", vault.getDisplayableName())); - task.setOnFailed(evt -> LOG.error("Failed to lock ", evt.getSource().getException())); - executorService.execute(task); + executorService.execute(createLockTask(vault, forced)); } + /** + * Creates but doesn't start a lock task. + * + * @param vault The vault to lock + * @param forced Whether to attempt a forced lock + */ + public Task createLockTask(Vault vault, boolean forced) { + Task task = new LockVaultTask(vault, forced); + task.setOnSucceeded(evt -> LOG.info("Locked {}", vault.getDisplayableName())); + task.setOnFailed(evt -> LOG.error("Failed to lock " + vault.getDisplayableName(), evt.getSource().getException())); + return task; + } + + /** + * Locks all given vaults in a background thread. + * + * @param vaults The vaults to lock + * @param forced Whether to attempt a forced lock + */ public void lockAll(Collection vaults, boolean forced) { Service service = createLockAllService(vaults, forced); service.setOnSucceeded(evt -> LOG.info("Locked {}", service.getValue().getDisplayableName())); @@ -75,6 +107,24 @@ public class VaultService { return service; } + private static class RevealVaultTask extends Task { + + private final Vault vault; + + /** + * @param vault The vault to lock + */ + public RevealVaultTask(Vault vault) { + this.vault = vault; + } + + @Override + protected Vault call() throws Volume.VolumeException { + vault.reveal(); + return vault; + } + } + /** * A task that locks a vault */ 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 f180e4a83..32f9bc9b0 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 @@ -4,22 +4,14 @@ import javafx.beans.property.ObjectProperty; import javafx.beans.property.ReadOnlyObjectProperty; import javafx.fxml.FXML; import org.cryptomator.common.vaults.Vault; -import org.cryptomator.common.vaults.VaultState; -import org.cryptomator.common.vaults.Volume; import org.cryptomator.ui.common.FxController; -import org.cryptomator.ui.common.Tasks; import org.cryptomator.ui.common.VaultService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import javax.inject.Inject; -import java.util.concurrent.ExecutorService; @MainWindowScoped public class VaultDetailUnlockedController implements FxController { - private static final Logger LOG = LoggerFactory.getLogger(VaultDetailUnlockedController.class); - private final ReadOnlyObjectProperty vault; private final VaultService vaultService; @@ -31,11 +23,7 @@ public class VaultDetailUnlockedController implements FxController { @FXML public void revealAccessLocation() { - try { - vault.get().reveal(); - } catch (Volume.VolumeException e) { - LOG.error("Failed to reveal vault.", e); - } + vaultService.reveal(vault.get()); } @FXML diff --git a/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockSuccessController.java b/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockSuccessController.java index 44e1c0010..cf61ab2e7 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockSuccessController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockSuccessController.java @@ -5,13 +5,13 @@ import javafx.beans.property.ObjectProperty; import javafx.beans.property.ReadOnlyObjectProperty; import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleObjectProperty; +import javafx.concurrent.Task; import javafx.fxml.FXML; import javafx.scene.control.ContentDisplay; import javafx.stage.Stage; import org.cryptomator.common.vaults.Vault; -import org.cryptomator.cryptolib.api.InvalidPassphraseException; import org.cryptomator.ui.common.FxController; -import org.cryptomator.ui.common.Tasks; +import org.cryptomator.ui.common.VaultService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -26,14 +26,16 @@ public class UnlockSuccessController implements FxController { private final Stage window; private final Vault vault; private final ExecutorService executor; + private final VaultService vaultService; private final ObjectProperty revealButtonState; private final BooleanProperty revealButtonDisabled; @Inject - public UnlockSuccessController(@UnlockWindow Stage window, @UnlockWindow Vault vault, ExecutorService executor) { + public UnlockSuccessController(@UnlockWindow Stage window, @UnlockWindow Vault vault, ExecutorService executor, VaultService vaultService) { this.window = window; this.vault = vault; this.executor = executor; + this.vaultService = vaultService; this.revealButtonState = new SimpleObjectProperty<>(ContentDisplay.TEXT_ONLY); this.revealButtonDisabled = new SimpleBooleanProperty(); } @@ -49,17 +51,19 @@ public class UnlockSuccessController implements FxController { LOG.trace("UnlockSuccessController.revealAndClose()"); revealButtonState.set(ContentDisplay.LEFT); revealButtonDisabled.set(true); - Tasks.create(() -> { - vault.reveal(); - }).onSuccess(() -> { - window.close(); - }).onError(InvalidPassphraseException.class, e -> { - // TODO - LOG.warn("Reveal failed.", e); - }).andFinally(() -> { + + Task revealTask = vaultService.createRevealTask(vault); + revealTask.setOnSucceeded(evt -> { revealButtonState.set(ContentDisplay.TEXT_ONLY); revealButtonDisabled.set(false); - }).runOnce(executor); + window.close(); + }); + revealTask.setOnFailed(evt -> { + LOG.warn("Reveal failed.", revealTask.getException()); + revealButtonState.set(ContentDisplay.TEXT_ONLY); + revealButtonDisabled.set(false); + }); + executor.execute(revealTask); } /* Getter/Setter */