mirror of
https://github.com/cryptomator/cryptomator.git
synced 2026-05-18 10:41:26 +00:00
refactored macfuse/fuse-t specific workaround to a generic fuse workaround
This commit is contained in:
@@ -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.");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user