From 92de05b3db77a3ace436edca66ef6276c4cca9a1 Mon Sep 17 00:00:00 2001 From: Martin Beyer Date: Thu, 1 Apr 2021 11:42:41 +0200 Subject: [PATCH] Changed textfield to only accept Integers, Using scheduled Executor as Timer --- .../common/settings/VaultSettings.java | 15 +++-------- .../settings/VaultSettingsJsonAdapter.java | 4 +-- .../cryptomator/ui/fxapp/FxApplication.java | 25 ++++++++----------- .../AutoLockVaultOptionsController.java | 7 +++--- .../main/resources/i18n/strings.properties | 3 --- 5 files changed, 20 insertions(+), 34 deletions(-) diff --git a/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettings.java b/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettings.java index 5b828380d..1b93d0901 100644 --- a/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettings.java +++ b/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettings.java @@ -11,14 +11,7 @@ import com.google.common.io.BaseEncoding; import javafx.beans.Observable; import javafx.beans.binding.Bindings; import javafx.beans.binding.StringBinding; -import javafx.beans.property.BooleanProperty; -import javafx.beans.property.IntegerProperty; -import javafx.beans.property.ObjectProperty; -import javafx.beans.property.SimpleBooleanProperty; -import javafx.beans.property.SimpleIntegerProperty; -import javafx.beans.property.SimpleObjectProperty; -import javafx.beans.property.SimpleStringProperty; -import javafx.beans.property.StringProperty; +import javafx.beans.property.*; import java.nio.file.Path; import java.util.Objects; @@ -38,7 +31,7 @@ public class VaultSettings { public static final int DEFAULT_FILENAME_LENGTH_LIMIT = -1; public static final WhenUnlocked DEFAULT_ACTION_AFTER_UNLOCK = WhenUnlocked.ASK; public static final boolean DEFAULT_LOCK_AFTER_TIME = false; - public static final String DEFAULT_LOCK_TIME_IN_MINUTES = "30"; + public static final int DEFAULT_LOCK_TIME_IN_MINUTES = 30; private static final Random RNG = new Random(); @@ -55,7 +48,7 @@ public class VaultSettings { private final IntegerProperty filenameLengthLimit = new SimpleIntegerProperty(DEFAULT_FILENAME_LENGTH_LIMIT); private final ObjectProperty actionAfterUnlock = new SimpleObjectProperty<>(DEFAULT_ACTION_AFTER_UNLOCK); private final BooleanProperty lockAfterTime = new SimpleBooleanProperty(DEFAULT_LOCK_AFTER_TIME); - private final StringProperty lockTimeInMinutes = new SimpleStringProperty(DEFAULT_LOCK_TIME_IN_MINUTES); + private final IntegerProperty lockTimeInMinutes = new SimpleIntegerProperty(DEFAULT_LOCK_TIME_IN_MINUTES); private final StringBinding mountName; public VaultSettings(String id) { @@ -169,7 +162,7 @@ public class VaultSettings { return lockAfterTime; } - public StringProperty lockTimeInMinutes() { + public IntegerProperty lockTimeInMinutes() { return lockTimeInMinutes; } diff --git a/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettingsJsonAdapter.java b/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettingsJsonAdapter.java index a32956411..ffff021e2 100644 --- a/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettingsJsonAdapter.java +++ b/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettingsJsonAdapter.java @@ -51,7 +51,7 @@ class VaultSettingsJsonAdapter { int filenameLengthLimit = VaultSettings.DEFAULT_FILENAME_LENGTH_LIMIT; WhenUnlocked actionAfterUnlock = VaultSettings.DEFAULT_ACTION_AFTER_UNLOCK; boolean lockAfterTime = VaultSettings.DEFAULT_LOCK_AFTER_TIME; - String lockTimeInMinutes = VaultSettings.DEFAULT_LOCK_TIME_IN_MINUTES; + int lockTimeInMinutes = VaultSettings.DEFAULT_LOCK_TIME_IN_MINUTES; in.beginObject(); while (in.hasNext()) { @@ -71,7 +71,7 @@ class VaultSettingsJsonAdapter { case "filenameLengthLimit" -> filenameLengthLimit = in.nextInt(); case "actionAfterUnlock" -> actionAfterUnlock = parseActionAfterUnlock(in.nextString()); case "lockAfterTime" -> lockAfterTime = in.nextBoolean(); - case "lockTimeInMinutes" -> lockTimeInMinutes = in.nextString(); + case "lockTimeInMinutes" -> lockTimeInMinutes = in.nextInt(); default -> { LOG.warn("Unsupported vault setting found in JSON: " + name); in.skipValue(); diff --git a/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java b/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java index 400760e2d..cc6e97d72 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java +++ b/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java @@ -14,7 +14,6 @@ import org.cryptomator.common.settings.Settings; import org.cryptomator.common.settings.UiTheme; import org.cryptomator.common.vaults.Vault; import org.cryptomator.common.vaults.VaultListManager; -import org.cryptomator.common.vaults.Volume; import org.cryptomator.integrations.tray.TrayIntegrationProvider; import org.cryptomator.integrations.uiappearance.Theme; import org.cryptomator.integrations.uiappearance.UiAppearanceException; @@ -33,10 +32,11 @@ import org.slf4j.LoggerFactory; import javax.inject.Inject; import javax.inject.Provider; import java.awt.desktop.QuitResponse; -import java.util.Date; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; @FxApplicationScoped public class FxApplication extends Application { @@ -57,9 +57,10 @@ public class FxApplication extends Application { private final BooleanBinding hasVisibleWindows; private final UiAppearanceListener systemInterfaceThemeListener = this::systemInterfaceThemeChanged; private final VaultListManager vaultListManager; + private final ScheduledExecutorService scheduledExecutorService; @Inject - FxApplication(Settings settings, Lazy mainWindow, Lazy preferencesWindow, Provider unlockWindowBuilderProvider, Provider lockWindowBuilderProvider, Lazy quitWindow, Optional trayIntegration, Optional appearanceProvider, VaultService vaultService, LicenseHolder licenseHolder, VaultListManager vaultListManager) { + FxApplication(Settings settings, Lazy mainWindow, Lazy preferencesWindow, Provider unlockWindowBuilderProvider, Provider lockWindowBuilderProvider, Lazy quitWindow, Optional trayIntegration, Optional appearanceProvider, VaultService vaultService, LicenseHolder licenseHolder, VaultListManager vaultListManager, ScheduledExecutorService scheduledExecutorService) { this.settings = settings; this.mainWindow = mainWindow; this.preferencesWindow = preferencesWindow; @@ -73,6 +74,7 @@ public class FxApplication extends Application { this.visibleWindows = Stage.getWindows().filtered(Window::isShowing); this.hasVisibleWindows = Bindings.isNotEmpty(visibleWindows); this.vaultListManager = vaultListManager; + this.scheduledExecutorService = scheduledExecutorService; } public void start() { @@ -199,19 +201,12 @@ public class FxApplication extends Application { } - - private void checkAutolock(Vault vault, Optional owner){ - if (vault.getVaultSettings().lockAfterTime().get()){ + private void checkAutolock(Vault vault, Optional owner) { + if (vault.getVaultSettings().lockAfterTime().get()) { LOG.info("Locking after {} minutes.", vault.getVaultSettings().lockTimeInMinutes().get()); - new java.util.Timer().schedule( - new java.util.TimerTask() { - @Override - public void run() { - startLockWorkflow(vault, owner); - } - }, - new Date(System.currentTimeMillis() + (int)(Double.parseDouble(vault.getVaultSettings().lockTimeInMinutes().get()) * 60 * 1000)) - ); + scheduledExecutorService.schedule(() -> { + startLockWorkflow(vault, owner); + }, (long) (vault.getVaultSettings().lockTimeInMinutes().get()), TimeUnit.MINUTES); } } diff --git a/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/AutoLockVaultOptionsController.java b/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/AutoLockVaultOptionsController.java index 21af0c3d9..906a40ba3 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/AutoLockVaultOptionsController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/AutoLockVaultOptionsController.java @@ -5,12 +5,14 @@ import org.cryptomator.ui.common.FxController; import javax.inject.Inject; +import javafx.beans.binding.Bindings; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.fxml.FXML; import javafx.scene.control.CheckBox; import javafx.scene.control.TextField; import javafx.stage.Stage; +import javafx.util.converter.NumberStringConverter; import java.util.ResourceBundle; @@ -31,12 +33,11 @@ public class AutoLockVaultOptionsController implements FxController { @FXML public void initialize() { lockAfterTimeCheckbox.selectedProperty().bindBidirectional(vault.getVaultSettings().lockAfterTime()); - lockTimeInMinutesTextField.textProperty().bindBidirectional(vault.getVaultSettings().lockTimeInMinutes()); - //force the field to be a double with the correct decimal point + Bindings.bindBidirectional(lockTimeInMinutesTextField.textProperty(), vault.getVaultSettings().lockTimeInMinutes(), new NumberStringConverter()); lockTimeInMinutesTextField.textProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, String oldValue, String newValue) { - if (!newValue.matches("\\d{0,9}([\\.]\\d{0,9})?")) { + if (!newValue.matches("\\d{0,9}")) { lockTimeInMinutesTextField.setText(newValue.replaceAll("[^\\d]", "")); } } diff --git a/main/ui/src/main/resources/i18n/strings.properties b/main/ui/src/main/resources/i18n/strings.properties index 31311fc2a..d429d29b5 100644 --- a/main/ui/src/main/resources/i18n/strings.properties +++ b/main/ui/src/main/resources/i18n/strings.properties @@ -294,9 +294,6 @@ vaultOptions.masterkey.showRecoveryKeyBtn=Display Recovery Key vaultOptions.masterkey.recoverPasswordBtn=Recover Password ## Auto Lock vaultOptions.autoLock=Auto-Lock -vaultOptions.autoLock.lockOnSleep=Lock on sleep -vaultOptions.autoLock.lockAfterIdleTimePart1=Lock after computer is idle for -vaultOptions.autoLock.lockAfterIdleTimePart2=minutes. vaultOptions.autoLock.lockAfterTimePart1=Lock after vaultOptions.autoLock.lockAfterTimePart2=minutes.