/* * This file is part of Bitsquare. * * Bitsquare is free software: you can redistribute it and/or modify it * under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * Bitsquare is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public * License for more details. * * You should have received a copy of the GNU Affero General Public License * along with Bitsquare. If not, see <http://www.gnu.org/licenses/>. */ package io.bitsquare.gui.main.account.content.arbitratorselection; import com.google.inject.Inject; import io.bitsquare.arbitration.Arbitrator; import io.bitsquare.arbitration.ArbitratorManager; import io.bitsquare.common.crypto.KeyRing; import io.bitsquare.gui.common.model.ActivatableDataModel; import io.bitsquare.gui.util.BSFormatter; import io.bitsquare.locale.LanguageUtil; import io.bitsquare.p2p.NodeAddress; import io.bitsquare.user.Preferences; import io.bitsquare.user.User; import javafx.collections.FXCollections; import javafx.collections.MapChangeListener; import javafx.collections.ObservableList; import java.util.stream.Collectors; class ArbitratorSelectionViewModel extends ActivatableDataModel { private final User user; private final ArbitratorManager arbitratorManager; private final Preferences preferences; private final KeyRing keyRing; private final BSFormatter formatter; final ObservableList<String> languageCodes = FXCollections.observableArrayList(); final ObservableList<ArbitratorListItem> arbitratorListItems = FXCollections.observableArrayList(); final ObservableList<String> allLanguageCodes = FXCollections.observableArrayList(LanguageUtil.getAllLanguageCodes()); private final MapChangeListener<NodeAddress, Arbitrator> arbitratorMapChangeListener; @Inject public ArbitratorSelectionViewModel(User user, ArbitratorManager arbitratorManager, Preferences preferences, KeyRing keyRing, BSFormatter formatter) { this.user = user; this.arbitratorManager = arbitratorManager; this.preferences = preferences; this.keyRing = keyRing; this.formatter = formatter; arbitratorMapChangeListener = change -> applyArbitratorMap(); } private void applyArbitratorMap() { arbitratorListItems.clear(); arbitratorListItems.addAll(arbitratorManager.getArbitratorsObservableMap().values().stream() .map(e -> new ArbitratorListItem(e, formatter)).collect(Collectors.toList())); } @Override protected void activate() { languageCodes.setAll(user.getAcceptedLanguageLocaleCodes()); arbitratorManager.getArbitratorsObservableMap().addListener(arbitratorMapChangeListener); arbitratorManager.updateArbitratorMap(); applyArbitratorMap(); updateAutoSelectArbitrators(); } @Override protected void deactivate() { arbitratorManager.getArbitratorsObservableMap().removeListener(arbitratorMapChangeListener); } void onAddLanguage(String code) { if (code != null) { boolean changed = user.addAcceptedLanguageLocale(code); if (changed) languageCodes.add(code); } updateAutoSelectArbitrators(); } void onRemoveLanguage(String code) { if (code != null) { boolean changed = user.removeAcceptedLanguageLocale(code); if (changed) languageCodes.remove(code); } updateAutoSelectArbitrators(); } void onAddArbitrator(Arbitrator arbitrator) { if (!arbitratorIsTrader(arbitrator)) user.addAcceptedArbitrator(arbitrator); } void onRemoveArbitrator(Arbitrator arbitrator) { if (arbitrator != null) user.removeAcceptedArbitrator(arbitrator); } public boolean isDeselectAllowed(ArbitratorListItem arbitratorListItem) { return arbitratorListItem != null && user.getAcceptedArbitrators() != null && user.getAcceptedArbitrators().size() > 1; } public boolean isAcceptedArbitrator(Arbitrator arbitrator) { if (arbitrator != null && user.getAcceptedArbitrators() != null) return user.getAcceptedArbitrators().contains(arbitrator) && !isMyOwnRegisteredArbitrator(arbitrator); else return false; } public boolean arbitratorIsTrader(Arbitrator arbitrator) { return keyRing.getPubKeyRing().equals(arbitrator.getPubKeyRing()); } public boolean hasMatchingLanguage(Arbitrator arbitrator) { return user.hasMatchingLanguage(arbitrator); } public boolean isMyOwnRegisteredArbitrator(Arbitrator arbitrator) { return user.isMyOwnRegisteredArbitrator(arbitrator); } private void updateAutoSelectArbitrators() { if (preferences.getAutoSelectArbitrators()) { arbitratorListItems.stream().forEach(item -> { Arbitrator arbitrator = item.arbitrator; if (!isMyOwnRegisteredArbitrator(arbitrator)) { if (hasMatchingLanguage(arbitrator)) { onAddArbitrator(arbitrator); item.setIsSelected(true); } else { onRemoveArbitrator(arbitrator); item.setIsSelected(false); } } else { item.setIsSelected(false); } }); } } public void setAutoSelectArbitrators(boolean doAutoSelect) { preferences.setAutoSelectArbitrators(doAutoSelect); updateAutoSelectArbitrators(); } public boolean getAutoSelectArbitrators() { return preferences.getAutoSelectArbitrators(); } }