From c8a6d0339e503e9dfdbca1db6a20806b3bb8697f Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Wed, 29 Mar 2023 17:42:18 +0200 Subject: [PATCH] Use in volume preferences controller same objet as in MountModule to store first used fuse mount service --- .../cryptomator/common/mount/MountModule.java | 23 +++++++++++++------ .../VolumePreferencesController.java | 15 +++++++----- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/cryptomator/common/mount/MountModule.java b/src/main/java/org/cryptomator/common/mount/MountModule.java index a6e7fb490..1241b783e 100644 --- a/src/main/java/org/cryptomator/common/mount/MountModule.java +++ b/src/main/java/org/cryptomator/common/mount/MountModule.java @@ -4,8 +4,10 @@ import dagger.Module; import dagger.Provides; import org.cryptomator.common.ObservableUtil; import org.cryptomator.common.settings.Settings; +import org.cryptomator.integrations.mount.Mount; import org.cryptomator.integrations.mount.MountService; +import javax.inject.Named; import javax.inject.Singleton; import javafx.beans.value.ObservableValue; import java.util.List; @@ -15,7 +17,7 @@ import java.util.concurrent.atomic.AtomicReference; public class MountModule { private static final AtomicReference formerSelectedMountService = new AtomicReference<>(null); - private static final AtomicReference firstUsedProblematicFuseMountService = new AtomicReference<>(null); + private static final List problematicFuseMountServices = List.of("org.cryptomator.frontend.fuse.mount.MacFuseMountProvider", "org.cryptomator.frontend.fuse.mount.FuseTMountProvider"); @Provides @Singleton @@ -25,23 +27,30 @@ public class MountModule { @Provides @Singleton - static ObservableValue provideMountService(Settings settings, List serviceImpls) { + @Named("FUPFMS") + static AtomicReference provideFirstUsedProblematicFuseMountService() { + return new AtomicReference<>(null); + } + + @Provides + @Singleton + static ObservableValue provideMountService(Settings settings, List serviceImpls, @Named("FUPFMS") AtomicReference fupfms) { var fallbackProvider = serviceImpls.stream().findFirst().orElse(null); var observableMountService = ObservableUtil.mapWithDefault(settings.mountService(), // desiredServiceImpl -> { // var serviceFromSettings = serviceImpls.stream().filter(serviceImpl -> serviceImpl.getClass().getName().equals(desiredServiceImpl)).findAny(); // var targetedService = serviceFromSettings.orElse(fallbackProvider); - return applyWorkaroundForProblematicFuse(targetedService, serviceFromSettings.isPresent()); + return applyWorkaroundForProblematicFuse(targetedService, serviceFromSettings.isPresent(), fupfms); }, // () -> { // - return applyWorkaroundForProblematicFuse(fallbackProvider, true); + return applyWorkaroundForProblematicFuse(fallbackProvider, true, fupfms); }); return observableMountService; } //see https://github.com/cryptomator/cryptomator/issues/2786 - private synchronized static ActualMountService applyWorkaroundForProblematicFuse(MountService targetedService, boolean isDesired) { + private synchronized static ActualMountService applyWorkaroundForProblematicFuse(MountService targetedService, boolean isDesired, AtomicReference firstUsedProblematicFuseMountService) { //set the first used problematic fuse service if applicable var targetIsProblematicFuse = isProblematicFuseService(targetedService); if (targetIsProblematicFuse && firstUsedProblematicFuseMountService.get() == null) { @@ -57,7 +66,7 @@ public class MountModule { } } - private static boolean isProblematicFuseService(MountService service) { - return List.of("org.cryptomator.frontend.fuse.mount.MacFuseMountProvider", "org.cryptomator.frontend.fuse.mount.FuseTMountProvider").contains(service.getClass().getName()); + public static boolean isProblematicFuseService(MountService service) { + return problematicFuseMountServices.contains(service.getClass().getName()); } } diff --git a/src/main/java/org/cryptomator/ui/preferences/VolumePreferencesController.java b/src/main/java/org/cryptomator/ui/preferences/VolumePreferencesController.java index b665a682f..6c60e74b7 100644 --- a/src/main/java/org/cryptomator/ui/preferences/VolumePreferencesController.java +++ b/src/main/java/org/cryptomator/ui/preferences/VolumePreferencesController.java @@ -2,12 +2,14 @@ package org.cryptomator.ui.preferences; import dagger.Lazy; import org.cryptomator.common.ObservableUtil; +import org.cryptomator.common.mount.MountModule; import org.cryptomator.common.settings.Settings; import org.cryptomator.integrations.mount.MountCapability; import org.cryptomator.integrations.mount.MountService; import org.cryptomator.ui.common.FxController; import javax.inject.Inject; +import javax.inject.Named; import javafx.application.Application; import javafx.beans.binding.Bindings; import javafx.beans.binding.BooleanExpression; @@ -19,6 +21,7 @@ import javafx.util.StringConverter; import java.util.List; import java.util.Optional; import java.util.ResourceBundle; +import java.util.concurrent.atomic.AtomicReference; @PreferencesScoped public class VolumePreferencesController implements FxController { @@ -41,7 +44,7 @@ public class VolumePreferencesController implements FxController { public Button loopbackPortApplyButton; @Inject - VolumePreferencesController(Settings settings, Lazy application, List mountProviders, ResourceBundle resourceBundle) { + VolumePreferencesController(Settings settings, Lazy application, List mountProviders, @Named("FUPFMS") AtomicReference firstUsedProblematicFuseMountService, ResourceBundle resourceBundle) { this.settings = settings; this.application = application; this.mountProviders = mountProviders; @@ -54,12 +57,12 @@ public class VolumePreferencesController implements FxController { this.mountToDriveLetterSupported = selectedMountService.map(s -> s.hasCapability(MountCapability.MOUNT_AS_DRIVE_LETTER)); 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.fuseRestartRequired = selectedMountService.map(s -> isProblematicFuse(mountServiceAtStart) && isProblematicFuse(s) && !mountServiceAtStart.equals(s)); - } + this.fuseRestartRequired = selectedMountService.map(s -> {// + return firstUsedProblematicFuseMountService.get() != null // + && MountModule.isProblematicFuseService(s) // + && !firstUsedProblematicFuseMountService.get().equals(s); + }); - private boolean isProblematicFuse(MountService service) { - return List.of("org.cryptomator.frontend.fuse.mount.MacFuseMountProvider", "org.cryptomator.frontend.fuse.mount.FuseTMountProvider").contains(service.getClass().getName()); } public void initialize() {