Переглянути джерело

refactored macfuse/fuse-t specific workaround to a generic fuse workaround

Tobias Hagemann 2 роки тому
батько
коміт
771468c8c6

+ 14 - 36
src/main/java/org/cryptomator/common/mount/MountModule.java

@@ -11,15 +11,11 @@ import javafx.beans.value.ObservableValue;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicReference;
 
-import static org.cryptomator.common.mount.MountModule.FirstUsedFuseOnMacOS.FUSE_T;
-import static org.cryptomator.common.mount.MountModule.FirstUsedFuseOnMacOS.MAC_FUSE;
-import static org.cryptomator.common.mount.MountModule.FirstUsedFuseOnMacOS.UNDEFINED;
-
 @Module
 public class MountModule {
 
 	private static final AtomicReference<MountService> formerSelectedMountService = new AtomicReference<>(null);
-	private static final AtomicReference<FirstUsedFuseOnMacOS> FIRST_USED = new AtomicReference<>(UNDEFINED);
+	private static final AtomicReference<MountService> firstUsedFuseMountService = new AtomicReference<>(null);
 
 	@Provides
 	@Singleton
@@ -36,50 +32,32 @@ public class MountModule {
 				desiredServiceImpl -> { //
 					var serviceFromSettings = serviceImpls.stream().filter(serviceImpl -> serviceImpl.getClass().getName().equals(desiredServiceImpl)).findAny(); //
 					var targetedService = serviceFromSettings.orElse(fallbackProvider);
-					return applyWorkaroundForFuseTMacFuse(targetedService, serviceFromSettings.isPresent());
+					return applyWorkaroundForFuse(targetedService, serviceFromSettings.isPresent());
 				}, //
 				() -> { //
-					return applyWorkaroundForFuseTMacFuse(fallbackProvider, true);
+					return applyWorkaroundForFuse(fallbackProvider, true);
 				});
 		return observableMountService;
 	}
 
-
 	//see https://github.com/cryptomator/cryptomator/issues/2786
