From 39d048fd5e4f177daee298aad16c67187dd6a98b Mon Sep 17 00:00:00 2001 From: m2049r Date: Sun, 27 Jan 2019 21:32:06 +0100 Subject: [PATCH] Feature bitpay (#525) * support bitcoin payment protocol (BIP70/72) * prep translations --- .../java/com/m2049r/xmrwallet/TxFragment.java | 2 +- .../com/m2049r/xmrwallet/WalletActivity.java | 4 +- .../m2049r/xmrwallet/data/BarcodeData.java | 126 +++++++----- .../com/m2049r/xmrwallet/data/TxData.java | 3 - .../com/m2049r/xmrwallet/data/TxDataBtc.java | 17 +- .../xmrwallet/{util => data}/UserNotes.java | 2 +- .../send/SendAddressWizardFragment.java | 179 ++++++++++++++---- .../send/SendBtcAmountWizardFragment.java | 16 +- .../send/SendBtcConfirmWizardFragment.java | 14 +- .../send/SendConfirmWizardFragment.java | 2 +- .../xmrwallet/fragment/send/SendFragment.java | 3 +- .../layout/TransactionInfoAdapter.java | 2 +- .../xmrwallet/util/PaymentProtocolHelper.java | 102 ++++++++++ .../m2049r/xmrwallet/xmrto/XmrToError.java | 30 ++- .../xmrwallet/xmrto/api/CreateOrder.java | 2 + .../m2049r/xmrwallet/xmrto/api/XmrToApi.java | 7 + .../xmrto/network/CreateOrderImpl.java | 40 +++- .../xmrwallet/xmrto/network/XmrToApiImpl.java | 7 + .../main/res/layout/fragment_send_address.xml | 17 +- app/src/main/res/values-de/help.xml | 22 ++- app/src/main/res/values-de/strings.xml | 11 +- app/src/main/res/values-el/help.xml | 12 +- app/src/main/res/values-el/strings.xml | 11 +- app/src/main/res/values-es/help.xml | 12 +- app/src/main/res/values-es/strings.xml | 13 +- app/src/main/res/values-et/help.xml | 10 +- app/src/main/res/values-et/strings.xml | 12 +- app/src/main/res/values-fr/help.xml | 12 +- app/src/main/res/values-fr/strings.xml | 12 +- app/src/main/res/values-hu/help.xml | 12 +- app/src/main/res/values-hu/strings.xml | 11 +- app/src/main/res/values-it/help.xml | 12 +- app/src/main/res/values-it/strings.xml | 12 +- app/src/main/res/values-ja/help.xml | 13 +- app/src/main/res/values-ja/strings.xml | 12 +- app/src/main/res/values-nb/help.xml | 12 +- app/src/main/res/values-nb/strings.xml | 11 +- app/src/main/res/values-nl/help.xml | 12 +- app/src/main/res/values-nl/strings.xml | 12 +- app/src/main/res/values-pt-rBR/help.xml | 12 +- app/src/main/res/values-pt-rBR/strings.xml | 11 +- app/src/main/res/values-pt/help.xml | 12 +- app/src/main/res/values-pt/strings.xml | 11 +- app/src/main/res/values-ro/help.xml | 12 +- app/src/main/res/values-ro/strings.xml | 11 +- app/src/main/res/values-ru/help.xml | 12 +- app/src/main/res/values-ru/strings.xml | 12 +- app/src/main/res/values-sk/help.xml | 15 +- app/src/main/res/values-sk/strings.xml | 12 +- app/src/main/res/values-sv/help.xml | 12 +- app/src/main/res/values-sv/strings.xml | 12 +- app/src/main/res/values-ua/strings.xml | 12 +- app/src/main/res/values-zh-rCN/help.xml | 12 +- app/src/main/res/values-zh-rCN/strings.xml | 11 +- app/src/main/res/values-zh-rTW/help.xml | 12 +- app/src/main/res/values-zh-rTW/strings.xml | 12 +- app/src/main/res/values/help.xml | 8 +- app/src/main/res/values/strings.xml | 13 +- .../m2049r/xmrwallet/util/UserNoteTest.java | 2 + 59 files changed, 872 insertions(+), 175 deletions(-) rename app/src/main/java/com/m2049r/xmrwallet/{util => data}/UserNotes.java (98%) create mode 100644 app/src/main/java/com/m2049r/xmrwallet/util/PaymentProtocolHelper.java diff --git a/app/src/main/java/com/m2049r/xmrwallet/TxFragment.java b/app/src/main/java/com/m2049r/xmrwallet/TxFragment.java index 8fbb90f..4f83123 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/TxFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/TxFragment.java @@ -36,7 +36,7 @@ import com.m2049r.xmrwallet.model.TransactionInfo; import com.m2049r.xmrwallet.model.Transfer; import com.m2049r.xmrwallet.model.Wallet; import com.m2049r.xmrwallet.util.Helper; -import com.m2049r.xmrwallet.util.UserNotes; +import com.m2049r.xmrwallet.data.UserNotes; import com.m2049r.xmrwallet.widget.Toolbar; import java.text.SimpleDateFormat; diff --git a/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java b/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java index a077cbe..8fa6dea 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java +++ b/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java @@ -59,7 +59,7 @@ import com.m2049r.xmrwallet.model.WalletManager; import com.m2049r.xmrwallet.service.WalletService; import com.m2049r.xmrwallet.util.Helper; import com.m2049r.xmrwallet.util.MoneroThreadPoolExecutor; -import com.m2049r.xmrwallet.util.UserNotes; +import com.m2049r.xmrwallet.data.UserNotes; import com.m2049r.xmrwallet.widget.Toolbar; import java.util.ArrayList; @@ -958,8 +958,6 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste } if (!processed || (onUriScannedListener == null)) { Toast.makeText(this, getString(R.string.nfc_tag_read_what), Toast.LENGTH_LONG).show(); - } else { - Toast.makeText(this, getString(R.string.nfc_tag_read_success), Toast.LENGTH_SHORT).show(); } } diff --git a/app/src/main/java/com/m2049r/xmrwallet/data/BarcodeData.java b/app/src/main/java/com/m2049r/xmrwallet/data/BarcodeData.java index c6bc4ce..7cf5a10 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/data/BarcodeData.java +++ b/app/src/main/java/com/m2049r/xmrwallet/data/BarcodeData.java @@ -21,7 +21,10 @@ import android.net.Uri; import com.m2049r.xmrwallet.model.Wallet; import com.m2049r.xmrwallet.util.BitcoinAddressValidator; import com.m2049r.xmrwallet.util.OpenAliasHelper; +import com.m2049r.xmrwallet.util.PaymentProtocolHelper; +import java.net.URI; +import java.net.URISyntaxException; import java.util.HashMap; import java.util.Map; @@ -37,9 +40,10 @@ public class BarcodeData { public static final String OA_XMR_ASSET = "xmr"; public static final String OA_BTC_ASSET = "btc"; - static final String BTC_SCHEME = "bitcoin:"; + static final String BTC_SCHEME = "bitcoin"; static final String BTC_DESCRIPTION = "message"; static final String BTC_AMOUNT = "amount"; + static final String BTC_BIP70_PARM = "r"; public enum Asset { XMR, BTC @@ -48,7 +52,8 @@ public class BarcodeData { public enum Security { NORMAL, OA_NO_DNSSEC, - OA_DNSSEC + OA_DNSSEC, + BIP70 } final public Asset asset; @@ -58,57 +63,44 @@ public class BarcodeData { final public String amount; final public String description; final public Security security; + final public String bip70; public BarcodeData(Asset asset, String address) { - this.asset = asset; - this.address = address; - amount = null; - paymentId = null; - addressName = null; - description = null; - this.security = Security.NORMAL; + this(asset, address, null, null, null, null, Security.NORMAL); } public BarcodeData(Asset asset, String address, String amount) { - this.asset = asset; - this.address = address; - this.amount = amount; - paymentId = null; - addressName = null; - description = null; - this.security = Security.NORMAL; + this(asset, address, null, null, null, amount, Security.NORMAL); + } + + public BarcodeData(Asset asset, String address, String amount, String description, Security security) { + this(asset, address, null, null, description, amount, security); } public BarcodeData(Asset asset, String address, String paymentId, String amount) { - this.asset = asset; - this.address = address; - this.paymentId = paymentId; - this.amount = amount; - addressName = null; - description = null; - this.security = Security.NORMAL; + this(asset, address, null, paymentId, null, amount, Security.NORMAL); } public BarcodeData(Asset asset, String address, String paymentId, String description, String amount) { - this.asset = asset; - this.address = address; - this.paymentId = paymentId; - this.description = description; - this.amount = amount; - addressName = null; - this.security = Security.NORMAL; + this(asset, address, null, paymentId, description, amount, Security.NORMAL); } - public BarcodeData(Asset asset, String address, String addressName, String paymentId, String description, String amount, Security sec) { + public BarcodeData(Asset asset, String address, String addressName, String paymentId, String description, String amount, Security security) { + this(asset, address, addressName, null, paymentId, description, amount, security); + } + + public BarcodeData(Asset asset, String address, String addressName, String bip70, String paymentId, String description, String amount, Security security) { this.asset = asset; this.address = address; + this.bip70 = bip70; this.addressName = addressName; this.paymentId = paymentId; this.description = description; this.amount = amount; - this.security = sec; + this.security = security; } + public Uri getUri() { return Uri.parse(getUriString()); } @@ -146,6 +138,10 @@ public class BarcodeData { if (bcData == null) { bcData = parseBitcoinUri(qrCode); } + // check for btc payment uri (like bitpay) + if (bcData == null) { + bcData = parseBitcoinPaymentUrl(qrCode); + } // check for naked btc address if (bcData == null) { bcData = parseBitcoinNaked(qrCode); @@ -228,19 +224,28 @@ public class BarcodeData { } // bitcoin:mpQ84J43EURZHkCnXbyQ4PpNDLLBqdsMW2?amount=0.01 - static public BarcodeData parseBitcoinUri(String uri) { - Timber.d("parseBitcoinUri=%s", uri); + // bitcoin:?r=https://bitpay.com/i/xxx + static public BarcodeData parseBitcoinUri(String uriString) { + Timber.d("parseBitcoinUri=%s", uriString); - if (uri == null) return null; + if (uriString == null) return null; + URI uri; + try { + uri = new URI(uriString); + } catch (URISyntaxException ex) { + return null; + } + if (!uri.isOpaque() || + !uri.getScheme().equals(BTC_SCHEME)) return null; - if (!uri.startsWith(BTC_SCHEME)) return null; - - String noScheme = uri.substring(BTC_SCHEME.length()); - Uri bitcoin = Uri.parse(noScheme); + String[] parts = uri.getRawSchemeSpecificPart().split("[?]"); + if ((parts.length <= 0) || (parts.length > 2)) { + Timber.d("invalid number of parts %d", parts.length); + return null; + } Map parms = new HashMap<>(); - String query = bitcoin.getQuery(); - if (query != null) { - String[] args = query.split("&"); + if (parts.length == 2) { + String[] args = parts[1].split("&"); for (String arg : args) { String[] namevalue = arg.split("="); if (namevalue.length == 0) { @@ -250,10 +255,26 @@ public class BarcodeData { namevalue.length > 1 ? Uri.decode(namevalue[1]) : ""); } } - String address = bitcoin.getPath(); String description = parms.get(BTC_DESCRIPTION); + String address = parts[0]; // no need to decode as there can bo no special characters + if (address.isEmpty()) { // possibly a BIP72 uri + String bip70 = parms.get(BTC_BIP70_PARM); + if (bip70 == null) { + Timber.d("no address and can't find pp url"); + return null; + } + if (!PaymentProtocolHelper.isHttp(bip70)) { + Timber.d("[%s] is not http url", bip70); + return null; + } + return new BarcodeData(BarcodeData.Asset.BTC, null, null, bip70, null, description, null, Security.NORMAL); + } + if (!BitcoinAddressValidator.validate(address)) { + Timber.d("BTC address (%s) invalid", address); + return null; + } String amount = parms.get(BTC_AMOUNT); - if (amount != null) { + if ((amount != null) && (!amount.isEmpty())) { try { Double.parseDouble(amount); } catch (NumberFormatException ex) { @@ -261,11 +282,22 @@ public class BarcodeData { return null; // we have an amount but its not a number! } } - if (!BitcoinAddressValidator.validate(address)) { - Timber.d("address invalid"); + return new BarcodeData(BarcodeData.Asset.BTC, address, null, description, amount); + } + + // https://bitpay.com/invoice?id=xxx + // https://bitpay.com/i/KbMdd4EhnLXSbpWGKsaeo6 + static public BarcodeData parseBitcoinPaymentUrl(String url) { + Timber.d("parseBitcoinUri=%s", url); + + if (url == null) return null; + + if (!PaymentProtocolHelper.isHttp(url)) { + Timber.d("[%s] is not http url", url); return null; } - return new BarcodeData(BarcodeData.Asset.BTC, address, null, description, amount); + + return new BarcodeData(Asset.BTC, url); } static public BarcodeData parseBitcoinNaked(String address) { diff --git a/app/src/main/java/com/m2049r/xmrwallet/data/TxData.java b/app/src/main/java/com/m2049r/xmrwallet/data/TxData.java index 55505da..3391c3a 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/data/TxData.java +++ b/app/src/main/java/com/m2049r/xmrwallet/data/TxData.java @@ -20,9 +20,6 @@ import android.os.Parcel; import android.os.Parcelable; import com.m2049r.xmrwallet.model.PendingTransaction; -import com.m2049r.xmrwallet.util.UserNotes; - -import timber.log.Timber; // https://stackoverflow.com/questions/2139134/how-to-send-an-object-from-one-android-activity-to-another-using-intents public class TxData implements Parcelable { diff --git a/app/src/main/java/com/m2049r/xmrwallet/data/TxDataBtc.java b/app/src/main/java/com/m2049r/xmrwallet/data/TxDataBtc.java index 6b61e10..635cb64 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/data/TxDataBtc.java +++ b/app/src/main/java/com/m2049r/xmrwallet/data/TxDataBtc.java @@ -18,12 +18,11 @@ package com.m2049r.xmrwallet.data; import android.os.Parcel; -import com.m2049r.xmrwallet.model.PendingTransaction; - public class TxDataBtc extends TxData { private String xmrtoUuid; private String btcAddress; + private String bip70; private double btcAmount; public TxDataBtc() { @@ -50,6 +49,14 @@ public class TxDataBtc extends TxData { this.btcAddress = btcAddress; } + public String getBip70() { + return bip70; + } + + public void setBip70(String bip70) { + this.bip70 = bip70; + } + public double getBtcAmount() { return btcAmount; } @@ -63,6 +70,7 @@ public class TxDataBtc extends TxData { super.writeToParcel(out, flags); out.writeString(xmrtoUuid); out.writeString(btcAddress); + out.writeString(bip70); out.writeDouble(btcAmount); } @@ -81,16 +89,19 @@ public class TxDataBtc extends TxData { super(in); xmrtoUuid = in.readString(); btcAddress = in.readString(); + bip70 = in.readString(); btcAmount = in.readDouble(); } @Override public String toString() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append(",xmrtoUuid:"); sb.append(xmrtoUuid); sb.append(",btcAddress:"); sb.append(btcAddress); + sb.append(",bip70:"); + sb.append(bip70); sb.append(",btcAmount:"); sb.append(btcAmount); return sb.toString(); diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/UserNotes.java b/app/src/main/java/com/m2049r/xmrwallet/data/UserNotes.java similarity index 98% rename from app/src/main/java/com/m2049r/xmrwallet/util/UserNotes.java rename to app/src/main/java/com/m2049r/xmrwallet/data/UserNotes.java index e6e463c..5062512 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/util/UserNotes.java +++ b/app/src/main/java/com/m2049r/xmrwallet/data/UserNotes.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.m2049r.xmrwallet.util; +package com.m2049r.xmrwallet.data; import com.m2049r.xmrwallet.xmrto.api.QueryOrderStatus; diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendAddressWizardFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendAddressWizardFragment.java index dabf6f1..c8597e1 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendAddressWizardFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendAddressWizardFragment.java @@ -39,12 +39,15 @@ import com.m2049r.xmrwallet.R; import com.m2049r.xmrwallet.data.BarcodeData; import com.m2049r.xmrwallet.data.TxData; import com.m2049r.xmrwallet.data.TxDataBtc; +import com.m2049r.xmrwallet.data.UserNotes; import com.m2049r.xmrwallet.model.PendingTransaction; import com.m2049r.xmrwallet.model.Wallet; import com.m2049r.xmrwallet.util.BitcoinAddressValidator; import com.m2049r.xmrwallet.util.Helper; import com.m2049r.xmrwallet.util.OpenAliasHelper; -import com.m2049r.xmrwallet.util.UserNotes; +import com.m2049r.xmrwallet.util.PaymentProtocolHelper; +import com.m2049r.xmrwallet.xmrto.XmrToError; +import com.m2049r.xmrwallet.xmrto.XmrToException; import java.util.Map; @@ -72,6 +75,8 @@ public class SendAddressWizardFragment extends SendWizardFragment { BarcodeData getBarcodeData(); + BarcodeData popBarcodeData(); + void setMode(SendFragment.Mode mode); TxData getTxData(); @@ -89,6 +94,8 @@ public class SendAddressWizardFragment extends SendWizardFragment { private View llXmrTo; private boolean resolvingOA = false; + private boolean resolvingPP = false; + private String resolvedPP = null; OnScanListener onScanListener; @@ -113,28 +120,54 @@ public class SendAddressWizardFragment extends SendWizardFragment { etAddress.getEditText().setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); etAddress.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() { public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN)) - || (actionId == EditorInfo.IME_ACTION_NEXT)) { - String dnsOA = dnsFromOpenAlias(etAddress.getEditText().getText().toString()); + // ignore ENTER + return ((event != null) && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)); + } + }); + etAddress.getEditText().setOnFocusChangeListener(new View.OnFocusChangeListener() { + @Override + public void onFocusChange(View v, boolean hasFocus) { + if (!hasFocus) { + View next = etAddress; + String enteredAddress = etAddress.getEditText().getText().toString().trim(); + String dnsOA = dnsFromOpenAlias(enteredAddress); Timber.d("OpenAlias is %s", dnsOA); if (dnsOA != null) { processOpenAlias(dnsOA); - } else if (checkAddress()) { - if (llPaymentId.getVisibility() == View.VISIBLE) { - etPaymentId.requestFocus(); - } else { - etDummy.requestFocus(); - Helper.hideKeyboard(getActivity()); + next = null; + } else { + // maybe a bip72 or 70 URI + String bip70 = PaymentProtocolHelper.getBip70(enteredAddress); + if (bip70 != null) { + // looks good - resolve through xmr.to + processBip70(bip70); + next = null; + } else if (checkAddress()) { + if (llPaymentId.getVisibility() == View.VISIBLE) { + next = etPaymentId; + } else { + next = etNotes; + } } } - return true; + if (next != null) { + final View focus = next; + etAddress.post(new Runnable() { + @Override + public void run() { + focus.requestFocus(); + } + }); + } } - return false; } }); etAddress.getEditText().addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable editable) { + Timber.d("AFTER: %s", editable.toString()); + if (editable.toString().equals(resolvedPP)) return; // no change required + resolvedPP = null; etAddress.setError(null); if (isIntegratedAddress()) { Timber.d("isIntegratedAddress"); @@ -143,15 +176,11 @@ public class SendAddressWizardFragment extends SendWizardFragment { tvPaymentIdIntegrated.setVisibility(View.VISIBLE); llXmrTo.setVisibility(View.INVISIBLE); sendListener.setMode(SendFragment.Mode.XMR); - } else if (isBitcoinAddress()) { + } else if (isBitcoinAddress() || (resolvedPP != null)) { Timber.d("isBitcoinAddress"); - etPaymentId.getEditText().getText().clear(); - llPaymentId.setVisibility(View.INVISIBLE); - tvPaymentIdIntegrated.setVisibility(View.INVISIBLE); - llXmrTo.setVisibility(View.VISIBLE); - sendListener.setMode(SendFragment.Mode.BTC); + setBtcMode(); } else { - Timber.d("isStandardAddress"); + Timber.d("isStandardAddress or other"); llPaymentId.setVisibility(View.VISIBLE); tvPaymentIdIntegrated.setVisibility(View.INVISIBLE); llXmrTo.setVisibility(View.INVISIBLE); @@ -227,7 +256,6 @@ public class SendAddressWizardFragment extends SendWizardFragment { } }); - etDummy = view.findViewById(R.id.etDummy); etDummy.setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); etDummy.requestFocus(); @@ -241,8 +269,18 @@ public class SendAddressWizardFragment extends SendWizardFragment { return view; } + private void setBtcMode() { + Timber.d("setBtcMode"); + etPaymentId.getEditText().getText().clear(); + llPaymentId.setVisibility(View.INVISIBLE); + tvPaymentIdIntegrated.setVisibility(View.INVISIBLE); + llXmrTo.setVisibility(View.VISIBLE); + sendListener.setMode(SendFragment.Mode.BTC); + } + private void processOpenAlias(String dnsOA) { if (resolvingOA) return; // already resolving - just wait + sendListener.popBarcodeData(); if (dnsOA != null) { resolvingOA = true; etAddress.setError(getString(R.string.send_address_resolve_openalias)); @@ -255,8 +293,6 @@ public class SendAddressWizardFragment extends SendWizardFragment { if (barcodeData != null) { Timber.d("Security=%s, %s", barcodeData.security.toString(), barcodeData.address); processScannedData(barcodeData); - etDummy.requestFocus(); - Helper.hideKeyboard(getActivity()); } else { etAddress.setError(getString(R.string.send_address_not_openalias)); Timber.d("NO XMR OPENALIAS TXT FOUND"); @@ -273,10 +309,62 @@ public class SendAddressWizardFragment extends SendWizardFragment { } // else ignore } + private void processBip70(final String bip70) { + Timber.d("RESOLVED PP: %s", resolvedPP); + if (resolvingPP) return; // already resolving - just wait + resolvingPP = true; + sendListener.popBarcodeData(); + etAddress.setError(getString(R.string.send_address_resolve_bip70)); + PaymentProtocolHelper.resolve(bip70, new PaymentProtocolHelper.OnResolvedListener() { + @Override + public void onResolved(BarcodeData.Asset asset, String address, double amount, String resolvedBip70) { + resolvingPP = false; + if (asset != BarcodeData.Asset.BTC) + throw new IllegalArgumentException("only BTC here"); + + if (resolvedBip70 == null) + throw new IllegalArgumentException("success means we have a pp_url - else die"); + + final BarcodeData barcodeData = + new BarcodeData(BarcodeData.Asset.BTC, address, null, + resolvedBip70, null, null, String.valueOf(amount), + BarcodeData.Security.BIP70); + etNotes.post(new Runnable() { + @Override + public void run() { + Timber.d("security is %s", barcodeData.security); + processScannedData(barcodeData); + etNotes.requestFocus(); + } + }); + } + + @Override + public void onFailure(final Exception ex) { + resolvingPP = false; + etAddress.post(new Runnable() { + @Override + public void run() { + int errorMsgId = R.string.send_address_not_bip70; + if (ex instanceof XmrToException) { + XmrToError error = ((XmrToException) ex).getError(); + if (error != null) { + errorMsgId = error.getErrorMsgId(); + } + } + etAddress.setError(getString(errorMsgId)); + } + }); + Timber.d("PP FAILED"); + } + }); + } + private boolean checkAddressNoError() { String address = etAddress.getEditText().getText().toString(); return Wallet.isAddressValid(address) - || BitcoinAddressValidator.validate(address); + || BitcoinAddressValidator.validate(address) + || (resolvedPP != null); } private boolean checkAddress() { @@ -322,25 +410,39 @@ public class SendAddressWizardFragment extends SendWizardFragment { @Override public boolean onValidateFields() { - boolean ok = true; if (!checkAddressNoError()) { shakeAddress(); - ok = false; - String dnsOA = dnsFromOpenAlias(etAddress.getEditText().getText().toString()); + String enteredAddress = etAddress.getEditText().getText().toString().trim(); + String dnsOA = dnsFromOpenAlias(enteredAddress); Timber.d("OpenAlias is %s", dnsOA); if (dnsOA != null) { processOpenAlias(dnsOA); + } else { + String bip70 = PaymentProtocolHelper.getBip70(enteredAddress); + if (bip70 != null) { + processBip70(bip70); + } } + return false; } + if (!checkPaymentId()) { etPaymentId.startAnimation(Helper.getShakeAnimation(getContext())); - ok = false; + return false; } - if (!ok) return false; + if (sendListener != null) { TxData txData = sendListener.getTxData(); - if (isBitcoinAddress()) { - ((TxDataBtc) txData).setBtcAddress(etAddress.getEditText().getText().toString()); + if (txData instanceof TxDataBtc) { + if (resolvedPP != null) { + // take the value from the field nonetheless as this is what the user sees + // (in case we have a bug somewhere) + ((TxDataBtc) txData).setBip70(etAddress.getEditText().getText().toString()); + ((TxDataBtc) txData).setBtcAddress(null); + } else { + ((TxDataBtc) txData).setBtcAddress(etAddress.getEditText().getText().toString()); + ((TxDataBtc) txData).setBip70(null); + } txData.setDestinationAddress(null); txData.setPaymentId(""); } else { @@ -381,12 +483,22 @@ public class SendAddressWizardFragment extends SendWizardFragment { } public void processScannedData() { + resolvedPP = null; BarcodeData barcodeData = sendListener.getBarcodeData(); if (barcodeData != null) { Timber.d("GOT DATA"); - String scannedAddress = barcodeData.address; - if (scannedAddress != null) { - etAddress.getEditText().setText(scannedAddress); + + if (barcodeData.bip70 != null) { + setBtcMode(); + if (barcodeData.security == BarcodeData.Security.BIP70) { + resolvedPP = barcodeData.bip70; + etAddress.setError(getString(R.string.send_address_bip70)); + } else { + processBip70(barcodeData.bip70); + } + etAddress.getEditText().setText(barcodeData.bip70); + } else if (barcodeData.address != null) { + etAddress.getEditText().setText(barcodeData.address); if (checkAddress()) { if (barcodeData.security == BarcodeData.Security.OA_NO_DNSSEC) etAddress.setError(getString(R.string.send_address_no_dnssec)); @@ -397,6 +509,7 @@ public class SendAddressWizardFragment extends SendWizardFragment { etAddress.getEditText().getText().clear(); etAddress.setError(null); } + String scannedPaymentId = barcodeData.paymentId; if (scannedPaymentId != null) { etPaymentId.getEditText().setText(scannedPaymentId); diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcAmountWizardFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcAmountWizardFragment.java index d8708b6..6728ec7 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcAmountWizardFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcAmountWizardFragment.java @@ -120,6 +120,15 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment { return true; } + private void setBip70Mode() { + TxDataBtc txDataBtc = (TxDataBtc) sendListener.getTxData(); + if (txDataBtc.getBip70() != null) { + numberPad.setVisibility(View.INVISIBLE); + } else { + numberPad.setVisibility(View.VISIBLE); + } + } + double maxBtc = 0; double minBtc = 0; @@ -141,12 +150,13 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment { tvFunds.setText(getString(R.string.send_available, getString(R.string.unknown_amount))); } - if ((evAmount.getAmount() == null) || evAmount.getAmount().isEmpty()) { - final BarcodeData data = sendListener.popBarcodeData(); - if ((data != null) && (data.amount != null)) { + final BarcodeData data = sendListener.popBarcodeData(); + if (data != null) { + if (data.amount != null) { evAmount.setAmount(data.amount); } } + setBip70Mode(); callXmrTo(); } diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcConfirmWizardFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcConfirmWizardFragment.java index 6e8a200..5c49c90 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcConfirmWizardFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcConfirmWizardFragment.java @@ -524,8 +524,8 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements xmrtoStatus = null; showProgress(1, getString(R.string.label_send_progress_xmrto_create)); TxDataBtc txDataBtc = (TxDataBtc) sendListener.getTxData(); - double btcAmount = txDataBtc.getBtcAmount(); - getXmrToApi().createOrder(btcAmount, txDataBtc.getBtcAddress(), new XmrToCallback() { + + XmrToCallback callback = new XmrToCallback() { @Override public void onSuccess(CreateOrder createOrder) { if (!isResumed) return; @@ -545,7 +545,13 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements } processCreateOrderError(ex); } - }); + }; + + if (txDataBtc.getBip70() != null) { + getXmrToApi().createOrder(txDataBtc.getBip70(), callback); + } else { + getXmrToApi().createOrder(txDataBtc.getBtcAmount(), txDataBtc.getBtcAddress(), callback); + } } private QueryOrderStatus xmrtoStatus = null; @@ -666,7 +672,7 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements private XmrToApi xmrToApi = null; - private final XmrToApi getXmrToApi() { + private XmrToApi getXmrToApi() { if (xmrToApi == null) { synchronized (this) { if (xmrToApi == null) { diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendConfirmWizardFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendConfirmWizardFragment.java index f0eba4d..63f7361 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendConfirmWizardFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendConfirmWizardFragment.java @@ -36,7 +36,7 @@ import com.m2049r.xmrwallet.data.TxData; import com.m2049r.xmrwallet.model.PendingTransaction; import com.m2049r.xmrwallet.model.Wallet; import com.m2049r.xmrwallet.util.Helper; -import com.m2049r.xmrwallet.util.UserNotes; +import com.m2049r.xmrwallet.data.UserNotes; import timber.log.Timber; diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendFragment.java index a9f0a54..d01ca43 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendFragment.java @@ -34,7 +34,6 @@ import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; -import android.widget.Toast; import com.m2049r.xmrwallet.OnBackPressedListener; import com.m2049r.xmrwallet.OnUriScannedListener; @@ -47,7 +46,7 @@ import com.m2049r.xmrwallet.layout.SpendViewPager; import com.m2049r.xmrwallet.model.PendingTransaction; import com.m2049r.xmrwallet.util.Helper; import com.m2049r.xmrwallet.util.Notice; -import com.m2049r.xmrwallet.util.UserNotes; +import com.m2049r.xmrwallet.data.UserNotes; import com.m2049r.xmrwallet.widget.DotBar; import com.m2049r.xmrwallet.widget.Toolbar; diff --git a/app/src/main/java/com/m2049r/xmrwallet/layout/TransactionInfoAdapter.java b/app/src/main/java/com/m2049r/xmrwallet/layout/TransactionInfoAdapter.java index 6c38f3e..589b84e 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/layout/TransactionInfoAdapter.java +++ b/app/src/main/java/com/m2049r/xmrwallet/layout/TransactionInfoAdapter.java @@ -28,7 +28,7 @@ import android.widget.TextView; import com.m2049r.xmrwallet.R; import com.m2049r.xmrwallet.model.TransactionInfo; import com.m2049r.xmrwallet.util.Helper; -import com.m2049r.xmrwallet.util.UserNotes; +import com.m2049r.xmrwallet.data.UserNotes; import java.text.SimpleDateFormat; import java.util.ArrayList; diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/PaymentProtocolHelper.java b/app/src/main/java/com/m2049r/xmrwallet/util/PaymentProtocolHelper.java new file mode 100644 index 0000000..ba904e6 --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/util/PaymentProtocolHelper.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2018 m2049r + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Specs from https://openalias.org/ + +package com.m2049r.xmrwallet.util; + +import com.m2049r.xmrwallet.data.BarcodeData; +import com.m2049r.xmrwallet.xmrto.api.CreateOrder; +import com.m2049r.xmrwallet.xmrto.api.XmrToApi; +import com.m2049r.xmrwallet.xmrto.api.XmrToCallback; +import com.m2049r.xmrwallet.xmrto.network.XmrToApiImpl; + +import java.net.MalformedURLException; +import java.net.URISyntaxException; +import java.net.URL; + +import timber.log.Timber; + +public class PaymentProtocolHelper { + + //https://bitpay.com/i/xxx + public static boolean isHttp(String string) { + if ((string == null) || (string.isEmpty())) return false; + try { + // new URL(string).toURI() checks if its a real url + return new URL(string).toURI().getScheme().startsWith("http"); + } catch (MalformedURLException | URISyntaxException ex) { + return false; + } + } + + // guess if the string may be a valid payment uri + //https://bitpay.com/i/xxx + //bitcoin:?r=https://bitpay.com/i/xxx + public static String getBip70(String bip72Or70) { + if ((bip72Or70 == null) || (bip72Or70.isEmpty())) return null; + if (isHttp(bip72Or70)) return bip72Or70; + BarcodeData bc = BarcodeData.parseBitcoinUri(bip72Or70); + if (bc == null) return null; + return bc.bip70; + } + + public interface OnResolvedListener { + void onResolved(BarcodeData.Asset asset, String address, double amount, String bip70); + + void onFailure(Exception ex); + + } + + static public boolean resolve(final String bip70, final OnResolvedListener resolvedListener) { + if ((bip70 == null) || (bip70.isEmpty())) + return false; //pointless trying to lookup nothing + Timber.d("Resolving %s", bip70); + getXmrToApi().createOrder(bip70, new XmrToCallback() { + @Override + public void onSuccess(CreateOrder createOrder) { + if (resolvedListener != null) { + resolvedListener.onResolved(BarcodeData.Asset.BTC, + createOrder.getBtcDestAddress(), + createOrder.getBtcAmount(), + createOrder.getBtcBip70()); + } + } + + @Override + public void onError(Exception ex) { + if (resolvedListener != null) { + resolvedListener.onFailure(ex); + } + } + }); + return true; + } + + static private XmrToApi xmrToApi = null; + + static private XmrToApi getXmrToApi() { + if (xmrToApi == null) { + synchronized (PaymentProtocolHelper.class) { + if (xmrToApi == null) { + xmrToApi = new XmrToApiImpl(OkHttpHelper.getOkHttpClient(), + Helper.getXmrToBaseUrl()); + } + } + } + return xmrToApi; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/m2049r/xmrwallet/xmrto/XmrToError.java b/app/src/main/java/com/m2049r/xmrwallet/xmrto/XmrToError.java index 2ac5bc2..bf3f07b 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/xmrto/XmrToError.java +++ b/app/src/main/java/com/m2049r/xmrwallet/xmrto/XmrToError.java @@ -16,6 +16,8 @@ package com.m2049r.xmrwallet.xmrto; +import com.m2049r.xmrwallet.R; + import org.json.JSONException; import org.json.JSONObject; @@ -33,7 +35,10 @@ public class XmrToError { XMRTO_ERROR_006, // (404) requested order not found check order UUID XMRTO_ERROR_007, // (503) third party service not available try again later XMRTO_ERROR_008, // (503) insufficient funds available try again later - XMRTO_ERROR_009 // (400) invalid request check request parameters + XMRTO_ERROR_009, // (400) invalid request check request parameters + XMRTO_ERROR_010, // (400) payment protocol failed invalid or outdated data served by url + XMRTO_ERROR_011, // (400) malformed payment protocol url url is malformed or cannot be contacted + XMRTO_ERROR_012 // (403) too many requests } public boolean isRetryable() { @@ -78,6 +83,21 @@ public class XmrToError { return errorMsg; } + public int getErrorMsgId() { + switch (errorId) { + case XMRTO_ERROR_001: + return R.string.xmrto_error_001; + case XMRTO_ERROR_004: + return R.string.xmrto_error_004; + case XMRTO_ERROR_010: + return R.string.xmrto_error_010; + case XMRTO_ERROR_012: + return R.string.xmrto_error_012; + default: + return R.string.xmrto_error; + } + } + @Override public String toString() { return getErrorIdString(getErrorId()) + ": " + getErrorMsg(); @@ -97,6 +117,10 @@ public class XmrToError { 400 XMRTO-ERROR-003 invalid bitcoin amount check amount data type 503 XMRTO-ERROR-004 bitcoin amount out of bounds check min and max amount 400 XMRTO-ERROR-005 unexpected validation error contact support + + Errors from Create Order Payment Protocol + 400 XMRTO-ERROR-010 payment protocol failed invalid or outdated data served by url + 400 XMRTO-ERROR-011 malformed payment protocol url url is malformed or cannot be contacted */ /* Errors from Query Order @@ -104,4 +128,8 @@ public class XmrToError { 400 XMRTO-ERROR-009 invalid request check request parameters 404 XMRTO-ERROR-006 requested order not found check order UUID */ + + /* General + 403 XMRTO-ERROR-012 too many requests + */ } diff --git a/app/src/main/java/com/m2049r/xmrwallet/xmrto/api/CreateOrder.java b/app/src/main/java/com/m2049r/xmrwallet/xmrto/api/CreateOrder.java index b03abe7..ca5c391 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/xmrto/api/CreateOrder.java +++ b/app/src/main/java/com/m2049r/xmrwallet/xmrto/api/CreateOrder.java @@ -21,6 +21,8 @@ public interface CreateOrder { String getBtcDestAddress(); + String getBtcBip70(); + String getState(); String getUuid(); diff --git a/app/src/main/java/com/m2049r/xmrwallet/xmrto/api/XmrToApi.java b/app/src/main/java/com/m2049r/xmrwallet/xmrto/api/XmrToApi.java index daaf071..0281780 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/xmrto/api/XmrToApi.java +++ b/app/src/main/java/com/m2049r/xmrwallet/xmrto/api/XmrToApi.java @@ -35,6 +35,13 @@ public interface XmrToApi { */ void createOrder(final double amount, @NonNull final String address, @NonNull final XmrToCallback callback); + /** + * Creates an order through BIP70 payment protocol like bitpay + * + * @param url the BIP70 URL + */ + void createOrder(@NonNull final String url, @NonNull final XmrToCallback callback); + /** * Queries the order status for given current order * diff --git a/app/src/main/java/com/m2049r/xmrwallet/xmrto/network/CreateOrderImpl.java b/app/src/main/java/com/m2049r/xmrwallet/xmrto/network/CreateOrderImpl.java index f6faf98..7a28968 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/xmrto/network/CreateOrderImpl.java +++ b/app/src/main/java/com/m2049r/xmrwallet/xmrto/network/CreateOrderImpl.java @@ -18,8 +18,8 @@ package com.m2049r.xmrwallet.xmrto.network; import android.support.annotation.NonNull; -import com.m2049r.xmrwallet.xmrto.api.XmrToCallback; import com.m2049r.xmrwallet.xmrto.api.CreateOrder; +import com.m2049r.xmrwallet.xmrto.api.XmrToCallback; import org.json.JSONException; import org.json.JSONObject; @@ -29,6 +29,7 @@ class CreateOrderImpl implements CreateOrder { private final String state; private final double btcAmount; private final String btcDestAddress; + private final String btcBip70; private final String uuid; public Double getBtcAmount() { @@ -39,6 +40,10 @@ class CreateOrderImpl implements CreateOrder { return btcDestAddress; } + public String getBtcBip70() { + return btcBip70; + } + public String getUuid() { return uuid; } @@ -51,6 +56,10 @@ class CreateOrderImpl implements CreateOrder { this.state = jsonObject.getString("state"); this.btcAmount = jsonObject.getDouble("btc_amount"); this.btcDestAddress = jsonObject.getString("btc_dest_address"); + if (jsonObject.has("pp_url")) + this.btcBip70 = jsonObject.getString("pp_url"); + else + this.btcBip70 = null; this.uuid = jsonObject.getString("uuid"); } @@ -78,6 +87,30 @@ class CreateOrderImpl implements CreateOrder { } } + public static void call(@NonNull final XmrToApiCall api, @NonNull final String url, + @NonNull final XmrToCallback callback) { + try { + final JSONObject request = createRequest(url); + api.call("order_create_pp", request, new NetworkCallback() { + @Override + public void onSuccess(JSONObject jsonObject) { + try { + callback.onSuccess(new CreateOrderImpl(jsonObject)); + } catch (JSONException ex) { + callback.onError(ex); + } + } + + @Override + public void onError(Exception ex) { + callback.onError(ex); + } + }); + } catch (JSONException ex) { + callback.onError(ex); + } + } + static JSONObject createRequest(final double amount, final String address) throws JSONException { final JSONObject jsonObject = new JSONObject(); jsonObject.put("btc_amount", amount); @@ -85,5 +118,10 @@ class CreateOrderImpl implements CreateOrder { return jsonObject; } + static JSONObject createRequest(final String ppUrl) throws JSONException { + final JSONObject jsonObject = new JSONObject(); + jsonObject.put("pp_url", ppUrl); + return jsonObject; + } } diff --git a/app/src/main/java/com/m2049r/xmrwallet/xmrto/network/XmrToApiImpl.java b/app/src/main/java/com/m2049r/xmrwallet/xmrto/network/XmrToApiImpl.java index 3d4fa73..e2f2d6c 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/xmrto/network/XmrToApiImpl.java +++ b/app/src/main/java/com/m2049r/xmrwallet/xmrto/network/XmrToApiImpl.java @@ -64,6 +64,12 @@ public class XmrToApiImpl implements XmrToApi, XmrToApiCall { CreateOrderImpl.call(this, amount, address, callback); } + @Override + public void createOrder(@NonNull final String url, + @NonNull final XmrToCallback callback) { + CreateOrderImpl.call(this, url, callback); + } + @Override public void queryOrderStatus(@NonNull final String uuid, @NonNull final XmrToCallback callback) { @@ -113,6 +119,7 @@ public class XmrToApiImpl implements XmrToApi, XmrToApiCall { } else { try { final JSONObject json = new JSONObject(response.body().string()); + Timber.d(json.toString(2)); final XmrToError error = new XmrToError(json); Timber.e("xmr.to says %d/%s", response.code(), error.toString()); callback.onError(new XmrToException(response.code(), error)); diff --git a/app/src/main/res/layout/fragment_send_address.xml b/app/src/main/res/layout/fragment_send_address.xml index 7867943..e1e0f2b 100644 --- a/app/src/main/res/layout/fragment_send_address.xml +++ b/app/src/main/res/layout/fragment_send_address.xml @@ -47,8 +47,8 @@ android:layout_height="wrap_content" android:layout_gravity="start|center_vertical" android:layout_margin="8dp" - android:drawablePadding="8dp" android:drawableStart="@drawable/ic_check_gray_24dp" + android:drawablePadding="8dp" android:gravity="center" android:text="@string/info_paymentid_intergrated" android:textSize="18sp" @@ -83,21 +83,21 @@ tools:text="@string/info_xmrto" /> - + android:visibility="visible"> @@ -118,12 +118,13 @@ style="@style/MoneroText.Button.Small" android:layout_width="56dp" android:layout_height="56dp" + android:layout_alignParentEnd="true" android:layout_gravity="center" android:layout_marginStart="8dp" - android:background="?android:selectableItemBackground" + android:background="?android:selectableItemBackgroundBorderless" android:drawableTop="@drawable/ic_settings_orange_24dp" android:text="@string/send_generate_paymentid_hint" /> - + diff --git a/app/src/main/res/values-de/help.xml b/app/src/main/res/values-de/help.xml index 976ae54..78bc5b5 100644 --- a/app/src/main/res/values-de/help.xml +++ b/app/src/main/res/values-de/help.xml @@ -141,13 +141,19 @@ Senden

Empfängeradresse

-

Dies ist die öffentliche Adresse des Wallets, an die du Moneroj sendest. Du kannst sie aus der Zwischenablage kopieren, +

Dies ist die öffentliche Adresse des Wallets, an die du Moneroj sendest. Du kannst sie aus der Zwischenablage kopieren, einen QR-Code scannen oder sie manuell eingeben. Vergewissere dich, dass es die richtige Adresse ist um sicherzustellen die Moneroj nicht irrtümlich an eine falsche Adresse zu senden.

-

Zusätzlich zum Senden von XMR kannst du auch BTC mittels des XMR.TO Service versenden (siehe https://xmr.to - für Details). Siehe den Abschnitt über das Versenden von BTC unten.

+

In addition to using an XMR address, you can also use +

    +
  • an OpenAlias for XMR or BTC
  • +
  • a BTC address
  • +
  • a bitcoin: URI (including BIP70 like bitpay)
  • + + Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to + for details). See the section on sending BTC below.

    Zahlungs-ID

    -

    Du kannst eine Zahlungs-ID benutzen um den Grund einer Transaktion zwischen zwei Parteien zu identifizieren. Dies ist optional +

    Du kannst eine Zahlungs-ID benutzen um den Grund einer Transaktion zwischen zwei Parteien zu identifizieren. Dies ist optional und nicht öffentlich einsehbar. Zum Beispiel kann ein Unternehmen damit Zahlungen und Verkäufe miteinander verbinden.

    BTC Senden

    XMR.TO

    @@ -158,12 +164,12 @@

    XMR.TO Wechselkurs

    Auf dem \"Menge\" Bildschirm siehst du die aktuellen Werte des XMR.TO Service. Diese beinhalten den aktuellen Tauschkurs sowie die oberen und unteren BTC-Limits. Bitte bedenke, dass dieser Kurs zu diesem Zeitpunkt nicht garantiert ist. - Außerdem siehst du den Wert bis zu dem eine BTC-Zahlung sofort ausgeführt wird - ohne auf XMR-Bestätigungen warten zu müssen (siehe die XMR.TO FAQ für mehr Details). + Außerdem siehst du den Wert bis zu dem eine BTC-Zahlung sofort ausgeführt wird + ohne auf XMR-Bestätigungen warten zu müssen (siehe die XMR.TO FAQ für mehr Details). XMR.TO erhebt keine zusätzlichen Gebühren - wie cool ist das denn?

    XMR.TO Auftrag

    Auf dem \"Bestätigen\" Bildschirm siehst du das genaue XMR.TO-Angebot. Dieses Angebot gilt - für eine bestimmte Zeit - du siehst einen Countdown auf dem \"Ausgeben\" Button. Der Wechselkurs kann + für eine bestimmte Zeit - du siehst einen Countdown auf dem \"Ausgeben\" Button. Der Wechselkurs kann sich von den vorherigen Angaben unterscheiden.

    Geheimer XMR.TO Schlüssel

    Da Monerujo nur den Monero-Teil deiner Transaktion verarbeitet kann dein geheimer XMR.TO Schlüssel @@ -281,4 +287,6 @@ Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The scan stops when it finds 10 remote nodes in total.

    ]]> + + diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 6769a03..37684c2 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -322,7 +322,6 @@ OpenAlias sicher ✔ Löse OpenAlias auf… OpenAlias ohne DNSSEC - Adresse kann gefälscht sein! - Empfänger XMR/BTC Adresse oder OpenAlias Schreibe Tag Schreiben des Tags fehlgeschlagen! @@ -365,4 +364,14 @@ Scanning network… Automatically bookmarked best %1$d nodes Test + + Resolving Payment URI… + Could not resolve Payment URI + Resolved Payment URI ✔ + Empfänger + + XMR.TO offline - try again later + BTC amount out of bounds + Invalid or outdated Payment URL + Too many requests diff --git a/app/src/main/res/values-el/help.xml b/app/src/main/res/values-el/help.xml index 90890f9..fe85009 100644 --- a/app/src/main/res/values-el/help.xml +++ b/app/src/main/res/values-el/help.xml @@ -123,8 +123,14 @@

    Αυή είναι η δημόσια διεύθυνση πορτοφολιού που στέλνεις Moneroj, μπορείς να το αντιγράψεις από το πρόχειρο, να σαρώσεις έναν κωδικό QR ή να το πληκτρολογήσεις. Βεβαιώσου οτι έχεις τριπλο-ελέγξει για να είσαι σίγουρος ότι δεν στέλνεις σε λάθος διύθυνση τα κεφάλαια σου.

    -

    Εκτός από την αποστολή XMR, μπορείς να στείλεις BTC δια μέσου της υπηρεσίας XMR.TO (δες https://xmr.to - για πληροφορίες). Δες την ενότητα σχετικά με αποστολή BTC παρακάτω.

    +

    In addition to using an XMR address, you can also use +

      +
    • an OpenAlias for XMR or BTC
    • +
    • a BTC address
    • +
    • a bitcoin: URI (including BIP70 like bitpay)
    • + + Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to + for details). See the section on sending BTC below.

      ID Πληρωμής

      Μπορείς να χρησιμοποιήσεις ένα ID Πληρωμής(Payment ID) για να προσδιορίσεις τον λόγο που στέλνεις Monero ανάμεσα σε δύο ενδιαφερόμενους αυτό είναι προεραιτικό και ιδωτικό. Για παράδειγμα μπορεί να επιτρέψει σε μια επιχείρηση @@ -266,4 +272,6 @@ Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The scan stops when it finds 10 remote nodes in total.

      ]]> + + diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index db112ce..344a6e1 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -331,7 +331,6 @@ OpenAlias secure ✔ Resolving OpenAlias… OpenAlias without DNSSEC - address may be spoofed - Receiver\'s XMR/BTC Address or OpenAlias Node version incompatible - please upgrade! @@ -364,4 +363,14 @@ Scanning network… Automatically bookmarked best %1$d nodes Test + + Resolving Payment URI… + Could not resolve Payment URI + Resolved Payment URI ✔ + Receiver + + XMR.TO offline - try again later + BTC amount out of bounds + Invalid or outdated Payment URL + Too many requests diff --git a/app/src/main/res/values-es/help.xml b/app/src/main/res/values-es/help.xml index e1ad8fb..bc92097 100644 --- a/app/src/main/res/values-es/help.xml +++ b/app/src/main/res/values-es/help.xml @@ -78,7 +78,7 @@ Asegúrate de escribir esta contraseña. Si restablececes tu dispositivo o desinstalas esta aplicación, vas a necesitarla para acceder a tu monedero otra vez.

      CrAzYpass

      - Si la contraseña que se muestra consiste de 52 caracteres alfanuméricos en grupos de 4... + Si la contraseña que se muestra consiste de 52 caracteres alfanuméricos en grupos de 4… ¡felicitaciones! Los archivos de tu monedero están asegurado con una clave de 256 bits, generada por tu propio dispositivo basándose en la contraseña que elegiste (al crear el monedero o luego @@ -160,6 +160,14 @@

      Esta es la dirección pública del monedero al que vas a enviar moneroj. Puedes copiarla desde tu portapapeles, escanear un código QR o introducirla manualmente. Asegúrate de comprobarla varias veces para confirmar que no estás enviando moneroj a la dirección equivocada.

      +

      In addition to using an XMR address, you can also use +

        +
      • an OpenAlias for XMR or BTC
      • +
      • a BTC address
      • +
      • a bitcoin: URI (including BIP70 like bitpay)
      • + + Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to + for details). See the section on sending BTC below.

        ID de Pago

        Al ser Monero ofuscado por naturaleza, puedes usar un ID de Pago para identificar un envío de Monero entre dos partes. Esto es completamente opcional y privado. Por ejemplo, esto permitiría que un @@ -304,4 +312,6 @@ Monerujo irá directo a los nodos semilla de Monero codificados en Monero. El escaneo parará cuando encuentre 10 nodos remotos en total.

        ]]> + + diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index cfa68ac..b02ccce 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -319,11 +319,11 @@ OpenAlias asegurado ✔ Resolviendo OpenAlias… OpenAlias sin DNSSEC - la drección puede ser falsificada - Dirección XMR/BTC del receptor u OpenAlias Versión de nodo incompatible - ¡por favor actualiza! Detalles + Modo Público Nodo-o-matiC habilitado, toque para más información. @@ -352,4 +352,15 @@ Escaneando la red… Mejores %1$d nodos marcados automáticamente Probar + + Resolving Payment URI… + Could not resolve Payment URI + Resolved Payment URI ✔ + + Receptor + + XMR.TO offline - try again later + BTC amount out of bounds + Invalid or outdated Payment URL + Too many requests diff --git a/app/src/main/res/values-et/help.xml b/app/src/main/res/values-et/help.xml index 11d4b49..f431a57 100644 --- a/app/src/main/res/values-et/help.xml +++ b/app/src/main/res/values-et/help.xml @@ -155,7 +155,13 @@

        This is the public address of the wallet you are sending Moneroj to, you can copy this from your clipboard, scan a QR code or enter it manually. Make sure you triple check this to ensure you aren’t sending coins to the wrong address.

        -

        In addition to sending XMR, you can send BTC through the XMR.TO service (see https://xmr.to +

        In addition to using an XMR address, you can also use +

          +
        • an OpenAlias for XMR or BTC
        • +
        • a BTC address
        • +
        • a bitcoin: URI (including BIP70 like bitpay)
        • + + Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to for details). See the section on sending BTC below.

          Makse ID

          You can use a Payment ID to identify the reason you sent Monero between two parties. This @@ -298,4 +304,6 @@ Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The scan stops when it finds 10 remote nodes in total.

          ]]> + + diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 076ef38..ad7fe43 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -210,7 +210,6 @@ %1$s (umbkaudne) - Saaja XMR/BTC aadress või OpenAlias Makse ID (valikuline) 0.00 Privaatsed kommentaarid (valikuline) @@ -361,4 +360,15 @@ Testi Tagavarakoopia õnnestus + + Resolving Payment URI… + Could not resolve Payment URI + Resolved Payment URI ✔ + + Saaja + + XMR.TO offline - try again later + BTC amount out of bounds + Invalid or outdated Payment URL + Too many requests diff --git a/app/src/main/res/values-fr/help.xml b/app/src/main/res/values-fr/help.xml index 5bacbf1..361bb8f 100644 --- a/app/src/main/res/values-fr/help.xml +++ b/app/src/main/res/values-fr/help.xml @@ -153,8 +153,14 @@

          C’est l’adresse publique du portefeuille auquel vous allez envoyer des Moneroj, vous pouvez la copier/coller, scanner un QR code ou la saisir manuellement. Vérifiez là bien trois fois afin de vous assurer que vous n’envoyez pas de pièces à la mauvaise adresse.

          -

          En plus d’envoyer des XMR, vous pouvez envoyer des BTC via le service XMR.TO (voir https://xmr.to - pour plus de détails). Consultez la rubrique sur l’envoie de BTC ci-dessous.

          +

          In addition to using an XMR address, you can also use +

            +
          • an OpenAlias for XMR or BTC
          • +
          • a BTC address
          • +
          • a bitcoin: URI (including BIP70 like bitpay)
          • + + Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to + for details). See the section on sending BTC below.

            ID de Paiement

            Vous pouvez utiliser un ID de paiement pour identifier la raison pour laquelle vous avez envoyé des Moneroj entre deux parties. C’est totallement privé et optionnel. Il permet par @@ -303,4 +309,6 @@ Monerujo va communiquer directement avec les nœuds d’ensemencement codés en dur dans Monero. La recherche s’arrête lorsqu’un total de 10 nœuds distant est récupéré.

            ]]> + + diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index f70a987..1a4524c 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -334,7 +334,6 @@ Sécurisé OpenAlias ✔ Résolution OpenAlias… OpenAlias sans DNSSEC - l\'adresse pourrait être usurpée ! - Adresse ou OpenAlias XMR/BTC du Destinataire Version du Nœud incompatible - merci de mettre à jour ! @@ -367,4 +366,15 @@ Recherche de nœuds… %1$d meilleurs nœuds mis en favoris automatiquement Tester + + Resolving Payment URI… + Could not resolve Payment URI + Resolved Payment URI ✔ + + Destinataire + + XMR.TO offline - try again later + BTC amount out of bounds + Invalid or outdated Payment URL + Too many requests diff --git a/app/src/main/res/values-hu/help.xml b/app/src/main/res/values-hu/help.xml index 17b5380..92e0e16 100644 --- a/app/src/main/res/values-hu/help.xml +++ b/app/src/main/res/values-hu/help.xml @@ -142,8 +142,14 @@

            Kedvezményezett címe

            Azon tárca nyilvános címe, melyre Monerót küldesz. Begépelhető kézileg, de akár vágólapról vagy QR-kódból is beilleszthető. Többször is ellenőrizd, hogy biztosan jó címre utalsz-e.

            -

            Az XMR-küldés mellett BTC-küldésre is lehetőség van az XMR.TO szolgálatatásn keresztül. Részletekért - látogass el a https://xmr.to weboldalra és olvasd el a lentebb található BTC-küldés című pontot.

            +

            In addition to using an XMR address, you can also use +

              +
            • an OpenAlias for XMR or BTC
            • +
            • a BTC address
            • +
            • a bitcoin: URI (including BIP70 like bitpay)
            • + + Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to + for details). See the section on sending BTC below.

              Fizetési azonosító

              Fizetési azonosítót (payment ID) használhatsz arra a célra, hogy beazonosítsd, miért történt tranzakció két fél között. Ez teljes mértékben opcionális és privát. A fizetési azonosító például @@ -288,4 +294,6 @@ Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The scan stops when it finds 10 remote nodes in total.

              ]]> + + diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 2b5103f..8d0a290 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -331,7 +331,6 @@ OpenAlias secure ✔ Resolving OpenAlias… OpenAlias without DNSSEC - address may be spoofed - Receiver\'s XMR/BTC Address or OpenAlias Node version incompatible - please upgrade! @@ -366,4 +365,14 @@ Test Backup successful + + Resolving Payment URI… + Could not resolve Payment URI + Resolved Payment URI ✔ + Receiver + + XMR.TO offline - try again later + BTC amount out of bounds + Invalid or outdated Payment URL + Too many requests diff --git a/app/src/main/res/values-it/help.xml b/app/src/main/res/values-it/help.xml index 85ffe98..6f12b43 100644 --- a/app/src/main/res/values-it/help.xml +++ b/app/src/main/res/values-it/help.xml @@ -148,8 +148,14 @@

              Questo è l'indirizzo pubblico del portafoglio cui stai inviando Moneroj, puoi incollare qui un indirizzo che hai precededentemente copiato sul blocco appunti, scansionare un codice QR o inserire un indirizzo manualmente. Accertati più volte che sia l'indirizzo corretto e che tu non stia inviando Moneroj ad un indirizzo sbagliato.

              -

              Oltre ad inviare Moneroj (XMR), puoi anche inviare Bitcoin (BTC) attraverso il servizio XMR.TO (vedi https://xmr.to - per ulteriori dettagli). Controlla la sezione sull'invio di BTC più avanti.

              +

              In addition to using an XMR address, you can also use +

                +
              • an OpenAlias for XMR or BTC
              • +
              • a BTC address
              • +
              • a bitcoin: URI (including BIP70 like bitpay)
              • + + Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to + for details). See the section on sending BTC below.

                ID Pagamento

                Puoi usare un ID Pagamento per identificare la causale della transazione. Questa è un'informazione opzionale e privata. Ad esempio può aiutare un venditore ad associare una transazione ricevuta ad un bene da te acquistato.

                @@ -285,4 +291,6 @@ Monerujo proseguirà con i nodi seed codificati in Monero. La scansione termina quando vengono trovati 10 nodi in totale.

                ]]> + + diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 74fd719..895c00d 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -333,7 +333,6 @@ OpenAlias sicuro ✔ Risolvendo OpenAlias… OpenAlias senza DNSSEC - L\'indirizzo potrebbe essere rubato - Indirizzo XMR/BTC del ricevente o OpenAlias Versione del nodo incompatibile - si prega di aggiornare! @@ -366,4 +365,15 @@ Scansione rete… Aggiunti automaticamente ai segnalibri i %1$d nodi migliori Effettua Test + + Resolving Payment URI… + Could not resolve Payment URI + Resolved Payment URI ✔ + + Ricevitore + + XMR.TO offline - try again later + BTC amount out of bounds + Invalid or outdated Payment URL + Too many requests diff --git a/app/src/main/res/values-ja/help.xml b/app/src/main/res/values-ja/help.xml index 451122e..64f92f1 100644 --- a/app/src/main/res/values-ja/help.xml +++ b/app/src/main/res/values-ja/help.xml @@ -239,9 +239,14 @@ コピーするか、QRコードから読み取るか、直接入力することができます。 間違ったアドレスにコインが送金されないように、 このアドレスは確実に間違いがないことを確認してください。

                -

                XMRの送金に加えて、あなたはBTCを XMR.TO のサービスを使って - 送金することができます(詳細は https://xmr.to をご覧ください)。 - 下記のBTCの送金のセクションをご覧ください。

                +

                In addition to using an XMR address, you can also use +

                  +
                • an OpenAlias for XMR or BTC
                • +
                • a BTC address
                • +
                • a bitcoin: URI (including BIP70 like bitpay)
                • + + Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to + for details). See the section on sending BTC below.

                  ペイメントID(Payment ID)

                  あなたは2者間でモネロを送金した理由を特定するために ペイメントIDを使うことができます。 @@ -422,4 +427,6 @@ シードノードと直接通信します。 スキャンは全部で10個のリモートノードを見つけたときに終了します。

                  ]]> + + diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 11a62b5..5b3890a 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -215,7 +215,6 @@ %1$s (指定) - 受け取り手の XMR/BTC アドレスまたは OpenAlias ペイメントID (オプション) 0.00 プライベートノート (オプション) @@ -409,4 +408,15 @@ テスト バックアップ成功 + + Resolving Payment URI… + Could not resolve Payment URI + Resolved Payment URI ✔ + + 受け取り手 + + XMR.TO offline - try again later + BTC amount out of bounds + Invalid or outdated Payment URL + Too many requests diff --git a/app/src/main/res/values-nb/help.xml b/app/src/main/res/values-nb/help.xml index d2e76a5..45762e5 100644 --- a/app/src/main/res/values-nb/help.xml +++ b/app/src/main/res/values-nb/help.xml @@ -143,8 +143,14 @@

                  Dette er den offentlige adressen til lommeboka du skal sende moneroj til, som du kan kopiere fra utklippstavla, skanne fra en QR-kode eller skrive inn manuellt. Vær sikker på at du trippelsjekker dette for å forsikre deg om at du ikke sender moneroj til feil adresse.

                  -

                  I tillegg til å sende XMR, kan du sende BTC gjennom XMR.TO tjenesten (se https://xmr.to - for detaljer). Se seksjonen på å sende BTC under.

                  +

                  In addition to using an XMR address, you can also use +

                    +
                  • an OpenAlias for XMR or BTC
                  • +
                  • a BTC address
                  • +
                  • a bitcoin: URI (including BIP70 like bitpay)
                  • + + Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to + for details). See the section on sending BTC below.

                    Betalings-ID

                    Du kan bruke betalings-ID til å identifisere hvorfor du sendte Monero mellom to parter. Dette er helt frivillig og privat. For eksempel lar det en bedrift tilknytte transaksjonen din med @@ -286,4 +292,6 @@ Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The scan stops when it finds 10 remote nodes in total.

                    ]]> + + diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 5a963d6..54aa12f 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -331,7 +331,6 @@ OpenAlias secure ✔ Resolving OpenAlias… OpenAlias without DNSSEC - address may be spoofed - Receiver\'s XMR/BTC Address or OpenAlias Node version incompatible - please upgrade! @@ -364,4 +363,14 @@ Scanning network… Automatically bookmarked best %1$d nodes Test + + Resolving Payment URI… + Could not resolve Payment URI + Resolved Payment URI ✔ + Receiver + + XMR.TO offline - try again later + BTC amount out of bounds + Invalid or outdated Payment URL + Too many requests diff --git a/app/src/main/res/values-nl/help.xml b/app/src/main/res/values-nl/help.xml index c9ec5ab..4c160df 100644 --- a/app/src/main/res/values-nl/help.xml +++ b/app/src/main/res/values-nl/help.xml @@ -112,8 +112,14 @@

                    Verzenden

                    Adres ontvanger

                    Dit is het openbare adres van de portemonnee waar je moneroj naartoe stuurt. Je kunt dit kopiëren via het klembord, een QR-code scannen of het adres handmatig invoeren. Controleer dit nauwkeurig om er zeker van te zijn dat je geen geld naar het verkeerde adres stuurt.

                    -

                    Je kunt niet alleen XMR verzenden, maar ook BTC via XMR.TO (zie https://xmr.to - voor meer informatie). Zie ook het gedeelte over BTC verzenden hieronder.

                    +

                    In addition to using an XMR address, you can also use +

                      +
                    • an OpenAlias for XMR or BTC
                    • +
                    • a BTC address
                    • +
                    • a bitcoin: URI (including BIP70 like bitpay)
                    • + + Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to + for details). See the section on sending BTC below.

                      Betalings-ID

                      Je kunt een Betalings-ID gebruiken om aan te geven waarom je Monero verzendt. Dit is volledig optioneel en blijft vertrouwelijk tussen beide partijen. Een bedrijf kan bijvoorbeeld jouw transactie koppelen aan een artikel dat je hebt gekocht.

                      BTC verzenden

                      @@ -214,4 +220,6 @@ Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The scan stops when it finds 10 remote nodes in total.

                      ]]> + + diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 2e69b26..875a7ba 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -210,7 +210,6 @@ %1$s (schatting) - XMR- of BTC-adres ontvanger Betalings-ID (optioneel) 0,00 Opmerkingen voor jezelf (optioneel) @@ -363,4 +362,15 @@ Test Backup successful + + Resolving Payment URI… + Could not resolve Payment URI + Resolved Payment URI ✔ + + Ontvanger + + XMR.TO offline - try again later + BTC amount out of bounds + Invalid or outdated Payment URL + Too many requests diff --git a/app/src/main/res/values-pt-rBR/help.xml b/app/src/main/res/values-pt-rBR/help.xml index 41f831f..92ac1c1 100755 --- a/app/src/main/res/values-pt-rBR/help.xml +++ b/app/src/main/res/values-pt-rBR/help.xml @@ -154,8 +154,14 @@

                      Este é o endereço público da carteira na qual você está enviando Monero. Você pode colar da sua área de transferência, escanear um código QR ou escrevê-lo manualmente. Verifique-o múltiplas vezes para garantir que você não está enviando Monero para o endereço errado.

                      -

                      Além de enviar XMR, você também pode enviar BTC através do serviço XMR.TO (consulte https://xmr.to para mais detalhes). - Consulte a seção de envio de BTC mais abaixo.

                      +

                      In addition to using an XMR address, you can also use +

                        +
                      • an OpenAlias for XMR or BTC
                      • +
                      • a BTC address
                      • +
                      • a bitcoin: URI (including BIP70 like bitpay)
                      • + + Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to + for details). See the section on sending BTC below.

                        ID do Pagamento

                        Você pode usar o ID do Pagamento para identificar a razão pela qual você transacionou com a contraparte. Essa opção é opcional e privada. Por exemplo, lojistas podem reconciliar o seu pagamento com @@ -281,4 +287,6 @@ o Monerujo irá direto para os nós codificados direto no Monero em si. O escaneamento termina quando 10 nós remotos são encontrados no total.

                        ]]> + + diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 939d570..4e47eec 100755 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -212,7 +212,6 @@ %1$s (indicativo) - Endereço de destino XMR ou BTC ID do pagamento (opcional) 0.00 Notas (opcional) @@ -356,4 +355,14 @@ Testar Backup feito com successo + + Resolving Payment URI… + Could not resolve Payment URI + Resolved Payment URI ✔ + Receiver + + XMR.TO offline - try again later + BTC amount out of bounds + Invalid or outdated Payment URL + Too many requests diff --git a/app/src/main/res/values-pt/help.xml b/app/src/main/res/values-pt/help.xml index 08f10d4..375e90a 100644 --- a/app/src/main/res/values-pt/help.xml +++ b/app/src/main/res/values-pt/help.xml @@ -141,8 +141,14 @@

                        Este é o endereço público da carteira para a qual vais enviar Moneroj, podes copiar esta informação da área de transferência, capturara um código QR, ou introduzir manualmente. Confirma atentamente que não estás a enviar para o endereço errado.

                        -

                        Em adição a enviar XMR, podes enviar BTC através do serviço XMR.TO (ver https://xmr.to - para mais detalhes). Vê a secção de enviar BTC mais abaixo.

                        +

                        In addition to using an XMR address, you can also use +

                          +
                        • an OpenAlias for XMR or BTC
                        • +
                        • a BTC address
                        • +
                        • a bitcoin: URI (including BIP70 like bitpay)
                        • + + Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to + for details). See the section on sending BTC below.

                          ID do Pagamento

                          Utiliza-se o ID do Pagamento para identificar a razão porque foram transaccionados Moneroj. Isto é opcional e privado. Por exemplo, isto permite que um negócio identifique que item @@ -289,4 +295,6 @@ Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The scan stops when it finds 10 remote nodes in total.

                          ]]> + + diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index c95ab46..cc35b71 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -333,7 +333,6 @@ OpenAlias secure ✔ Resolving OpenAlias… OpenAlias without DNSSEC - address may be spoofed - Receiver\'s XMR/BTC Address or OpenAlias Node version incompatible - please upgrade! @@ -368,4 +367,14 @@ Test Backup successful + + Resolving Payment URI… + Could not resolve Payment URI + Resolved Payment URI ✔ + Receiver + + XMR.TO offline - try again later + BTC amount out of bounds + Invalid or outdated Payment URL + Too many requests diff --git a/app/src/main/res/values-ro/help.xml b/app/src/main/res/values-ro/help.xml index 8d20210..8fc6f8e 100644 --- a/app/src/main/res/values-ro/help.xml +++ b/app/src/main/res/values-ro/help.xml @@ -133,8 +133,14 @@

                          Aceasta este adresa publică a destinatarului la care vrei să trimiți Monero, poți copia această adresă folosind clipboard-ul, scanând codul QR sau introducând-o manual. Verifică de trei ori această adresă pentru a fi sigur că nu trimiți monedele la o adresă greșită.

                          -

                          Pe lângă trimiterea de XMR, poți trimite BTC prin intermediul serviciului XMR.TO - (vezi https://xmr.to pentru detalii). Vizualizează secțiunea despre trimiterea BTC mai jos.

                          +

                          In addition to using an XMR address, you can also use +

                            +
                          • an OpenAlias for XMR or BTC
                          • +
                          • a BTC address
                          • +
                          • a bitcoin: URI (including BIP70 like bitpay)
                          • + + Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to + for details). See the section on sending BTC below.

                            Payment ID

                            Poți utiliza un ID de plată pentru a identifica suma trimisă între două terțe, acest lucru este complet opțional și privat. Ca exemplu, poate permite identificare într-o activitate comercială @@ -274,4 +280,6 @@ Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The scan stops when it finds 10 remote nodes in total.

                            ]]> + + diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 5bad90e..3740c27 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -331,7 +331,6 @@ OpenAlias secure ✔ Resolving OpenAlias… OpenAlias without DNSSEC - address may be spoofed - Receiver\'s XMR/BTC Address or OpenAlias Node version incompatible - please upgrade! @@ -364,4 +363,14 @@ Scanning network… Automatically bookmarked best %1$d nodes Test + + Resolving Payment URI… + Could not resolve Payment URI + Resolved Payment URI ✔ + Receiver + + XMR.TO offline - try again later + BTC amount out of bounds + Invalid or outdated Payment URL + Too many requests diff --git a/app/src/main/res/values-ru/help.xml b/app/src/main/res/values-ru/help.xml index a923cc0..3e9d1f1 100644 --- a/app/src/main/res/values-ru/help.xml +++ b/app/src/main/res/values-ru/help.xml @@ -146,8 +146,14 @@

                            Это публичный адрес кошелька, на который вы отправляете Monero. Вы можете скопировать его из буфера, отсканировать QR-код или ввести вручную. Следует трижды проверить правильность этого адреса, чтобы не отправить монеты на ошибочный адрес.

                            -

                            Помимо XMR служба XMR.TO позволяет отправлять BTC (подробности ищите на https://xmr.to). - См. раздел по отправке BTC ниже.

                            +

                            In addition to using an XMR address, you can also use +

                              +
                            • an OpenAlias for XMR or BTC
                            • +
                            • a BTC address
                            • +
                            • a bitcoin: URI (including BIP70 like bitpay)
                            • + + Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to + for details). See the section on sending BTC below.

                              Идентификатор оплаты (Payment ID)

                              Вы можете использовать Payment ID для идентификации причины, по которой Monero передаётся между двумя сторонами. Это опциональная и конфиденциальная операция. Например, @@ -292,4 +298,6 @@ Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The scan stops when it finds 10 remote nodes in total.

                              ]]> + + diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 73648dd..8b83296 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -332,7 +332,6 @@ OpenAlias безопасен ✔ Разрешения OpenAlias… OpenAlias без DNSSEC - адрес может быть подделан - XMR/BTC адрес получателя или OpenAlias Node version incompatible - please upgrade! @@ -367,4 +366,15 @@ Test Backup successful + + Resolving Payment URI… + Could not resolve Payment URI + Resolved Payment URI ✔ + + Получател + + XMR.TO offline - try again later + BTC amount out of bounds + Invalid or outdated Payment URL + Too many requests diff --git a/app/src/main/res/values-sk/help.xml b/app/src/main/res/values-sk/help.xml index 5da9356..a8c618a 100644 --- a/app/src/main/res/values-sk/help.xml +++ b/app/src/main/res/values-sk/help.xml @@ -148,8 +148,14 @@

                              Adresa Príjemcu

                              Toto je verejná adresa peňaženky kam posielaš Monero. Môžeš ju kopírovať zo schránky, skenovať QR kód alebo vložiť manuálne. Trikrát sa uisti, že neposielaš mince na zlú adresu.

                              -

                              Okrem posielana XMR, môžeš posielať BTC cez sllužbu XMR.TO (pozri https://xmr.to). - Pozri sekciu posielanie BTC nižšie.

                              +

                              In addition to using an XMR address, you can also use +

                                +
                              • an OpenAlias for XMR or BTC
                              • +
                              • a BTC address
                              • +
                              • a bitcoin: URI (including BIP70 like bitpay)
                              • + + Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to + for details). See the section on sending BTC below.

                                ID Platby

                                ID Platby môžeš použiť na identifikáciu platby medzi dvoma stranami. Nie je to síce povinný, ale je to súkromný údaj. @@ -225,14 +231,13 @@ ]]> Uzly

    TL;DR

    Aktuálny zoznam uzlov získaš tak, že potiahneš a pridáš do záložiek 5 uzlov, z ktorých si Monerujo jeden vyberie.

    Čo je Uzol?

    Monerujo používa vzdialený uzol (Remote Node, niekedy nazývaný aj Daemon) a peňaženka tak môže komunikovať so sieťou Monero bez toho, aby bolo potrebné sťahovať celú blockchain.

    Zoznam Uzlov

    -

    Ak je zoznam prázdny, môžeš zadať adresu uzla manuálne, alebo môžeš nechať Monerujo preskúmať celú sieť. Prípadne oboje. Čítaj ďalej...

    +

    Ak je zoznam prázdny, môžeš zadať adresu uzla manuálne, alebo môžeš nechať Monerujo preskúmať celú sieť. Prípadne oboje. Čítaj ďalej…

    Zoznam uzlov zobrazuje všetky momentálne známe uzly. Pod každým uzlom je zobrazená časová pečiatka jeho posledného bloku. Vedľa je ikonka nodu, ktorá indikuje úroveň pripojenia.

    Ktorýkoľvek uzol v zozname si môžte pridať do záložiek pre budúce použitie. Uzly, ktoré nebudú uložené, sa z pamäte vymažú.

    @@ -254,4 +259,6 @@ Začína tým, že sa opýta uzlov vo vašich záložkách na ďalšie uzly v P2P sieti Monero, ktoré sú s nimi spojené, tých sa opýta zas na ďalšie uzly atď. V prípade, že nemáte žiadne uzly vo svojich záložkách, Monerujo bude skúšať uzly (seed nodes) natvrdo zapísané v kóde Monero. Vyhľadávanie končí ak Monerujo nájde aspoň 10 vzdialených uzlov.

    ]]> + + diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 91f1d17..679d435 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -329,7 +329,6 @@ OpenAlias zabezpečený ✔ Prekladám OpenAlias… OpenAlias bez DNSSEC - adresa môže byť zneužitá - Prijímateľova XMR/BTC adresa alebo OpenAlias Nekompatibilný s verziou uzla - nutná aktualizácia! @@ -364,4 +363,15 @@ Test Backup successful + + Resolving Payment URI… + Could not resolve Payment URI + Resolved Payment URI ✔ + + Prijímatel + + XMR.TO offline - try again later + BTC amount out of bounds + Invalid or outdated Payment URL + Too many requests diff --git a/app/src/main/res/values-sv/help.xml b/app/src/main/res/values-sv/help.xml index 04ee665..a9b3a01 100644 --- a/app/src/main/res/values-sv/help.xml +++ b/app/src/main/res/values-sv/help.xml @@ -131,8 +131,14 @@

    Det här är offentliga adressen av plånboken du skickar Moneroj till, du kan kopiera den från urklipp, skanna en QR-kod eller ange den manuellt. Se till att du trippel-kollar den för att vara säker på att du inte skickar pengar till fel adress.

    -

    Dessutom kan du skicka BTC genom XMR.TO tjänsten (se https://xmr.to för detaljer). Se delen - om att skicka BTC nedan.

    +

    In addition to using an XMR address, you can also use +

      +
    • an OpenAlias for XMR or BTC
    • +
    • a BTC address
    • +
    • a bitcoin: URI (including BIP70 like bitpay)
    • + + Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to + for details). See the section on sending BTC below.

      Betalnings-ID

      Du kan använda ett Betalnings-ID för att identifiera anledningen du skickat Monero till någon, det är valfritt och privat. Till exempel tillåter det en affär att förknippa din transaktion @@ -269,4 +275,6 @@ Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The scan stops when it finds 10 remote nodes in total.

      ]]> + + diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 9ba59e2..2f33499 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -315,7 +315,6 @@ OpenAlias säkrad ✔ Slår upp OpenAlias… OpenAlias utan DNSSEC - adressen kan vara förfalskad - Mottagarens XMR/BTC-adress eller OpenAlias Node version incompatible - please upgrade! @@ -348,4 +347,15 @@ Scanning network… Automatically bookmarked best %1$d nodes Test + + Resolving Payment URI… + Could not resolve Payment URI + Resolved Payment URI ✔ + + Mottagaren + + XMR.TO offline - try again later + BTC amount out of bounds + Invalid or outdated Payment URL + Too many requests diff --git a/app/src/main/res/values-ua/strings.xml b/app/src/main/res/values-ua/strings.xml index ed79e30..7f5581c 100644 --- a/app/src/main/res/values-ua/strings.xml +++ b/app/src/main/res/values-ua/strings.xml @@ -332,7 +332,6 @@ OpenAlias безпечний ✔ Дозволи OpenAlias… OpenAlias без DNSSEC - адреса може бути підмінена - XMR/BTC адреса отримувача або OpenAlias Node version incompatible - please upgrade! @@ -367,4 +366,15 @@ Test Backup successful + + Resolving Payment URI… + Could not resolve Payment URI + Resolved Payment URI ✔ + + Receiver + + XMR.TO offline - try again later + BTC amount out of bounds + Invalid or outdated Payment URL + Too many requests diff --git a/app/src/main/res/values-zh-rCN/help.xml b/app/src/main/res/values-zh-rCN/help.xml index 287b550..150cbce 100644 --- a/app/src/main/res/values-zh-rCN/help.xml +++ b/app/src/main/res/values-zh-rCN/help.xml @@ -123,8 +123,14 @@

      收款者地址

      这是你欲发送Monero过去的钱包地址。你可以从剪贴簿贴上, 扫描QR码或是手动输入。 请务必再三确认地址正确以免发送至错误的钱包地址

      -

      除了发送XMR,你还可透过 XMR.TO 服务来发送BTC (请至 https://xmr.to - 了解更多),或在下面阅读发送BTC的說明

      +

      In addition to using an XMR address, you can also use +

        +
      • an OpenAlias for XMR or BTC
      • +
      • a BTC address
      • +
      • a bitcoin: URI (including BIP70 like bitpay)
      • + + Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to + for details). See the section on sending BTC below.

        付款ID

        你可以使用付款ID以帮助识別双方的款项交易。这是选填项目并且完全为隐私保护的。 举例来說这可以让公司行号辨別你的这笔款项是用来支付某项购买的商品。

        @@ -247,4 +253,6 @@ Monerujo will go straight to the Monero seed nodes hardcoded into Monero. The scan stops when it finds 10 remote nodes in total.

        ]]> + + diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index fdd9ebd..6df893c 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -329,7 +329,6 @@ OpenAlias secure ✔ Resolving OpenAlias… OpenAlias without DNSSEC - address may be spoofed - Receiver\'s XMR/BTC Address or OpenAlias Node version incompatible - please upgrade! @@ -362,4 +361,14 @@ Scanning network… Automatically bookmarked best %1$d nodes Test + + Resolving Payment URI… + Could not resolve Payment URI + Resolved Payment URI ✔ + Receiver + + XMR.TO offline - try again later + BTC amount out of bounds + Invalid or outdated Payment URL + Too many requests diff --git a/app/src/main/res/values-zh-rTW/help.xml b/app/src/main/res/values-zh-rTW/help.xml index b37fbff..f2c6a7a 100644 --- a/app/src/main/res/values-zh-rTW/help.xml +++ b/app/src/main/res/values-zh-rTW/help.xml @@ -116,8 +116,14 @@

        收款者地址

        這是你欲發送 Monero 過去的錢包地址。你可以從剪貼簿貼上, 掃描 QR 碼或是手動輸入。 請務必再三確認地址正確以免發送至錯誤的錢包地址

        -

        除了發送 XMR,你還可透過 XMR.TO 服務來發送 BTC (請至 https://xmr.to - 了解更多),或在下面閱讀發送 BTC 的說明

        +

        In addition to using an XMR address, you can also use +

          +
        • an OpenAlias for XMR or BTC
        • +
        • a BTC address
        • +
        • a bitcoin: URI (including BIP70 like bitpay)
        • + + Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to + for details). See the section on sending BTC below.

          付款 ID

          你可以使用付款 ID 以幫助識別雙方的款項交易。這是選填項目並且完全為隱私保護的。 舉例來說這可以讓公司行號辨別你的這筆款項是用來支付某項購買的商品。

          @@ -218,4 +224,6 @@ 如果你沒有任何書籤節點 (或是書籤節點無法提供它們的連接清單),Monerujo 將會直接從 Monero 內建的種子節點取得清單。 這個掃描功能將會在總共可用節點的數量達到十個後停止。

          ]]> + + diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index baf24b5..54862d6 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -330,7 +330,6 @@ 這個 OpenAlias 已確認安全可用 ✔ 正在解析 OpenAlias … 這個 OpenAlias 沒有使用 DNSSEC - 地址有被欺騙的風險 - 收款者的 XMR/BTC 地址或 OpenAlias 節點版本不相容 - 請盡速更新! @@ -363,4 +362,15 @@ 掃描節點中 … 已自動加入 %1$d 個節點至書籤 測試節點 + + Resolving Payment URI… + Could not resolve Payment URI + Resolved Payment URI ✔ + + 收款者 + + XMR.TO offline - try again later + BTC amount out of bounds + Invalid or outdated Payment URL + Too many requests diff --git a/app/src/main/res/values/help.xml b/app/src/main/res/values/help.xml index 5a1a19e..b619f54 100644 --- a/app/src/main/res/values/help.xml +++ b/app/src/main/res/values/help.xml @@ -155,7 +155,13 @@

          This is the public address of the wallet you are sending Moneroj to, you can copy this from your clipboard, scan a QR code or enter it manually. Make sure you triple check this to ensure you aren’t sending coins to the wrong address.

          -

          In addition to sending XMR, you can send BTC through the XMR.TO service (see https://xmr.to +

          In addition to using an XMR address, you can also use +

            +
          • an OpenAlias for XMR or BTC
          • +
          • a BTC address
          • +
          • a bitcoin: URI (including BIP70 like bitpay)
          • + + Please note, that sending BTC is processed through the XMR.TO service (see https://xmr.to for details). See the section on sending BTC below.

            Payment ID

            You can use a Payment ID to identify the reason you sent Monero between two parties. This diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0aed979..755b8d3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -219,7 +219,6 @@ %1$s (indicative) - Receiver\'s XMR/BTC Address or OpenAlias Payment ID (optional) 0.00 Private Notes (optional) @@ -411,4 +410,16 @@ Scanning network… Automatically bookmarked best %1$d nodes Test + + Resolving Payment URI… + Could not resolve Payment URI + Resolved Payment URI ✔ + Receiver + + XMR.TO offline - try again later + BTC amount out of bounds + Invalid or outdated Payment URL + Too many requests + + XMR.TO Service Error diff --git a/app/src/test/java/com/m2049r/xmrwallet/util/UserNoteTest.java b/app/src/test/java/com/m2049r/xmrwallet/util/UserNoteTest.java index 33acec0..28cd4db 100644 --- a/app/src/test/java/com/m2049r/xmrwallet/util/UserNoteTest.java +++ b/app/src/test/java/com/m2049r/xmrwallet/util/UserNoteTest.java @@ -16,6 +16,8 @@ package com.m2049r.xmrwallet.util; +import com.m2049r.xmrwallet.data.UserNotes; + import org.junit.Test; import static org.junit.Assert.assertNotNull;