From f35f04851e5d8865e32043acbbc8b64fb84064af Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Fri, 6 Sep 2019 15:26:01 +0200 Subject: [PATCH] Hook up migration window --- .../org/cryptomator/common/vaults/Vault.java | 10 +++ .../org/cryptomator/ui/common/FxmlFile.java | 1 + .../ui/controls/FontAwesome5Icon.java | 1 + .../ui/mainwindow/MainWindowModule.java | 3 +- .../ui/mainwindow/VaultDetailController.java | 14 +++- .../ui/migration/MigrationComponent.java | 38 ++++++++++ .../ui/migration/MigrationModule.java | 71 +++++++++++++++++++ .../ui/migration/MigrationScoped.java | 13 ++++ .../migration/MigrationStartController.java | 46 ++++++++++++ .../ui/migration/MigrationWindow.java | 14 ++++ .../main/resources/fxml/migration_start.fxml | 45 ++++++++++++ .../src/main/resources/fxml/vault_detail.fxml | 7 ++ 12 files changed, 259 insertions(+), 4 deletions(-) create mode 100644 main/ui/src/main/java/org/cryptomator/ui/migration/MigrationComponent.java create mode 100644 main/ui/src/main/java/org/cryptomator/ui/migration/MigrationModule.java create mode 100644 main/ui/src/main/java/org/cryptomator/ui/migration/MigrationScoped.java create mode 100644 main/ui/src/main/java/org/cryptomator/ui/migration/MigrationStartController.java create mode 100644 main/ui/src/main/java/org/cryptomator/ui/migration/MigrationWindow.java create mode 100644 main/ui/src/main/resources/fxml/migration_start.fxml diff --git a/main/commons/src/main/java/org/cryptomator/common/vaults/Vault.java b/main/commons/src/main/java/org/cryptomator/common/vaults/Vault.java index 8eafd14a2..9ac09cb87 100644 --- a/main/commons/src/main/java/org/cryptomator/common/vaults/Vault.java +++ b/main/commons/src/main/java/org/cryptomator/common/vaults/Vault.java @@ -68,6 +68,7 @@ public class Vault { private final BooleanBinding locked; private final BooleanBinding processing; private final BooleanBinding unlocked; + private final BooleanBinding needsMigration; private final ObjectBinding accessPoint; private volatile Volume volume; @@ -85,6 +86,7 @@ public class Vault { this.locked = Bindings.createBooleanBinding(this::isLocked, state); this.processing = Bindings.createBooleanBinding(this::isProcessing, state); this.unlocked = Bindings.createBooleanBinding(this::isUnlocked, state); + this.needsMigration = Bindings.createBooleanBinding(this::isNeedsMigration, state); this.accessPoint = Bindings.createObjectBinding(this::getAccessPoint, state); } @@ -215,6 +217,14 @@ public class Vault { public boolean isUnlocked() { return state.get() == VaultState.UNLOCKED; } + + public BooleanBinding needsMigrationProperty() { + return needsMigration; + } + + public boolean isNeedsMigration() { + return state.get() == VaultState.NEEDS_MIGRATION; + } public StringBinding displayableNameProperty() { return displayableName; 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 83ddee800..4a7c07faa 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 @@ -9,6 +9,7 @@ public enum FxmlFile { ADDVAULT_SUCCESS("/fxml/addvault_success.fxml"), // CHANGEPASSWORD("/fxml/changepassword.fxml"), // MAIN_WINDOW("/fxml/main_window.fxml"), // + MIGRATION_START("/fxml/migration_start.fxml"), // PREFERENCES("/fxml/preferences.fxml"), // QUIT("/fxml/quit.fxml"), // REMOVE_VAULT("/fxml/remove_vault.fxml"), // diff --git a/main/ui/src/main/java/org/cryptomator/ui/controls/FontAwesome5Icon.java b/main/ui/src/main/java/org/cryptomator/ui/controls/FontAwesome5Icon.java index f4bea2918..070f4519d 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/controls/FontAwesome5Icon.java +++ b/main/ui/src/main/java/org/cryptomator/ui/controls/FontAwesome5Icon.java @@ -12,6 +12,7 @@ public enum FontAwesome5Icon { EXCLAMATION_TRIANGLE("\uF071"), // EYE("\uF06E"), // EYE_SLASH("\uF070"), // + FILE_IMPORT("\uF56F"), // FOLDER_OPEN("\uF07C"), // HDD("\uF0A0"), // KEY("\uF084"), // 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 eac6d58b4..673bb82c4 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 @@ -17,6 +17,7 @@ import org.cryptomator.ui.common.FxController; import org.cryptomator.ui.common.FxControllerKey; import org.cryptomator.ui.common.FxmlFile; import org.cryptomator.ui.common.FxmlScene; +import org.cryptomator.ui.migration.MigrationComponent; import org.cryptomator.ui.removevault.RemoveVaultComponent; import org.cryptomator.ui.vaultoptions.VaultOptionsComponent; import org.cryptomator.ui.wrongfilealert.WrongFileAlertComponent; @@ -27,7 +28,7 @@ import java.util.Map; import java.util.Optional; import java.util.ResourceBundle; -@Module(subcomponents = {AddVaultWizardComponent.class, RemoveVaultComponent.class, VaultOptionsComponent.class, WrongFileAlertComponent.class}) +@Module(subcomponents = {AddVaultWizardComponent.class, MigrationComponent.class, RemoveVaultComponent.class, VaultOptionsComponent.class, WrongFileAlertComponent.class}) abstract class MainWindowModule { @Provides diff --git a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailController.java b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailController.java index 0d621c469..c2598d334 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailController.java @@ -13,6 +13,7 @@ import org.cryptomator.ui.common.FxController; import org.cryptomator.ui.common.Tasks; import org.cryptomator.ui.controls.FontAwesome5Icon; import org.cryptomator.ui.fxapp.FxApplication; +import org.cryptomator.ui.migration.MigrationComponent; import org.cryptomator.ui.vaultoptions.VaultOptionsComponent; import org.fxmisc.easybind.EasyBind; import org.slf4j.Logger; @@ -32,15 +33,17 @@ public class VaultDetailController implements FxController { private final ExecutorService executor; private final FxApplication application; private final VaultOptionsComponent.Builder vaultOptionsWindow; + private final MigrationComponent.Builder vaultMigrationWindow; @Inject - VaultDetailController(ObjectProperty vault, ExecutorService executor, FxApplication application, VaultOptionsComponent.Builder vaultOptionsWindow) { + VaultDetailController(ObjectProperty vault, ExecutorService executor, FxApplication application, VaultOptionsComponent.Builder vaultOptionsWindow, MigrationComponent.Builder vaultMigrationWindow) { this.vault = vault; this.glyph = EasyBind.select(vault).selectObject(Vault::stateProperty).map(this::getGlyphForVaultState).orElse(FontAwesome5Icon.EXCLAMATION_TRIANGLE); this.executor = executor; this.application = application; this.vaultOptionsWindow = vaultOptionsWindow; this.anyVaultSelected = vault.isNotNull(); + this.vaultMigrationWindow = vaultMigrationWindow; } private FontAwesome5Icon getGlyphForVaultState(VaultState state) { @@ -83,12 +86,17 @@ public class VaultDetailController implements FxController { } @FXML - public void revealStorageLocation(ActionEvent actionEvent) { + public void showVaultMigrator() { + vaultMigrationWindow.vault(vault.get()).build().showMigrationWindow(); + } + + @FXML + public void revealStorageLocation() { application.getHostServices().showDocument(vault.get().getPath().toUri().toString()); } @FXML - public void revealAccessLocation(ActionEvent actionEvent) { + public void revealAccessLocation() { try { vault.get().reveal(); } catch (Volume.VolumeException e) { diff --git a/main/ui/src/main/java/org/cryptomator/ui/migration/MigrationComponent.java b/main/ui/src/main/java/org/cryptomator/ui/migration/MigrationComponent.java new file mode 100644 index 000000000..98507a2f9 --- /dev/null +++ b/main/ui/src/main/java/org/cryptomator/ui/migration/MigrationComponent.java @@ -0,0 +1,38 @@ +package org.cryptomator.ui.migration; + +import dagger.BindsInstance; +import dagger.Lazy; +import dagger.Subcomponent; +import javafx.scene.Scene; +import javafx.stage.Stage; +import org.cryptomator.common.vaults.Vault; +import org.cryptomator.ui.common.FxmlFile; +import org.cryptomator.ui.common.FxmlScene; + +@MigrationScoped +@Subcomponent(modules = {MigrationModule.class}) +public interface MigrationComponent { + + @MigrationWindow + Stage window(); + + @FxmlScene(FxmlFile.MIGRATION_START) + Lazy scene(); + + default Stage showMigrationWindow() { + Stage stage = window(); + stage.setScene(scene().get()); + stage.show(); + return stage; + } + + @Subcomponent.Builder + interface Builder { + + @BindsInstance + Builder vault(@MigrationWindow Vault vault); + + MigrationComponent build(); + } + +} diff --git a/main/ui/src/main/java/org/cryptomator/ui/migration/MigrationModule.java b/main/ui/src/main/java/org/cryptomator/ui/migration/MigrationModule.java new file mode 100644 index 000000000..f2fea79a2 --- /dev/null +++ b/main/ui/src/main/java/org/cryptomator/ui/migration/MigrationModule.java @@ -0,0 +1,71 @@ +package org.cryptomator.ui.migration; + +import dagger.Binds; +import dagger.Module; +import dagger.Provides; +import dagger.multibindings.IntoMap; +import javafx.scene.Scene; +import javafx.scene.image.Image; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyCodeCombination; +import javafx.scene.input.KeyCombination; +import javafx.stage.Modality; +import javafx.stage.Stage; +import org.cryptomator.ui.common.FXMLLoaderFactory; +import org.cryptomator.ui.common.FxController; +import org.cryptomator.ui.common.FxControllerKey; +import org.cryptomator.ui.common.FxmlFile; +import org.cryptomator.ui.common.FxmlScene; +import org.cryptomator.ui.mainwindow.MainWindow; + +import javax.inject.Named; +import javax.inject.Provider; +import java.util.Map; +import java.util.Optional; +import java.util.ResourceBundle; + +@Module +abstract class MigrationModule { + + @Provides + @MigrationWindow + @MigrationScoped + static FXMLLoaderFactory provideFxmlLoaderFactory(Map, Provider> factories, ResourceBundle resourceBundle) { + return new FXMLLoaderFactory(factories, resourceBundle); + } + + @Provides + @MigrationWindow + @MigrationScoped + static Stage provideStage(@MainWindow Stage owner, ResourceBundle resourceBundle, @Named("windowIcon") Optional windowIcon) { + Stage stage = new Stage(); + stage.setTitle(resourceBundle.getString("unlock.title")); + stage.setResizable(false); + stage.initModality(Modality.WINDOW_MODAL); + stage.initOwner(owner); + windowIcon.ifPresent(stage.getIcons()::add); + return stage; + } + + @Provides + @FxmlScene(FxmlFile.MIGRATION_START) + @MigrationScoped + static Scene provideMigrationStartScene(@MigrationWindow FXMLLoaderFactory fxmlLoaders, @MigrationWindow Stage window) { + Scene scene = fxmlLoaders.createScene("/fxml/migration_start.fxml"); // TODO rename fxml file + + KeyCombination cmdW = new KeyCodeCombination(KeyCode.W, KeyCombination.SHORTCUT_DOWN); + scene.getAccelerators().put(cmdW, window::close); + + return scene; + } + + + // ------------------ + + @Binds + @IntoMap + @FxControllerKey(MigrationStartController.class) + abstract FxController bindMigrationStartController(MigrationStartController controller); + + +} diff --git a/main/ui/src/main/java/org/cryptomator/ui/migration/MigrationScoped.java b/main/ui/src/main/java/org/cryptomator/ui/migration/MigrationScoped.java new file mode 100644 index 000000000..52226c237 --- /dev/null +++ b/main/ui/src/main/java/org/cryptomator/ui/migration/MigrationScoped.java @@ -0,0 +1,13 @@ +package org.cryptomator.ui.migration; + +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 MigrationScoped { + +} diff --git a/main/ui/src/main/java/org/cryptomator/ui/migration/MigrationStartController.java b/main/ui/src/main/java/org/cryptomator/ui/migration/MigrationStartController.java new file mode 100644 index 000000000..082477653 --- /dev/null +++ b/main/ui/src/main/java/org/cryptomator/ui/migration/MigrationStartController.java @@ -0,0 +1,46 @@ +package org.cryptomator.ui.migration; + +import dagger.Lazy; +import javafx.fxml.FXML; +import javafx.scene.Scene; +import javafx.stage.Stage; +import org.cryptomator.common.vaults.Vault; +import org.cryptomator.ui.common.FxController; +import org.cryptomator.ui.common.FxmlFile; +import org.cryptomator.ui.common.FxmlScene; + +import javax.inject.Inject; + +@MigrationScoped +public class MigrationStartController implements FxController { + + private final Stage window; + private final Vault vault; + private final Lazy successScene; + + @Inject + public MigrationStartController(@MigrationWindow Stage window, @MigrationWindow Vault vault, @FxmlScene(FxmlFile.MIGRATION_START) Lazy successScene) { + this.window = window; + this.vault = vault; + this.successScene = successScene; + } + + public void initialize() { + } + + @FXML + public void cancel() { + window.close(); + } + + @FXML + public void proceed() { + + } + + /* Getter/Setter */ + + public Vault getVault() { + return vault; + } +} diff --git a/main/ui/src/main/java/org/cryptomator/ui/migration/MigrationWindow.java b/main/ui/src/main/java/org/cryptomator/ui/migration/MigrationWindow.java new file mode 100644 index 000000000..0cb2d37b4 --- /dev/null +++ b/main/ui/src/main/java/org/cryptomator/ui/migration/MigrationWindow.java @@ -0,0 +1,14 @@ +package org.cryptomator.ui.migration; + +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) +public @interface MigrationWindow { + +} diff --git a/main/ui/src/main/resources/fxml/migration_start.fxml b/main/ui/src/main/resources/fxml/migration_start.fxml new file mode 100644 index 000000000..4e5e6d462 --- /dev/null +++ b/main/ui/src/main/resources/fxml/migration_start.fxml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +