Browse Source

move decrypt name feature to own package and use a custom window

Armin Schrenk 2 months ago
parent
commit
c1370f7f86

+ 1 - 0
src/main/java/org/cryptomator/ui/common/FxmlFile.java

@@ -12,6 +12,7 @@ public enum FxmlFile {
 	CONVERTVAULT_HUBTOPASSWORD_START("/fxml/convertvault_hubtopassword_start.fxml"), //
 	CONVERTVAULT_HUBTOPASSWORD_CONVERT("/fxml/convertvault_hubtopassword_convert.fxml"), //
 	CONVERTVAULT_HUBTOPASSWORD_SUCCESS("/fxml/convertvault_hubtopassword_success.fxml"), //
+	DECRYPTNAMES("/fxml/decryptnames.fxml"), //
 	ERROR("/fxml/error.fxml"), //
 	FORGET_PASSWORD("/fxml/forget_password.fxml"), //
 	HEALTH_START("/fxml/health_start.fxml"), //

+ 51 - 0
src/main/java/org/cryptomator/ui/decryptname/DecryptNameComponent.java

@@ -0,0 +1,51 @@
+package org.cryptomator.ui.decryptname;
+
+import dagger.BindsInstance;
+import dagger.Lazy;
+import dagger.Subcomponent;
+import org.cryptomator.common.Nullable;
+import org.cryptomator.common.vaults.Vault;
+import org.cryptomator.common.vaults.VaultState;
+import org.cryptomator.ui.common.FxmlFile;
+import org.cryptomator.ui.common.FxmlScene;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.inject.Named;
+import javafx.scene.Scene;
+import javafx.stage.Stage;
+import java.nio.file.Paths;
+import java.util.List;
+
+@DecryptNameScoped
+@Subcomponent(modules = DecryptNameModule.class)
+public interface DecryptNameComponent {
+
+	Logger LOG = LoggerFactory.getLogger(DecryptNameComponent.class);
+
+	@DecryptNameWindow
+	Stage window();
+
+	@FxmlScene(FxmlFile.DECRYPTNAMES)
+	Lazy<Scene> namesDecryptedScene();
+
+	@DecryptNameWindow
+	Vault vault();
+
+	default void showDecryptFileNameWindow() {
+		Stage s = window();
+		s.setScene(null);
+		s.sizeToScene();
+		if (vault().isUnlocked()) {
+			s.show();
+		} else {
+			LOG.error("Aborted showing DecryptFileName window: vault state is not {}, but {}.", VaultState.Value.UNLOCKED, vault().getState());
+		}
+	}
+
+	@Subcomponent.Factory
+	interface Factory {
+
+		DecryptNameComponent create(@BindsInstance @DecryptNameWindow Vault vault, @BindsInstance @Named("windowOwner") Stage owner, @Nullable @BindsInstance List<Paths> ciphertextPaths);
+	}
+}

+ 60 - 0
src/main/java/org/cryptomator/ui/decryptname/DecryptNameModule.java

@@ -0,0 +1,60 @@
+package org.cryptomator.ui.decryptname;
+
+import dagger.Binds;
+import dagger.Module;
+import dagger.Provides;
+import dagger.multibindings.IntoMap;
+import org.cryptomator.common.vaults.Vault;
+import org.cryptomator.common.vaults.VaultState;
+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 javax.inject.Named;
+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
+public abstract class DecryptNameModule {
+
+	@Provides
+	@DecryptNameScoped
+	@DecryptNameWindow
+	static Stage provideStage(StageFactory factory, @Named("windowOwner") Stage owner, @DecryptNameWindow Vault vault, ResourceBundle resourceBundle) {
+		Stage stage = factory.create();
+		stage.setResizable(true);
+		stage.initModality(Modality.WINDOW_MODAL);
+		stage.initOwner(owner);
+		stage.setTitle("TODO Decrypt Name");
+		vault.stateProperty().addListener(((_, _, _) -> stage.close())); //as soon as the state changes from unlocked, close the window
+		//stage.setTitle(resourceBundle.getString("convertVault.title"));
+		return stage;
+	}
+
+	@Provides
+	@DecryptNameScoped
+	@DecryptNameWindow
+	static FxmlLoaderFactory provideFxmlLoaderFactory(Map<Class<? extends FxController>, Provider<FxController>> factories, DefaultSceneFactory sceneFactory, ResourceBundle resourceBundle) {
+		return new FxmlLoaderFactory(factories, sceneFactory, resourceBundle);
+	}
+
+	@Provides
+	@FxmlScene(FxmlFile.DECRYPTNAMES)
+	@DecryptNameScoped
+	static Scene provideOverviewScene(@DecryptNameWindow FxmlLoaderFactory fxmlLoaders) {
+		return fxmlLoaders.createScene(FxmlFile.DECRYPTNAMES);
+	}
+
+	@Binds
+	@IntoMap
+	@FxControllerKey(OverviewController.class)
+	abstract FxController bindOverviewController(OverviewController controller);
+}

+ 11 - 0
src/main/java/org/cryptomator/ui/decryptname/DecryptNameScoped.java

@@ -0,0 +1,11 @@
+package org.cryptomator.ui.decryptname;
+
+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 DecryptNameScoped {}

+ 12 - 0
src/main/java/org/cryptomator/ui/decryptname/DecryptNameWindow.java

@@ -0,0 +1,12 @@
+package org.cryptomator.ui.decryptname;
+
+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 DecryptNameWindow {}

+ 13 - 0
src/main/java/org/cryptomator/ui/decryptname/OverviewController.java

@@ -0,0 +1,13 @@
+package org.cryptomator.ui.decryptname;
+
+import org.cryptomator.ui.common.FxController;
+
+import javax.inject.Inject;
+
+@DecryptNameScoped
+public class OverviewController implements FxController {
+
+	@Inject
+	public OverviewController() {}
+
+}

+ 2 - 0
src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java

@@ -7,6 +7,7 @@ package org.cryptomator.ui.fxapp;
 
 import dagger.Module;
 import dagger.Provides;
+import org.cryptomator.ui.decryptname.DecryptNameComponent;
 import org.cryptomator.ui.error.ErrorComponent;
 import org.cryptomator.ui.health.HealthCheckComponent;
 import org.cryptomator.ui.lock.LockComponent;
@@ -24,6 +25,7 @@ import java.io.IOException;
 import java.io.InputStream;
 
 @Module(includes = {UpdateCheckerModule.class}, subcomponents = {TrayMenuComponent.class, //
+		DecryptNameComponent.class, //
 		MainWindowComponent.class, //
 		PreferencesComponent.class, //
 		VaultOptionsComponent.class, //

+ 16 - 1
src/main/java/org/cryptomator/ui/mainwindow/VaultDetailUnlockedController.java

@@ -13,6 +13,7 @@ import org.cryptomator.integrations.revealpath.RevealFailedException;
 import org.cryptomator.integrations.revealpath.RevealPathService;
 import org.cryptomator.ui.common.FxController;
 import org.cryptomator.ui.common.VaultService;
+import org.cryptomator.ui.decryptname.DecryptNameComponent;
 import org.cryptomator.ui.fxapp.FxApplicationWindows;
 import org.cryptomator.ui.stats.VaultStatisticsComponent;
 import org.cryptomator.ui.wrongfilealert.WrongFileAlertComponent;
@@ -61,6 +62,7 @@ public class VaultDetailUnlockedController implements FxController {
 	private final WrongFileAlertComponent.Builder wrongFileAlert;
 	private final Stage mainWindow;
 	private final Optional<RevealPathService> revealPathService;
+	private final DecryptNameComponent.Factory decryptNameWindowFactory;
 	private final ResourceBundle resourceBundle;
 	private final LoadingCache<Vault, VaultStatisticsComponent> vaultStats;
 	private final VaultStatisticsComponent.Builder vaultStatsBuilder;
@@ -78,13 +80,22 @@ public class VaultDetailUnlockedController implements FxController {
 	public Button decryptNameDropZone;
 
 	@Inject
-	public VaultDetailUnlockedController(ObjectProperty<Vault> vault, FxApplicationWindows appWindows, VaultService vaultService, VaultStatisticsComponent.Builder vaultStatsBuilder, WrongFileAlertComponent.Builder wrongFileAlert, @MainWindow Stage mainWindow, Optional<RevealPathService> revealPathService, ResourceBundle resourceBundle) {
+	public VaultDetailUnlockedController(ObjectProperty<Vault> vault, //
+										 FxApplicationWindows appWindows, //
+										 VaultService vaultService, //
+										 VaultStatisticsComponent.Builder vaultStatsBuilder, //
+										 WrongFileAlertComponent.Builder wrongFileAlert, //
+										 @MainWindow Stage mainWindow, //
+										 Optional<RevealPathService> revealPathService, //
+										 DecryptNameComponent.Factory decryptNameWindowFactory, //
+										 ResourceBundle resourceBundle) {
 		this.vault = vault;
 		this.appWindows = appWindows;
 		this.vaultService = vaultService;
 		this.wrongFileAlert = wrongFileAlert;
 		this.mainWindow = mainWindow;
 		this.revealPathService = revealPathService;
+		this.decryptNameWindowFactory = decryptNameWindowFactory;
 		this.resourceBundle = resourceBundle;
 		this.vaultStats = CacheBuilder.newBuilder().weakValues().build(CacheLoader.from(this::buildVaultStats));
 		this.vaultStatsBuilder = vaultStatsBuilder;
@@ -154,6 +165,8 @@ public class VaultDetailUnlockedController implements FxController {
 
 	@FXML
 	public void chooseEncryptedFileAndCopyNames() {
+		decryptNameWindowFactory.create(vault.get(),mainWindow, List.of()).showDecryptFileNameWindow();
+		/*
 		var fileChooser = new FileChooser();
 		fileChooser.setTitle(resourceBundle.getString("main.vaultDetail.decryptName.filePickerTitle"));
 
@@ -163,6 +176,8 @@ public class VaultDetailUnlockedController implements FxController {
 			var nodeName = getCleartextName(ciphertextNode.toPath());
 			copyDecryptedNamesToClipboard(List.of(nodeName));
 		}
+
+		 */
 	}
 
 	private void copyDecryptedNamesToClipboard(List<CipherToCleartext> mapping) {

+ 14 - 0
src/main/resources/fxml/decryptnames.fxml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<?import java.lang.*?>
+<?import java.util.*?>
+<?import javafx.scene.*?>
+<?import javafx.scene.control.*?>
+<?import javafx.scene.layout.*?>
+
+<AnchorPane xmlns="http://javafx.com/javafx"
+			xmlns:fx="http://javafx.com/fxml"
+			fx:controller="org.cryptomator.ui.decryptname.OverviewController"
+			prefHeight="400.0" prefWidth="600.0">
+
+</AnchorPane>