From e052a4b2617f761b355ce72f3b6c42cb5c38c571 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Tue, 9 May 2017 14:48:04 +0200 Subject: [PATCH] AutoUnlocker now workes sequentially and takes a small nap between unlocks. --- .../cryptomator/ui/model/AutoUnlocker.java | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/AutoUnlocker.java b/main/ui/src/main/java/org/cryptomator/ui/model/AutoUnlocker.java index c947aa53d..e6612f1cb 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/model/AutoUnlocker.java +++ b/main/ui/src/main/java/org/cryptomator/ui/model/AutoUnlocker.java @@ -2,8 +2,11 @@ package org.cryptomator.ui.model; import java.nio.CharBuffer; import java.util.Arrays; +import java.util.Collection; +import java.util.Iterator; import java.util.Optional; import java.util.concurrent.ExecutorService; +import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Singleton; @@ -18,6 +21,7 @@ import org.slf4j.LoggerFactory; public class AutoUnlocker { private static final Logger LOG = LoggerFactory.getLogger(AutoUnlocker.class); + private static final int NAP_TIME_MILLIS = 500; private final Optional keychainAccess; private final VaultList vaults; @@ -31,8 +35,9 @@ public class AutoUnlocker { } public void unlockAllSilently() { - if (keychainAccess.isPresent()) { - vaults.stream().filter(this::shouldUnlockAfterStartup).map(this::createUnlockTask).forEach(executor::submit); + Collection vaultsToUnlock = vaults.stream().filter(this::shouldUnlockAfterStartup).collect(Collectors.toList()); + if (keychainAccess.isPresent() && !vaultsToUnlock.isEmpty()) { + executor.submit(() -> unlockAll(vaultsToUnlock)); } } @@ -40,8 +45,19 @@ public class AutoUnlocker { return vault.getVaultSettings().unlockAfterStartup().get(); } - private Runnable createUnlockTask(Vault vault) { - return () -> unlockSilently(vault); + private void unlockAll(Collection vaults) { + try { + Iterator iterator = vaults.iterator(); + assert iterator.hasNext() : "vaults must not be empty"; + unlockSilently(iterator.next()); + while (iterator.hasNext()) { + Thread.sleep(NAP_TIME_MILLIS); + unlockSilently(iterator.next()); + } + } catch (InterruptedException e) { + LOG.warn("Auto unlock thread interrupted."); + Thread.currentThread().interrupt(); + } } private void unlockSilently(Vault vault) {