Browse Source

Merge pull request #3457 from cryptomator/feature/dokany-info-dialog

Feature: Migrate volume type Dokany to Default one and Display Info Dialog
mindmonk 10 months ago
parent
commit
d2ec5a5646

+ 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"), //
+	DOKANY_SUPPORT_END("/fxml/dokany_support_end.fxml"), //
 	ERROR("/fxml/error.fxml"), //
 	FORGET_PASSWORD("/fxml/forget_password.fxml"), //
 	HEALTH_START("/fxml/health_start.fxml"), //

+ 34 - 0
src/main/java/org/cryptomator/ui/dokanysupportend/DokanySupportEndComponent.java

@@ -0,0 +1,34 @@
+package org.cryptomator.ui.dokanysupportend;
+
+import dagger.Lazy;
+import dagger.Subcomponent;
+import org.cryptomator.ui.common.FxmlFile;
+import org.cryptomator.ui.common.FxmlScene;
+
+import javafx.scene.Scene;
+import javafx.stage.Stage;
+
+@DokanySupportEndScoped
+@Subcomponent(modules = {DokanySupportEndModule.class})
+public interface DokanySupportEndComponent {
+
+	@DokanySupportEndWindow
+	Stage window();
+
+	@FxmlScene(FxmlFile.DOKANY_SUPPORT_END)
+	Lazy<Scene> dokanySupportEndScene();
+
+
+	default void showDokanySupportEndWindow() {
+		Stage stage = window();
+		stage.setScene(dokanySupportEndScene().get());
+		stage.sizeToScene();
+		stage.show();
+	}
+
+	@Subcomponent.Factory
+	interface Factory {
+
+		DokanySupportEndComponent create();
+	}
+}

+ 34 - 0
src/main/java/org/cryptomator/ui/dokanysupportend/DokanySupportEndController.java

@@ -0,0 +1,34 @@
+package org.cryptomator.ui.dokanysupportend;
+
+import org.cryptomator.ui.common.FxController;
+import org.cryptomator.ui.fxapp.FxApplicationWindows;
+import org.cryptomator.ui.preferences.SelectedPreferencesTab;
+
+import javax.inject.Inject;
+import javafx.fxml.FXML;
+import javafx.stage.Stage;
+
+
+@DokanySupportEndScoped
+public class DokanySupportEndController implements FxController {
+
+	private final Stage window;
+	private final FxApplicationWindows applicationWindows;
+
+	@Inject
+	DokanySupportEndController(@DokanySupportEndWindow Stage window, FxApplicationWindows applicationWindows) {
+		this.window = window;
+		this.applicationWindows = applicationWindows;
+	}
+
+	@FXML
+	public void close() {
+		window.close();
+	}
+
+	public void openVolumePreferences() {
+		applicationWindows.showPreferencesWindow(SelectedPreferencesTab.VOLUME);
+		window.close();
+	}
+
+}

+ 57 - 0
src/main/java/org/cryptomator/ui/dokanysupportend/DokanySupportEndModule.java

@@ -0,0 +1,57 @@
+package org.cryptomator.ui.dokanysupportend;
+
+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 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 DokanySupportEndModule {
+
+	@Provides
+	@DokanySupportEndWindow
+	@DokanySupportEndScoped
+	static FxmlLoaderFactory provideFxmlLoaderFactory(Map<Class<? extends FxController>, Provider<FxController>> factories, DefaultSceneFactory sceneFactory, ResourceBundle resourceBundle) {
+		return new FxmlLoaderFactory(factories, sceneFactory, resourceBundle);
+	}
+
+	@Provides
+	@DokanySupportEndWindow
+	@DokanySupportEndScoped
+	static Stage provideStage(StageFactory factory, ResourceBundle resourceBundle) {
+		Stage stage = factory.create();
+		stage.setTitle(resourceBundle.getString("dokanySupportEnd.title"));
+		stage.setMinWidth(500);
+		stage.setMinHeight(100);
+		stage.initModality(Modality.APPLICATION_MODAL);
+		return stage;
+	}
+
+	@Provides
+	@FxmlScene(FxmlFile.DOKANY_SUPPORT_END)
+	@DokanySupportEndScoped
+	static Scene provideDokanySupportEndScene(@DokanySupportEndWindow FxmlLoaderFactory fxmlLoaders) {
+		return fxmlLoaders.createScene(FxmlFile.DOKANY_SUPPORT_END);
+	}
+
+
+	@Binds
+	@IntoMap
+	@FxControllerKey(DokanySupportEndController.class)
+	abstract FxController bindDokanySupportEndController(DokanySupportEndController controller);
+
+}

