From 57553bbda13de873d310a78f84ad07974135171e Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Thu, 29 Aug 2019 23:18:03 +0200 Subject: [PATCH] Replaced TransformationList by simpler List with listener, because Property Extractor didn't work properly --- .../org/cryptomator/common/CommonsModule.java | 14 +- .../org/cryptomator/common/vaults/Vault.java | 2 +- .../cryptomator/common/vaults/VaultList.java | 130 ------------------ .../vaults/VaultListChangeListener.java | 33 +++++ .../ui/controllers/MainController.java | 3 +- .../cryptomator/ui/model/AutoUnlocker.java | 8 +- .../ui/traymenu/TrayMenuController.java | 11 +- 7 files changed, 60 insertions(+), 141 deletions(-) delete mode 100644 main/commons/src/main/java/org/cryptomator/common/vaults/VaultList.java create mode 100644 main/commons/src/main/java/org/cryptomator/common/vaults/VaultListChangeListener.java diff --git a/main/commons/src/main/java/org/cryptomator/common/CommonsModule.java b/main/commons/src/main/java/org/cryptomator/common/CommonsModule.java index f9b3509d5..7742cd90b 100644 --- a/main/commons/src/main/java/org/cryptomator/common/CommonsModule.java +++ b/main/commons/src/main/java/org/cryptomator/common/CommonsModule.java @@ -15,9 +15,11 @@ import javafx.collections.ObservableList; import org.apache.commons.lang3.SystemUtils; import org.cryptomator.common.settings.Settings; import org.cryptomator.common.settings.SettingsProvider; +import org.cryptomator.common.settings.VaultSettings; import org.cryptomator.common.vaults.Vault; import org.cryptomator.common.vaults.VaultComponent; -import org.cryptomator.common.vaults.VaultList; +import org.cryptomator.common.vaults.VaultFactory; +import org.cryptomator.common.vaults.VaultListChangeListener; import org.cryptomator.frontend.webdav.WebDavServer; import org.fxmisc.easybind.EasyBind; @@ -51,8 +53,14 @@ public abstract class CommonsModule { @Provides @Singleton - static ObservableList provideVaultList(VaultList vaultList) { - return FXCollections.observableList(vaultList, Vault::observables); + static ObservableList provideVaultList(Settings settings, VaultFactory vaultFactory) { + ObservableList list = FXCollections.observableArrayList(Vault::observables); + for (VaultSettings s : settings.getDirectories()) { + Vault v = vaultFactory.get(s); + list.add(v); + } + list.addListener(new VaultListChangeListener(settings.getDirectories())); + return list; } @Provides diff --git a/main/commons/src/main/java/org/cryptomator/common/vaults/Vault.java b/main/commons/src/main/java/org/cryptomator/common/vaults/Vault.java index 51622f094..8228bd59e 100644 --- a/main/commons/src/main/java/org/cryptomator/common/vaults/Vault.java +++ b/main/commons/src/main/java/org/cryptomator/common/vaults/Vault.java @@ -57,7 +57,7 @@ public class Vault { private final Provider volumeProvider; private final StringBinding defaultMountFlags; private final AtomicReference cryptoFileSystem; - private final ObjectProperty state ; + private final ObjectProperty state; private final VaultStats stats; private final ObjectProperty accessPoint = new SimpleObjectProperty<>(Path.of("")); private final StringBinding displayableName; diff --git a/main/commons/src/main/java/org/cryptomator/common/vaults/VaultList.java b/main/commons/src/main/java/org/cryptomator/common/vaults/VaultList.java deleted file mode 100644 index 9386d9dc4..000000000 --- a/main/commons/src/main/java/org/cryptomator/common/vaults/VaultList.java +++ /dev/null @@ -1,130 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2017 Skymatic UG (haftungsbeschränkt). - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the accompanying LICENSE file. - *******************************************************************************/ -package org.cryptomator.common.vaults; - -import com.google.common.collect.Lists; -import javafx.collections.ListChangeListener; -import javafx.collections.ObservableList; -import javafx.collections.transformation.TransformationList; -import org.cryptomator.common.settings.Settings; -import org.cryptomator.common.settings.VaultSettings; - -import javax.inject.Inject; -import javax.inject.Singleton; -import java.util.List; -import java.util.stream.IntStream; - -@Singleton -public class VaultList extends TransformationList { - - private final VaultFactory vaultFactory; - private final ObservableList source; - - @Inject - public VaultList(Settings settings, VaultFactory vaultFactory) { - super(settings.getDirectories()); - this.source = settings.getDirectories(); - this.vaultFactory = vaultFactory; - } - - @Override - public int getSourceIndex(int index) { - return index; - } - - @Override - public int getViewIndex(int index) { - return index; - } - - @Override - public Vault get(int index) { - VaultSettings s = source.get(index); - return vaultFactory.get(s); - } - - @Override - public void add(int index, Vault element) { - source.add(index, element.getVaultSettings()); - } - - @Override - public Vault remove(int index) { - VaultSettings s = source.remove(index); - return vaultFactory.get(s); - } - - @Override - public int size() { - return getSource().size(); - } - - @Override - protected void sourceChanged(ListChangeListener.Change c) { - this.fireChange(new VaultListChange(c)); - } - - private class VaultListChange extends ListChangeListener.Change { - - private final ListChangeListener.Change delegate; - - public VaultListChange(ListChangeListener.Change delegate) { - super(VaultList.this); - this.delegate = delegate; - } - - @Override - public boolean next() { - return delegate.next(); - } - - @Override - public boolean wasUpdated() { - return delegate.wasUpdated(); - } - - @Override - public void reset() { - delegate.reset(); - } - - @Override - public int getFrom() { - return delegate.getFrom(); - } - - @Override - public int getTo() { - return delegate.getTo(); - } - - @Override - public List getRemoved() { - return Lists.transform(delegate.getRemoved(), vaultFactory::get); - } - - @Override - public boolean wasPermutated() { - return delegate.wasPermutated(); - } - - @Override - protected int[] getPermutation() { - if (delegate.wasPermutated()) { - return IntStream.range(getFrom(), getTo()).map(delegate::getPermutation).toArray(); - } else { - return new int[0]; - } - } - - @Override - public String toString() { - return delegate.toString(); - } - - } - -} diff --git a/main/commons/src/main/java/org/cryptomator/common/vaults/VaultListChangeListener.java b/main/commons/src/main/java/org/cryptomator/common/vaults/VaultListChangeListener.java new file mode 100644 index 000000000..cf514ebb6 --- /dev/null +++ b/main/commons/src/main/java/org/cryptomator/common/vaults/VaultListChangeListener.java @@ -0,0 +1,33 @@ +package org.cryptomator.common.vaults; + +import javafx.collections.ListChangeListener; +import javafx.collections.ObservableList; +import org.cryptomator.common.settings.VaultSettings; + +/** + * This listener makes sure to reflect any changes to the vault list back to the settings. + */ +public class VaultListChangeListener implements ListChangeListener { + + private final ObservableList vaultSettingsList; + + public VaultListChangeListener(ObservableList vaultSettingsList) { + this.vaultSettingsList = vaultSettingsList; + } + + @Override + public void onChanged(Change c) { + while(c.next()) { + if (c.wasAdded()) { + for (int i = c.getFrom(); i < c.getTo(); i++) { + Vault v = c.getList().get(i); + vaultSettingsList.add(i, v.getVaultSettings()); + } + } else if (c.wasRemoved()) { + for (Vault v : c.getRemoved()) { + vaultSettingsList.remove(v.getVaultSettings()); + } + } + } + } +} 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 8e02aa6c0..9331f47f7 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 @@ -54,7 +54,6 @@ import org.cryptomator.ui.model.AppLaunchEvent; import org.cryptomator.ui.model.AutoUnlocker; import org.cryptomator.common.vaults.Vault; import org.cryptomator.common.vaults.VaultFactory; -import org.cryptomator.common.vaults.VaultList; import org.cryptomator.ui.model.upgrade.UpgradeStrategies; import org.cryptomator.ui.model.upgrade.UpgradeStrategy; import org.cryptomator.ui.util.DialogBuilderUtil; @@ -112,7 +111,7 @@ public class MainController implements ViewController { @Inject public MainController(@Named("mainWindow") Stage mainWindow, ExecutorService executorService, @Named("launchEventQueue") BlockingQueue launchEventQueue, ExitUtil exitUtil, Localization localization, - VaultFactory vaultFactoy, ViewControllerLoader viewControllerLoader, UpgradeStrategies upgradeStrategies, VaultList vaults, AutoUnlocker autoUnlocker) { + VaultFactory vaultFactoy, ViewControllerLoader viewControllerLoader, UpgradeStrategies upgradeStrategies, ObservableList vaults, AutoUnlocker autoUnlocker) { this.mainWindow = mainWindow; this.executorService = executorService; this.launchEventQueue = launchEventQueue; diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/AutoUnlocker.java b/main/ui/src/main/java/org/cryptomator/ui/model/AutoUnlocker.java index e3fb99916..14a604883 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/model/AutoUnlocker.java +++ b/main/ui/src/main/java/org/cryptomator/ui/model/AutoUnlocker.java @@ -5,13 +5,13 @@ *******************************************************************************/ package org.cryptomator.ui.model; +import javafx.collections.ObservableList; import org.cryptomator.common.vaults.Vault; -import org.cryptomator.common.vaults.VaultList; import org.cryptomator.common.vaults.Volume; -import org.cryptomator.ui.fxapp.FxApplicationScoped; import org.cryptomator.cryptolib.api.CryptoException; import org.cryptomator.keychain.KeychainAccess; import org.cryptomator.keychain.KeychainAccessException; +import org.cryptomator.ui.fxapp.FxApplicationScoped; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,11 +33,11 @@ public class AutoUnlocker { private static final int NAP_TIME_MILLIS = 500; private final Optional keychainAccess; - private final VaultList vaults; + private final ObservableList vaults; private final ExecutorService executor; @Inject - public AutoUnlocker(Optional keychainAccess, VaultList vaults, ExecutorService executor) { + public AutoUnlocker(Optional keychainAccess, ObservableList vaults, ExecutorService executor) { this.keychainAccess = keychainAccess; this.vaults = vaults; this.executor = executor; diff --git a/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayMenuController.java b/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayMenuController.java index 1336213d2..86645d88d 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayMenuController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayMenuController.java @@ -1,10 +1,13 @@ package org.cryptomator.ui.traymenu; +import javafx.application.Platform; import javafx.beans.Observable; import javafx.collections.ObservableList; import org.cryptomator.common.settings.Settings; import org.cryptomator.common.vaults.Vault; import org.cryptomator.ui.fxapp.FxApplication; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.inject.Inject; import javax.inject.Named; @@ -23,6 +26,8 @@ import java.util.function.Consumer; @TrayMenuScoped class TrayMenuController { + + private static final Logger LOG = LoggerFactory.getLogger(TrayMenuController.class); private final ResourceBundle resourceBundle; private final FxApplicationStarter fxApplicationStarter; @@ -69,8 +74,12 @@ class TrayMenuController { } private void vaultListChanged(@SuppressWarnings("unused") Observable observable) { + assert Platform.isFxApplicationThread(); rebuildMenu(); - allVaultsAreLocked.set(vaults.stream().allMatch(Vault::isLocked)); + boolean allLocked = vaults.stream().allMatch(Vault::isLocked); + // TODO remove logging + LOG.warn("allLocked: {}", allLocked); + allVaultsAreLocked.set(allLocked); } private void rebuildMenu() {