diff --git a/gui/pom.xml b/gui/pom.xml index ddaf01f94b..5504ac17a3 100644 --- a/gui/pom.xml +++ b/gui/pom.xml @@ -141,5 +141,12 @@ Enzo 0.1.5 + + + \ No newline at end of file diff --git a/gui/src/main/java/io/bitsquare/gui/bitsquare.css b/gui/src/main/java/io/bitsquare/gui/bitsquare.css index 907f961a3a..28f5107421 100644 --- a/gui/src/main/java/io/bitsquare/gui/bitsquare.css +++ b/gui/src/main/java/io/bitsquare/gui/bitsquare.css @@ -31,7 +31,11 @@ bg color of non edit textFields: fafafa -fx-accent: #0f87c3; -bs-green: #00aa33; + -bs-green-soft: derive(-bs-green, 60%); -bs-error-red: #dd0000; + -bs-red-soft: derive(-bs-error-red, 60%); + -bs-orange: #dd8f05; + -bs-blue-transparent: #0f87c344; -bs-green-transparent: #00aa3344; @@ -146,7 +150,7 @@ bg color of non edit textFields: fafafa } .received-funds-icon { - -fx-text-fill: -bs-green; + -fx-text-fill: -bs-green-soft; -fx-cursor: hand; } @@ -156,7 +160,7 @@ bg color of non edit textFields: fafafa } .sent-funds-icon { - -fx-text-fill: -bs-error-red; + -fx-text-fill: -bs-red-soft; -fx-cursor: hand; } @@ -613,6 +617,65 @@ textfield */ -fx-background-radius: 3px, 3px, 2px, 1px; } +#open-support-button { + -fx-font-weight: bold; + -fx-font-size: 14; + -fx-base: -bs-orange; +} + +#open-dispute-button { + -fx-font-weight: bold; + -fx-font-size: 14; + -fx-base: #dd0000; +} + +#trade-notification-warning { + -fx-font-size: 14; + -fx-base: -bs-red-soft; +} + +#trade-notification-information { + -fx-font-size: 14; + -fx-outer-border: linear-gradient(to bottom, #ffb34b, #ff9200); +} + +#trade-notification-dispute { + -fx-font-size: 14; + -fx-base: -bs-error-red; +} + +#trade-notification-support { + -fx-font-size: 14; + -fx-base: -bs-orange; +} + +#support-info-label { + -fx-font-size: 14; + -fx-text-fill: -bs-red-soft; +} + +#titled-group-bg-warn { + -fx-body-color: linear-gradient(to bottom, -bs-content-bg-grey, #F0F0F0); + -fx-outer-border: linear-gradient(to bottom, #ffb34b, #ff9200); + -fx-background-color: -fx-shadow-highlight-color, + -fx-outer-border, + -fx-inner-border, + -fx-body-color; + -fx-background-insets: 0 0 -1 0, 0, 1, 2; + -fx-background-radius: 3px, 3px, 2px, 1px; +} + +#titled-group-bg-label-warn { + -fx-font-weight: bold; + -fx-font-size: 14; + -fx-text-fill: #ff9200; + -fx-background-color: -bs-content-bg-grey; +} + + + + + /* TitledGroupBg */ #titled-group-bg-label { -fx-font-weight: bold; diff --git a/gui/src/main/java/io/bitsquare/gui/components/AddressTextField.java b/gui/src/main/java/io/bitsquare/gui/components/AddressTextField.java index 7fa2877914..4d37f59e2c 100644 --- a/gui/src/main/java/io/bitsquare/gui/components/AddressTextField.java +++ b/gui/src/main/java/io/bitsquare/gui/components/AddressTextField.java @@ -62,20 +62,20 @@ public class AddressTextField extends AnchorPane { textField.setId("address-text-field"); textField.setEditable(false); textField.textProperty().bind(address); - Tooltip.install(textField, new Tooltip("Open your default bitcoin wallet with that address.")); - textField.setOnMouseClicked(mouseEvent -> { - try { - Utilities.openURI(URI.create(getBitcoinURI())); - } catch (Exception e) { - log.warn(e.getMessage()); - new Popup().warning("Opening a default bitcoin wallet application has failed. " + - "Perhaps you don't have one installed?").show(); - } - }); + String tooltipText = "Open your default bitcoin wallet"; + Tooltip.install(textField, new Tooltip(tooltipText)); + textField.setOnMouseClicked(mouseEvent -> openExtWallet()); textField.focusTraversableProperty().set(focusTraversableProperty().get()); //TODO app wide focus //focusedProperty().addListener((ov, oldValue, newValue) -> textField.requestFocus()); + Label extWalletIcon = new Label(); + extWalletIcon.setLayoutY(3); + extWalletIcon.getStyleClass().add("copy-icon"); + Tooltip.install(extWalletIcon, new Tooltip(tooltipText)); + AwesomeDude.setIcon(extWalletIcon, AwesomeIcon.SIGNIN); + extWalletIcon.setOnMouseClicked(e -> openExtWallet()); + Label copyIcon = new Label(); copyIcon.setLayoutY(3); copyIcon.getStyleClass().add("copy-icon"); @@ -121,10 +121,21 @@ public class AddressTextField extends AnchorPane { AnchorPane.setRightAnchor(qrCode, 5.0); AnchorPane.setRightAnchor(copyIcon, 30.0); - AnchorPane.setRightAnchor(textField, 55.0); + AnchorPane.setRightAnchor(extWalletIcon, 55.0); + AnchorPane.setRightAnchor(textField, 77.0); AnchorPane.setLeftAnchor(textField, 0.0); - getChildren().addAll(textField, copyIcon, qrCode); + getChildren().addAll(textField, extWalletIcon, copyIcon, qrCode); + } + + private void openExtWallet() { + try { + Utilities.openURI(URI.create(getBitcoinURI())); + } catch (Exception e) { + log.warn(e.getMessage()); + new Popup().warning("Opening a default bitcoin wallet application has failed. " + + "Perhaps you don't have one installed?").show(); + } } diff --git a/gui/src/main/java/io/bitsquare/gui/components/AddressWithIconAndDirection.java b/gui/src/main/java/io/bitsquare/gui/components/AddressWithIconAndDirection.java index 9a3974bf17..add6fec473 100644 --- a/gui/src/main/java/io/bitsquare/gui/components/AddressWithIconAndDirection.java +++ b/gui/src/main/java/io/bitsquare/gui/components/AddressWithIconAndDirection.java @@ -26,7 +26,6 @@ public class AddressWithIconAndDirection extends AnchorPane { directionIcon.setLayoutY(3); directionIcon.getStyleClass().add(received ? "received-funds-icon" : "sent-funds-icon"); AwesomeDude.setIcon(directionIcon, received ? AwesomeIcon.SIGNIN : AwesomeIcon.SIGNOUT); - directionIcon.setOpacity(0.7); directionIcon.setMouseTransparent(true); HBox hBox = new HBox(); @@ -48,6 +47,7 @@ public class AddressWithIconAndDirection extends AnchorPane { openLinkIcon = new Label(); openLinkIcon.setLayoutY(3); openLinkIcon.getStyleClass().add("external-link-icon"); + openLinkIcon.setOpacity(0.7); AwesomeDude.setIcon(openLinkIcon, awesomeIcon); AnchorPane.setLeftAnchor(directionIcon, 3.0); diff --git a/gui/src/main/java/io/bitsquare/gui/components/HyperlinkWithIcon.java b/gui/src/main/java/io/bitsquare/gui/components/HyperlinkWithIcon.java index 3b311e3e9a..44c5d38642 100644 --- a/gui/src/main/java/io/bitsquare/gui/components/HyperlinkWithIcon.java +++ b/gui/src/main/java/io/bitsquare/gui/components/HyperlinkWithIcon.java @@ -14,7 +14,7 @@ import javafx.scene.layout.Priority; public class HyperlinkWithIcon extends HBox { private final Hyperlink hyperlink; - private final Label openLinkIcon; + private final Label icon; public HyperlinkWithIcon(String text, AwesomeIcon awesomeIcon) { this(text, awesomeIcon, false); @@ -28,12 +28,13 @@ public class HyperlinkWithIcon extends HBox { setSpacing(5); hyperlink = new Hyperlink(text); - openLinkIcon = new Label(); - openLinkIcon.getStyleClass().add("external-link-icon"); + icon = new Label(); + icon.getStyleClass().add("external-link-icon"); - AwesomeDude.setIcon(openLinkIcon, awesomeIcon); - openLinkIcon.setMinWidth(20); - HBox.setMargin(openLinkIcon, new Insets(awesomeIcon == AwesomeIcon.INFO_SIGN ? 2 : 3, 0, 0, 0)); + AwesomeDude.setIcon(icon, awesomeIcon); + icon.setMinWidth(20); + icon.setOpacity(0.7); + HBox.setMargin(icon, new Insets(awesomeIcon == AwesomeIcon.INFO_SIGN ? 2 : 3, 0, 0, 0)); if (isCentered) { Pane spacer1 = new Pane(); @@ -44,20 +45,20 @@ public class HyperlinkWithIcon extends HBox { spacer2.setMaxWidth(Double.MAX_VALUE); HBox.setHgrow(spacer2, Priority.ALWAYS); - getChildren().addAll(spacer1, hyperlink, openLinkIcon, spacer2); + getChildren().addAll(spacer1, hyperlink, icon, spacer2); } else { - getChildren().addAll(hyperlink, openLinkIcon); + getChildren().addAll(hyperlink, icon); } } public void setOnAction(EventHandler handler) { hyperlink.setOnAction(handler); - openLinkIcon.setOnMouseClicked(e -> handler.handle(null)); + icon.setOnMouseClicked(e -> handler.handle(null)); } public void setTooltip(Tooltip tooltip) { hyperlink.setTooltip(tooltip); // TODO does not use the right style - openLinkIcon.setTooltip(tooltip); + icon.setTooltip(tooltip); } } diff --git a/gui/src/main/java/io/bitsquare/gui/components/TitledGroupBg.java b/gui/src/main/java/io/bitsquare/gui/components/TitledGroupBg.java index 6ed55eba38..b98316dcd3 100644 --- a/gui/src/main/java/io/bitsquare/gui/components/TitledGroupBg.java +++ b/gui/src/main/java/io/bitsquare/gui/components/TitledGroupBg.java @@ -26,6 +26,7 @@ import javafx.scene.layout.Pane; public class TitledGroupBg extends Pane { + private final Label label; private final StringProperty text = new SimpleStringProperty(); @@ -68,5 +69,8 @@ public class TitledGroupBg extends Pane { this.text.set(text); } + public Label getLabel() { + return label; + } } diff --git a/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/AliPayForm.java b/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/AliPayForm.java index b46db99c54..49726e1a0a 100644 --- a/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/AliPayForm.java +++ b/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/AliPayForm.java @@ -42,9 +42,7 @@ public class AliPayForm extends PaymentMethodForm { private InputTextField accountNrInputTextField; public static int addFormForBuyer(GridPane gridPane, int gridRow, PaymentAccountContractData paymentAccountContractData) { - addLabelTextField(gridPane, ++gridRow, "Payment method:", BSResources.get(paymentAccountContractData.getPaymentMethodName())); addLabelTextFieldWithCopyIcon(gridPane, ++gridRow, "Account nr.:", ((AliPayAccountContractData) paymentAccountContractData).getAccountNr()); - addAllowedPeriod(gridPane, ++gridRow, paymentAccountContractData); return gridRow; } @@ -72,7 +70,7 @@ public class AliPayForm extends PaymentMethodForm { @Override protected void autoFillNameTextField() { - if (autoFillCheckBox != null && autoFillCheckBox.isSelected()) { + if (useCustomAccountNameCheckBox != null && !useCustomAccountNameCheckBox.isSelected()) { String accountNr = accountNrInputTextField.getText(); accountNr = StringUtils.abbreviate(accountNr, 5); String method = BSResources.get(paymentAccount.getPaymentMethod().getId()); diff --git a/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/BlockChainForm.java b/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/BlockChainForm.java index c0f1c47943..5738e00bc1 100644 --- a/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/BlockChainForm.java +++ b/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/BlockChainForm.java @@ -49,13 +49,11 @@ public class BlockChainForm extends PaymentMethodForm { private ComboBox currencyComboBox; public static int addFormForBuyer(GridPane gridPane, int gridRow, PaymentAccountContractData paymentAccountContractData) { - addLabelTextField(gridPane, ++gridRow, "Payment method:", BSResources.get(paymentAccountContractData.getPaymentMethodName())); addLabelTextFieldWithCopyIcon(gridPane, ++gridRow, "Address:", ((BlockChainAccountContractData) paymentAccountContractData).getAddress()); if (paymentAccountContractData instanceof BlockChainAccountContractData && ((BlockChainAccountContractData) paymentAccountContractData).getPaymentId() != null) addLabelTextFieldWithCopyIcon(gridPane, ++gridRow, "Payment ID:", ((BlockChainAccountContractData) paymentAccountContractData).getPaymentId()); - addAllowedPeriod(gridPane, ++gridRow, paymentAccountContractData); return gridRow; } @@ -86,7 +84,7 @@ public class BlockChainForm extends PaymentMethodForm { @Override protected void autoFillNameTextField() { - if (autoFillCheckBox != null && autoFillCheckBox.isSelected()) { + if (useCustomAccountNameCheckBox != null && !useCustomAccountNameCheckBox.isSelected()) { String method = BSResources.get(paymentAccount.getPaymentMethod().getId()); String address = addressInputTextField.getText(); address = StringUtils.abbreviate(address, 9); diff --git a/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/OKPayForm.java b/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/OKPayForm.java index f6d5f3b366..689f3f6068 100644 --- a/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/OKPayForm.java +++ b/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/OKPayForm.java @@ -49,9 +49,7 @@ public class OKPayForm extends PaymentMethodForm { private InputTextField accountNrInputTextField; public static int addFormForBuyer(GridPane gridPane, int gridRow, PaymentAccountContractData paymentAccountContractData) { - addLabelTextField(gridPane, ++gridRow, "Payment method:", BSResources.get(paymentAccountContractData.getPaymentMethodName())); addLabelTextFieldWithCopyIcon(gridPane, ++gridRow, "Account nr.:", ((OKPayAccountContractData) paymentAccountContractData).getAccountNr()); - addAllowedPeriod(gridPane, ++gridRow, paymentAccountContractData); return gridRow; } @@ -116,7 +114,7 @@ public class OKPayForm extends PaymentMethodForm { @Override protected void autoFillNameTextField() { - if (autoFillCheckBox != null && autoFillCheckBox.isSelected()) { + if (useCustomAccountNameCheckBox != null && !useCustomAccountNameCheckBox.isSelected()) { String accountNr = accountNrInputTextField.getText(); accountNr = StringUtils.abbreviate(accountNr, 5); String method = BSResources.get(paymentAccount.getPaymentMethod().getId()); diff --git a/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/PaymentMethodForm.java b/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/PaymentMethodForm.java index 0f020e1bb0..bc99ee858c 100644 --- a/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/PaymentMethodForm.java +++ b/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/PaymentMethodForm.java @@ -48,7 +48,7 @@ public abstract class PaymentMethodForm { protected int gridRowFrom; protected InputTextField accountNameTextField; - protected CheckBox autoFillCheckBox; + protected CheckBox useCustomAccountNameCheckBox; private ComboBox currencyComboBox; public PaymentMethodForm(PaymentAccount paymentAccount, InputValidator inputValidator, GridPane gridPane, int gridRow) { @@ -80,7 +80,7 @@ public abstract class PaymentMethodForm { } protected void addAccountNameTextFieldWithAutoFillCheckBox() { - Tuple3 tuple = addLabelInputTextFieldCheckBox(gridPane, ++gridRow, "Account name:", "Auto-fill"); + Tuple3 tuple = addLabelInputTextFieldCheckBox(gridPane, ++gridRow, "Account name:", "Use custom account name"); accountNameTextField = tuple.second; accountNameTextField.setPrefWidth(250); accountNameTextField.setEditable(false); @@ -89,23 +89,29 @@ public abstract class PaymentMethodForm { paymentAccount.setAccountName(newValue); updateAllInputsValid(); }); - autoFillCheckBox = tuple.third; - autoFillCheckBox.setSelected(true); - autoFillCheckBox.setOnAction(e -> { - accountNameTextField.setEditable(!autoFillCheckBox.isSelected()); + useCustomAccountNameCheckBox = tuple.third; + useCustomAccountNameCheckBox.setSelected(false); + useCustomAccountNameCheckBox.setOnAction(e -> { + accountNameTextField.setEditable(useCustomAccountNameCheckBox.isSelected()); autoFillNameTextField(); }); } - static void addAllowedPeriod(GridPane gridPane, int gridRow, PaymentAccountContractData paymentAccountContractData) { + public static void addAllowedPeriod(GridPane gridPane, int gridRow, + PaymentAccountContractData paymentAccountContractData, String dateFromBlocks) { long hours = paymentAccountContractData.getMaxTradePeriod() / 6; - String displayText = hours + " hours"; + String displayText; + if (hours == 1) + displayText = hours + " hour"; + else + displayText = hours + " hours"; if (hours == 24) displayText = "1 day"; if (hours > 24) displayText = hours / 24 + " days"; - addLabelTextField(gridPane, gridRow, "Max. allowed trade period:", displayText); + + addLabelTextField(gridPane, gridRow, "Trade period/end date:", displayText + " / " + dateFromBlocks); } protected void addAllowedPeriod() { @@ -118,9 +124,9 @@ public abstract class PaymentMethodForm { else if (hours > 24) displayText = hours / 24 + " days"; - displayText += " (Max. permitted period until the trade needs to be completed)"; + displayText += " (Max. permitted period until the trade has to be completed)"; - addLabelTextField(gridPane, ++gridRow, "Max. permitted trade period:", displayText); + addLabelTextField(gridPane, ++gridRow, "Allowed trade period:", displayText); } abstract protected void autoFillNameTextField(); diff --git a/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/PerfectMoneyForm.java b/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/PerfectMoneyForm.java index 1420b1e28f..5dcefa14fd 100644 --- a/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/PerfectMoneyForm.java +++ b/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/PerfectMoneyForm.java @@ -42,9 +42,7 @@ public class PerfectMoneyForm extends PaymentMethodForm { private InputTextField accountNrInputTextField; public static int addFormForBuyer(GridPane gridPane, int gridRow, PaymentAccountContractData paymentAccountContractData) { - addLabelTextField(gridPane, ++gridRow, "Payment method:", BSResources.get(paymentAccountContractData.getPaymentMethodName())); addLabelTextFieldWithCopyIcon(gridPane, ++gridRow, "Account nr.:", ((PerfectMoneyAccountContractData) paymentAccountContractData).getAccountNr()); - addAllowedPeriod(gridPane, ++gridRow, paymentAccountContractData); return gridRow; } @@ -74,7 +72,7 @@ public class PerfectMoneyForm extends PaymentMethodForm { @Override protected void autoFillNameTextField() { - if (autoFillCheckBox != null && autoFillCheckBox.isSelected()) { + if (useCustomAccountNameCheckBox != null && !useCustomAccountNameCheckBox.isSelected()) { String accountNr = accountNrInputTextField.getText(); accountNr = StringUtils.abbreviate(accountNr, 5); String method = BSResources.get(paymentAccount.getPaymentMethod().getId()); diff --git a/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/SepaForm.java b/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/SepaForm.java index 31b02b3bd6..6e5f91925a 100644 --- a/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/SepaForm.java +++ b/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/SepaForm.java @@ -58,12 +58,10 @@ public class SepaForm extends PaymentMethodForm { private final List nonEuroCountryCheckBoxes = new ArrayList<>(); public static int addFormForBuyer(GridPane gridPane, int gridRow, PaymentAccountContractData paymentAccountContractData) { - addLabelTextField(gridPane, ++gridRow, "Payment method:", BSResources.get(paymentAccountContractData.getPaymentMethodName())); addLabelTextFieldWithCopyIcon(gridPane, ++gridRow, "Account holder name:", ((SepaAccountContractData) paymentAccountContractData).getHolderName()); addLabelTextFieldWithCopyIcon(gridPane, ++gridRow, "Country of bank:", CountryUtil.getNameByCode(paymentAccountContractData.getCountryCode())); addLabelTextFieldWithCopyIcon(gridPane, ++gridRow, "IBAN:", ((SepaAccountContractData) paymentAccountContractData).getIban()); addLabelTextFieldWithCopyIcon(gridPane, ++gridRow, "BIC/SWIFT:", ((SepaAccountContractData) paymentAccountContractData).getBic()); - addAllowedPeriod(gridPane, ++gridRow, paymentAccountContractData); return gridRow; } @@ -218,7 +216,7 @@ public class SepaForm extends PaymentMethodForm { @Override protected void autoFillNameTextField() { - if (autoFillCheckBox != null && autoFillCheckBox.isSelected()) { + if (useCustomAccountNameCheckBox != null && !useCustomAccountNameCheckBox.isSelected()) { String iban = ibanInputTextField.getText(); if (iban.length() > 5) iban = StringUtils.abbreviate(iban, 5); diff --git a/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/SwishForm.java b/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/SwishForm.java index 28c97a199f..affd00d380 100644 --- a/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/SwishForm.java +++ b/gui/src/main/java/io/bitsquare/gui/components/paymentmethods/SwishForm.java @@ -43,10 +43,8 @@ public class SwishForm extends PaymentMethodForm { private InputTextField mobileNrInputTextField; public static int addFormForBuyer(GridPane gridPane, int gridRow, PaymentAccountContractData paymentAccountContractData) { - addLabelTextField(gridPane, ++gridRow, "Payment method:", BSResources.get(paymentAccountContractData.getPaymentMethodName())); addLabelTextField(gridPane, ++gridRow, "Account holder name:", ((SwishAccountContractData) paymentAccountContractData).getHolderName()); addLabelTextField(gridPane, ++gridRow, "Mobile nr.:", ((SwishAccountContractData) paymentAccountContractData).getMobileNr()); - addAllowedPeriod(gridPane, ++gridRow, paymentAccountContractData); return gridRow; } @@ -81,7 +79,7 @@ public class SwishForm extends PaymentMethodForm { @Override protected void autoFillNameTextField() { - if (autoFillCheckBox != null && autoFillCheckBox.isSelected()) { + if (useCustomAccountNameCheckBox != null && !useCustomAccountNameCheckBox.isSelected()) { String mobileNr = mobileNrInputTextField.getText(); mobileNr = StringUtils.abbreviate(mobileNr, 5); String method = BSResources.get(paymentAccount.getPaymentMethod().getId()); diff --git a/gui/src/main/java/io/bitsquare/gui/main/MainViewModel.java b/gui/src/main/java/io/bitsquare/gui/main/MainViewModel.java index 5feaeac7d4..a759b36ae5 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/MainViewModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/MainViewModel.java @@ -116,7 +116,7 @@ public class MainViewModel implements ViewModel { private final String btcNetworkAsString; final StringProperty p2PNetworkLabelId = new SimpleStringProperty("footer-pane"); - private MonadicBinding allServicesDone; + private MonadicBinding allServicesDone, tradesAndUIReady; private final User user; private int numBTCPeers = 0; private Timer checkForBtcSyncStateTimer; @@ -383,18 +383,13 @@ public class MainViewModel implements ViewModel { walletPasswordPopup.onAesKey(aesKey -> tradeWalletService.setAesKey(aesKey)).show(); } - if (tradeManager.pendingTradesInitializedProperty().get() && isSplashScreenRemoved.get()) - applyTradePeriodState(); - else { - isSplashScreenRemoved.addListener((observable, oldValue, newValue) -> { - if (tradeManager.pendingTradesInitializedProperty().get() && isSplashScreenRemoved.get()) - applyTradePeriodState(); - }); - tradeManager.pendingTradesInitializedProperty().addListener((observable, oldValue, newValue) -> { - if (tradeManager.pendingTradesInitializedProperty().get() && isSplashScreenRemoved.get()) - applyTradePeriodState(); - }); - } + // We handle the trade period here as we display a global popup if we reached dispute time + tradesAndUIReady = EasyBind.combine(isSplashScreenRemoved, tradeManager.pendingTradesInitializedProperty(), (a, b) -> a && b); + tradesAndUIReady.subscribe((observable, oldValue, newValue) -> { + if (newValue) + applyTradePeriodState(); + }); + walletService.addBalanceListener(new BalanceListener() { @Override public void onBalanceChanged(Coin balance) { @@ -445,7 +440,7 @@ public class MainViewModel implements ViewModel { "when using Mainnet.") .headLine("Important information!") .actionButtonText("I understand and want to use Mainnet") - .closeButtonText("Use Testnet and restart") + .closeButtonText("Restart and use Testnet") .onClose(() -> { UserThread.execute(() -> preferences.setBitcoinNetwork(BitcoinNetwork.TESTNET)); UserThread.runAfter(BitsquareApp.shutDownHandler::run, 300, TimeUnit.MILLISECONDS); @@ -644,28 +639,40 @@ public class MainViewModel implements ViewModel { private void updateTradePeriodState() { tradeManager.getTrades().stream().forEach(trade -> { int bestChainHeight = tradeWalletService.getBestChainHeight(); - if (trade.getCheckPaymentTimeAsBlockHeight() > 0 && bestChainHeight >= trade.getCheckPaymentTimeAsBlockHeight()) - trade.setTradePeriodState(Trade.TradePeriodState.HALF_REACHED); if (trade.getOpenDisputeTimeAsBlockHeight() > 0 && bestChainHeight >= trade.getOpenDisputeTimeAsBlockHeight()) trade.setTradePeriodState(Trade.TradePeriodState.TRADE_PERIOD_OVER); + else if (trade.getCheckPaymentTimeAsBlockHeight() > 0 && bestChainHeight >= trade.getCheckPaymentTimeAsBlockHeight()) + trade.setTradePeriodState(Trade.TradePeriodState.HALF_REACHED); + String id; + String limitDate = formatter.addBlocksToNowDateFormatted(trade.getOpenDisputeTimeAsBlockHeight() - tradeWalletService.getBestChainHeight()); switch (trade.getTradePeriodState()) { case NORMAL: break; case HALF_REACHED: - if (!trade.isHalfTradePeriodReachedWarningDisplayed()) { + id = "displayHalfTradePeriodOver" + trade.getId(); + if (preferences.showAgain(id)) { new Popup().warning("Your trade with ID " + trade.getShortId() + " has reached the half of the max. allowed trading period and " + - "is still not completed.\nPlease check your trade state at \"Portfolio/Open trades\" for further information.").show(); - trade.setHalfTradePeriodReachedWarningDisplayed(true); + "is still not completed.\n\n" + + "The trade period ends on " + limitDate + "\n\n" + + "Please check your trade state at \"Portfolio/Open trades\" for further information.") + .onClose(() -> preferences.dontShowAgain(id)) + .show(); } break; case TRADE_PERIOD_OVER: - if (!trade.isTradePeriodOverWarningDisplayed()) { - new Popup().warning("Your trade with ID " + trade.getShortId() + " has reached the max. allowed trading period and is " + - "not completed.\nPlease check your trade at \"Portfolio/Open trades\" for contacting the arbitrator.").show(); - trade.setTradePeriodOverWarningDisplayed(true); + id = "displayTradePeriodOver" + trade.getId(); + if (preferences.showAgain(id)) { + new Popup().warning("Your trade with ID " + trade.getShortId() + + " has reached the max. allowed trading period and is " + + "not completed.\n\n" + + "The trade period ended on " + limitDate + "\n\n" + + "Please check your trade at \"Portfolio/Open trades\" for contacting " + + "the arbitrator.") + .onClose(() -> preferences.dontShowAgain(id)) + .show(); } break; } diff --git a/gui/src/main/java/io/bitsquare/gui/main/account/content/arbitratorselection/ArbitratorSelectionView.java b/gui/src/main/java/io/bitsquare/gui/main/account/content/arbitratorselection/ArbitratorSelectionView.java index 7a04962f14..d4aed9aa6b 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/account/content/arbitratorselection/ArbitratorSelectionView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/account/content/arbitratorselection/ArbitratorSelectionView.java @@ -187,7 +187,7 @@ public class ArbitratorSelectionView extends ActivatableViewAndModel + @@ -37,7 +38,6 @@ - @@ -56,7 +56,8 @@