From a96115ecd6cc218c5314e8c20b98cd56204edc07 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Tue, 29 Jun 2021 09:57:45 +0200 Subject: [PATCH] Feature: revamp health workflow init (#1695) * Add health tab to vault options: * health tool is started from there * health tool closes old Window and creates new one * added info and remarks about health tool * adds confirmation checkbox before starting health tool * close vault options window when starting health workflow * Remove AutoLock tab, move options to general tab Co-authored-by: Snyk bot Co-authored-by: Tobias Hagemann Co-authored-by: Sebastian Stenzel --- .../ui/controls/FontAwesome5Icon.java | 2 +- .../ui/health/HealthCheckComponent.java | 8 +++ .../ui/health/HealthCheckModule.java | 6 ++- .../AutoLockVaultOptionsController.java | 51 ------------------- .../GeneralVaultOptionsController.java | 35 +++++++++---- .../HealthVaultOptionsController.java | 30 +++++++++++ .../vaultoptions/SelectedVaultOptionsTab.java | 6 ++- .../vaultoptions/VaultOptionsController.java | 2 + .../ui/vaultoptions/VaultOptionsModule.java | 5 +- src/main/resources/fxml/health_start.fxml | 1 - src/main/resources/fxml/vault_options.fxml | 6 +-- .../fxml/vault_options_autolock.fxml | 26 ---------- .../resources/fxml/vault_options_general.fxml | 13 ++++- .../resources/fxml/vault_options_health.fxml | 49 ++++++++++++++++++ src/main/resources/i18n/strings.properties | 18 ++++--- 15 files changed, 153 insertions(+), 105 deletions(-) delete mode 100644 src/main/java/org/cryptomator/ui/vaultoptions/AutoLockVaultOptionsController.java create mode 100644 src/main/java/org/cryptomator/ui/vaultoptions/HealthVaultOptionsController.java delete mode 100644 src/main/resources/fxml/vault_options_autolock.fxml create mode 100644 src/main/resources/fxml/vault_options_health.fxml diff --git a/src/main/java/org/cryptomator/ui/controls/FontAwesome5Icon.java b/src/main/java/org/cryptomator/ui/controls/FontAwesome5Icon.java index a273447bb..6ec3cddb4 100644 --- a/src/main/java/org/cryptomator/ui/controls/FontAwesome5Icon.java +++ b/src/main/java/org/cryptomator/ui/controls/FontAwesome5Icon.java @@ -39,7 +39,7 @@ public enum FontAwesome5Icon { REDO("\uF01E"), // SEARCH("\uF002"), // SPINNER("\uF110"), // - STOPWATCH("\uF2F2"), // + STETHOSCOPE("\uF0f1"), // SYNC("\uF021"), // TIMES("\uF00D"), // TRASH("\uF1F8"), // diff --git a/src/main/java/org/cryptomator/ui/health/HealthCheckComponent.java b/src/main/java/org/cryptomator/ui/health/HealthCheckComponent.java index 48b16f694..365ab63df 100644 --- a/src/main/java/org/cryptomator/ui/health/HealthCheckComponent.java +++ b/src/main/java/org/cryptomator/ui/health/HealthCheckComponent.java @@ -7,6 +7,7 @@ import org.cryptomator.common.vaults.Vault; import org.cryptomator.ui.common.FxmlFile; import org.cryptomator.ui.common.FxmlScene; +import javax.inject.Named; import javafx.scene.Scene; import javafx.stage.Stage; @@ -17,6 +18,9 @@ public interface HealthCheckComponent { @HealthCheckWindow Stage window(); + @Named("windowToClose") + Stage windowToClose(); + @FxmlScene(FxmlFile.HEALTH_START) Lazy scene(); @@ -24,6 +28,7 @@ public interface HealthCheckComponent { Stage stage = window(); stage.setScene(scene().get()); stage.show(); + windowToClose().close(); return stage; } @@ -33,6 +38,9 @@ public interface HealthCheckComponent { @BindsInstance Builder vault(@HealthCheckWindow Vault vault); + @BindsInstance + Builder windowToClose(@Named("windowToClose") Stage window); + HealthCheckComponent build(); } diff --git a/src/main/java/org/cryptomator/ui/health/HealthCheckModule.java b/src/main/java/org/cryptomator/ui/health/HealthCheckModule.java index e33a9f2f1..061aee4ce 100644 --- a/src/main/java/org/cryptomator/ui/health/HealthCheckModule.java +++ b/src/main/java/org/cryptomator/ui/health/HealthCheckModule.java @@ -19,6 +19,8 @@ import org.cryptomator.ui.keyloading.KeyLoadingComponent; import org.cryptomator.ui.keyloading.KeyLoadingStrategy; import org.cryptomator.ui.mainwindow.MainWindow; +import javax.annotation.Nullable; +import javax.inject.Named; import javax.inject.Provider; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleObjectProperty; @@ -86,10 +88,10 @@ abstract class HealthCheckModule { @HealthCheckScoped static Stage provideStage(StageFactory factory, @MainWindow Stage owner, ResourceBundle resourceBundle, ChangeListener showingListener) { Stage stage = factory.create(); - stage.setTitle(resourceBundle.getString("health.title")); - stage.setResizable(true); stage.initModality(Modality.WINDOW_MODAL); stage.initOwner(owner); + stage.setTitle(resourceBundle.getString("health.title")); + stage.setResizable(true); stage.showingProperty().addListener(showingListener); // bind masterkey lifecycle to window return stage; } diff --git a/src/main/java/org/cryptomator/ui/vaultoptions/AutoLockVaultOptionsController.java b/src/main/java/org/cryptomator/ui/vaultoptions/AutoLockVaultOptionsController.java deleted file mode 100644 index 1bb74690f..000000000 --- a/src/main/java/org/cryptomator/ui/vaultoptions/AutoLockVaultOptionsController.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.cryptomator.ui.vaultoptions; - -import org.cryptomator.common.vaults.Vault; -import org.cryptomator.ui.common.FxController; -import org.cryptomator.ui.controls.NumericTextField; - -import javax.inject.Inject; -import javafx.beans.binding.Bindings; -import javafx.fxml.FXML; -import javafx.scene.control.CheckBox; -import javafx.util.StringConverter; - -@VaultOptionsScoped -public class AutoLockVaultOptionsController implements FxController { - - private final Vault vault; - - public CheckBox lockAfterTimeCheckbox; - public NumericTextField lockTimeInMinutesTextField; - - @Inject - AutoLockVaultOptionsController(@VaultOptionsWindow Vault vault) { - this.vault = vault; - } - - @FXML - public void initialize() { - lockAfterTimeCheckbox.selectedProperty().bindBidirectional(vault.getVaultSettings().autoLockWhenIdle()); - Bindings.bindBidirectional(lockTimeInMinutesTextField.textProperty(), vault.getVaultSettings().autoLockIdleSeconds(), new IdleTimeSecondsConverter()); - } - - private static class IdleTimeSecondsConverter extends StringConverter { - - @Override - public String toString(Number seconds) { - int minutes = seconds.intValue() / 60; // int-truncate - return Integer.toString(minutes); - } - - @Override - public Number fromString(String string) { - try { - int minutes = Integer.valueOf(string); - return minutes * 60; - } catch (NumberFormatException e) { - return 0; - } - } - } - -} diff --git a/src/main/java/org/cryptomator/ui/vaultoptions/GeneralVaultOptionsController.java b/src/main/java/org/cryptomator/ui/vaultoptions/GeneralVaultOptionsController.java index 79d3b53ad..0ccea096e 100644 --- a/src/main/java/org/cryptomator/ui/vaultoptions/GeneralVaultOptionsController.java +++ b/src/main/java/org/cryptomator/ui/vaultoptions/GeneralVaultOptionsController.java @@ -3,10 +3,11 @@ package org.cryptomator.ui.vaultoptions; import org.cryptomator.common.settings.WhenUnlocked; import org.cryptomator.common.vaults.Vault; import org.cryptomator.ui.common.FxController; -import org.cryptomator.ui.health.HealthCheckComponent; +import org.cryptomator.ui.controls.NumericTextField; import javax.inject.Inject; import javafx.beans.Observable; +import javafx.beans.binding.Bindings; import javafx.fxml.FXML; import javafx.scene.control.CheckBox; import javafx.scene.control.ChoiceBox; @@ -23,18 +24,18 @@ public class GeneralVaultOptionsController implements FxController { private final Stage window; private final Vault vault; - private final HealthCheckComponent.Builder healthCheckWindow; private final ResourceBundle resourceBundle; public TextField vaultName; public CheckBox unlockOnStartupCheckbox; public ChoiceBox actionAfterUnlockChoiceBox; + public CheckBox lockAfterTimeCheckbox; + public NumericTextField lockTimeInMinutesTextField; @Inject - GeneralVaultOptionsController(@VaultOptionsWindow Stage window, @VaultOptionsWindow Vault vault, HealthCheckComponent.Builder healthCheckWindow, ResourceBundle resourceBundle) { + GeneralVaultOptionsController(@VaultOptionsWindow Stage window, @VaultOptionsWindow Vault vault, ResourceBundle resourceBundle) { this.window = window; this.vault = vault; - this.healthCheckWindow = healthCheckWindow; this.resourceBundle = resourceBundle; } @@ -47,6 +48,8 @@ public class GeneralVaultOptionsController implements FxController { actionAfterUnlockChoiceBox.getItems().addAll(WhenUnlocked.values()); actionAfterUnlockChoiceBox.valueProperty().bindBidirectional(vault.getVaultSettings().actionAfterUnlock()); actionAfterUnlockChoiceBox.setConverter(new WhenUnlockedConverter(resourceBundle)); + lockAfterTimeCheckbox.selectedProperty().bindBidirectional(vault.getVaultSettings().autoLockWhenIdle()); + Bindings.bindBidirectional(lockTimeInMinutesTextField.textProperty(), vault.getVaultSettings().autoLockIdleSeconds(), new IdleTimeSecondsConverter()); } private void trimVaultNameOnFocusLoss(Observable observable, Boolean wasFocussed, Boolean isFocussed) { @@ -64,12 +67,6 @@ public class GeneralVaultOptionsController implements FxController { } } - @FXML - public void showHealthCheck() { - healthCheckWindow.vault(vault).build().showHealthCheckWindow(); - } - - private static class WhenUnlockedConverter extends StringConverter { private final ResourceBundle resourceBundle; @@ -89,4 +86,22 @@ public class GeneralVaultOptionsController implements FxController { } } + private static class IdleTimeSecondsConverter extends StringConverter { + + @Override + public String toString(Number seconds) { + int minutes = seconds.intValue() / 60; // int-truncate + return Integer.toString(minutes); + } + + @Override + public Number fromString(String string) { + try { + int minutes = Integer.valueOf(string); + return minutes * 60; + } catch (NumberFormatException e) { + return 0; + } + } + } } diff --git a/src/main/java/org/cryptomator/ui/vaultoptions/HealthVaultOptionsController.java b/src/main/java/org/cryptomator/ui/vaultoptions/HealthVaultOptionsController.java new file mode 100644 index 000000000..ee8bf1df0 --- /dev/null +++ b/src/main/java/org/cryptomator/ui/vaultoptions/HealthVaultOptionsController.java @@ -0,0 +1,30 @@ +package org.cryptomator.ui.vaultoptions; + +import org.cryptomator.common.vaults.Vault; +import org.cryptomator.ui.common.FxController; +import org.cryptomator.ui.health.HealthCheckComponent; + +import javax.inject.Inject; +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.stage.Stage; + +@VaultOptionsScoped +public class HealthVaultOptionsController implements FxController { + + @Inject + public HealthVaultOptionsController(@VaultOptionsWindow Stage window, @VaultOptionsWindow Vault vault, HealthCheckComponent.Builder healthCheckWindow) { + this.window = window; + this.vault = vault; + this.healthCheckWindow = healthCheckWindow; + } + + @FXML + public void startHealthCheck(ActionEvent event) { + healthCheckWindow.vault(vault).windowToClose(window).build().showHealthCheckWindow(); + } + + private final Stage window; + private final Vault vault; + private final HealthCheckComponent.Builder healthCheckWindow; +} diff --git a/src/main/java/org/cryptomator/ui/vaultoptions/SelectedVaultOptionsTab.java b/src/main/java/org/cryptomator/ui/vaultoptions/SelectedVaultOptionsTab.java index 03a4922d4..bfaff147a 100644 --- a/src/main/java/org/cryptomator/ui/vaultoptions/SelectedVaultOptionsTab.java +++ b/src/main/java/org/cryptomator/ui/vaultoptions/SelectedVaultOptionsTab.java @@ -23,7 +23,11 @@ public enum SelectedVaultOptionsTab { /** * Show Auto-Lock tab - * */ AUTOLOCK, + + /** + * Show health tab + */ + HEALTH; } diff --git a/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java b/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java index 20dac7594..662232a49 100644 --- a/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java +++ b/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java @@ -24,6 +24,7 @@ public class VaultOptionsController implements FxController { public Tab mountTab; public Tab keyTab; public Tab autoLockTab; + public Tab healthTab; @Inject VaultOptionsController(@VaultOptionsWindow Stage window, ObjectProperty selectedTabProperty) { @@ -49,6 +50,7 @@ public class VaultOptionsController implements FxController { case MOUNT -> mountTab; case KEY -> keyTab; case AUTOLOCK -> autoLockTab; + case HEALTH -> healthTab; }; } diff --git a/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsModule.java b/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsModule.java index 89cef234b..2de9421a0 100644 --- a/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsModule.java +++ b/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsModule.java @@ -86,7 +86,6 @@ abstract class VaultOptionsModule { @Binds @IntoMap - @FxControllerKey(AutoLockVaultOptionsController.class) - abstract FxController bindAutoLockVaultOptionsController(AutoLockVaultOptionsController controller); - + @FxControllerKey(HealthVaultOptionsController.class) + abstract FxController bindHealthOptionsController(HealthVaultOptionsController controller); } diff --git a/src/main/resources/fxml/health_start.fxml b/src/main/resources/fxml/health_start.fxml index 79d946884..63db32ce8 100644 --- a/src/main/resources/fxml/health_start.fxml +++ b/src/main/resources/fxml/health_start.fxml @@ -17,7 +17,6 @@ -