From 670c5418ee0e16a047336f7e24b36cb5f4db72f8 Mon Sep 17 00:00:00 2001 From: jmacxx <47253594+jmacxx@users.noreply.github.com> Date: Fri, 26 Nov 2021 20:55:46 -0600 Subject: [PATCH 1/4] Improve user experience once mediation has been accepted by both parties Transitions to Trade Step 4 (previously it would close/remove the trade). --- core/src/main/java/bisq/core/trade/TradeManager.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/bisq/core/trade/TradeManager.java b/core/src/main/java/bisq/core/trade/TradeManager.java index 89d924364c7..2444606dc7d 100644 --- a/core/src/main/java/bisq/core/trade/TradeManager.java +++ b/core/src/main/java/bisq/core/trade/TradeManager.java @@ -702,7 +702,9 @@ public void onTradeCompleted(Trade trade) { public void closeDisputedTrade(String tradeId, Trade.DisputeState disputeState) { getTradeById(tradeId).ifPresent(trade -> { trade.setDisputeState(disputeState); - onTradeCompleted(trade); + trade.setState(trade.getContract().isMyRoleBuyer(keyRing.getPubKeyRing()) ? + Trade.State.BUYER_RECEIVED_PAYOUT_TX_PUBLISHED_MSG : // buyer to trade step 4 + Trade.State.SELLER_SAW_ARRIVED_PAYOUT_TX_PUBLISHED_MSG); // seller to trade step 4 btcWalletService.swapTradeEntryToAvailableEntry(trade.getId(), AddressEntry.Context.TRADE_PAYOUT); requestPersistence(); }); From 1162060e28ce302c7b9715072e664b043008500a Mon Sep 17 00:00:00 2001 From: jmacxx <47253594+jmacxx@users.noreply.github.com> Date: Fri, 24 Dec 2021 14:22:59 -0600 Subject: [PATCH 2/4] Simplify the trade complete summary dialog --- .../resources/i18n/displayStrings.properties | 2 + .../steps/buyer/BuyerStep4View.java | 216 +++--------------- 2 files changed, 28 insertions(+), 190 deletions(-) diff --git a/core/src/main/resources/i18n/displayStrings.properties b/core/src/main/resources/i18n/displayStrings.properties index 1cc275d92bf..a7ad9087146 100644 --- a/core/src/main/resources/i18n/displayStrings.properties +++ b/core/src/main/resources/i18n/displayStrings.properties @@ -898,6 +898,8 @@ portfolio.pending.step3_seller.onPaymentReceived.signer=IMPORTANT: By confirming you should delay confirmation of the payment as long as possible to reduce the risk of a chargeback. portfolio.pending.step5_buyer.groupTitle=Summary of completed trade +portfolio.pending.step5_buyer.groupTitle.mediated=This trade was resolved by mediation +portfolio.pending.step5_buyer.groupTitle.arbitrated=This trade was resolved by arbitration portfolio.pending.step5_buyer.tradeFee=Trade fee portfolio.pending.step5_buyer.makersMiningFee=Mining fee portfolio.pending.step5_buyer.takersMiningFee=Total mining fees diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/buyer/BuyerStep4View.java b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/buyer/BuyerStep4View.java index b6dbf081bdc..9e9e612fce6 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/buyer/BuyerStep4View.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/buyer/BuyerStep4View.java @@ -18,8 +18,6 @@ package bisq.desktop.main.portfolio.pendingtrades.steps.buyer; import bisq.desktop.components.AutoTooltipButton; -import bisq.desktop.components.AutoTooltipLabel; -import bisq.desktop.components.InputTextField; import bisq.desktop.components.TitledGroupBg; import bisq.desktop.main.MainView; import bisq.desktop.main.overlays.notifications.Notification; @@ -31,26 +29,13 @@ import bisq.desktop.main.portfolio.pendingtrades.steps.TradeStepView; import bisq.desktop.util.Layout; -import bisq.core.btc.exceptions.AddressEntryException; -import bisq.core.btc.exceptions.InsufficientFundsException; import bisq.core.btc.model.AddressEntry; -import bisq.core.btc.wallet.BtcWalletService; -import bisq.core.btc.wallet.Restrictions; import bisq.core.locale.Res; import bisq.core.trade.txproof.AssetTxProofResult; import bisq.core.user.DontShowAgainLookup; -import bisq.core.util.coin.CoinFormatter; -import bisq.core.util.coin.CoinUtil; -import bisq.core.util.validation.BtcAddressValidator; import bisq.common.UserThread; import bisq.common.app.DevEnv; -import bisq.common.handlers.FaultHandler; -import bisq.common.handlers.ResultHandler; - -import org.bitcoinj.core.AddressFormatException; -import org.bitcoinj.core.Coin; -import org.bitcoinj.core.Transaction; import com.jfoenix.controls.JFXBadge; @@ -63,20 +48,13 @@ import javafx.geometry.Insets; import javafx.geometry.Pos; -import org.bouncycastle.crypto.params.KeyParameter; - import java.util.concurrent.TimeUnit; import static bisq.desktop.util.FormBuilder.addCompactTopLabelTextField; -import static bisq.desktop.util.FormBuilder.addInputTextField; -import static bisq.desktop.util.FormBuilder.addTitledGroupBg; public class BuyerStep4View extends TradeStepView { - // private final ChangeListener focusedPropertyListener; - private InputTextField withdrawAddressTextField, withdrawMemoTextField; - private Button withdrawToExternalWalletButton, useSavingsWalletButton; - private TitledGroupBg withdrawTitledGroupBg; + private Button closeButton; /////////////////////////////////////////////////////////////////////////////////////////// // Constructor, Initialisation @@ -108,8 +86,13 @@ protected void addContent() { gridPane.getColumnConstraints().get(1).setHgrow(Priority.SOMETIMES); TitledGroupBg completedTradeLabel = new TitledGroupBg(); - completedTradeLabel.setText(Res.get("portfolio.pending.step5_buyer.groupTitle")); - + if (trade.getDisputeState().isMediated()) { + completedTradeLabel.setText(Res.get("portfolio.pending.step5_buyer.groupTitle.mediated")); + } else if (trade.getDisputeState().isArbitrated()) { + completedTradeLabel.setText(Res.get("portfolio.pending.step5_buyer.groupTitle.arbitrated")); + } else { + completedTradeLabel.setText(Res.get("portfolio.pending.step5_buyer.groupTitle")); + } JFXBadge autoConfBadge = new JFXBadge(new Label(""), Pos.BASELINE_RIGHT); autoConfBadge.setText(Res.get("portfolio.pending.autoConf")); autoConfBadge.getStyleClass().add("auto-conf"); @@ -120,49 +103,28 @@ protected void addContent() { GridPane.setRowSpan(hBox2, 5); autoConfBadge.setVisible(AssetTxProofResult.COMPLETED == trade.getAssetTxProofResult()); - addCompactTopLabelTextField(gridPane, gridRow, getBtcTradeAmountLabel(), model.getTradeVolume(), Layout.TWICE_FIRST_ROW_DISTANCE); - addCompactTopLabelTextField(gridPane, ++gridRow, getFiatTradeAmountLabel(), model.getFiatVolume()); - addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("portfolio.pending.step5_buyer.refunded"), model.getSecurityDeposit()); - addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("portfolio.pending.step5_buyer.tradeFee"), model.getTradeFee()); - final String miningFee = model.dataModel.isMaker() ? - Res.get("portfolio.pending.step5_buyer.makersMiningFee") : - Res.get("portfolio.pending.step5_buyer.takersMiningFee"); - addCompactTopLabelTextField(gridPane, ++gridRow, miningFee, model.getTxFee()); - withdrawTitledGroupBg = addTitledGroupBg(gridPane, ++gridRow, 1, Res.get("portfolio.pending.step5_buyer.withdrawBTC"), Layout.COMPACT_GROUP_DISTANCE); - withdrawTitledGroupBg.getStyleClass().add("last"); - addCompactTopLabelTextField(gridPane, gridRow, Res.get("portfolio.pending.step5_buyer.amount"), model.getPayoutAmount(), Layout.FIRST_ROW_AND_GROUP_DISTANCE); - - withdrawAddressTextField = addInputTextField(gridPane, ++gridRow, Res.get("portfolio.pending.step5_buyer.withdrawToAddress")); - withdrawAddressTextField.setManaged(false); - withdrawAddressTextField.setVisible(false); - - withdrawMemoTextField = addInputTextField(gridPane, ++gridRow, - Res.get("funds.withdrawal.memoLabel", Res.getBaseCurrencyCode())); - withdrawMemoTextField.setPromptText(Res.get("funds.withdrawal.memo")); - withdrawMemoTextField.setManaged(false); - withdrawMemoTextField.setVisible(false); + if (trade.getDisputeState().isNotDisputed()) { + addCompactTopLabelTextField(gridPane, gridRow, getBtcTradeAmountLabel(), model.getTradeVolume(), Layout.TWICE_FIRST_ROW_DISTANCE); + addCompactTopLabelTextField(gridPane, ++gridRow, getFiatTradeAmountLabel(), model.getFiatVolume()); + addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("portfolio.pending.step5_buyer.refunded"), model.getSecurityDeposit()); + addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("portfolio.pending.step5_buyer.tradeFee"), model.getTradeFee()); + final String miningFee = model.dataModel.isMaker() ? + Res.get("portfolio.pending.step5_buyer.makersMiningFee") : + Res.get("portfolio.pending.step5_buyer.takersMiningFee"); + addCompactTopLabelTextField(gridPane, ++gridRow, miningFee, model.getTxFee()); + } - HBox hBox = new HBox(); - hBox.setSpacing(10); - useSavingsWalletButton = new AutoTooltipButton(Res.get("portfolio.pending.step5_buyer.moveToBisqWallet")); - useSavingsWalletButton.setDefaultButton(true); - useSavingsWalletButton.getStyleClass().add("action-button"); - Label label = new AutoTooltipLabel(Res.get("shared.OR")); - label.setPadding(new Insets(5, 0, 0, 0)); - withdrawToExternalWalletButton = new AutoTooltipButton(Res.get("portfolio.pending.step5_buyer.withdrawExternal")); - withdrawToExternalWalletButton.setDefaultButton(false); - hBox.getChildren().addAll(useSavingsWalletButton, label, withdrawToExternalWalletButton); - GridPane.setRowIndex(hBox, ++gridRow); - GridPane.setMargin(hBox, new Insets(5, 10, 0, 0)); - gridPane.getChildren().add(hBox); + closeButton = new AutoTooltipButton(Res.get("shared.close")); + closeButton.setDefaultButton(true); + closeButton.getStyleClass().add("action-button"); + GridPane.setRowIndex(closeButton, ++gridRow); + GridPane.setMargin(closeButton, new Insets(Layout.GROUP_DISTANCE, 10, 0, 0)); + gridPane.getChildren().add(closeButton); - useSavingsWalletButton.setOnAction(e -> { + closeButton.setOnAction(e -> { handleTradeCompleted(); model.dataModel.tradeManager.onTradeCompleted(trade); }); - withdrawToExternalWalletButton.setOnAction(e -> { - onWithdrawal(); - }); String key = "tradeCompleted" + trade.getId(); if (!DevEnv.isDevMode() && DontShowAgainLookup.showAgain(key)) { @@ -174,128 +136,8 @@ protected void addContent() { } } - private void onWithdrawal() { - withdrawAddressTextField.setManaged(true); - withdrawAddressTextField.setVisible(true); - withdrawMemoTextField.setManaged(true); - withdrawMemoTextField.setVisible(true); - GridPane.setRowSpan(withdrawTitledGroupBg, 3); - withdrawToExternalWalletButton.setDefaultButton(true); - useSavingsWalletButton.setDefaultButton(false); - withdrawToExternalWalletButton.getStyleClass().add("action-button"); - useSavingsWalletButton.getStyleClass().remove("action-button"); - - withdrawToExternalWalletButton.setOnAction(e -> { - if (model.dataModel.isReadyForTxBroadcast()) { - reviewWithdrawal(); - } - }); - - } - - private void reviewWithdrawal() { - Coin amount = trade.getPayoutAmount(); - BtcWalletService walletService = model.dataModel.btcWalletService; - - AddressEntry fromAddressesEntry = walletService.getOrCreateAddressEntry(trade.getId(), AddressEntry.Context.TRADE_PAYOUT); - String fromAddresses = fromAddressesEntry.getAddressString(); - String toAddresses = withdrawAddressTextField.getText(); - if (new BtcAddressValidator().validate(toAddresses).isValid) { - Coin balance = walletService.getBalanceForAddress(fromAddressesEntry.getAddress()); - try { - Transaction feeEstimationTransaction = walletService.getFeeEstimationTransaction(fromAddresses, toAddresses, amount, AddressEntry.Context.TRADE_PAYOUT); - Coin fee = feeEstimationTransaction.getFee(); - Coin receiverAmount = amount.subtract(fee); - if (balance.isZero()) { - new Popup().warning(Res.get("portfolio.pending.step5_buyer.alreadyWithdrawn")).show(); - model.dataModel.tradeManager.onTradeCompleted(trade); - } else { - if (toAddresses.isEmpty()) { - validateWithdrawAddress(); - } else if (Restrictions.isAboveDust(receiverAmount)) { - CoinFormatter formatter = model.btcFormatter; - int txVsize = feeEstimationTransaction.getVsize(); - double feePerVbyte = CoinUtil.getFeePerVbyte(fee, txVsize); - double vkb = txVsize / 1000d; - String recAmount = formatter.formatCoinWithCode(receiverAmount); - new Popup().headLine(Res.get("portfolio.pending.step5_buyer.confirmWithdrawal")) - .confirmation(Res.get("shared.sendFundsDetailsWithFee", - formatter.formatCoinWithCode(amount), - fromAddresses, - toAddresses, - formatter.formatCoinWithCode(fee), - feePerVbyte, - vkb, - recAmount)) - .actionButtonText(Res.get("shared.yes")) - .onAction(() -> doWithdrawal(amount, fee)) - .closeButtonText(Res.get("shared.cancel")) - .onClose(() -> { - useSavingsWalletButton.setDisable(false); - withdrawToExternalWalletButton.setDisable(false); - }) - .show(); - } else { - new Popup().warning(Res.get("portfolio.pending.step5_buyer.amountTooLow")).show(); - } - } - } catch (AddressFormatException e) { - validateWithdrawAddress(); - } catch (AddressEntryException e) { - log.error(e.getMessage()); - } catch (InsufficientFundsException e) { - log.error(e.getMessage()); - e.printStackTrace(); - new Popup().warning(e.getMessage()).show(); - } - } else { - new Popup().warning(Res.get("validation.btc.invalidAddress")).show(); - } - } - - private void doWithdrawal(Coin amount, Coin fee) { - String toAddress = withdrawAddressTextField.getText(); - ResultHandler resultHandler = this::handleTradeCompleted; - FaultHandler faultHandler = (errorMessage, throwable) -> { - useSavingsWalletButton.setDisable(false); - withdrawToExternalWalletButton.setDisable(false); - if (throwable != null && throwable.getMessage() != null) - new Popup().error(errorMessage + "\n\n" + throwable.getMessage()).show(); - else - new Popup().error(errorMessage).show(); - }; - if (model.dataModel.btcWalletService.isEncrypted()) { - UserThread.runAfter(() -> model.dataModel.walletPasswordWindow.onAesKey(aesKey -> - doWithdrawRequest(toAddress, amount, fee, aesKey, resultHandler, faultHandler)) - .show(), 300, TimeUnit.MILLISECONDS); - } else - doWithdrawRequest(toAddress, amount, fee, null, resultHandler, faultHandler); - } - - private void doWithdrawRequest(String toAddress, - Coin amount, - Coin fee, - KeyParameter aesKey, - ResultHandler resultHandler, - FaultHandler faultHandler) { - useSavingsWalletButton.setDisable(true); - withdrawToExternalWalletButton.setDisable(true); - String memo = withdrawMemoTextField.getText(); - if (memo.isEmpty()) { - memo = null; - } - model.dataModel.onWithdrawRequest(toAddress, - amount, - fee, - aesKey, - memo, - resultHandler, - faultHandler); - } - private void handleTradeCompleted() { - useSavingsWalletButton.setDisable(true); - withdrawToExternalWalletButton.setDisable(true); + closeButton.setDisable(true); model.dataModel.btcWalletService.swapTradeEntryToAvailableEntry(trade.getId(), AddressEntry.Context.TRADE_PAYOUT); openTradeFeedbackWindow(); @@ -328,12 +170,6 @@ private void showNavigateToClosedTradesViewPopup() { } } - private void validateWithdrawAddress() { - withdrawAddressTextField.setValidator(model.btcAddressValidator); - withdrawAddressTextField.requestFocus(); - useSavingsWalletButton.requestFocus(); - } - protected String getBtcTradeAmountLabel() { return Res.get("portfolio.pending.step5_buyer.bought"); } From 9759cebc4d72202b11d84f5ce0ef15b94725788e Mon Sep 17 00:00:00 2001 From: Christoph Atteneder Date: Tue, 11 Jan 2022 10:48:06 +0100 Subject: [PATCH 3/4] Remove unused translations --- core/src/main/resources/i18n/displayStrings.properties | 7 ------- 1 file changed, 7 deletions(-) diff --git a/core/src/main/resources/i18n/displayStrings.properties b/core/src/main/resources/i18n/displayStrings.properties index a7ad9087146..0750c235c4d 100644 --- a/core/src/main/resources/i18n/displayStrings.properties +++ b/core/src/main/resources/i18n/displayStrings.properties @@ -904,13 +904,6 @@ portfolio.pending.step5_buyer.tradeFee=Trade fee portfolio.pending.step5_buyer.makersMiningFee=Mining fee portfolio.pending.step5_buyer.takersMiningFee=Total mining fees portfolio.pending.step5_buyer.refunded=Refunded security deposit -portfolio.pending.step5_buyer.withdrawBTC=Withdraw your bitcoin -portfolio.pending.step5_buyer.amount=Amount to withdraw -portfolio.pending.step5_buyer.withdrawToAddress=Withdraw to address -portfolio.pending.step5_buyer.moveToBisqWallet=Keep funds in Bisq wallet -portfolio.pending.step5_buyer.withdrawExternal=Withdraw to external wallet -portfolio.pending.step5_buyer.alreadyWithdrawn=Your funds have already been withdrawn.\nPlease check the transaction history. -portfolio.pending.step5_buyer.confirmWithdrawal=Confirm withdrawal request portfolio.pending.step5_buyer.amountTooLow=The amount to transfer is lower than the transaction fee and the min. possible tx value (dust). portfolio.pending.step5_buyer.withdrawalCompleted.headline=Withdrawal completed portfolio.pending.step5_buyer.withdrawalCompleted.msg=Your completed trades are stored under \"Portfolio/History\".\nYou can review all your bitcoin transactions under \"Funds/Transactions\" From 4a3e29daf515f2a46fae233b822e6e2be6d4900c Mon Sep 17 00:00:00 2001 From: Christoph Atteneder Date: Tue, 11 Jan 2022 11:02:55 +0100 Subject: [PATCH 4/4] Improve wording of trade completed notification popups --- .../java/bisq/core/trade/TradeManager.java | 9 +++---- .../resources/i18n/displayStrings.properties | 6 ++--- .../steps/buyer/BuyerStep4View.java | 24 ++++++++----------- 3 files changed, 18 insertions(+), 21 deletions(-) diff --git a/core/src/main/java/bisq/core/trade/TradeManager.java b/core/src/main/java/bisq/core/trade/TradeManager.java index 2444606dc7d..e68410c9c30 100644 --- a/core/src/main/java/bisq/core/trade/TradeManager.java +++ b/core/src/main/java/bisq/core/trade/TradeManager.java @@ -261,12 +261,12 @@ private void handleTakeOfferRequest(NodeAddress peer, InputsForDepositTxRequest try { Validator.nonEmptyStringOf(inputsForDepositTxRequest.getTradeId()); } catch (Throwable t) { - log.warn("Invalid inputsForDepositTxRequest " + inputsForDepositTxRequest.toString()); + log.warn("Invalid inputsForDepositTxRequest " + inputsForDepositTxRequest); return; } Optional openOfferOptional = openOfferManager.getOpenOfferById(inputsForDepositTxRequest.getTradeId()); - if (!openOfferOptional.isPresent()) { + if (openOfferOptional.isEmpty()) { return; } @@ -702,9 +702,10 @@ public void onTradeCompleted(Trade trade) { public void closeDisputedTrade(String tradeId, Trade.DisputeState disputeState) { getTradeById(tradeId).ifPresent(trade -> { trade.setDisputeState(disputeState); + checkNotNull(trade.getContract(), "Trade contract must not be null"); trade.setState(trade.getContract().isMyRoleBuyer(keyRing.getPubKeyRing()) ? - Trade.State.BUYER_RECEIVED_PAYOUT_TX_PUBLISHED_MSG : // buyer to trade step 4 - Trade.State.SELLER_SAW_ARRIVED_PAYOUT_TX_PUBLISHED_MSG); // seller to trade step 4 + Trade.State.BUYER_RECEIVED_PAYOUT_TX_PUBLISHED_MSG : // buyer to trade step 4 + Trade.State.SELLER_SAW_ARRIVED_PAYOUT_TX_PUBLISHED_MSG); // seller to trade step 4 btcWalletService.swapTradeEntryToAvailableEntry(trade.getId(), AddressEntry.Context.TRADE_PAYOUT); requestPersistence(); }); diff --git a/core/src/main/resources/i18n/displayStrings.properties b/core/src/main/resources/i18n/displayStrings.properties index 0750c235c4d..f3c556c7182 100644 --- a/core/src/main/resources/i18n/displayStrings.properties +++ b/core/src/main/resources/i18n/displayStrings.properties @@ -905,8 +905,8 @@ portfolio.pending.step5_buyer.makersMiningFee=Mining fee portfolio.pending.step5_buyer.takersMiningFee=Total mining fees portfolio.pending.step5_buyer.refunded=Refunded security deposit portfolio.pending.step5_buyer.amountTooLow=The amount to transfer is lower than the transaction fee and the min. possible tx value (dust). -portfolio.pending.step5_buyer.withdrawalCompleted.headline=Withdrawal completed -portfolio.pending.step5_buyer.withdrawalCompleted.msg=Your completed trades are stored under \"Portfolio/History\".\nYou can review all your bitcoin transactions under \"Funds/Transactions\" +portfolio.pending.step5_buyer.tradeCompleted.headline=Trade completed +portfolio.pending.step5_buyer.tradeCompleted.msg=Your completed trades are stored under \"Portfolio/History\".\nYou can review all your bitcoin transactions under \"Funds/Transactions\" portfolio.pending.step5_buyer.bought=You have bought portfolio.pending.step5_buyer.paid=You have paid @@ -3135,7 +3135,7 @@ notification.walletUpdate.headline=Trading wallet update notification.walletUpdate.msg=Your trading wallet is sufficiently funded.\nAmount: {0} notification.takeOffer.walletUpdate.msg=Your trading wallet was already sufficiently funded from an earlier take offer attempt.\nAmount: {0} notification.tradeCompleted.headline=Trade completed -notification.tradeCompleted.msg=You can withdraw your funds now to your external Bitcoin wallet or transfer it to the Bisq wallet. +notification.tradeCompleted.msg=You can withdraw your funds now to your external Bitcoin wallet from Funds > Send Funds. notification.bsqSwap.maker.headline=BSQ swap completed notification.bsqSwap.maker.tradeCompleted=Your offer with ID ''{0}'' has been taken. notification.bsqSwap.confirmed.headline=BSQ swap transaction confirmed diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/buyer/BuyerStep4View.java b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/buyer/BuyerStep4View.java index 9e9e612fce6..307c7031d9c 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/buyer/BuyerStep4View.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/buyer/BuyerStep4View.java @@ -146,12 +146,10 @@ private void handleTradeCompleted() { private void openTradeFeedbackWindow() { String key = "feedbackPopupAfterTrade"; if (!DevEnv.isDevMode() && preferences.showAgain(key)) { - UserThread.runAfter(() -> { - new TradeFeedbackWindow() - .dontShowAgainId(key) - .onAction(this::showNavigateToClosedTradesViewPopup) - .show(); - }, 500, TimeUnit.MILLISECONDS); + UserThread.runAfter(() -> new TradeFeedbackWindow() + .dontShowAgainId(key) + .onAction(this::showNavigateToClosedTradesViewPopup) + .show(), 500, TimeUnit.MILLISECONDS); } else { showNavigateToClosedTradesViewPopup(); } @@ -159,14 +157,12 @@ private void openTradeFeedbackWindow() { private void showNavigateToClosedTradesViewPopup() { if (!DevEnv.isDevMode()) { - UserThread.runAfter(() -> { - new Popup().headLine(Res.get("portfolio.pending.step5_buyer.withdrawalCompleted.headline")) - .feedback(Res.get("portfolio.pending.step5_buyer.withdrawalCompleted.msg")) - .actionButtonTextWithGoTo("navigation.portfolio.closedTrades") - .onAction(() -> model.dataModel.navigation.navigateTo(MainView.class, PortfolioView.class, ClosedTradesView.class)) - .dontShowAgainId("tradeCompleteWithdrawCompletedInfo") - .show(); - }, 500, TimeUnit.MILLISECONDS); + UserThread.runAfter(() -> new Popup().headLine(Res.get("portfolio.pending.step5_buyer.tradeCompleted.headline")) + .feedback(Res.get("portfolio.pending.step5_buyer.tradeCompleted.msg")) + .actionButtonTextWithGoTo("navigation.portfolio.closedTrades") + .onAction(() -> model.dataModel.navigation.navigateTo(MainView.class, PortfolioView.class, ClosedTradesView.class)) + .dontShowAgainId("tradeCompleteWithdrawCompletedInfo") + .show(), 500, TimeUnit.MILLISECONDS); } }