diff --git a/src/main/java/org/cryptomator/ui/common/UserInteractionLock.java b/src/main/java/org/cryptomator/ui/common/UserInteractionLock.java index f0c199648..4eba62552 100644 --- a/src/main/java/org/cryptomator/ui/common/UserInteractionLock.java +++ b/src/main/java/org/cryptomator/ui/common/UserInteractionLock.java @@ -16,7 +16,11 @@ public class UserInteractionLock { private volatile E state; public UserInteractionLock(E initialValue) { - state = initialValue; + this.state = initialValue; + } + + public synchronized void reset(E value) { + this.state = value; } public void interacted(E result) { diff --git a/src/main/java/org/cryptomator/ui/lock/LockForcedController.java b/src/main/java/org/cryptomator/ui/lock/LockForcedController.java index 8d4ce32d3..c3a452acc 100644 --- a/src/main/java/org/cryptomator/ui/lock/LockForcedController.java +++ b/src/main/java/org/cryptomator/ui/lock/LockForcedController.java @@ -35,7 +35,13 @@ public class LockForcedController implements FxController { } @FXML - public void confirmForcedLock() { + public void retry() { + forceLockDecisionLock.interacted(LockModule.ForceLockDecision.RETRY); + window.close(); + } + + @FXML + public void force() { forceLockDecisionLock.interacted(LockModule.ForceLockDecision.FORCE); window.close(); } @@ -54,4 +60,8 @@ public class LockForcedController implements FxController { return vault.getDisplayName(); } + public boolean isForceSupported() { + return vault.supportsForcedUnmount(); + } + } diff --git a/src/main/java/org/cryptomator/ui/lock/LockModule.java b/src/main/java/org/cryptomator/ui/lock/LockModule.java index 160dcf6fb..d1eb5f189 100644 --- a/src/main/java/org/cryptomator/ui/lock/LockModule.java +++ b/src/main/java/org/cryptomator/ui/lock/LockModule.java @@ -28,6 +28,7 @@ abstract class LockModule { enum ForceLockDecision { CANCEL, + RETRY, FORCE; } diff --git a/src/main/java/org/cryptomator/ui/lock/LockWorkflow.java b/src/main/java/org/cryptomator/ui/lock/LockWorkflow.java index 73b4844b9..00b25c507 100644 --- a/src/main/java/org/cryptomator/ui/lock/LockWorkflow.java +++ b/src/main/java/org/cryptomator/ui/lock/LockWorkflow.java @@ -51,20 +51,26 @@ public class LockWorkflow extends Task { @Override protected Void call() throws Volume.VolumeException, InterruptedException, LockNotCompletedException { - try { - vault.lock(false); - } catch (Volume.VolumeException | LockNotCompletedException e) { - LOG.debug("Regular lock of {} failed.", vault.getDisplayName(), e); - var decision = askUserForAction(); - switch (decision) { - case FORCE -> vault.lock(true); - case CANCEL -> cancel(false); - } - } + lock(false); return null; } + private void lock(boolean forced) throws InterruptedException { + try { + vault.lock(forced); + } catch (Volume.VolumeException | LockNotCompletedException e) { + LOG.info("Locking {} failed (forced: {}).", vault.getDisplayName(), forced, e); + var decision = askUserForAction(); + switch (decision) { + case RETRY -> lock(false); + case FORCE -> lock(true); + case CANCEL -> cancel(false); + } + } + } + private LockModule.ForceLockDecision askUserForAction() throws InterruptedException { + forceLockDecisionLock.reset(null); // show forcedLock dialogue ... Platform.runLater(() -> { lockWindow.setScene(lockForcedScene.get()); diff --git a/src/main/resources/fxml/lock_forced.fxml b/src/main/resources/fxml/lock_forced.fxml index 4596af119..b0b5baa63 100644 --- a/src/main/resources/fxml/lock_forced.fxml +++ b/src/main/resources/fxml/lock_forced.fxml @@ -33,11 +33,11 @@ - +