diff --git a/main/ui/src/main/java/org/cryptomator/ui/preferences/AutoStartWinStrategy.java b/main/ui/src/main/java/org/cryptomator/ui/preferences/AutoStartWinStrategy.java index 0d2f20536..3f51af849 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/preferences/AutoStartWinStrategy.java +++ b/main/ui/src/main/java/org/cryptomator/ui/preferences/AutoStartWinStrategy.java @@ -17,11 +17,14 @@ import java.util.concurrent.TimeUnit; *

* Two strategies are implemented for this feature, the first uses the registry and the second one the autostart folder. *

- * To check if it is enabled at all, both locations are checked. - * To enable it, first the registry is tried and only on failure the autostart folder is used. - * To disable it, first it is determined, which strategies must be used and in the second step those are executed. + * The registry strategy checks/add/removes at the registry key {@value HKCU_AUTOSTART_KEY} an entry for Cryptomator. + * The folder strategy checks/add/removes at the location {@value WINDOWS_START_MENU_ENTRY}. + *

+ * To check if the feature is active, both strategies are applied. + * To enable the feature, first the registry is tried and only on failure the autostart folder is used. + * To disable it, first it is determined by an internal state, which strategies must be used and in the second step those are executed. * - * @apiNote This class is not thread safe, hence it should be avoided to be used simultaniously by the same threads. + * @apiNote This class is not thread safe, hence it should be avoided to call its methods simultaniously by different threads. */ class AutoStartWinStrategy implements AutoStartStrategy { @@ -32,34 +35,34 @@ class AutoStartWinStrategy implements AutoStartStrategy { private final String exePath; - private boolean activatedOverFolder; - private boolean activatedOverRegistry; + private boolean activatedUsingFolder; + private boolean activatedUsingRegistry; public AutoStartWinStrategy(String exePath) { this.exePath = exePath; - this.activatedOverFolder = false; - this.activatedOverRegistry = false; + this.activatedUsingFolder = false; + this.activatedUsingRegistry = false; } @Override public CompletionStage isAutoStartEnabled() { - return isAutoStartEnabledOverRegistry().thenCombine(isAutoStartEnabledOverFolder(), (bReg, bFolder) -> bReg || bFolder); + return isAutoStartEnabledUsingRegistry().thenCombine(isAutoStartEnabledUsingFolder(), (bReg, bFolder) -> bReg || bFolder); } - private CompletableFuture isAutoStartEnabledOverFolder() { + private CompletableFuture isAutoStartEnabledUsingFolder() { Path autoStartEntry = Path.of(System.getProperty("user.home") + WINDOWS_START_MENU_ENTRY); - this.activatedOverFolder = Files.exists(autoStartEntry); - return CompletableFuture.completedFuture(activatedOverFolder); + this.activatedUsingFolder = Files.exists(autoStartEntry); + return CompletableFuture.completedFuture(activatedUsingFolder); } - private CompletableFuture isAutoStartEnabledOverRegistry() { + private CompletableFuture isAutoStartEnabledUsingRegistry() { ProcessBuilder regQuery = new ProcessBuilder("reg", "query", HKCU_AUTOSTART_KEY, // "/v", AUTOSTART_VALUE); try { Process proc = regQuery.start(); return proc.onExit().thenApply(p -> { - this.activatedOverRegistry = p.exitValue() == 0; - return activatedOverRegistry; + this.activatedUsingRegistry = p.exitValue() == 0; + return activatedUsingRegistry; }); } catch (IOException e) { LOG.debug("Failed to query {} from registry key {}", AUTOSTART_VALUE, HKCU_AUTOSTART_KEY); @@ -70,19 +73,19 @@ class AutoStartWinStrategy implements AutoStartStrategy { @Override public void enableAutoStart() throws TogglingAutoStartFailedException { try { - enableAutoStartOverRegistry().thenAccept((Void v) -> this.activatedOverRegistry = true).exceptionallyCompose(e -> { + enableAutoStartUsingRegistry().thenAccept((Void v) -> this.activatedUsingRegistry = true).exceptionallyCompose(e -> { LOG.debug("Falling back to using autostart folder."); - return this.enableAutoStartOverFolder(); - }).thenAccept((Void v) -> this.activatedOverFolder = true).get(); + return this.enableAutoStartUsingFolder(); + }).thenAccept((Void v) -> this.activatedUsingFolder = true).get(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new TogglingAutoStartFailedException("Execution of enabling auto start setting was interrupted."); } catch (ExecutionException e) { - throw new TogglingAutoStartFailedException("Enabling auto start failed both over registry and auto start folder."); + throw new TogglingAutoStartFailedException("Enabling auto start failed both using registry and auto start folder."); } } - private CompletableFuture enableAutoStartOverRegistry() { + private CompletableFuture enableAutoStartUsingRegistry() { ProcessBuilder regAdd = new ProcessBuilder("reg", "add", HKCU_AUTOSTART_KEY, // "/v", AUTOSTART_VALUE, // "/t", "REG_SZ", // @@ -103,7 +106,7 @@ class AutoStartWinStrategy implements AutoStartStrategy { } } - private CompletableFuture enableAutoStartOverFolder() { + private CompletableFuture enableAutoStartUsingFolder() { String autoStartFolderEntry = System.getProperty("user.home") + WINDOWS_START_MENU_ENTRY; String createShortcutCommand = "$s=(New-Object -COM WScript.Shell).CreateShortcut('" + autoStartFolderEntry + "');$s.TargetPath='" + exePath + "';$s.Save();"; ProcessBuilder shortcutAdd = new ProcessBuilder("cmd", "/c", "Start powershell " + createShortcutCommand); @@ -125,28 +128,28 @@ class AutoStartWinStrategy implements AutoStartStrategy { @Override public void disableAutoStart() throws TogglingAutoStartFailedException { - if (activatedOverRegistry) { - disableAutoStartOverRegistry().whenComplete((voit, ex) -> { + if (activatedUsingRegistry) { + disableAutoStartUsingRegistry().whenComplete((voit, ex) -> { if (ex == null) { - this.activatedOverRegistry = false; + this.activatedUsingRegistry = false; } }); } - if (activatedOverFolder) { - disableAutoStartOverFolder().whenComplete((voit, ex) -> { + if (activatedUsingFolder) { + disableAutoStartUsingFolder().whenComplete((voit, ex) -> { if (ex == null) { - this.activatedOverFolder = false; + this.activatedUsingFolder = false; } }); } - if (activatedOverRegistry || activatedOverFolder) { - throw new TogglingAutoStartFailedException("Disabling auto start failed both over registry and auto start folder."); + if (activatedUsingRegistry || activatedUsingFolder) { + throw new TogglingAutoStartFailedException("Disabling auto start failed both using registry and auto start folder."); } } - public CompletableFuture disableAutoStartOverRegistry() { + public CompletableFuture disableAutoStartUsingRegistry() { ProcessBuilder regRemove = new ProcessBuilder("reg", "delete", HKCU_AUTOSTART_KEY, // "/v", AUTOSTART_VALUE, // "/f"); @@ -165,7 +168,7 @@ class AutoStartWinStrategy implements AutoStartStrategy { } } - private CompletableFuture disableAutoStartOverFolder() { + private CompletableFuture disableAutoStartUsingFolder() { try { Files.delete(Path.of(WINDOWS_START_MENU_ENTRY)); LOG.debug("Successfully deleted {}.", WINDOWS_START_MENU_ENTRY); @@ -194,7 +197,7 @@ class AutoStartWinStrategy implements AutoStartStrategy { return finishedInTime; } - public class SystemCommandException extends RuntimeException { + private class SystemCommandException extends RuntimeException { public SystemCommandException(String msg) { super(msg);