|
@@ -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.");
|
|
|
}
|
|
|
}
|