diff --git a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesDataModel.java b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesDataModel.java index 77adc381da..603a0c6c44 100644 --- a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesDataModel.java +++ b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesDataModel.java @@ -20,7 +20,6 @@ package io.bitsquare.gui.main.portfolio.pending; import io.bitsquare.btc.AddressEntry; import io.bitsquare.btc.FeePolicy; import io.bitsquare.btc.WalletService; -import io.bitsquare.btc.listeners.TxConfidenceListener; import io.bitsquare.common.viewfx.model.Activatable; import io.bitsquare.common.viewfx.model.DataModel; import io.bitsquare.offer.Direction; @@ -33,7 +32,6 @@ import org.bitcoinj.core.AddressFormatException; import org.bitcoinj.core.Coin; import org.bitcoinj.core.InsufficientMoneyException; import org.bitcoinj.core.Transaction; -import org.bitcoinj.core.TransactionConfidence; import com.google.common.util.concurrent.FutureCallback; @@ -68,7 +66,6 @@ class PendingTradesDataModel implements Activatable, DataModel { private boolean isOfferer; private Trade closedTrade; - private TxConfidenceListener txConfidenceListener; private final ChangeListener tradeStateChangeListener; private final MapChangeListener mapChangeListener; @@ -155,15 +152,6 @@ class PendingTradesDataModel implements Activatable, DataModel { if (trade.getDepositTx() != null) txId.set(trade.getDepositTx().getHashAsString()); - - txConfidenceListener = new TxConfidenceListener(txId.get()) { - @Override - public void onTransactionConfidenceChanged(TransactionConfidence confidence) { - updateConfidence(confidence); - } - }; - walletService.addTxConfidenceListener(txConfidenceListener); - updateConfidence(walletService.getConfidenceForTxId(txId.get())); } else { txId.set(null); @@ -176,7 +164,6 @@ class PendingTradesDataModel implements Activatable, DataModel { } void fiatPaymentReceived() { - getTrade().setState(Trade.State.FIAT_PAYMENT_RECEIVED); tradeManager.onFiatPaymentReceived(getTrade().getId()); } @@ -287,26 +274,11 @@ class PendingTradesDataModel implements Activatable, DataModel { return getTrade().getSecurityDeposit(); } - private void updateConfidence(TransactionConfidence confidence) { - log.trace("updateConfidence confidence " + confidence); - log.trace("updateConfidence getTrade().getState() " + getTrade().getState()); - if (confidence != null && - confidence.getConfidenceType() == TransactionConfidence.ConfidenceType.BUILDING - && getTrade().getState() == Trade.State.DEPOSIT_PUBLISHED) { - // only set it once when actual state is DEPOSIT_PUBLISHED, and remove listener afterwards - getTrade().setState(Trade.State.DEPOSIT_CONFIRMED); - walletService.removeTxConfidenceListener(txConfidenceListener); - txConfidenceListener = null; - } - } private void cleanUpSelectedTrade() { if (selectedItem != null) { selectedItem.getTrade().stateProperty().removeListener(tradeStateChangeListener); } - - if (txConfidenceListener != null) - walletService.removeTxConfidenceListener(txConfidenceListener); } private void sortList() { diff --git a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesView.java b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesView.java index 7cecd3e757..635875208f 100644 --- a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesView.java +++ b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesView.java @@ -356,6 +356,7 @@ public class PendingTradesView extends ActivatableViewAndModel taskRunner = new TaskRunner<>(model, () -> { log.debug("taskRunner at handleFiatReceivedUIEvent completed"); diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SetupListenerForBlockChainConfirmation.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SetupListenerForBlockChainConfirmation.java new file mode 100644 index 0000000000..e083095ecd --- /dev/null +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SetupListenerForBlockChainConfirmation.java @@ -0,0 +1,67 @@ +/* + * 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 . + */ + +package io.bitsquare.trade.protocol.trade.taker.tasks; + +import io.bitsquare.common.taskrunner.Task; +import io.bitsquare.common.taskrunner.TaskRunner; +import io.bitsquare.trade.Trade; +import io.bitsquare.trade.protocol.trade.offerer.models.OffererAsBuyerModel; + +import org.bitcoinj.core.Transaction; +import org.bitcoinj.core.TransactionConfidence; + +import javafx.application.Platform; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SetupListenerForBlockChainConfirmation extends Task { + private static final Logger log = LoggerFactory.getLogger(SetupListenerForBlockChainConfirmation.class); + + private TransactionConfidence.Listener transactionConfidenceListener; + private TransactionConfidence transactionConfidence; + + public SetupListenerForBlockChainConfirmation(TaskRunner taskHandler, OffererAsBuyerModel model) { + super(taskHandler, model); + } + + @Override + protected void doRun() { + transactionConfidence = model.trade.getDepositTx().getConfidence(); + transactionConfidenceListener = new TransactionConfidence.Listener() { + @Override + public void onConfidenceChanged(Transaction tx, ChangeReason reason) { + log.trace("onConfidenceChanged " + tx.getConfidence()); + if (reason == ChangeReason.TYPE && tx.getConfidence().getConfidenceType() == TransactionConfidence.ConfidenceType.BUILDING) { + model.trade.setState(Trade.State.DEPOSIT_CONFIRMED); + + // transactionConfidence use CopyOnWriteArrayList as listeners, but be safe and delay remove a bit. + Platform.runLater(() -> removeEventListener()); + } + } + }; + transactionConfidence.addEventListener(transactionConfidenceListener); + + complete(); + } + + private void removeEventListener() { + if (!transactionConfidence.removeEventListener(transactionConfidenceListener)) + throw new RuntimeException("Remove transactionConfidenceListener failed at SetupListenerForBlockChainConfirmation."); + } +}