From 497e5ce73f1054983c9979f1810b88bb6bac6936 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Wed, 31 Mar 2021 11:37:55 +0200 Subject: [PATCH 01/67] Add health check window --- .../org/cryptomator/ui/common/FxmlFile.java | 1 + .../ui/health/HealthCheckComponent.java | 39 +++++++++++++ .../ui/health/HealthCheckModule.java | 57 +++++++++++++++++++ .../ui/health/HealthCheckScoped.java | 13 +++++ .../ui/health/HealthCheckWindow.java | 14 +++++ .../ui/health/StartController.java | 40 +++++++++++++ .../ui/mainwindow/MainWindowModule.java | 3 +- .../VaultDetailLockedController.java | 11 +++- .../src/main/resources/fxml/health_start.fxml | 28 +++++++++ .../resources/fxml/vault_detail_locked.fxml | 1 + .../main/resources/i18n/strings.properties | 3 + 11 files changed, 208 insertions(+), 2 deletions(-) create mode 100644 main/ui/src/main/java/org/cryptomator/ui/health/HealthCheckComponent.java create mode 100644 main/ui/src/main/java/org/cryptomator/ui/health/HealthCheckModule.java create mode 100644 main/ui/src/main/java/org/cryptomator/ui/health/HealthCheckScoped.java create mode 100644 main/ui/src/main/java/org/cryptomator/ui/health/HealthCheckWindow.java create mode 100644 main/ui/src/main/java/org/cryptomator/ui/health/StartController.java create mode 100644 main/ui/src/main/resources/fxml/health_start.fxml diff --git a/main/ui/src/main/java/org/cryptomator/ui/common/FxmlFile.java b/main/ui/src/main/java/org/cryptomator/ui/common/FxmlFile.java index 32dc94f14..625c95acb 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/common/FxmlFile.java +++ b/main/ui/src/main/java/org/cryptomator/ui/common/FxmlFile.java @@ -11,6 +11,7 @@ public enum FxmlFile { CHANGEPASSWORD("/fxml/changepassword.fxml"), // ERROR("/fxml/error.fxml"), // FORGET_PASSWORD("/fxml/forget_password.fxml"), // + HEALTH_START("/fxml/health_start.fxml"), // LOCK_FORCED("/fxml/lock_forced.fxml"), // LOCK_FAILED("/fxml/lock_failed.fxml"), // MAIN_WINDOW("/fxml/main_window.fxml"), // diff --git a/main/ui/src/main/java/org/cryptomator/ui/health/HealthCheckComponent.java b/main/ui/src/main/java/org/cryptomator/ui/health/HealthCheckComponent.java new file mode 100644 index 000000000..48b16f694 --- /dev/null +++ b/main/ui/src/main/java/org/cryptomator/ui/health/HealthCheckComponent.java @@ -0,0 +1,39 @@ +package org.cryptomator.ui.health; + +import dagger.BindsInstance; +import dagger.Lazy; +import dagger.Subcomponent; +import org.cryptomator.common.vaults.Vault; +import org.cryptomator.ui.common.FxmlFile; +import org.cryptomator.ui.common.FxmlScene; + +import javafx.scene.Scene; +import javafx.stage.Stage; + +@HealthCheckScoped +@Subcomponent(modules = {HealthCheckModule.class}) +public interface HealthCheckComponent { + + @HealthCheckWindow + Stage window(); + + @FxmlScene(FxmlFile.HEALTH_START) + Lazy scene(); + + default Stage showHealthCheckWindow() { + Stage stage = window(); + stage.setScene(scene().get()); + stage.show(); + return stage; + } + + @Subcomponent.Builder + interface Builder { + + @BindsInstance + Builder vault(@HealthCheckWindow Vault vault); + + HealthCheckComponent build(); + } + +} diff --git a/main/ui/src/main/java/org/cryptomator/ui/health/HealthCheckModule.java b/main/ui/src/main/java/org/cryptomator/ui/health/HealthCheckModule.java new file mode 100644 index 000000000..ec0c0331f --- /dev/null +++ b/main/ui/src/main/java/org/cryptomator/ui/health/HealthCheckModule.java @@ -0,0 +1,57 @@ +package org.cryptomator.ui.health; + +import dagger.Binds; +import dagger.Module; +import dagger.Provides; +import dagger.multibindings.IntoMap; +import org.cryptomator.ui.common.DefaultSceneFactory; +import org.cryptomator.ui.common.FxController; +import org.cryptomator.ui.common.FxControllerKey; +import org.cryptomator.ui.common.FxmlFile; +import org.cryptomator.ui.common.FxmlLoaderFactory; +import org.cryptomator.ui.common.FxmlScene; +import org.cryptomator.ui.common.StageFactory; +import org.cryptomator.ui.mainwindow.MainWindow; + +import javax.inject.Provider; +import javafx.scene.Scene; +import javafx.stage.Modality; +import javafx.stage.Stage; +import java.util.Map; +import java.util.ResourceBundle; + +@Module +abstract class HealthCheckModule { + + @Provides + @HealthCheckWindow + @HealthCheckScoped + static FxmlLoaderFactory provideFxmlLoaderFactory(Map, Provider> factories, DefaultSceneFactory sceneFactory, ResourceBundle resourceBundle) { + return new FxmlLoaderFactory(factories, sceneFactory, resourceBundle); + } + + @Provides + @HealthCheckWindow + @HealthCheckScoped + static Stage provideStage(StageFactory factory, @MainWindow Stage owner, ResourceBundle resourceBundle) { + Stage stage = factory.create(); + stage.setTitle(resourceBundle.getString("health.title")); + stage.setResizable(false); + stage.initModality(Modality.WINDOW_MODAL); + stage.initOwner(owner); + return stage; + } + + @Provides + @FxmlScene(FxmlFile.HEALTH_START) + @HealthCheckScoped + static Scene provideUnlockSelectMasterkeyFileScene(@HealthCheckWindow FxmlLoaderFactory fxmlLoaders) { + return fxmlLoaders.createScene(FxmlFile.HEALTH_START); + } + + @Binds + @IntoMap + @FxControllerKey(StartController.class) + abstract FxController bindStartController(StartController controller); + +} diff --git a/main/ui/src/main/java/org/cryptomator/ui/health/HealthCheckScoped.java b/main/ui/src/main/java/org/cryptomator/ui/health/HealthCheckScoped.java new file mode 100644 index 000000000..af563d737 --- /dev/null +++ b/main/ui/src/main/java/org/cryptomator/ui/health/HealthCheckScoped.java @@ -0,0 +1,13 @@ +package org.cryptomator.ui.health; + +import javax.inject.Scope; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Scope +@Documented +@Retention(RetentionPolicy.RUNTIME) +@interface HealthCheckScoped { + +} diff --git a/main/ui/src/main/java/org/cryptomator/ui/health/HealthCheckWindow.java b/main/ui/src/main/java/org/cryptomator/ui/health/HealthCheckWindow.java new file mode 100644 index 000000000..50243c07a --- /dev/null +++ b/main/ui/src/main/java/org/cryptomator/ui/health/HealthCheckWindow.java @@ -0,0 +1,14 @@ +package org.cryptomator.ui.health; + +import javax.inject.Qualifier; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; + +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +@Qualifier +@Documented +@Retention(RUNTIME) +@interface HealthCheckWindow { + +} diff --git a/main/ui/src/main/java/org/cryptomator/ui/health/StartController.java b/main/ui/src/main/java/org/cryptomator/ui/health/StartController.java new file mode 100644 index 000000000..c87e95e0f --- /dev/null +++ b/main/ui/src/main/java/org/cryptomator/ui/health/StartController.java @@ -0,0 +1,40 @@ +package org.cryptomator.ui.health; + +import org.cryptomator.common.vaults.Vault; +import org.cryptomator.ui.common.FxController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.inject.Inject; +import javafx.fxml.FXML; +import javafx.stage.Stage; + +@HealthCheckScoped +public class StartController implements FxController { + + private static final Logger LOG = LoggerFactory.getLogger(StartController.class); + + private final Vault vault; + private final Stage window; + + @Inject + public StartController(@HealthCheckWindow Vault vault, @HealthCheckWindow Stage window) { + this.vault = vault; + this.window = window; + } + + @FXML + public void close() { + LOG.trace("StartController.close()"); + window.close(); + } + + @FXML + public void next() { + LOG.trace("StartController.next()"); + } + + public Vault getVault() { + return vault; + } +} diff --git a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java index f8316d289..e8aae56fb 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java +++ b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java @@ -12,6 +12,7 @@ import org.cryptomator.ui.common.FxControllerKey; import org.cryptomator.ui.common.FxmlFile; import org.cryptomator.ui.common.FxmlScene; import org.cryptomator.ui.common.StageFactory; +import org.cryptomator.ui.health.HealthCheckComponent; import org.cryptomator.ui.migration.MigrationComponent; import org.cryptomator.ui.removevault.RemoveVaultComponent; import org.cryptomator.ui.vaultoptions.VaultOptionsComponent; @@ -27,7 +28,7 @@ import javafx.stage.StageStyle; import java.util.Map; import java.util.ResourceBundle; -@Module(subcomponents = {AddVaultWizardComponent.class, MigrationComponent.class, RemoveVaultComponent.class, VaultOptionsComponent.class, VaultStatisticsComponent.class, WrongFileAlertComponent.class}) +@Module(subcomponents = {AddVaultWizardComponent.class, HealthCheckComponent.class, MigrationComponent.class, RemoveVaultComponent.class, VaultOptionsComponent.class, VaultStatisticsComponent.class, WrongFileAlertComponent.class}) abstract class MainWindowModule { @Provides diff --git a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailLockedController.java b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailLockedController.java index bc2f2100a..8d3f6a72c 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailLockedController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailLockedController.java @@ -5,6 +5,7 @@ import org.cryptomator.common.keychain.KeychainManager; import org.cryptomator.common.vaults.Vault; import org.cryptomator.ui.common.FxController; import org.cryptomator.ui.fxapp.FxApplication; +import org.cryptomator.ui.health.HealthCheckComponent; import org.cryptomator.ui.vaultoptions.SelectedVaultOptionsTab; import org.cryptomator.ui.vaultoptions.VaultOptionsComponent; @@ -13,6 +14,7 @@ import javafx.beans.binding.BooleanExpression; import javafx.beans.property.ObjectProperty; import javafx.beans.property.ReadOnlyObjectProperty; import javafx.beans.property.SimpleBooleanProperty; +import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.stage.Stage; import java.util.Optional; @@ -22,15 +24,17 @@ public class VaultDetailLockedController implements FxController { private final ReadOnlyObjectProperty vault; private final FxApplication application; + private final HealthCheckComponent.Builder healthCheckWindow; private final VaultOptionsComponent.Builder vaultOptionsWindow; private final KeychainManager keychain; private final Stage mainWindow; private final BooleanExpression passwordSaved; @Inject - VaultDetailLockedController(ObjectProperty vault, FxApplication application, VaultOptionsComponent.Builder vaultOptionsWindow, KeychainManager keychain, @MainWindow Stage mainWindow) { + VaultDetailLockedController(ObjectProperty vault, FxApplication application, HealthCheckComponent.Builder healthCheckWindow, VaultOptionsComponent.Builder vaultOptionsWindow, KeychainManager keychain, @MainWindow Stage mainWindow) { this.vault = vault; this.application = application; + this.healthCheckWindow = healthCheckWindow; this.vaultOptionsWindow = vaultOptionsWindow; this.keychain = keychain; this.mainWindow = mainWindow; @@ -56,6 +60,11 @@ public class VaultDetailLockedController implements FxController { vaultOptionsWindow.vault(vault.get()).build().showVaultOptionsWindow(SelectedVaultOptionsTab.KEY); } + @FXML + public void showHealthCheck() { + healthCheckWindow.vault(vault.get()).build().showHealthCheckWindow(); + } + /* Getter/Setter */ public ReadOnlyObjectProperty vaultProperty() { diff --git a/main/ui/src/main/resources/fxml/health_start.fxml b/main/ui/src/main/resources/fxml/health_start.fxml new file mode 100644 index 000000000..246300be7 --- /dev/null +++ b/main/ui/src/main/resources/fxml/health_start.fxml @@ -0,0 +1,28 @@ + + + + + + + + + + + + +