From 771468c8c655b6aed820ca0554a09be755c422c5 Mon Sep 17 00:00:00 2001 From: Tobias Hagemann Date: Wed, 29 Mar 2023 16:16:04 +0200 Subject: [PATCH] refactored macfuse/fuse-t specific workaround to a generic fuse workaround --- .../cryptomator/common/mount/MountModule.java | 50 ++++++------------- .../VolumePreferencesController.java | 16 +++--- .../resources/fxml/preferences_volume.fxml | 4 +- src/main/resources/i18n/strings.properties | 1 + 4 files changed, 25 insertions(+), 46 deletions(-) diff --git a/src/main/java/org/cryptomator/common/mount/MountModule.java b/src/main/java/org/cryptomator/common/mount/MountModule.java index 4e278c793..e9d8098a5 100644 --- a/src/main/java/org/cryptomator/common/mount/MountModule.java +++ b/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 formerSelectedMountService = new AtomicReference<>(null); - private static final AtomicReference FIRST_USED = new AtomicReference<>(UNDEFINED); + private static final AtomicReference 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."); } } diff --git a/src/main/java/org/cryptomator/ui/preferences/VolumePreferencesController.java b/src/main/java/org/cryptomator/ui/preferences/VolumePreferencesController.java index ab3c319ba..5d0e66da5 100644 --- a/src/main/java/org/cryptomator/ui/preferences/VolumePreferencesController.java +++ b/src/main/java/org/cryptomator/ui/preferences/VolumePreferencesController.java @@ -33,7 +33,7 @@ public class VolumePreferencesController implements FxController { private final ObservableValue mountToDriveLetterSupported; private final ObservableValue mountFlagsSupported; private final ObservableValue readonlySupported; - private final ObservableValue macFuseAndFUSETRestartRequired; + private final ObservableValue fuseRestartRequired; private final Lazy application; private final List mountProviders; public ChoiceBox 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 macFuseAndFUSETRestartRequiredProperty() { - return macFuseAndFUSETRestartRequired; + public ObservableValue fuseRestartRequiredProperty() { + return fuseRestartRequired; } - public boolean isMacFuseAndFUSETRestartRequired() { - return macFuseAndFUSETRestartRequired.getValue(); + public boolean getFuseRestartRequired() { + return fuseRestartRequired.getValue(); } /* Helpers */ diff --git a/src/main/resources/fxml/preferences_volume.fxml b/src/main/resources/fxml/preferences_volume.fxml index 680579fbe..f48b1c1c8 100644 --- a/src/main/resources/fxml/preferences_volume.fxml +++ b/src/main/resources/fxml/preferences_volume.fxml @@ -8,9 +8,9 @@ + - -