Sebastian Stenzel 8 лет назад
Родитель
Сommit
93563f68e0

+ 7 - 5
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<UnlockedController> unlockedControllerProvider;
 	private final Lazy<ChangePasswordController> changePasswordController;
 	private final Lazy<SettingsController> settingsController;
-	private final Lazy<UpgradeStrategies> upgradeStrategies;
 	private final ObjectProperty<AbstractFXMLViewController> activeController = new SimpleObjectProperty<>();
 	private final VaultList vaults;
 	private final ObjectProperty<Vault> 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<UpgradeStrategy> upgradeStrategyForSelectedVault;
 	private final BooleanBinding isShowingSettings;
 	private final Map<Vault, UnlockedController> unlockedVaults = new HashMap<>();
 
 	@Inject
 	public MainController(@Named("mainWindow") Stage mainWindow, Localization localization, Settings settings, VaultFactory vaultFactoy, Lazy<WelcomeController> welcomeController,
 			Lazy<InitializeController> initializeController, Lazy<NotFoundController> notFoundController, Lazy<UpgradeController> upgradeController, Lazy<UnlockController> unlockController,
-			Provider<UnlockedController> unlockedControllerProvider, Lazy<ChangePasswordController> changePasswordController, Lazy<SettingsController> settingsController, Lazy<UpgradeStrategies> upgradeStrategies,
+			Provider<UnlockedController> unlockedControllerProvider, Lazy<ChangePasswordController> changePasswordController, Lazy<SettingsController> 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();

+ 6 - 10
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<Optional<UpgradeStrategy>> strategy = new SimpleObjectProperty<>();
+	private final ObjectProperty<UpgradeStrategy> strategy = new SimpleObjectProperty<>();
 	private final UpgradeStrategies strategies;
 	private final AsyncTaskService asyncTaskService;
 	private Optional<UpgradeListener> 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<UpgradeStrategy> nextStrategy = strategies.getUpgradeStrategy(vault);
-		if (nextStrategy.isPresent()) {
+		UpgradeStrategy nextStrategy = strategies.getUpgradeStrategy(vault);
+		if (nextStrategy != null) {
 			strategy.set(nextStrategy);
 		} else {
 			listener.ifPresent(UpgradeListener::didUpgrade);

+ 4 - 6
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<UpgradeStrategy> 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);
 	}
 
 }