-	private synchronized static ActualMountService applyWorkaroundForFuseTMacFuse(MountService targetedService, boolean isDesired) {
-		var targetIsFuseT = isFuseTService(targetedService);
-		var targetIsMacFuse = isMacFuseService(targetedService);
-
-		//if none of macFUSE and FUSE-T were selected before, check if targetedService is macFUSE or FUSE-T
-		if (FIRST_USED.get() == UNDEFINED) {
-			if (targetIsMacFuse) {
-				FIRST_USED.set(MAC_FUSE);
-			} else if (targetIsFuseT) {
-				FIRST_USED.set(FUSE_T);
-			}
+	private synchronized static ActualMountService applyWorkaroundForFuse(MountService targetedService, boolean isDesired) {
+		//set the first used fuse service if applicable
+		var targetIsFuse = isFuseService(targetedService);
+		if (targetIsFuse && firstUsedFuseMountService.get() == null) {
+			firstUsedFuseMountService.set(targetedService);
 		}
 
-		//if one of both were selected before and now the other should be used
-		if ((FIRST_USED.get() == MAC_FUSE && targetIsFuseT) || (FIRST_USED.get() == FUSE_T && targetIsMacFuse)) {
-			//return the former mount service
-			return new ActualMountService(formerSelectedMountService.get(), false); //
+		//make sure that the first used fuse service is always used
+		if (targetIsFuse && !firstUsedFuseMountService.get().equals(targetedService)) {
+			return new ActualMountService(formerSelectedMountService.get(), false);
 		} else {
 			formerSelectedMountService.set(targetedService);
-			return new ActualMountService(targetedService, isDesired); //
+			return new ActualMountService(targetedService, isDesired);
 		}
 	}
 
-	private static boolean isFuseTService(MountService service) {
-		return "org.cryptomator.frontend.fuse.mount.FuseTMountProvider".equals(service.getClass().getName());
-	}
-
-	private static boolean isMacFuseService(MountService service) {
-		return "org.cryptomator.frontend.fuse.mount.MacFuseMountProvider".equals(service.getClass().getName());
-	}
-
-	enum FirstUsedFuseOnMacOS {
-		UNDEFINED,
-		MAC_FUSE,
-		FUSE_T;
+	private static boolean isFuseService(MountService service) {
+		return service.getClass().getName().startsWith("org.cryptomator.frontend.fuse.mount.");
 	}
 }

+ 8 - 8
src/main/java/org/cryptomator/ui/preferences/VolumePreferencesController.java

@@ -33,7 +33,7 @@ public class VolumePreferencesController implements FxController {
 	private final ObservableValue<Boolean> mountToDriveLetterSupported;
 	private final ObservableValue<Boolean> mountFlagsSupported;
 	private final ObservableValue<Boolean> readonlySupported;
-	private final ObservableValue<Boolean> macFuseAndFUSETRestartRequired;
+	private final ObservableValue<Boolean> fuseRestartRequired;
 	private final Lazy<Application> application;
 	private final List<MountService> mountProviders;
 	public ChoiceBox<MountService> volumeTypeChoiceBox;
@@ -55,11 +55,11 @@ public class VolumePreferencesController implements FxController {
 		this.mountFlagsSupported = selectedMountService.map(s -> s.hasCapability(MountCapability.MOUNT_FLAGS));
 		this.readonlySupported = selectedMountService.map(s -> s.hasCapability(MountCapability.READ_ONLY));
 		var mountServiceAtStart = selectedMountService.getValue();
-		this.macFuseAndFUSETRestartRequired = selectedMountService.map(s -> isFUSETOrMacFUSE(mountServiceAtStart) && isFUSETOrMacFUSE(s) && !mountServiceAtStart.equals(s));
+		this.fuseRestartRequired = selectedMountService.map(s -> isFuse(mountServiceAtStart) && isFuse(s) && !mountServiceAtStart.equals(s));
 	}
 
-	private boolean isFUSETOrMacFUSE(MountService service) {
-		return List.of("org.cryptomator.frontend.fuse.mount.MacFuseMountProvider", "org.cryptomator.frontend.fuse.mount.FuseTMountProvider").contains(service.getClass().getName());
+	private boolean isFuse(MountService service) {
+		return service.getClass().getName().startsWith("org.cryptomator.frontend.fuse.mount.");
 	}
 
 	public void initialize() {
@@ -136,12 +136,12 @@ public class VolumePreferencesController implements FxController {
 		return mountFlagsSupported.getValue();
 	}
 
-	public ObservableValue<Boolean> macFuseAndFUSETRestartRequiredProperty() {
-		return macFuseAndFUSETRestartRequired;
+	public ObservableValue<Boolean> fuseRestartRequiredProperty() {
+		return fuseRestartRequired;
 	}
 
-	public boolean isMacFuseAndFUSETRestartRequired() {
-		return macFuseAndFUSETRestartRequired.getValue();
+	public boolean getFuseRestartRequired() {
+		return fuseRestartRequired.getValue();
 	}
 
 	/* Helpers */

+ 2 - 2
src/main/resources/fxml/preferences_volume.fxml

@@ -8,9 +8,9 @@
 <?import javafx.scene.control.Hyperlink?>
 <?import javafx.scene.control.Label?>
 <?import javafx.scene.control.Separator?>
+<?import javafx.scene.control.Tooltip?>
 <?import javafx.scene.layout.HBox?>
 <?import javafx.scene.layout.VBox?>
-<?import javafx.scene.control.Tooltip?>
 <VBox xmlns:fx="http://javafx.com/fxml"
 	  xmlns="http://javafx.com/javafx"
 	  fx:controller="org.cryptomator.ui.preferences.VolumePreferencesController"
@@ -32,7 +32,7 @@
 			</Hyperlink>
 		</HBox>
 
-		<Label styleClass="label-red" text="To apply the changes, Cryptomator needs to be restarted." visible="${controller.macFuseAndFUSETRestartRequired}" managed="${controller.macFuseAndFUSETRestartRequired}"/>
+		<Label styleClass="label-red" text="%preferences.volume.fuseRestartRequired" visible="${controller.fuseRestartRequired}" managed="${controller.fuseRestartRequired}"/>
 
 		<HBox spacing="12" alignment="CENTER_LEFT" visible="${controller.loopbackPortSupported}" managed="${controller.loopbackPortSupported}">
 			<Label text="%preferences.volume.tcp.port"/>

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

@@ -278,6 +278,7 @@ preferences.volume=Virtual Drive
 preferences.volume.type=Volume Type
 preferences.volume.type.automatic=Automatic
 preferences.volume.docsTooltip=Open the documentation to learn more about the different volume types.
+preferences.volume.fuseRestartRequired=To apply the changes, Cryptomator needs to be restarted.
 preferences.volume.tcp.port=TCP Port
 preferences.volume.supportedFeatures=The chosen volume type supports the following features:
 preferences.volume.feature.mountAuto=Automatic mount point selection