+ 13 - 0
src/main/java/org/cryptomator/ui/dokanysupportend/DokanySupportEndScoped.java

@@ -0,0 +1,13 @@
+package org.cryptomator.ui.dokanysupportend;
+
+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 DokanySupportEndScoped {
+
+}

+ 14 - 0
src/main/java/org/cryptomator/ui/dokanysupportend/DokanySupportEndWindow.java

@@ -0,0 +1,14 @@
+package org.cryptomator.ui.dokanysupportend;
+
+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 DokanySupportEndWindow {
+
+}

+ 21 - 0
src/main/java/org/cryptomator/ui/fxapp/FxApplication.java

@@ -3,6 +3,7 @@ package org.cryptomator.ui.fxapp;
 import dagger.Lazy;
 import org.cryptomator.common.Environment;
 import org.cryptomator.common.settings.Settings;
+import org.cryptomator.common.settings.VaultSettings;
 import org.cryptomator.ui.traymenu.TrayMenuComponent;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -75,7 +76,27 @@ public class FxApplication {
 			appWindows.checkAndShowUpdateReminderWindow();
 		}
 
+		migrateAndInformDokanyRemoval();
+
 		launchEventHandler.startHandlingLaunchEvents();
 		autoUnlocker.tryUnlockForTimespan(2, TimeUnit.MINUTES);
 	}
+
+	private void migrateAndInformDokanyRemoval() {
+		var dokanyProviderId = "org.cryptomator.frontend.dokany.mount.DokanyMountProvider";
+		boolean dokanyFound = false;
+		if (settings.mountService.getValueSafe().equals(dokanyProviderId)) {
+			dokanyFound = true;
+			settings.mountService.set(null);
+		}
+		for (VaultSettings vaultSettings : settings.directories) {
+			if (vaultSettings.mountService.getValueSafe().equals(dokanyProviderId)) {
+				dokanyFound = true;
+				vaultSettings.mountService.set(null);
+			}
+		}
+		if (dokanyFound) {
+			appWindows.showDokanySupportEndWindow();
+		}
+	}
 }

+ 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.dokanysupportend.DokanySupportEndComponent;
 import org.cryptomator.ui.error.ErrorComponent;
 import org.cryptomator.ui.health.HealthCheckComponent;
 import org.cryptomator.ui.lock.LockComponent;
@@ -33,6 +34,7 @@ import java.io.InputStream;
 		ErrorComponent.class, //
 		HealthCheckComponent.class, //
 		UpdateReminderComponent.class, //
