diff --git a/main/ui/src/main/java/org/cryptomator/ui/controllers/MainController.java b/main/ui/src/main/java/org/cryptomator/ui/controllers/MainController.java index 44c5b5dc1..a1eb9bb16 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/controllers/MainController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/controllers/MainController.java @@ -27,6 +27,7 @@ import javax.inject.Singleton; import org.apache.commons.lang3.SystemUtils; import org.cryptomator.ui.controls.DirectoryListCell; import org.cryptomator.ui.model.UpgradeStrategies; +import org.cryptomator.ui.model.UpgradeStrategy; import org.cryptomator.ui.model.Vault; import org.cryptomator.ui.model.VaultFactory; import org.cryptomator.ui.model.VaultList; @@ -35,6 +36,7 @@ import org.cryptomator.ui.settings.Settings; import org.cryptomator.ui.settings.VaultSettings; import org.cryptomator.ui.util.DialogBuilderUtil; import org.fxmisc.easybind.EasyBind; +import org.fxmisc.easybind.monadic.MonadicBinding; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -79,20 +81,20 @@ public class MainController extends LocalizedFXMLViewController { private final Provider unlockedControllerProvider; private final Lazy changePasswordController; private final Lazy settingsController; - private final Lazy upgradeStrategies; private final ObjectProperty activeController = new SimpleObjectProperty<>(); private final VaultList vaults; private final ObjectProperty selectedVault = new SimpleObjectProperty<>(); private final BooleanExpression isSelectedVaultUnlocked = BooleanBinding.booleanExpression(EasyBind.select(selectedVault).selectObject(Vault::unlockedProperty).orElse(false)); private final BooleanExpression isSelectedVaultValid = BooleanBinding.booleanExpression(EasyBind.monadic(selectedVault).map(Vault::isValidVaultDirectory).orElse(false)); private final BooleanExpression canEditSelectedVault = selectedVault.isNotNull().and(isSelectedVaultUnlocked.not()); + private final MonadicBinding upgradeStrategyForSelectedVault; private final BooleanBinding isShowingSettings; private final Map unlockedVaults = new HashMap<>(); @Inject public MainController(@Named("mainWindow") Stage mainWindow, Localization localization, Settings settings, VaultFactory vaultFactoy, Lazy welcomeController, Lazy initializeController, Lazy notFoundController, Lazy upgradeController, Lazy unlockController, - Provider unlockedControllerProvider, Lazy changePasswordController, Lazy settingsController, Lazy upgradeStrategies, + Provider unlockedControllerProvider, Lazy changePasswordController, Lazy settingsController, UpgradeStrategies upgradeStrategies, VaultList vaults) { super(localization); this.mainWindow = mainWindow; @@ -106,11 +108,11 @@ public class MainController extends LocalizedFXMLViewController { this.unlockedControllerProvider = unlockedControllerProvider; this.changePasswordController = changePasswordController; this.settingsController = settingsController; - this.upgradeStrategies = upgradeStrategies; this.vaults = vaults; // derived bindings: this.isShowingSettings = activeController.isEqualTo(settingsController.get()); + this.upgradeStrategyForSelectedVault = EasyBind.monadic(selectedVault).map(upgradeStrategies::getUpgradeStrategy); } @FXML @@ -151,7 +153,7 @@ public class MainController extends LocalizedFXMLViewController { selectedVault.bind(vaultList.getSelectionModel().selectedItemProperty()); removeVaultButton.disableProperty().bind(canEditSelectedVault.not()); emptyListInstructions.visibleProperty().bind(Bindings.isEmpty(vaults)); - changePasswordMenuItem.visibleProperty().bind(isSelectedVaultValid); + changePasswordMenuItem.visibleProperty().bind(isSelectedVaultValid.and(Bindings.isNull(upgradeStrategyForSelectedVault))); EasyBind.subscribe(selectedVault, this::selectedVaultDidChange); EasyBind.subscribe(activeController, this::activeControllerDidChange); @@ -292,7 +294,7 @@ public class MainController extends LocalizedFXMLViewController { this.showUnlockedView(newValue); } else if (!newValue.doesVaultDirectoryExist()) { this.showNotFoundView(); - } else if (newValue.isValidVaultDirectory() && upgradeStrategies.get().getUpgradeStrategy(newValue).isPresent()) { + } else if (newValue.isValidVaultDirectory() && upgradeStrategyForSelectedVault.isPresent()) { this.showUpgradeView(); } else if (newValue.isValidVaultDirectory()) { this.showUnlockView(); diff --git a/main/ui/src/main/java/org/cryptomator/ui/controllers/UpgradeController.java b/main/ui/src/main/java/org/cryptomator/ui/controllers/UpgradeController.java index 2c1840481..700e7a920 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/controllers/UpgradeController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/controllers/UpgradeController.java @@ -32,7 +32,7 @@ import javafx.scene.control.ProgressIndicator; public class UpgradeController extends LocalizedFXMLViewController { - private final ObjectProperty> strategy = new SimpleObjectProperty<>(); + private final ObjectProperty strategy = new SimpleObjectProperty<>(); private final UpgradeStrategies strategies; private final AsyncTaskService asyncTaskService; private Optional listener = Optional.empty(); @@ -68,12 +68,8 @@ public class UpgradeController extends LocalizedFXMLViewController { @Override protected void initialize() { - upgradeTitleLabel.textProperty().bind(EasyBind.monadic(strategy).map(instruction -> { - return instruction.map(this::upgradeTitle).orElse(""); - }).orElse("")); - upgradeMsgLabel.textProperty().bind(EasyBind.monadic(strategy).map(instruction -> { - return instruction.map(this::upgradeMessage).orElse(""); - }).orElse("")); + upgradeTitleLabel.textProperty().bind(EasyBind.monadic(strategy).map(this::upgradeTitle).orElse("")); + upgradeMsgLabel.textProperty().bind(EasyBind.monadic(strategy).map(this::upgradeMessage).orElse("")); BooleanExpression passwordProvided = passwordField.textProperty().isNotEmpty().and(passwordField.disabledProperty().not()); BooleanExpression syncFinished = confirmationCheckbox.selectedProperty(); @@ -112,7 +108,7 @@ public class UpgradeController extends LocalizedFXMLViewController { @FXML private void didClickUpgradeButton(ActionEvent event) { - strategy.getValue().ifPresent(this::upgrade); + EasyBind.monadic(strategy).ifPresent(this::upgrade); } private void upgrade(UpgradeStrategy instruction) { @@ -138,8 +134,8 @@ public class UpgradeController extends LocalizedFXMLViewController { private void showNextUpgrade() { errorLabel.setText(null); - Optional nextStrategy = strategies.getUpgradeStrategy(vault); - if (nextStrategy.isPresent()) { + UpgradeStrategy nextStrategy = strategies.getUpgradeStrategy(vault); + if (nextStrategy != null) { strategy.set(nextStrategy); } else { listener.ifPresent(UpgradeListener::didUpgrade); diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeStrategies.java b/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeStrategies.java index abb918e5c..e5c020aed 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeStrategies.java +++ b/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeStrategies.java @@ -8,7 +8,7 @@ package org.cryptomator.ui.model; import java.util.Arrays; import java.util.Collection; import java.util.Collections; -import java.util.Optional; +import java.util.Objects; import javax.inject.Inject; import javax.inject.Singleton; @@ -23,13 +23,11 @@ public class UpgradeStrategies { strategies = Collections.unmodifiableList(Arrays.asList(upgrader1, upgrader2, upgrader3)); } - public Optional getUpgradeStrategy(Vault vault) { - if (vault == null) { - return Optional.empty(); - } + public UpgradeStrategy getUpgradeStrategy(Vault vault) { + Objects.requireNonNull(vault); return strategies.stream().filter(strategy -> { return strategy.isApplicable(vault); - }).findFirst(); + }).findFirst().orElse(null); } }