diff --git a/core/src/main/java/bisq/core/payment/AustraliaPayid.java b/core/src/main/java/bisq/core/payment/AustraliaPayid.java new file mode 100644 index 00000000000..a64c62b42ac --- /dev/null +++ b/core/src/main/java/bisq/core/payment/AustraliaPayid.java @@ -0,0 +1,53 @@ +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package bisq.core.payment; + +import bisq.core.locale.FiatCurrency; +import bisq.core.payment.payload.AustraliaPayidPayload; +import bisq.core.payment.payload.PaymentAccountPayload; +import bisq.core.payment.payload.PaymentMethod; + +public final class AustraliaPayid extends PaymentAccount { + public AustraliaPayid() { + super(PaymentMethod.AUSTRALIA_PAYID); + setSingleTradeCurrency(new FiatCurrency("AUD")); + } + + @Override + protected PaymentAccountPayload createPayload() { + return new AustraliaPayidPayload(paymentMethod.getId(), id); + } + + public String getPayid() { + return ((AustraliaPayidPayload) paymentAccountPayload).getPayid(); + } + + public void setPayid(String payid) { + if (payid == null) payid = ""; + ((AustraliaPayidPayload) paymentAccountPayload).setPayid(payid); + } + + public String getBankAccountName() { + return ((AustraliaPayidPayload) paymentAccountPayload).getBankAccountName(); + } + + public void setBankAccountName(String bankAccountName) { + if (bankAccountName == null) bankAccountName = ""; + ((AustraliaPayidPayload) paymentAccountPayload).setBankAccountName(bankAccountName); + } +} diff --git a/core/src/main/java/bisq/core/payment/PaymentAccountFactory.java b/core/src/main/java/bisq/core/payment/PaymentAccountFactory.java index 9cf7972f8a1..71c52a82711 100644 --- a/core/src/main/java/bisq/core/payment/PaymentAccountFactory.java +++ b/core/src/main/java/bisq/core/payment/PaymentAccountFactory.java @@ -46,6 +46,8 @@ public static PaymentAccount getPaymentAccount(PaymentMethod paymentMethod) { return new SpecificBanksAccount(); case PaymentMethod.JAPAN_BANK_ID: return new JapanBankAccount(); + case PaymentMethod.AUSTRALIA_PAYID_ID: + return new AustraliaPayid(); case PaymentMethod.ALI_PAY_ID: return new AliPayAccount(); case PaymentMethod.WECHAT_PAY_ID: diff --git a/core/src/main/java/bisq/core/payment/payload/AustraliaPayidPayload.java b/core/src/main/java/bisq/core/payment/payload/AustraliaPayidPayload.java new file mode 100644 index 00000000000..50539cd4c0a --- /dev/null +++ b/core/src/main/java/bisq/core/payment/payload/AustraliaPayidPayload.java @@ -0,0 +1,113 @@ +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package bisq.core.payment.payload; + +import bisq.core.locale.Res; + +import bisq.common.util.CollectionUtils; + +import com.google.protobuf.Message; + +import java.nio.charset.StandardCharsets; + +import java.util.HashMap; +import java.util.Map; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; + +@EqualsAndHashCode(callSuper = true) +@ToString +@Setter +@Getter +@Slf4j +public final class AustraliaPayidPayload extends PaymentAccountPayload { + private String payid = ""; + private String bankAccountName = ""; + + public AustraliaPayidPayload(String paymentMethod, String id) { + super(paymentMethod, id); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // PROTO BUFFER + /////////////////////////////////////////////////////////////////////////////////////////// + + private AustraliaPayidPayload(String paymentMethod, + String id, + String payid, + String bankAccountName, + long maxTradePeriod, + Map excludeFromJsonDataMap) { + super(paymentMethod, + id, + maxTradePeriod, + excludeFromJsonDataMap); + + this.payid = payid; + this.bankAccountName = bankAccountName; + } + + @Override + public Message toProtoMessage() { + return getPaymentAccountPayloadBuilder() + .setAustraliaPayidPayload( + protobuf.AustraliaPayidPayload.newBuilder() + .setPayid(payid) + .setBankAccountName(bankAccountName) + ).build(); + } + + public static AustraliaPayidPayload fromProto(protobuf.PaymentAccountPayload proto) { + protobuf.AustraliaPayidPayload AustraliaPayidPayload = proto.getAustraliaPayidPayload(); + return new AustraliaPayidPayload(proto.getPaymentMethodId(), + proto.getId(), + AustraliaPayidPayload.getPayid(), + AustraliaPayidPayload.getBankAccountName(), + proto.getMaxTradePeriod(), + CollectionUtils.isEmpty(proto.getExcludeFromJsonDataMap()) ? null : new HashMap<>(proto.getExcludeFromJsonDataMap())); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // API + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public String getPaymentDetails() { + return Res.get(paymentMethodId) + " - " + getPaymentDetailsForTradePopup().replace("\n", ", "); + } + + @Override + public String getPaymentDetailsForTradePopup() { + return + Res.get("payment.australia.payid") + ": " + payid + "\n" + + Res.get("payment.account.owner") + ": " + bankAccountName; + } + + + @Override + public byte[] getAgeWitnessInputData() { + String all = this.payid + this.bankAccountName; + return super.getAgeWitnessInputData(all.getBytes(StandardCharsets.UTF_8)); + } +} diff --git a/core/src/main/java/bisq/core/payment/payload/PaymentMethod.java b/core/src/main/java/bisq/core/payment/payload/PaymentMethod.java index a590b8f8557..f7520aa1a9b 100644 --- a/core/src/main/java/bisq/core/payment/payload/PaymentMethod.java +++ b/core/src/main/java/bisq/core/payment/payload/PaymentMethod.java @@ -74,6 +74,7 @@ public final class PaymentMethod implements PersistablePayload, Comparable. + */ + +package bisq.desktop.components.paymentmethods; + +import bisq.desktop.components.InputTextField; +import bisq.desktop.util.FormBuilder; +import bisq.desktop.util.Layout; +import bisq.desktop.util.validation.AustraliaPayidValidator; + +import bisq.core.account.witness.AccountAgeWitnessService; +import bisq.core.locale.Res; +import bisq.core.locale.TradeCurrency; +import bisq.core.payment.AustraliaPayid; +import bisq.core.payment.PaymentAccount; +import bisq.core.payment.payload.AustraliaPayidPayload; +import bisq.core.payment.payload.PaymentAccountPayload; +import bisq.core.util.coin.CoinFormatter; +import bisq.core.util.validation.InputValidator; + +import javafx.scene.control.TextField; +import javafx.scene.layout.GridPane; + +import static bisq.desktop.util.FormBuilder.addCompactTopLabelTextField; +import static bisq.desktop.util.FormBuilder.addTopLabelTextField; + +public class AustraliaPayidForm extends PaymentMethodForm { + private final AustraliaPayid australiaPayid; + private final AustraliaPayidValidator australiaPayidValidator; + private InputTextField mobileNrInputTextField; + + public static int addFormForBuyer(GridPane gridPane, int gridRow, PaymentAccountPayload paymentAccountPayload) { + addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("payment.account.owner"), + ((AustraliaPayidPayload) paymentAccountPayload).getBankAccountName()); + addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("payment.payid"), + ((AustraliaPayidPayload) paymentAccountPayload).getPayid()); + return gridRow; + } + + public AustraliaPayidForm(PaymentAccount paymentAccount, + AccountAgeWitnessService accountAgeWitnessService, + AustraliaPayidValidator australiaPayidValidator, + InputValidator inputValidator, + GridPane gridPane, + int gridRow, + CoinFormatter formatter) { + super(paymentAccount, accountAgeWitnessService, inputValidator, gridPane, gridRow, formatter); + this.australiaPayid = (AustraliaPayid) paymentAccount; + this.australiaPayidValidator = australiaPayidValidator; + } + + @Override + public void addFormForAddAccount() { + gridRowFrom = gridRow + 1; + + InputTextField holderNameInputTextField = FormBuilder.addInputTextField(gridPane, ++gridRow, + Res.get("payment.account.owner")); + holderNameInputTextField.setValidator(inputValidator); + holderNameInputTextField.textProperty().addListener((ov, oldValue, newValue) -> { + australiaPayid.setBankAccountName(newValue); + updateFromInputs(); + }); + + mobileNrInputTextField = FormBuilder.addInputTextField(gridPane, ++gridRow, Res.get("payment.payid")); + mobileNrInputTextField.setValidator(australiaPayidValidator); + mobileNrInputTextField.textProperty().addListener((ov, oldValue, newValue) -> { + australiaPayid.setPayid(newValue); + updateFromInputs(); + }); + + TradeCurrency singleTradeCurrency = australiaPayid.getSingleTradeCurrency(); + String nameAndCode = singleTradeCurrency != null ? singleTradeCurrency.getNameAndCode() : "null"; + addTopLabelTextField(gridPane, ++gridRow, Res.get("shared.currency"), nameAndCode); + addLimitations(false); + addAccountNameTextFieldWithAutoFillToggleButton(); + } + + @Override + protected void autoFillNameTextField() { + setAccountNameWithString(mobileNrInputTextField.getText()); + } + + @Override + public void addFormForDisplayAccount() { + gridRowFrom = gridRow; + addTopLabelTextField(gridPane, gridRow, Res.get("payment.account.name"), + australiaPayid.getAccountName(), Layout.FIRST_ROW_AND_GROUP_DISTANCE); + addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("shared.paymentMethod"), + Res.get(australiaPayid.getPaymentMethod().getId())); + addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("payment.payid"), + australiaPayid.getPayid()); + TextField field = addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("payment.account.owner"), + australiaPayid.getBankAccountName()).second; + field.setMouseTransparent(false); + TradeCurrency singleTradeCurrency = australiaPayid.getSingleTradeCurrency(); + String nameAndCode = singleTradeCurrency != null ? singleTradeCurrency.getNameAndCode() : "null"; + addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("shared.currency"), nameAndCode); + addLimitations(true); + } + + @Override + public void updateAllInputsValid() { + allInputsValid.set(isAccountNameValid() + && australiaPayidValidator.validate(australiaPayid.getPayid()).isValid + && inputValidator.validate(australiaPayid.getBankAccountName()).isValid + && australiaPayid.getTradeCurrencies().size() > 0); + } +} diff --git a/desktop/src/main/java/bisq/desktop/main/account/content/fiataccounts/FiatAccountsView.java b/desktop/src/main/java/bisq/desktop/main/account/content/fiataccounts/FiatAccountsView.java index e111fb2dc73..7574a28371f 100644 --- a/desktop/src/main/java/bisq/desktop/main/account/content/fiataccounts/FiatAccountsView.java +++ b/desktop/src/main/java/bisq/desktop/main/account/content/fiataccounts/FiatAccountsView.java @@ -21,6 +21,7 @@ import bisq.desktop.components.TitledGroupBg; import bisq.desktop.components.paymentmethods.AdvancedCashForm; import bisq.desktop.components.paymentmethods.AliPayForm; +import bisq.desktop.components.paymentmethods.AustraliaPayidForm; import bisq.desktop.components.paymentmethods.CashDepositForm; import bisq.desktop.components.paymentmethods.ChaseQuickPayForm; import bisq.desktop.components.paymentmethods.ClearXchangeForm; @@ -54,6 +55,7 @@ import bisq.desktop.util.Layout; import bisq.desktop.util.validation.AdvancedCashValidator; import bisq.desktop.util.validation.AliPayValidator; +import bisq.desktop.util.validation.AustraliaPayidValidator; import bisq.desktop.util.validation.BICValidator; import bisq.desktop.util.validation.ChaseQuickPayValidator; import bisq.desktop.util.validation.ClearXchangeValidator; @@ -76,6 +78,7 @@ import bisq.core.account.witness.AccountAgeWitnessService; import bisq.core.locale.Res; import bisq.core.offer.OfferRestrictions; +import bisq.core.payment.AustraliaPayid; import bisq.core.payment.CashDepositAccount; import bisq.core.payment.ClearXchangeAccount; import bisq.core.payment.F2FAccount; @@ -139,6 +142,7 @@ public class FiatAccountsView extends PaymentAccountsView doSaveNewAccount(paymentAccount)) .show(); + } else if (paymentAccount instanceof AustraliaPayid) { + new Popup().information(Res.get("payment.payid.info", currencyName, currencyName)) + .width(900) + .closeButtonText(Res.get("shared.cancel")) + .actionButtonText(Res.get("shared.iConfirm")) + .onAction(() -> doSaveNewAccount(paymentAccount)) + .show(); } else { doSaveNewAccount(paymentAccount); } @@ -457,6 +470,8 @@ private PaymentMethodForm getPaymentMethodForm(PaymentMethod paymentMethod, Paym return new SpecificBankForm(paymentAccount, accountAgeWitnessService, inputValidator, root, gridRow, formatter); case PaymentMethod.JAPAN_BANK_ID: return new JapanBankTransferForm(paymentAccount, accountAgeWitnessService, japanBankTransferValidator, inputValidator, root, gridRow, formatter); + case PaymentMethod.AUSTRALIA_PAYID_ID: + return new AustraliaPayidForm(paymentAccount, accountAgeWitnessService, australiapayidValidator, inputValidator, root, gridRow, formatter); case PaymentMethod.ALI_PAY_ID: return new AliPayForm(paymentAccount, accountAgeWitnessService, aliPayValidator, inputValidator, root, gridRow, formatter); case PaymentMethod.WECHAT_PAY_ID: diff --git a/desktop/src/main/java/bisq/desktop/util/validation/AustraliaPayidAccountNameValidator.java b/desktop/src/main/java/bisq/desktop/util/validation/AustraliaPayidAccountNameValidator.java new file mode 100644 index 00000000000..4c6635e85ab --- /dev/null +++ b/desktop/src/main/java/bisq/desktop/util/validation/AustraliaPayidAccountNameValidator.java @@ -0,0 +1,51 @@ + +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package bisq.desktop.util.validation; + +import bisq.core.util.validation.InputValidator; +import bisq.core.util.validation.RegexValidator; + +import javax.inject.Inject; + +public final class AustraliaPayidAccountNameValidator extends InputValidator { + @Override + public ValidationResult validate(String input) { + ValidationResult result = super.validate(input); + + if (result.isValid) + result = lengthValidator.validate(input); + if (result.isValid) + result = regexValidator.validate(input); + + return result; + } + + private final LengthValidator lengthValidator; + private final RegexValidator regexValidator; + + @Inject + public AustraliaPayidAccountNameValidator(LengthValidator lengthValidator, RegexValidator regexValidator) { + + lengthValidator.setMinLength(1); + lengthValidator.setMaxLength(40); + this.lengthValidator = lengthValidator; + + this.regexValidator = regexValidator; + } +} diff --git a/desktop/src/main/java/bisq/desktop/util/validation/AustraliaPayidValidator.java b/desktop/src/main/java/bisq/desktop/util/validation/AustraliaPayidValidator.java new file mode 100644 index 00000000000..62ddc30cc90 --- /dev/null +++ b/desktop/src/main/java/bisq/desktop/util/validation/AustraliaPayidValidator.java @@ -0,0 +1,56 @@ +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package bisq.desktop.util.validation; + +import bisq.core.util.validation.InputValidator; + +public final class AustraliaPayidValidator extends InputValidator { + + private final EmailValidator emailValidator; + + /////////////////////////////////////////////////////////////////////////////////////////// + // Public methods + /////////////////////////////////////////////////////////////////////////////////////////// + + public AustraliaPayidValidator() { + emailValidator = new EmailValidator(); + } + + @Override + public ValidationResult validate(String input) { + ValidationResult result = validateIfNotEmpty(input); + if (!result.isValid) { + return result; + } else { + ValidationResult emailResult = emailValidator.validate(input); + if (emailResult.isValid) + return emailResult; + else + return validatePhoneNumber(input); + } + } + + /////////////////////////////////////////////////////////////////////////////////////////// + // Private methods + /////////////////////////////////////////////////////////////////////////////////////////// + + // TODO not impl yet -> see InteracETransferValidator + private ValidationResult validatePhoneNumber(String input) { + return super.validate(input); + } +} diff --git a/proto/src/main/proto/pb.proto b/proto/src/main/proto/pb.proto index 55e6a8df391..f84329db5e0 100644 --- a/proto/src/main/proto/pb.proto +++ b/proto/src/main/proto/pb.proto @@ -933,6 +933,7 @@ message PaymentAccountPayload { InstantCryptoCurrencyAccountPayload instant_crypto_currency_account_payload = 27; JapanBankAccountPayload japan_bank_account_payload = 28; TransferwiseAccountPayload Transferwise_account_payload = 29; + AustraliaPayidPayload australia_payid_payload = 30; } map exclude_from_json_data = 15; } @@ -1000,6 +1001,11 @@ message JapanBankAccountPayload { string bank_account_number = 7; } +message AustraliaPayidPayload { + string bank_account_name = 1; + string payid = 2; +} + message SpecificBanksAccountPayload { repeated string accepted_banks = 1; }