+		DokanySupportEndComponent.class, //
 		ShareVaultComponent.class})
 abstract class FxApplicationModule {
 

+ 10 - 1
src/main/java/org/cryptomator/ui/fxapp/FxApplicationWindows.java

@@ -5,6 +5,7 @@ import dagger.Lazy;
 import org.cryptomator.common.vaults.Vault;
 import org.cryptomator.common.vaults.VaultState;
 import org.cryptomator.integrations.tray.TrayIntegrationProvider;
+import org.cryptomator.ui.dokanysupportend.DokanySupportEndComponent;
 import org.cryptomator.ui.error.ErrorComponent;
 import org.cryptomator.ui.lock.LockComponent;
 import org.cryptomator.ui.mainwindow.MainWindowComponent;
@@ -48,6 +49,7 @@ public class FxApplicationWindows {
 	private final QuitComponent.Builder quitWindowBuilder;
 	private final UnlockComponent.Factory unlockWorkflowFactory;
 	private final UpdateReminderComponent.Factory updateReminderWindowBuilder;
+	private final DokanySupportEndComponent.Factory dokanySupportEndWindowBuilder;
 	private final LockComponent.Factory lockWorkflowFactory;
 	private final ErrorComponent.Factory errorWindowFactory;
 	private final ExecutorService executor;
@@ -56,13 +58,14 @@ public class FxApplicationWindows {
 	private final FilteredList<Window> visibleWindows;
 
 	@Inject
-	public FxApplicationWindows(@PrimaryStage Stage primaryStage,
+	public FxApplicationWindows(@PrimaryStage Stage primaryStage, //
 								Optional<TrayIntegrationProvider> trayIntegration, //
 								Lazy<MainWindowComponent> mainWindow, //
 								Lazy<PreferencesComponent> preferencesWindow, //
 								QuitComponent.Builder quitWindowBuilder, //
 								UnlockComponent.Factory unlockWorkflowFactory, //
 								UpdateReminderComponent.Factory updateReminderWindowBuilder, //
+								DokanySupportEndComponent.Factory dokanySupportEndWindowBuilder, //
 								LockComponent.Factory lockWorkflowFactory, //
 								ErrorComponent.Factory errorWindowFactory, //
 								VaultOptionsComponent.Factory vaultOptionsWindow, //
@@ -75,6 +78,7 @@ public class FxApplicationWindows {
 		this.quitWindowBuilder = quitWindowBuilder;
 		this.unlockWorkflowFactory = unlockWorkflowFactory;
 		this.updateReminderWindowBuilder = updateReminderWindowBuilder;
+		this.dokanySupportEndWindowBuilder = dokanySupportEndWindowBuilder;
 		this.lockWorkflowFactory = lockWorkflowFactory;
 		this.errorWindowFactory = errorWindowFactory;
 		this.executor = executor;
@@ -142,6 +146,11 @@ public class FxApplicationWindows {
 		CompletableFuture.runAsync(() -> updateReminderWindowBuilder.create().checkAndShowUpdateReminderWindow(), Platform::runLater);
 	}
 
+	public void showDokanySupportEndWindow() {
+		CompletableFuture.runAsync(() -> dokanySupportEndWindowBuilder.create().showDokanySupportEndWindow(), Platform::runLater);
+	}
+
+
 	public CompletionStage<Void> startUnlockWorkflow(Vault vault, @Nullable Stage owner) {
 		return CompletableFuture.supplyAsync(() -> {
 					Preconditions.checkState(vault.stateProperty().transition(VaultState.Value.LOCKED, VaultState.Value.PROCESSING), "Vault not locked.");

+ 53 - 0
src/main/resources/fxml/dokany_support_end.fxml

@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<?import org.cryptomator.ui.controls.FontAwesome5IconView?>
+<?import javafx.geometry.Insets?>
+<?import javafx.scene.control.Button?>
+<?import javafx.scene.control.ButtonBar?>
+<?import javafx.scene.control.Label?>
+<?import javafx.scene.Group?>
+<?import javafx.scene.layout.HBox?>
+<?import javafx.scene.layout.Region?>
+<?import javafx.scene.layout.StackPane?>
+<?import javafx.scene.layout.VBox?>
+<?import javafx.scene.shape.Circle?>
+<HBox xmlns:fx="http://javafx.com/fxml"
+	  xmlns="http://javafx.com/javafx"
+	  fx:controller="org.cryptomator.ui.dokanysupportend.DokanySupportEndController"
+	  minWidth="500"
+	  prefWidth="500"
+	  minHeight="145"
+	  spacing="12"
+	  alignment="TOP_LEFT">
+	<padding>
+		<Insets topRightBottomLeft="12"/>
+	</padding>
+	<children>
+		<Group>
+			<StackPane>
+				<padding>
+					<Insets topRightBottomLeft="6"/>
+				</padding>
+				<Circle styleClass="glyph-icon-primary" radius="24"/>
+				<FontAwesome5IconView styleClass="glyph-icon-white" glyph="EXCLAMATION" glyphSize="24"/>
+			</StackPane>
+		</Group>
+
+		<VBox HBox.hgrow="ALWAYS">
+			<Label styleClass="label-large" text="%dokanySupportEnd.message" wrapText="true">
+				<padding>
+					<Insets bottom="6" top="6"/>
+				</padding>
+			</Label>
+			<Label text="%dokanySupportEnd.description" wrapText="true"/>
+			<Region VBox.vgrow="ALWAYS" minHeight="18"/>
+			<ButtonBar buttonMinWidth="120" buttonOrder="+UC">
+				<buttons>
+					<Button text="%dokanySupportEnd.preferencesBtn" ButtonBar.buttonData="OTHER" cancelButton="true" onAction="#openVolumePreferences"/>
+					<Button text="%generic.button.close" ButtonBar.buttonData="CANCEL_CLOSE" cancelButton="true" onAction="#close" defaultButton="true"/>
+				</buttons>
+			</ButtonBar>
+
+		</VBox>
+	</children>
+</HBox>

+ 6 - 0
src/main/resources/i18n/strings.properties

@@ -541,6 +541,12 @@ updateReminder.notNow=Not Now
 updateReminder.yesOnce=Yes, Once
 updateReminder.yesAutomatically=Yes, Automatically
 
+#Dokany Support End
+dokanySupportEnd.title=Deprecation notice
+dokanySupportEnd.message=Support end for Dokany
+dokanySupportEnd.description=The volume type Dokany is no longer supported by Cryptomator. Your settings are adjusted to use the default volume type now. You can view the default type in the preferences.
+dokanySupportEnd.preferencesBtn=Open Preferences
+
 # Share Vault
 shareVault.title=Share Vault
 shareVault.message=Would you like to share your vault with others?