From 40bb0079acf2c5d8b8979c4185e9edc4f082567f Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Tue, 14 Jul 2026 16:28:29 +0200 Subject: [PATCH] add ui to import a vault from template add scaffolding, controller are stubs for now Signed-off-by: Armin Schrenk --- .../org/cryptomator/ui/common/FxmlFile.java | 2 + .../ui/fxapp/FxApplicationModule.java | 2 + .../ImportTemplateComponent.java | 34 +++++++ .../ImportTemplateLocationController.java | 40 +++++++++ .../importtemplate/ImportTemplateModule.java | 90 +++++++++++++++++++ .../importtemplate/ImportTemplateScoped.java | 13 +++ .../ImportTemplateSuccessController.java | 39 ++++++++ .../importtemplate/ImportTemplateWindow.java | 14 +++ .../fxml/import_template_location.fxml | 22 +++++ .../fxml/import_template_success.fxml | 28 ++++++ src/main/resources/i18n/strings.properties | 5 ++ 11 files changed, 289 insertions(+) create mode 100644 src/main/java/org/cryptomator/ui/importtemplate/ImportTemplateComponent.java create mode 100644 src/main/java/org/cryptomator/ui/importtemplate/ImportTemplateLocationController.java create mode 100644 src/main/java/org/cryptomator/ui/importtemplate/ImportTemplateModule.java create mode 100644 src/main/java/org/cryptomator/ui/importtemplate/ImportTemplateScoped.java create mode 100644 src/main/java/org/cryptomator/ui/importtemplate/ImportTemplateSuccessController.java create mode 100644 src/main/java/org/cryptomator/ui/importtemplate/ImportTemplateWindow.java create mode 100644 src/main/resources/fxml/import_template_location.fxml create mode 100644 src/main/resources/fxml/import_template_success.fxml diff --git a/src/main/java/org/cryptomator/ui/common/FxmlFile.java b/src/main/java/org/cryptomator/ui/common/FxmlFile.java index b31245b4c..c437db43a 100644 --- a/src/main/java/org/cryptomator/ui/common/FxmlFile.java +++ b/src/main/java/org/cryptomator/ui/common/FxmlFile.java @@ -13,6 +13,8 @@ public enum FxmlFile { CONVERTVAULT_HUBTOPASSWORD_CONVERT("/fxml/convertvault_hubtopassword_convert.fxml"), // CONVERTVAULT_HUBTOPASSWORD_SUCCESS("/fxml/convertvault_hubtopassword_success.fxml"), // DECRYPTNAMES("/fxml/decryptnames.fxml"), // + IMPORT_TEMPLATE_LOCATION("/fxml/import_template_location.fxml"), // + IMPORT_TEMPLATE_SUCCESS("/fxml/import_template_success.fxml"), // ERROR("/fxml/error.fxml"), // EVENT_VIEW("/fxml/eventview.fxml"), // FORGET_PASSWORD("/fxml/forget_password.fxml"), // diff --git a/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java b/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java index bb5af478c..7598fd3fc 100644 --- a/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java +++ b/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java @@ -12,6 +12,7 @@ import org.cryptomator.ui.decryptname.DecryptNameComponent; import org.cryptomator.ui.error.ErrorComponent; import org.cryptomator.ui.eventview.EventViewComponent; import org.cryptomator.ui.health.HealthCheckComponent; +import org.cryptomator.ui.importtemplate.ImportTemplateComponent; import org.cryptomator.ui.lock.LockComponent; import org.cryptomator.ui.mainwindow.MainWindowComponent; import org.cryptomator.ui.notification.NotificationComponent; @@ -31,6 +32,7 @@ import java.util.Optional; @Module(subcomponents = {TrayMenuComponent.class, // DecryptNameComponent.class, // + ImportTemplateComponent.class, // MainWindowComponent.class, // PreferencesComponent.class, // VaultOptionsComponent.class, // diff --git a/src/main/java/org/cryptomator/ui/importtemplate/ImportTemplateComponent.java b/src/main/java/org/cryptomator/ui/importtemplate/ImportTemplateComponent.java new file mode 100644 index 000000000..e2b5d1c02 --- /dev/null +++ b/src/main/java/org/cryptomator/ui/importtemplate/ImportTemplateComponent.java @@ -0,0 +1,34 @@ +package org.cryptomator.ui.importtemplate; + +import dagger.BindsInstance; +import dagger.Lazy; +import dagger.Subcomponent; +import org.cryptomator.ui.common.FxmlFile; +import org.cryptomator.ui.common.FxmlScene; + +import javax.inject.Named; +import javafx.scene.Scene; +import javafx.stage.Stage; + +@ImportTemplateScoped +@Subcomponent(modules = {ImportTemplateModule.class}) +public interface ImportTemplateComponent { + + @ImportTemplateWindow + Stage window(); + + @FxmlScene(FxmlFile.IMPORT_TEMPLATE_LOCATION) + Lazy scene(); + + default void showImportTemplateWindow() { + Stage stage = window(); + stage.setScene(scene().get()); + stage.show(); + } + + @Subcomponent.Factory + interface Factory { + ImportTemplateComponent create(@BindsInstance @Named("vaultName") String name, @BindsInstance @Named("vaultTemplate") byte[] template); + } + +} diff --git a/src/main/java/org/cryptomator/ui/importtemplate/ImportTemplateLocationController.java b/src/main/java/org/cryptomator/ui/importtemplate/ImportTemplateLocationController.java new file mode 100644 index 000000000..c4e705f5d --- /dev/null +++ b/src/main/java/org/cryptomator/ui/importtemplate/ImportTemplateLocationController.java @@ -0,0 +1,40 @@ +package org.cryptomator.ui.importtemplate; + +import org.cryptomator.ui.common.FxController; + +import javax.inject.Inject; +import javax.inject.Named; +import javafx.beans.property.ObjectProperty; +import javafx.fxml.FXML; +import javafx.stage.Stage; +import java.nio.file.Path; + +@ImportTemplateScoped +public class ImportTemplateLocationController implements FxController { + + private final Stage window; + private final String vaultName; + private final byte[] template; + private final ObjectProperty vaultPath; + + @Inject + ImportTemplateLocationController(@ImportTemplateWindow Stage window, // + @Named("vaultName") String vaultName, // + @Named("vaultTemplate") byte[] template, // + ObjectProperty vaultPath) { + this.window = window; + this.vaultName = vaultName; + this.template = template; + this.vaultPath = vaultPath; + } + + @FXML + public void initialize() { + // TODO (import-template step 4b): location presets, path validation, finish() with spinner + Tasks.runOnce + } + + public String getVaultName() { + return vaultName; + } + +} diff --git a/src/main/java/org/cryptomator/ui/importtemplate/ImportTemplateModule.java b/src/main/java/org/cryptomator/ui/importtemplate/ImportTemplateModule.java new file mode 100644 index 000000000..df769e485 --- /dev/null +++ b/src/main/java/org/cryptomator/ui/importtemplate/ImportTemplateModule.java @@ -0,0 +1,90 @@ +package org.cryptomator.ui.importtemplate; + +import dagger.Binds; +import dagger.Module; +import dagger.Provides; +import dagger.multibindings.IntoMap; +import org.cryptomator.common.vaults.Vault; +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.fxapp.PrimaryStage; + +import javax.inject.Provider; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; +import javafx.scene.Scene; +import javafx.stage.Modality; +import javafx.stage.Stage; +import java.nio.file.Path; +import java.util.Map; +import java.util.ResourceBundle; + +@Module +abstract class ImportTemplateModule { + + @Provides + @ImportTemplateWindow + @ImportTemplateScoped + static FxmlLoaderFactory provideFxmlLoaderFactory(Map, Provider> factories, DefaultSceneFactory sceneFactory, ResourceBundle resourceBundle) { + return new FxmlLoaderFactory(factories, sceneFactory, resourceBundle); + } + + @Provides + @ImportTemplateWindow + @ImportTemplateScoped + static Stage provideStage(StageFactory factory, @PrimaryStage Stage primaryStage, ResourceBundle resourceBundle) { + Stage stage = factory.create(); + stage.setResizable(false); + stage.initModality(Modality.WINDOW_MODAL); + stage.initOwner(primaryStage); + stage.setTitle(resourceBundle.getString("importTemplate.title")); + return stage; + } + + @Provides + @ImportTemplateScoped + static ObjectProperty provideVaultPath() { + return new SimpleObjectProperty<>(); + } + + @Provides + @ImportTemplateWindow + @ImportTemplateScoped + static ObjectProperty provideVault() { + return new SimpleObjectProperty<>(); + } + + // ------------------ + + @Provides + @FxmlScene(FxmlFile.IMPORT_TEMPLATE_LOCATION) + @ImportTemplateScoped + static Scene provideImportTemplateLocationScene(@ImportTemplateWindow FxmlLoaderFactory fxmlLoaders) { + return fxmlLoaders.createScene(FxmlFile.IMPORT_TEMPLATE_LOCATION); + } + + @Provides + @FxmlScene(FxmlFile.IMPORT_TEMPLATE_SUCCESS) + @ImportTemplateScoped + static Scene provideImportTemplateSuccessScene(@ImportTemplateWindow FxmlLoaderFactory fxmlLoaders) { + return fxmlLoaders.createScene(FxmlFile.IMPORT_TEMPLATE_SUCCESS); + } + + // ------------------ + + @Binds + @IntoMap + @FxControllerKey(ImportTemplateLocationController.class) + abstract FxController bindImportTemplateLocationController(ImportTemplateLocationController controller); + + @Binds + @IntoMap + @FxControllerKey(ImportTemplateSuccessController.class) + abstract FxController bindImportTemplateSuccessController(ImportTemplateSuccessController controller); + +} diff --git a/src/main/java/org/cryptomator/ui/importtemplate/ImportTemplateScoped.java b/src/main/java/org/cryptomator/ui/importtemplate/ImportTemplateScoped.java new file mode 100644 index 000000000..1864e23a0 --- /dev/null +++ b/src/main/java/org/cryptomator/ui/importtemplate/ImportTemplateScoped.java @@ -0,0 +1,13 @@ +package org.cryptomator.ui.importtemplate; + +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 ImportTemplateScoped { + +} diff --git a/src/main/java/org/cryptomator/ui/importtemplate/ImportTemplateSuccessController.java b/src/main/java/org/cryptomator/ui/importtemplate/ImportTemplateSuccessController.java new file mode 100644 index 000000000..8ce16e929 --- /dev/null +++ b/src/main/java/org/cryptomator/ui/importtemplate/ImportTemplateSuccessController.java @@ -0,0 +1,39 @@ +package org.cryptomator.ui.importtemplate; + +import org.cryptomator.common.vaults.Vault; +import org.cryptomator.ui.common.FxController; + +import javax.inject.Inject; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.ReadOnlyObjectProperty; +import javafx.fxml.FXML; +import javafx.stage.Stage; + +@ImportTemplateScoped +public class ImportTemplateSuccessController implements FxController { + + private final Stage window; + private final ReadOnlyObjectProperty vault; + + @Inject + ImportTemplateSuccessController(@ImportTemplateWindow Stage window, @ImportTemplateWindow ObjectProperty vault) { + this.window = window; + this.vault = vault; + } + + @FXML + public void close() { + window.close(); + } + + // TODO (import-template step 4b): unlockAndClose() -> appWindows.startUnlockWorkflow(vault.get(), window) + + public ReadOnlyObjectProperty vaultProperty() { + return vault; + } + + public Vault getVault() { + return vault.get(); + } + +} diff --git a/src/main/java/org/cryptomator/ui/importtemplate/ImportTemplateWindow.java b/src/main/java/org/cryptomator/ui/importtemplate/ImportTemplateWindow.java new file mode 100644 index 000000000..8a7bcaac7 --- /dev/null +++ b/src/main/java/org/cryptomator/ui/importtemplate/ImportTemplateWindow.java @@ -0,0 +1,14 @@ +package org.cryptomator.ui.importtemplate; + +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 ImportTemplateWindow { + +} diff --git a/src/main/resources/fxml/import_template_location.fxml b/src/main/resources/fxml/import_template_location.fxml new file mode 100644 index 000000000..35ee842dc --- /dev/null +++ b/src/main/resources/fxml/import_template_location.fxml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + diff --git a/src/main/resources/fxml/import_template_success.fxml b/src/main/resources/fxml/import_template_success.fxml new file mode 100644 index 000000000..dafe35b06 --- /dev/null +++ b/src/main/resources/fxml/import_template_success.fxml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + +