diff --git a/app/build.gradle b/app/build.gradle index c2bb0b4e..8e4a678f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,8 +7,8 @@ android { applicationId "com.m2049r.xmrwallet" minSdkVersion 21 targetSdkVersion 29 - versionCode 702 - versionName "1.17.2 'Druk'" + versionCode 705 + versionName "1.17.5.1 'Druk'" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" externalNativeBuild { cmake { diff --git a/app/src/main/java/com/m2049r/xmrwallet/BaseActivity.java b/app/src/main/java/com/m2049r/xmrwallet/BaseActivity.java index 43185b24..d30f2978 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/BaseActivity.java +++ b/app/src/main/java/com/m2049r/xmrwallet/BaseActivity.java @@ -213,7 +213,7 @@ public class BaseActivity extends SecureActivity implements GenerateReviewFragme if (uri == null) { Toast.makeText(this, getString(R.string.nfc_tag_read_undef), Toast.LENGTH_LONG).show(); } else { - BarcodeData bc = BarcodeData.fromQrCode(uri.toString()); + BarcodeData bc = BarcodeData.fromString(uri.toString()); if (bc == null) Toast.makeText(this, getString(R.string.nfc_tag_read_undef), Toast.LENGTH_LONG).show(); else diff --git a/app/src/main/java/com/m2049r/xmrwallet/ReceiveFragment.java b/app/src/main/java/com/m2049r/xmrwallet/ReceiveFragment.java index ffc0c5b4..2c0276a3 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/ReceiveFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/ReceiveFragment.java @@ -58,6 +58,7 @@ import com.google.zxing.qrcode.QRCodeWriter; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import com.m2049r.xmrwallet.BuildConfig; import com.m2049r.xmrwallet.data.BarcodeData; +import com.m2049r.xmrwallet.data.Crypto; import com.m2049r.xmrwallet.ledger.LedgerProgressDialog; import com.m2049r.xmrwallet.model.Wallet; import com.m2049r.xmrwallet.model.WalletManager; @@ -469,7 +470,7 @@ public class ReceiveFragment extends Fragment { Timber.d("CLEARQR"); return; } - bcData = new BarcodeData(BarcodeData.Asset.XMR, address, notes, xmrAmount); + bcData = new BarcodeData(Crypto.XMR, address, notes, xmrAmount); int size = Math.max(ivQrCode.getWidth(), ivQrCode.getHeight()); Bitmap qr = generate(bcData.getUriString(), size, size); if (qr != null) { diff --git a/app/src/main/java/com/m2049r/xmrwallet/ScannerFragment.java b/app/src/main/java/com/m2049r/xmrwallet/ScannerFragment.java index 4f08cdd0..32512fdf 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/ScannerFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/ScannerFragment.java @@ -73,14 +73,7 @@ public class ScannerFragment extends Fragment implements ZXingScannerView.Result // * On older devices continuously stopping and resuming camera preview can result in freezing the app. // * I don't know why this is the case but I don't have the time to figure out. Handler handler = new Handler(); - handler.postDelayed(new - - Runnable() { - @Override - public void run() { - mScannerView.resumeCameraPreview(ScannerFragment.this); - } - }, 2000); + handler.postDelayed(() -> mScannerView.resumeCameraPreview(ScannerFragment.this), 2000); } @Override diff --git a/app/src/main/java/com/m2049r/xmrwallet/TxFragment.java b/app/src/main/java/com/m2049r/xmrwallet/TxFragment.java index ccf72c42..22e199b9 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/TxFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/TxFragment.java @@ -300,7 +300,7 @@ public class TxFragment extends Fragment { } tvTxXmrToKey.setText(key); tvDestinationBtc.setText(userNotes.xmrtoDestination); - tvTxAmountBtc.setText(userNotes.xmrtoAmount + " BTC"); + tvTxAmountBtc.setText(userNotes.xmrtoAmount + " "+ userNotes.xmrtoCurrency); switch (userNotes.xmrtoTag) { case "xmrto": tvXmrToSupport.setVisibility(View.GONE); diff --git a/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java b/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java index 87de0d81..10d6c1d2 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java +++ b/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java @@ -921,7 +921,7 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste @Override public boolean onScanned(String qrCode) { // #gurke - BarcodeData bcData = BarcodeData.fromQrCode(qrCode); + BarcodeData bcData = BarcodeData.fromString(qrCode); if (bcData != null) { popFragmentStack(null); Timber.d("AAA"); diff --git a/app/src/main/java/com/m2049r/xmrwallet/WalletFragment.java b/app/src/main/java/com/m2049r/xmrwallet/WalletFragment.java index f441ac52..1a1ac103 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/WalletFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/WalletFragment.java @@ -49,6 +49,7 @@ import com.m2049r.xmrwallet.service.exchange.api.ExchangeApi; import com.m2049r.xmrwallet.service.exchange.api.ExchangeCallback; import com.m2049r.xmrwallet.service.exchange.api.ExchangeRate; import com.m2049r.xmrwallet.util.Helper; +import com.m2049r.xmrwallet.util.ServiceHelper; import com.m2049r.xmrwallet.widget.Toolbar; import java.text.NumberFormat; @@ -242,7 +243,7 @@ public class WalletFragment extends Fragment String balanceCurrency = Helper.BASE_CRYPTO; double balanceRate = 1.0; - private final ExchangeApi exchangeApi = Helper.getExchangeApi(); + private final ExchangeApi exchangeApi = ServiceHelper.getExchangeApi(); void refreshBalance() { double unconfirmedXmr = Helper.getDecimalAmount(balance - unlockedBalance).doubleValue(); 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 8d2b60f7..eb155f15 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/data/BarcodeData.java +++ b/app/src/main/java/com/m2049r/xmrwallet/data/BarcodeData.java @@ -18,69 +18,57 @@ package com.m2049r.xmrwallet.data; import android.net.Uri; -import com.m2049r.xmrwallet.model.Wallet; -import com.m2049r.xmrwallet.util.BitcoinAddressValidator; import com.m2049r.xmrwallet.util.OpenAliasHelper; import java.net.URI; import java.net.URISyntaxException; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; +import lombok.ToString; import timber.log.Timber; +@ToString public class BarcodeData { - - public static final String XMR_SCHEME = "monero:"; - public static final String XMR_PAYMENTID = "tx_payment_id"; - public static final String XMR_AMOUNT = "tx_amount"; - public static final String XMR_DESCRIPTION = "tx_description"; - - 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_DESCRIPTION = "message"; - static final String BTC_AMOUNT = "amount"; - - public enum Asset { - XMR, BTC - } - public enum Security { NORMAL, OA_NO_DNSSEC, OA_DNSSEC } - final public Asset asset; + final public Crypto asset; + final public List<Crypto> ambiguousAssets; final public String address; final public String addressName; final public String amount; final public String description; final public Security security; - public BarcodeData(Asset asset, String address) { - this(asset, address, null, null, null, Security.NORMAL); + public BarcodeData(List<Crypto> assets, String address) { + if (assets.isEmpty()) + throw new IllegalArgumentException("no assets specified"); + this.addressName = null; + this.description = null; + this.amount = null; + this.security = Security.NORMAL; + this.address = address; + if (assets.size() == 1) { + this.asset = assets.get(0); + this.ambiguousAssets = null; + } else { + this.asset = null; + this.ambiguousAssets = assets; + } } - public BarcodeData(Asset asset, String address, String amount) { - this(asset, address, null, null, amount, Security.NORMAL); - } - - public BarcodeData(Asset asset, String address, String amount, String description, Security security) { - this(asset, address, null, description, amount, security); - } - - public BarcodeData(Asset asset, String address, String paymentId, String description, String amount) { + public BarcodeData(Crypto asset, String address, String description, String amount) { this(asset, address, null, description, amount, Security.NORMAL); } - public BarcodeData(Asset asset, String address, String description, String amount) { - this(asset, address, null, description, amount, Security.NORMAL); - } - - public BarcodeData(Asset asset, String address, String addressName, String description, String amount, Security security) { + public BarcodeData(Crypto asset, String address, String addressName, String description, String amount, Security security) { + this.ambiguousAssets = null; this.asset = asset; this.address = address; this.addressName = addressName; @@ -94,133 +82,54 @@ public class BarcodeData { } public String getUriString() { - if (asset != Asset.XMR) throw new IllegalStateException("We can only do XMR stuff!"); + if (asset != Crypto.XMR) throw new IllegalStateException("We can only do XMR stuff!"); StringBuilder sb = new StringBuilder(); - sb.append(BarcodeData.XMR_SCHEME).append(address); + sb.append(Crypto.XMR.getUriScheme()).append(address); boolean first = true; if ((description != null) && !description.isEmpty()) { sb.append(first ? "?" : "&"); first = false; - sb.append(BarcodeData.XMR_DESCRIPTION).append('=').append(Uri.encode(description)); + sb.append(Crypto.XMR.getUriMessage()).append('=').append(Uri.encode(description)); } if ((amount != null) && !amount.isEmpty()) { sb.append(first ? "?" : "&"); - sb.append(BarcodeData.XMR_AMOUNT).append('=').append(amount); + sb.append(Crypto.XMR.getUriAmount()).append('=').append(amount); } return sb.toString(); } - static public BarcodeData fromQrCode(String qrCode) { - // check for monero uri - BarcodeData bcData = parseMoneroUri(qrCode); - // check for naked monero address / integrated address - if (bcData == null) { - bcData = parseMoneroNaked(qrCode); - } - // check for btc uri - if (bcData == null) { - bcData = parseBitcoinUri(qrCode); - } - // check for naked btc address - if (bcData == null) { - bcData = parseBitcoinNaked(qrCode); - } - // check for OpenAlias - if (bcData == null) { - bcData = parseOpenAlias(qrCode, false); - } - return bcData; - } - - /** - * Parse and decode a monero scheme string. It is here because it needs to validate the data. - * - * @param uri String containing a monero URL - * @return BarcodeData object or null if uri not valid - */ - - static public BarcodeData parseMoneroUri(String uri) { - Timber.d("parseMoneroUri=%s", uri); - - if (uri == null) return null; - - if (!uri.startsWith(XMR_SCHEME)) return null; - - String noScheme = uri.substring(XMR_SCHEME.length()); - Uri monero = Uri.parse(noScheme); - Map<String, String> parms = new HashMap<>(); - String query = monero.getEncodedQuery(); - if (query != null) { - String[] args = query.split("&"); - for (String arg : args) { - String[] namevalue = arg.split("="); - if (namevalue.length == 0) { - continue; - } - parms.put(Uri.decode(namevalue[0]).toLowerCase(), - namevalue.length > 1 ? Uri.decode(namevalue[1]) : ""); + static private BarcodeData parseNaked(String address) { + List<Crypto> possibleAssets = new ArrayList<>(); + for (Crypto crypto : Crypto.values()) { + if (crypto.validate(address)) { + possibleAssets.add(crypto); } } - String address = monero.getPath(); - - String paymentId = parms.get(XMR_PAYMENTID); - // no support for payment ids! - if (paymentId != null) { - Timber.e("no support for payment ids!"); + if (possibleAssets.isEmpty()) return null; - } - - String description = parms.get(XMR_DESCRIPTION); - String amount = parms.get(XMR_AMOUNT); - if (amount != null) { - try { - Double.parseDouble(amount); - } catch (NumberFormatException ex) { - Timber.d(ex.getLocalizedMessage()); - return null; // we have an amount but its not a number! - } - } - - if ((address == null) || !Wallet.isAddressValid(address)) { - Timber.d("address invalid"); - return null; - } - return new BarcodeData(Asset.XMR, address, description, amount); + return new BarcodeData(possibleAssets, address); } - static public BarcodeData parseMoneroNaked(String address) { - Timber.d("parseMoneroNaked=%s", address); + static public BarcodeData parseUri(String uriString) { + Timber.d("parseBitUri=%s", uriString); - if (address == null) return null; - - if (!Wallet.isAddressValid(address)) { - Timber.d("address invalid"); - return null; - } - - return new BarcodeData(Asset.XMR, address); - } - - // bitcoin:mpQ84J43EURZHkCnXbyQ4PpNDLLBqdsMW2?amount=0.01 - // bitcoin:?r=https://bitpay.com/i/xxx - static public BarcodeData parseBitcoinUri(String uriString) { - Timber.d("parseBitcoinUri=%s", uriString); - - 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.isOpaque()) return null; + final String scheme = uri.getScheme(); + Crypto crypto = Crypto.withScheme(scheme); + if (crypto == null) return null; String[] parts = uri.getRawSchemeSpecificPart().split("[?]"); if ((parts.length <= 0) || (parts.length > 2)) { Timber.d("invalid number of parts %d", parts.length); return null; } + Map<String, String> parms = new HashMap<>(); if (parts.length == 2) { String[] args = parts[1].split("&"); @@ -233,17 +142,19 @@ public class BarcodeData { namevalue.length > 1 ? Uri.decode(namevalue[1]) : ""); } } - String description = parms.get(BTC_DESCRIPTION); - String address = parts[0]; // no need to decode as there can bo no special characters + + String addressName = parms.get(crypto.getUriLabel()); + String description = parms.get(crypto.getUriMessage()); + String address = parts[0]; // no need to decode as there can be no special characters if (address.isEmpty()) { Timber.d("no address"); return null; } - if (!BitcoinAddressValidator.validate(address)) { - Timber.d("BTC address (%s) invalid", address); + if (!crypto.validate(address)) { + Timber.d("%s address (%s) invalid", crypto, address); return null; } - String amount = parms.get(BTC_AMOUNT); + String amount = parms.get(crypto.getUriAmount()); if ((amount != null) && (!amount.isEmpty())) { try { Double.parseDouble(amount); @@ -252,20 +163,21 @@ public class BarcodeData { return null; // we have an amount but its not a number! } } - return new BarcodeData(BarcodeData.Asset.BTC, address, description, amount); + return new BarcodeData(crypto, address, addressName, description, amount, Security.NORMAL); } - static public BarcodeData parseBitcoinNaked(String address) { - Timber.d("parseBitcoinNaked=%s", address); - if (address == null) return null; - - if (!BitcoinAddressValidator.validate(address)) { - Timber.d("address invalid"); - return null; + static public BarcodeData fromString(String qrCode) { + BarcodeData bcData = parseUri(qrCode); + if (bcData == null) { + // maybe it's naked? + bcData = parseNaked(qrCode); } - - return new BarcodeData(BarcodeData.Asset.BTC, address); + if (bcData == null) { + // check for OpenAlias + bcData = parseOpenAlias(qrCode, false); + } + return bcData; } static public BarcodeData parseOpenAlias(String oaString, boolean dnssec) { @@ -281,29 +193,16 @@ public class BarcodeData { String address = oaAttrs.get(OpenAliasHelper.OA1_ADDRESS); if (address == null) return null; - Asset asset; - if (OA_XMR_ASSET.equals(oaAsset)) { - if (!Wallet.isAddressValid(address)) { - Timber.d("XMR address invalid"); - return null; - } - asset = Asset.XMR; - } else if (OA_BTC_ASSET.equals(oaAsset)) { - if (!BitcoinAddressValidator.validate(address)) { - Timber.d("BTC address invalid"); - return null; - } - asset = Asset.BTC; - } else { + Crypto crypto = Crypto.withSymbol(oaAsset); + if (crypto == null) { Timber.i("Unsupported OpenAlias asset %s", oaAsset); return null; } - - String paymentId = oaAttrs.get(OpenAliasHelper.OA1_PAYMENTID); - if (paymentId != null) { - Timber.e("paymentId not supported"); + if (!crypto.validate(address)) { + Timber.d("%s address invalid", crypto); return null; } + String description = oaAttrs.get(OpenAliasHelper.OA1_DESCRIPTION); if (description == null) { description = oaAttrs.get(OpenAliasHelper.OA1_NAME); @@ -322,6 +221,10 @@ public class BarcodeData { Security sec = dnssec ? BarcodeData.Security.OA_DNSSEC : BarcodeData.Security.OA_NO_DNSSEC; - return new BarcodeData(asset, address, addressName, description, amount, sec); + return new BarcodeData(crypto, address, addressName, description, amount, sec); + } + + public boolean isAmbiguous() { + return ambiguousAssets != null; } } \ No newline at end of file diff --git a/app/src/main/java/com/m2049r/xmrwallet/data/Crypto.java b/app/src/main/java/com/m2049r/xmrwallet/data/Crypto.java new file mode 100644 index 00000000..e9e66f1d --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/data/Crypto.java @@ -0,0 +1,89 @@ +package com.m2049r.xmrwallet.data; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.m2049r.xmrwallet.R; +import com.m2049r.xmrwallet.model.Wallet; +import com.m2049r.xmrwallet.util.validator.BitcoinAddressType; +import com.m2049r.xmrwallet.util.validator.BitcoinAddressValidator; +import com.m2049r.xmrwallet.util.validator.EthAddressValidator; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public enum Crypto { + XMR("XMR", true, "monero:tx_amount:recipient_name:tx_description", R.id.ibXMR, R.drawable.ic_monero, R.drawable.ic_monero_bw, Wallet::isAddressValid), + BTC("BTC", true, "bitcoin:amount:label:message", R.id.ibBTC, R.drawable.ic_xmrto_btc, R.drawable.ic_xmrto_btc_off, address -> { + return BitcoinAddressValidator.validate(address, BitcoinAddressType.BTC); + }), + DASH("DASH", true, "dash:amount:label:message", R.id.ibDASH, R.drawable.ic_xmrto_dash, R.drawable.ic_xmrto_dash_off, address -> { + return BitcoinAddressValidator.validate(address, BitcoinAddressType.DASH); + }), + DOGE("DOGE", true, "dogecoin:amount:label:message", R.id.ibDOGE, R.drawable.ic_xmrto_doge, R.drawable.ic_xmrto_doge_off, address -> { + return BitcoinAddressValidator.validate(address, BitcoinAddressType.DOGE); + }), + ETH("ETH", false, "ethereum:amount:label:message", R.id.ibETH, R.drawable.ic_xmrto_eth, R.drawable.ic_xmrto_eth_off, EthAddressValidator::validate), + LTC("LTC", true, "litecoin:amount:label:message", R.id.ibLTC, R.drawable.ic_xmrto_ltc, R.drawable.ic_xmrto_ltc_off, address -> { + return BitcoinAddressValidator.validate(address, BitcoinAddressType.LTC); + }); + + @Getter + @NonNull + private final String symbol; + @Getter + private final boolean casefull; + @NonNull + private final String uriSpec; + @Getter + private final int buttonId; + @Getter + private final int iconEnabledId; + @Getter + private final int iconDisabledId; + @NonNull + private final Validator validator; + + @Nullable + public static Crypto withScheme(@NonNull String scheme) { + for (Crypto crypto : values()) { + if (crypto.getUriScheme().equals(scheme)) return crypto; + } + return null; + } + + @Nullable + public static Crypto withSymbol(@NonNull String symbol) { + final String upperSymbol = symbol.toUpperCase(); + for (Crypto crypto : values()) { + if (crypto.symbol.equals(upperSymbol)) return crypto; + } + return null; + } + + interface Validator { + boolean validate(String address); + } + + // TODO maybe cache these segments + String getUriScheme() { + return uriSpec.split(":")[0]; + } + + String getUriAmount() { + return uriSpec.split(":")[1]; + } + + String getUriLabel() { + return uriSpec.split(":")[2]; + } + + String getUriMessage() { + return uriSpec.split(":")[3]; + } + + boolean validate(String address) { + return validator.validate(address); + } +} 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 d95dbd23..55ec71a0 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/data/TxDataBtc.java +++ b/app/src/main/java/com/m2049r/xmrwallet/data/TxDataBtc.java @@ -24,6 +24,9 @@ import lombok.Getter; import lombok.Setter; public class TxDataBtc extends TxData { + @Getter + @Setter + private String btcSymbol; // the actual non-XMR thing we're sending @Getter @Setter private String xmrtoOrderId; // shown in success screen @@ -45,6 +48,7 @@ public class TxDataBtc extends TxData { @Override public void writeToParcel(Parcel out, int flags) { super.writeToParcel(out, flags); + out.writeString(btcSymbol); out.writeString(xmrtoOrderId); out.writeString(btcAddress); out.writeDouble(btcAmount); @@ -63,6 +67,7 @@ public class TxDataBtc extends TxData { protected TxDataBtc(Parcel in) { super(in); + btcSymbol = in.readString(); xmrtoOrderId = in.readString(); btcAddress = in.readString(); btcAmount = in.readDouble(); @@ -74,10 +79,23 @@ public class TxDataBtc extends TxData { StringBuilder sb = new StringBuilder(); sb.append("xmrtoOrderId:"); sb.append(xmrtoOrderId); + sb.append(",btcSymbol:"); + sb.append(btcSymbol); sb.append(",btcAddress:"); sb.append(btcAddress); sb.append(",btcAmount:"); sb.append(btcAmount); return sb.toString(); } + + public boolean validateAddress(@NonNull String address) { + if ((btcSymbol == null) || (btcAddress == null)) return false; + final Crypto crypto = Crypto.withSymbol(btcSymbol); + if (crypto == null) return false; + if (crypto.isCasefull()) { // compare as-is + return address.equals(btcAddress); + } else { // normalize & compare (e.g. ETH with and without checksum capitals + return address.toLowerCase().equals(btcAddress.toLowerCase()); + } + } } diff --git a/app/src/main/java/com/m2049r/xmrwallet/data/UserNotes.java b/app/src/main/java/com/m2049r/xmrwallet/data/UserNotes.java index 0e831059..f5eb14b5 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/data/UserNotes.java +++ b/app/src/main/java/com/m2049r/xmrwallet/data/UserNotes.java @@ -28,6 +28,7 @@ public class UserNotes { public String xmrtoTag = null; public String xmrtoKey = null; public String xmrtoAmount = null; // could be a double - but we are not doing any calculations + public String xmrtoCurrency = null; public String xmrtoDestination = null; public UserNotes(final String txNotes) { @@ -35,14 +36,15 @@ public class UserNotes { return; } this.txNotes = txNotes; - Pattern p = Pattern.compile("^\\{([a-z]+)-(\\w{6,}),([0-9.]*)BTC,(\\w*)\\} ?(.*)"); + Pattern p = Pattern.compile("^\\{([a-z]+)-(\\w{6,}),([0-9.]*)([A-Z]+),(\\w*)\\} ?(.*)"); Matcher m = p.matcher(txNotes); if (m.find()) { xmrtoTag = m.group(1); xmrtoKey = m.group(2); xmrtoAmount = m.group(3); - xmrtoDestination = m.group(4); - note = m.group(5); + xmrtoCurrency = m.group(4); + xmrtoDestination = m.group(5); + note = m.group(6); } else { note = txNotes; } @@ -62,6 +64,7 @@ public class UserNotes { xmrtoTag = order.TAG; xmrtoKey = order.getOrderId(); xmrtoAmount = Helper.getDisplayAmount(order.getBtcAmount()); + xmrtoCurrency = order.getBtcCurrency(); xmrtoDestination = order.getBtcAddress(); } else { xmrtoTag = null; @@ -83,7 +86,8 @@ public class UserNotes { sb.append(xmrtoKey); sb.append(","); sb.append(xmrtoAmount); - sb.append("BTC,"); + sb.append(xmrtoCurrency); + sb.append(","); sb.append(xmrtoDestination); sb.append("}"); if ((note != null) && (!note.isEmpty())) 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 2ad428e8..5114b417 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,16 +39,23 @@ import androidx.annotation.NonNull; import com.google.android.material.textfield.TextInputLayout; import com.m2049r.xmrwallet.R; import com.m2049r.xmrwallet.data.BarcodeData; +import com.m2049r.xmrwallet.data.Crypto; 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.ServiceHelper; +import com.m2049r.xmrwallet.util.validator.BitcoinAddressType; +import com.m2049r.xmrwallet.util.validator.BitcoinAddressValidator; +import com.m2049r.xmrwallet.util.validator.EthAddressValidator; +import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import timber.log.Timber; @@ -64,9 +71,8 @@ public class SendAddressWizardFragment extends SendWizardFragment { Listener sendListener; - public SendAddressWizardFragment setSendListener(Listener listener) { + public void setSendListener(Listener listener) { this.sendListener = listener; - return this; } public interface Listener { @@ -84,11 +90,10 @@ public class SendAddressWizardFragment extends SendWizardFragment { private EditText etDummy; private TextInputLayout etAddress; private TextInputLayout etNotes; - private View cvScan; - private View tvPaymentIdIntegrated; private TextView tvXmrTo; - private View llXmrTo; - private ImageButton bPasteAddress; + private Map<Crypto, ImageButton> ibCrypto; + final private Set<Crypto> possibleCryptos = new HashSet<>(); + private Crypto selectedCrypto = null; private boolean resolvingOA = false; @@ -98,6 +103,13 @@ public class SendAddressWizardFragment extends SendWizardFragment { void onScan(); } + private Crypto getCryptoForButton(ImageButton button) { + for (Map.Entry<Crypto, ImageButton> entry : ibCrypto.entrySet()) { + if (entry.getValue() == button) return entry.getKey(); + } + return null; + } + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -105,10 +117,31 @@ public class SendAddressWizardFragment extends SendWizardFragment { View view = inflater.inflate(R.layout.fragment_send_address, container, false); - tvPaymentIdIntegrated = view.findViewById(R.id.tvPaymentIdIntegrated); - llXmrTo = view.findViewById(R.id.llXmrTo); tvXmrTo = view.findViewById(R.id.tvXmrTo); - tvXmrTo.setText(Html.fromHtml(getString(R.string.info_xmrto))); + + ibCrypto = new HashMap<>(); + for (Crypto crypto : Crypto.values()) { + final ImageButton button = view.findViewById(crypto.getButtonId()); + ibCrypto.put(crypto, button); + button.setOnClickListener(v -> { + if (possibleCryptos.contains(crypto)) { + selectedCrypto = crypto; + updateCryptoButtons(false); + } else { + // show help what to do: + if (button.getId() != R.id.ibXMR) { + final String name = getResources().getStringArray(R.array.cryptos)[crypto.ordinal()]; + final String symbol = getCryptoForButton(button).getSymbol(); + tvXmrTo.setText(Html.fromHtml(getString(R.string.info_xmrto_help, name, symbol))); + tvXmrTo.setVisibility(View.VISIBLE); + } else { + tvXmrTo.setText(Html.fromHtml(getString(R.string.info_xmrto_help_xmr))); + tvXmrTo.setVisibility(View.VISIBLE); + } + } + }); + } + updateCryptoButtons(true); etAddress = view.findViewById(R.id.etAddress); etAddress.getEditText().setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); @@ -118,16 +151,13 @@ public class SendAddressWizardFragment extends SendWizardFragment { return ((event != null) && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)); } }); - etAddress.getEditText().setOnFocusChangeListener(new View.OnFocusChangeListener() { - @Override - public void onFocusChange(View v, boolean hasFocus) { - if (!hasFocus) { - String enteredAddress = etAddress.getEditText().getText().toString().trim(); - String dnsOA = dnsFromOpenAlias(enteredAddress); - Timber.d("OpenAlias is %s", dnsOA); - if (dnsOA != null) { - processOpenAlias(dnsOA); - } + etAddress.getEditText().setOnFocusChangeListener((v, hasFocus) -> { + if (!hasFocus) { + String enteredAddress = etAddress.getEditText().getText().toString().trim(); + String dnsOA = dnsFromOpenAlias(enteredAddress); + Timber.d("OpenAlias is %s", dnsOA); + if (dnsOA != null) { + processOpenAlias(dnsOA); } } }); @@ -136,21 +166,47 @@ public class SendAddressWizardFragment extends SendWizardFragment { public void afterTextChanged(Editable editable) { Timber.d("AFTER: %s", editable.toString()); etAddress.setError(null); - if (isIntegratedAddress()) { + possibleCryptos.clear(); + selectedCrypto = null; + final String address = etAddress.getEditText().getText().toString(); + if (isIntegratedAddress(address)) { Timber.d("isIntegratedAddress"); + possibleCryptos.add(Crypto.XMR); + selectedCrypto = Crypto.XMR; etAddress.setError(getString(R.string.info_paymentid_integrated)); - tvPaymentIdIntegrated.setVisibility(View.VISIBLE); - llXmrTo.setVisibility(View.INVISIBLE); sendListener.setMode(SendFragment.Mode.XMR); - } else if (isBitcoinAddress()) { - Timber.d("isBitcoinAddress"); - setBtcMode(); - } else { - Timber.d("isStandardAddress or other"); - tvPaymentIdIntegrated.setVisibility(View.INVISIBLE); - llXmrTo.setVisibility(View.INVISIBLE); + } else if (isStandardAddress(address)) { + Timber.d("isStandardAddress"); + possibleCryptos.add(Crypto.XMR); + selectedCrypto = Crypto.XMR; sendListener.setMode(SendFragment.Mode.XMR); } + if ((selectedCrypto == null) && isEthAddress(address)) { + Timber.d("isEthAddress"); + possibleCryptos.add(Crypto.ETH); + selectedCrypto = Crypto.ETH; + tvXmrTo.setVisibility(View.VISIBLE); + sendListener.setMode(SendFragment.Mode.BTC); + } + if (possibleCryptos.isEmpty()) { + Timber.d("isBitcoinAddress"); + for (BitcoinAddressType type : BitcoinAddressType.values()) { + if (BitcoinAddressValidator.validate(address, type)) { + possibleCryptos.add(Crypto.valueOf(type.name())); + } + } + if (!possibleCryptos.isEmpty()) // found something in need of shifting! + sendListener.setMode(SendFragment.Mode.BTC); + if (possibleCryptos.size() == 1) { + selectedCrypto = (Crypto) possibleCryptos.toArray()[0]; + } + } + if (possibleCryptos.isEmpty()) { + Timber.d("other"); + tvXmrTo.setVisibility(View.INVISIBLE); + sendListener.setMode(SendFragment.Mode.XMR); + } + updateCryptoButtons(address.isEmpty()); } @Override @@ -162,45 +218,38 @@ public class SendAddressWizardFragment extends SendWizardFragment { } }); - bPasteAddress = view.findViewById(R.id.bPasteAddress); - bPasteAddress.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - final String clip = Helper.getClipBoardText(getActivity()); - if (clip == null) return; - // clean it up - final String address = clip.replaceAll("[^0-9A-Z-a-z]", ""); - if (Wallet.isAddressValid(address) || BitcoinAddressValidator.validate(address)) { - final EditText et = etAddress.getEditText(); - et.setText(address); - et.setSelection(et.getText().length()); - etAddress.requestFocus(); - } else { - Toast.makeText(getActivity(), getString(R.string.send_address_invalid), Toast.LENGTH_SHORT).show(); - } + final ImageButton bPasteAddress = view.findViewById(R.id.bPasteAddress); + bPasteAddress.setOnClickListener(v -> { + final String clip = Helper.getClipBoardText(getActivity()); + if (clip == null) return; + // clean it up + final String address = clip.replaceAll("( +)|(\\r?\\n?)", ""); + BarcodeData bc = BarcodeData.fromString(address); + if (bc != null) { + processScannedData(bc); + final EditText et = etAddress.getEditText(); + et.setSelection(et.getText().length()); + etAddress.requestFocus(); + } else { + Toast.makeText(getActivity(), getString(R.string.send_address_invalid), Toast.LENGTH_SHORT).show(); } }); etNotes = view.findViewById(R.id.etNotes); etNotes.getEditText().setRawInputType(InputType.TYPE_CLASS_TEXT); - etNotes.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_DONE)) { - etDummy.requestFocus(); - return true; - } - return false; - } - }); + etNotes.getEditText(). - cvScan = view.findViewById(R.id.bScan); - cvScan.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - onScanListener.onScan(); - } - }); + setOnEditorActionListener((v, actionId, event) -> { + if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN)) + || (actionId == EditorInfo.IME_ACTION_DONE)) { + etDummy.requestFocus(); + return true; + } + return false; + }); + + final View cvScan = view.findViewById(R.id.bScan); + cvScan.setOnClickListener(v -> onScanListener.onScan()); etDummy = view.findViewById(R.id.etDummy); etDummy.setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); @@ -214,11 +263,49 @@ public class SendAddressWizardFragment extends SendWizardFragment { return view; } - private void setBtcMode() { - Timber.d("setBtcMode"); - tvPaymentIdIntegrated.setVisibility(View.INVISIBLE); - llXmrTo.setVisibility(View.VISIBLE); - sendListener.setMode(SendFragment.Mode.BTC); + private void selectedCrypto(Crypto crypto) { + final ImageButton button = ibCrypto.get(crypto); + button.setImageResource(crypto.getIconEnabledId()); + button.setImageAlpha(255); + button.setEnabled(true); + } + + private void possibleCrypto(Crypto crypto) { + final ImageButton button = ibCrypto.get(crypto); + button.setImageResource(crypto.getIconDisabledId()); + button.setImageAlpha(255); + button.setEnabled(true); + } + + private void impossibleCrypto(Crypto crypto) { + final ImageButton button = ibCrypto.get(crypto); + button.setImageResource(crypto.getIconDisabledId()); + button.setImageAlpha(128); + button.setEnabled(true); + } + + private void updateCryptoButtons(boolean noAddress) { + for (Crypto crypto : Crypto.values()) { + if (crypto == selectedCrypto) { + selectedCrypto(crypto); + } else if (possibleCryptos.contains(crypto)) { + possibleCrypto(crypto); + } else { + impossibleCrypto(crypto); + } + } + if ((selectedCrypto != null) && (selectedCrypto != Crypto.XMR)) { + tvXmrTo.setText(Html.fromHtml(getString(R.string.info_xmrto, selectedCrypto.getSymbol()))); + tvXmrTo.setVisibility(View.VISIBLE); + } else if ((selectedCrypto == null) && (possibleCryptos.size() > 1)) { + tvXmrTo.setText(Html.fromHtml(getString(R.string.info_xmrto_ambiguous))); + tvXmrTo.setVisibility(View.VISIBLE); + } else { + tvXmrTo.setVisibility(View.INVISIBLE); + } + if (noAddress) { + selectedCrypto(Crypto.XMR); + } } private void processOpenAlias(String dnsOA) { @@ -229,10 +316,10 @@ public class SendAddressWizardFragment extends SendWizardFragment { etAddress.setError(getString(R.string.send_address_resolve_openalias)); OpenAliasHelper.resolve(dnsOA, new OpenAliasHelper.OnResolvedListener() { @Override - public void onResolved(Map<BarcodeData.Asset, BarcodeData> dataMap) { + public void onResolved(Map<Crypto, BarcodeData> dataMap) { resolvingOA = false; - BarcodeData barcodeData = dataMap.get(BarcodeData.Asset.XMR); - if (barcodeData == null) barcodeData = dataMap.get(BarcodeData.Asset.BTC); + BarcodeData barcodeData = dataMap.get(Crypto.XMR); + if (barcodeData == null) barcodeData = dataMap.get(Crypto.BTC); if (barcodeData != null) { Timber.d("Security=%s, %s", barcodeData.security.toString(), barcodeData.address); processScannedData(barcodeData); @@ -253,9 +340,7 @@ public class SendAddressWizardFragment extends SendWizardFragment { } private boolean checkAddressNoError() { - String address = etAddress.getEditText().getText().toString(); - return Wallet.isAddressValid(address) - || BitcoinAddressValidator.validate(address); + return selectedCrypto != null; } private boolean checkAddress() { @@ -268,19 +353,37 @@ public class SendAddressWizardFragment extends SendWizardFragment { return ok; } - private boolean isIntegratedAddress() { - String address = etAddress.getEditText().getText().toString(); + private boolean isStandardAddress(String address) { + return Wallet.isAddressValid(address); + } + + private boolean isIntegratedAddress(String address) { return (address.length() == INTEGRATED_ADDRESS_LENGTH) && Wallet.isAddressValid(address); } - private boolean isBitcoinAddress() { - final String address = etAddress.getEditText().getText().toString(); - return BitcoinAddressValidator.validate(address); + private boolean isBitcoinishAddress(String address) { + return BitcoinAddressValidator.validate(address, BitcoinAddressType.BTC) + || + BitcoinAddressValidator.validate(address, BitcoinAddressType.LTC) + || + BitcoinAddressValidator.validate(address, BitcoinAddressType.DASH); + } + + private boolean isEthAddress(String address) { + return EthAddressValidator.validate(address); } private void shakeAddress() { - etAddress.startAnimation(Helper.getShakeAnimation(getContext())); + if (possibleCryptos.size() > 1) { // address ambiguous + for (Crypto crypto : Crypto.values()) { + if (possibleCryptos.contains(crypto)) { + ibCrypto.get(crypto).startAnimation(Helper.getShakeAnimation(getContext())); + } + } + } else { + etAddress.startAnimation(Helper.getShakeAnimation(getContext())); + } } @Override @@ -300,9 +403,12 @@ public class SendAddressWizardFragment extends SendWizardFragment { TxData txData = sendListener.getTxData(); if (txData instanceof TxDataBtc) { ((TxDataBtc) txData).setBtcAddress(etAddress.getEditText().getText().toString()); + ((TxDataBtc) txData).setBtcSymbol(selectedCrypto.getSymbol()); txData.setDestinationAddress(null); + ServiceHelper.ASSET = selectedCrypto.getSymbol().toLowerCase(); } else { txData.setDestinationAddress(etAddress.getEditText().getText().toString()); + ServiceHelper.ASSET = null; } txData.setUserNotes(new UserNotes(etNotes.getEditText().getText().toString())); txData.setPriority(PendingTransaction.Priority.Priority_Default); @@ -344,6 +450,15 @@ public class SendAddressWizardFragment extends SendWizardFragment { if (barcodeData.address != null) { etAddress.getEditText().setText(barcodeData.address); + possibleCryptos.clear(); + selectedCrypto = null; + if (barcodeData.isAmbiguous()) { + possibleCryptos.addAll(barcodeData.ambiguousAssets); + } else { + possibleCryptos.add(barcodeData.asset); + selectedCrypto = barcodeData.asset; + } + updateCryptoButtons(false); if (checkAddress()) { if (barcodeData.security == BarcodeData.Security.OA_NO_DNSSEC) etAddress.setError(getString(R.string.send_address_no_dnssec)); @@ -355,7 +470,12 @@ public class SendAddressWizardFragment extends SendWizardFragment { etAddress.setError(null); } - String scannedNotes = barcodeData.description; + String scannedNotes = barcodeData.addressName; + if (scannedNotes == null) { + scannedNotes = barcodeData.description; + } else if (barcodeData.description != null) { + scannedNotes = scannedNotes + ": " + barcodeData.description; + } if (scannedNotes != null) { etNotes.getEditText().setText(scannedNotes); } else { diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendAmountWizardFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendAmountWizardFragment.java index a061df49..3e66a876 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendAmountWizardFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendAmountWizardFragment.java @@ -42,9 +42,8 @@ public class SendAmountWizardFragment extends SendWizardFragment { Listener sendListener; - public SendAmountWizardFragment setSendListener(Listener listener) { + public void setSendListener(Listener listener) { this.sendListener = listener; - return this; } interface Listener { 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 b819d5cd..f4b4ae0b 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 @@ -28,16 +28,16 @@ import com.m2049r.xmrwallet.R; import com.m2049r.xmrwallet.data.BarcodeData; import com.m2049r.xmrwallet.data.TxDataBtc; import com.m2049r.xmrwallet.model.Wallet; -import com.m2049r.xmrwallet.util.Helper; -import com.m2049r.xmrwallet.util.OkHttpHelper; -import com.m2049r.xmrwallet.widget.ExchangeOtherEditText; -import com.m2049r.xmrwallet.widget.SendProgressView; +import com.m2049r.xmrwallet.service.shift.ShiftCallback; import com.m2049r.xmrwallet.service.shift.ShiftError; import com.m2049r.xmrwallet.service.shift.ShiftException; import com.m2049r.xmrwallet.service.shift.sideshift.api.QueryOrderParameters; import com.m2049r.xmrwallet.service.shift.sideshift.api.SideShiftApi; -import com.m2049r.xmrwallet.service.shift.ShiftCallback; import com.m2049r.xmrwallet.service.shift.sideshift.network.SideShiftApiImpl; +import com.m2049r.xmrwallet.util.OkHttpHelper; +import com.m2049r.xmrwallet.util.ServiceHelper; +import com.m2049r.xmrwallet.widget.ExchangeOtherEditText; +import com.m2049r.xmrwallet.widget.SendProgressView; import java.text.NumberFormat; import java.util.Locale; @@ -85,6 +85,7 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment { etAmount = view.findViewById(R.id.etAmount); etAmount.requestFocus(); + return view; } @@ -130,20 +131,26 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment { public void onResumeFragment() { super.onResumeFragment(); Timber.d("onResumeFragment()"); + final String btcSymbol = ((TxDataBtc) sendListener.getTxData()).getBtcSymbol(); + if (!btcSymbol.toLowerCase().equals(ServiceHelper.ASSET)) + throw new IllegalStateException("Asset Symbol is wrong!"); final long funds = getTotalFunds(); if (!sendListener.getActivityCallback().isStreetMode()) { tvFunds.setText(getString(R.string.send_available, Wallet.getDisplayAmount(funds))); + //TODO } else { tvFunds.setText(getString(R.string.send_available, getString(R.string.unknown_amount))); } + etAmount.setAmount(""); final BarcodeData data = sendListener.popBarcodeData(); if (data != null) { if (data.amount != null) { etAmount.setAmount(data.amount); } } + etAmount.setBaseCurrency(btcSymbol); callXmrTo(); } @@ -166,7 +173,9 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment { String min = df.format(minBtc); String max = df.format(maxBtc); String rate = df.format(price); - Spanned xmrParmText = Html.fromHtml(getString(R.string.info_send_xmrto_parms, min, max, rate)); + final TxDataBtc txDataBtc = (TxDataBtc) sendListener.getTxData(); + Spanned xmrParmText = Html.fromHtml(getString(R.string.info_send_xmrto_parms, + min, max, rate, txDataBtc.getBtcSymbol())); tvXmrToParms.setText(xmrParmText); final long funds = getTotalFunds(); @@ -183,7 +192,8 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment { } tvFunds.setText(getString(R.string.send_available_btc, availXmrString, - availBtcString)); + availBtcString, + ((TxDataBtc) sendListener.getTxData()).getBtcSymbol())); llXmrToParms.setVisibility(View.VISIBLE); evParams.hideProgress(); }); @@ -246,7 +256,7 @@ public class SendBtcAmountWizardFragment extends SendWizardFragment { synchronized (this) { if (xmrToApi == null) { xmrToApi = new SideShiftApiImpl(OkHttpHelper.getOkHttpClient(), - Helper.getXmrToBaseUrl()); + ServiceHelper.getXmrToBaseUrl()); } } } 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 27ff90db..a37ece89 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 @@ -29,16 +29,17 @@ import com.m2049r.xmrwallet.data.TxData; import com.m2049r.xmrwallet.data.TxDataBtc; import com.m2049r.xmrwallet.model.PendingTransaction; import com.m2049r.xmrwallet.model.Wallet; -import com.m2049r.xmrwallet.util.Helper; -import com.m2049r.xmrwallet.util.OkHttpHelper; -import com.m2049r.xmrwallet.widget.SendProgressView; +import com.m2049r.xmrwallet.service.shift.ShiftCallback; import com.m2049r.xmrwallet.service.shift.ShiftError; import com.m2049r.xmrwallet.service.shift.ShiftException; import com.m2049r.xmrwallet.service.shift.sideshift.api.CreateOrder; import com.m2049r.xmrwallet.service.shift.sideshift.api.RequestQuote; import com.m2049r.xmrwallet.service.shift.sideshift.api.SideShiftApi; -import com.m2049r.xmrwallet.service.shift.ShiftCallback; import com.m2049r.xmrwallet.service.shift.sideshift.network.SideShiftApiImpl; +import com.m2049r.xmrwallet.util.Helper; +import com.m2049r.xmrwallet.util.OkHttpHelper; +import com.m2049r.xmrwallet.util.ServiceHelper; +import com.m2049r.xmrwallet.widget.SendProgressView; import java.text.NumberFormat; import java.util.Locale; @@ -67,6 +68,7 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements private TextView tvTxBtcAmount; private TextView tvTxBtcRate; private TextView tvTxBtcAddress; + private TextView tvTxBtcAddressLabel; private TextView tvTxXmrToKey; private TextView tvTxFee; private TextView tvTxTotal; @@ -84,6 +86,7 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements R.layout.fragment_send_btc_confirm, container, false); tvTxBtcAddress = view.findViewById(R.id.tvTxBtcAddress); + tvTxBtcAddressLabel = view.findViewById(R.id.tvTxBtcAddressLabel); tvTxBtcAmount = view.findViewById(R.id.tvTxBtcAmount); tvTxBtcRate = view.findViewById(R.id.tvTxBtcRate); tvTxXmrToKey = view.findViewById(R.id.tvTxXmrToKey); @@ -259,6 +262,8 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements if (sendListener.getMode() != SendFragment.Mode.BTC) { throw new IllegalStateException("Mode is not BTC!"); } + if (!((TxDataBtc) sendListener.getTxData()).getBtcSymbol().toLowerCase().equals(ServiceHelper.ASSET)) + throw new IllegalStateException("Asset Symbol is wrong!"); Helper.hideKeyboard(getActivity()); llStageA.setVisibility(View.INVISIBLE); evStageA.hideProgress(); @@ -392,9 +397,10 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements df.setMaximumFractionDigits(12); final String btcAmount = df.format(xmrtoQuote.getBtcAmount()); final String xmrAmountTotal = df.format(xmrtoQuote.getXmrAmount()); - tvTxBtcAmount.setText(getString(R.string.text_send_btc_amount, btcAmount, xmrAmountTotal)); + tvTxBtcAmount.setText(getString(R.string.text_send_btc_amount, + btcAmount, xmrAmountTotal, txDataBtc.getBtcSymbol())); final String xmrPriceBtc = df.format(xmrtoQuote.getPrice()); - tvTxBtcRate.setText(getString(R.string.text_send_btc_rate, xmrPriceBtc)); + tvTxBtcRate.setText(getString(R.string.text_send_btc_rate, xmrPriceBtc, txDataBtc.getBtcSymbol())); hideProgress(); }); stageB(requestQuote.getId()); @@ -477,13 +483,14 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements TxDataBtc txDataBtc = (TxDataBtc) sendListener.getTxData(); // verify amount & destination if ((order.getBtcAmount() != txDataBtc.getBtcAmount()) - || (!order.getBtcAddress().equals(txDataBtc.getBtcAddress()))) { + || (!txDataBtc.validateAddress(order.getBtcAddress()))) { throw new IllegalStateException("Order does not fulfill quote!"); // something is terribly wrong - die } xmrtoOrder = order; getView().post(() -> { tvTxXmrToKey.setText(order.getOrderId()); tvTxBtcAddress.setText(order.getBtcAddress()); + tvTxBtcAddressLabel.setText(getString(R.string.label_send_btc_address, txDataBtc.getBtcSymbol())); hideProgress(); Timber.d("Expires @ %s", order.getExpiresAt().toString()); final int timeout = (int) (order.getExpiresAt().getTime() - order.getCreatedAt().getTime()) / 1000 - 60; // -1 minute buffer @@ -561,7 +568,7 @@ public class SendBtcConfirmWizardFragment extends SendWizardFragment implements synchronized (this) { if (xmrToApi == null) { xmrToApi = new SideShiftApiImpl(OkHttpHelper.getOkHttpClient(), - Helper.getXmrToBaseUrl()); + ServiceHelper.getXmrToBaseUrl()); } } } diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcSuccessWizardFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcSuccessWizardFragment.java index d2a6462a..4156ee56 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcSuccessWizardFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcSuccessWizardFragment.java @@ -30,6 +30,7 @@ import android.widget.TextView; import android.widget.Toast; import com.m2049r.xmrwallet.R; +import com.m2049r.xmrwallet.data.Crypto; import com.m2049r.xmrwallet.data.PendingTx; import com.m2049r.xmrwallet.data.TxDataBtc; import com.m2049r.xmrwallet.service.shift.ShiftCallback; @@ -39,6 +40,7 @@ import com.m2049r.xmrwallet.service.shift.sideshift.api.SideShiftApi; import com.m2049r.xmrwallet.service.shift.sideshift.network.SideShiftApiImpl; import com.m2049r.xmrwallet.util.Helper; import com.m2049r.xmrwallet.util.OkHttpHelper; +import com.m2049r.xmrwallet.util.ServiceHelper; import java.text.NumberFormat; import java.util.Locale; @@ -62,10 +64,10 @@ public class SendBtcSuccessWizardFragment extends SendWizardFragment { ImageButton bCopyTxId; private TextView tvTxId; private TextView tvTxAddress; - private TextView tvTxPaymentId; private TextView tvTxAmount; private TextView tvTxFee; private TextView tvXmrToAmount; + private ImageView ivXmrToIcon; private TextView tvXmrToStatus; private ImageView ivXmrToStatus; private ImageView ivXmrToStatusBig; @@ -90,13 +92,13 @@ public class SendBtcSuccessWizardFragment extends SendWizardFragment { }); tvXmrToAmount = view.findViewById(R.id.tvXmrToAmount); + ivXmrToIcon = view.findViewById(R.id.ivXmrToIcon); tvXmrToStatus = view.findViewById(R.id.tvXmrToStatus); ivXmrToStatus = view.findViewById(R.id.ivXmrToStatus); ivXmrToStatusBig = view.findViewById(R.id.ivXmrToStatusBig); tvTxId = view.findViewById(R.id.tvTxId); tvTxAddress = view.findViewById(R.id.tvTxAddress); - tvTxPaymentId = view.findViewById(R.id.tvTxPaymentId); tvTxAmount = view.findViewById(R.id.tvTxAmount); tvTxFee = view.findViewById(R.id.tvTxFee); @@ -150,9 +152,11 @@ public class SendBtcSuccessWizardFragment extends SendWizardFragment { NumberFormat df = NumberFormat.getInstance(Locale.US); df.setMaximumFractionDigits(12); String btcAmount = df.format(btcData.getBtcAmount()); - tvXmrToAmount.setText(getString(R.string.info_send_xmrto_success_btc, btcAmount)); + tvXmrToAmount.setText(getString(R.string.info_send_xmrto_success_btc, btcAmount, btcData.getBtcSymbol())); //TODO btcData.getBtcAddress(); tvTxXmrToKey.setText(btcData.getXmrtoOrderId()); + final Crypto crypto = Crypto.withSymbol(btcData.getBtcSymbol()); + ivXmrToIcon.setImageResource(crypto.getIconEnabledId()); tvXmrToSupport.setOnClickListener(v -> { Uri orderUri = getXmrToApi().getQueryOrderUri(btcData.getXmrtoOrderId()); Intent intent = new Intent(Intent.ACTION_VIEW, orderUri); @@ -211,7 +215,7 @@ public class SendBtcSuccessWizardFragment extends SendWizardFragment { statusResource = R.drawable.ic_error_red_24dp; pbXmrto.getIndeterminateDrawable().setColorFilter(0xff8b0000, android.graphics.PorterDuff.Mode.MULTIPLY); } else if (status.isSent() || status.isPaid()) { - tvXmrToStatus.setText(getString(R.string.info_send_xmrto_sent)); + tvXmrToStatus.setText(getString(R.string.info_send_xmrto_sent, btcData.getBtcSymbol())); statusResource = R.drawable.ic_success_green_24dp; pbXmrto.getIndeterminateDrawable().setColorFilter(0xFF417505, android.graphics.PorterDuff.Mode.MULTIPLY); } else if (status.isWaiting()) { @@ -228,6 +232,7 @@ public class SendBtcSuccessWizardFragment extends SendWizardFragment { ivXmrToStatus.setImageResource(statusResource); if (status.isTerminal()) { pbXmrto.setVisibility(View.INVISIBLE); + ivXmrToIcon.setVisibility(View.GONE); ivXmrToStatus.setVisibility(View.GONE); ivXmrToStatusBig.setImageResource(statusResource); ivXmrToStatusBig.setVisibility(View.VISIBLE); @@ -241,7 +246,7 @@ public class SendBtcSuccessWizardFragment extends SendWizardFragment { synchronized (this) { if (xmrToApi == null) { xmrToApi = new SideShiftApiImpl(OkHttpHelper.getOkHttpClient(), - Helper.getXmrToBaseUrl()); + ServiceHelper.getXmrToBaseUrl()); } } } 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 2e0faf52..903aff0f 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 @@ -29,6 +29,7 @@ import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; @@ -92,8 +93,6 @@ public class SendFragment extends Fragment void setOnUriScannedListener(OnUriScannedListener onUriScannedListener); } - private EditText etDummy; - private View llNavBar; private DotBar dotBar; private Button bPrev; @@ -101,7 +100,7 @@ public class SendFragment extends Fragment private Button bDone; - static private int MAX_FALLBACK = Integer.MAX_VALUE; + static private final int MAX_FALLBACK = Integer.MAX_VALUE; public static SendFragment newInstance(String uri) { SendFragment f = new SendFragment(); @@ -166,28 +165,18 @@ public class SendFragment extends Fragment } }); - bPrev.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - spendViewPager.previous(); - } - }); + bPrev.setOnClickListener(v -> spendViewPager.previous()); - bNext.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - spendViewPager.next(); - } - }); + bNext.setOnClickListener(v -> spendViewPager.next()); - bDone.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - Timber.d("bDone.onClick"); - activityCallback.onFragmentDone(); - } + bDone.setOnClickListener(v -> { + Timber.d("bDone.onClick"); + activityCallback.onFragmentDone(); }); updatePosition(0); - etDummy = view.findViewById(R.id.etDummy); + final EditText etDummy = view.findViewById(R.id.etDummy); etDummy.setRawInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); etDummy.requestFocus(); Helper.hideKeyboard(getActivity()); @@ -197,7 +186,7 @@ public class SendFragment extends Fragment String uri = args.getString(WalletActivity.REQUEST_URI); Timber.d("URI: %s", uri); if (uri != null) { - barcodeData = BarcodeData.fromQrCode(uri); + barcodeData = BarcodeData.fromString(uri); Timber.d("barcodeData: %s", barcodeData != null ? barcodeData.toString() : "null"); } } @@ -236,7 +225,7 @@ public class SendFragment extends Fragment } @Override - public void onAttach(Context context) { + public void onAttach(@NonNull Context context) { Timber.d("onAttach %s", context); super.onAttach(context); if (context instanceof Listener) { @@ -300,12 +289,7 @@ public class SendFragment extends Fragment default: throw new IllegalArgumentException("Mode " + String.valueOf(aMode) + " unknown!"); } - getView().post(new Runnable() { - @Override - public void run() { - pagerAdapter.notifyDataSetChanged(); - } - }); + getView().post(() -> pagerAdapter.notifyDataSetChanged()); Timber.d("New Mode = %s", mode.toString()); } } @@ -338,8 +322,9 @@ public class SendFragment extends Fragment return numPages; } + @NonNull @Override - public Object instantiateItem(ViewGroup container, int position) { + public Object instantiateItem(@NonNull ViewGroup container, int position) { Timber.d("instantiateItem %d", position); SendWizardFragment fragment = (SendWizardFragment) super.instantiateItem(container, position); myFragments.put(position, new WeakReference<>(fragment)); @@ -347,20 +332,21 @@ public class SendFragment extends Fragment } @Override - public void destroyItem(ViewGroup container, int position, Object object) { + public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { Timber.d("destroyItem %d", position); myFragments.remove(position); super.destroyItem(container, position, object); } public SendWizardFragment getFragment(int position) { - WeakReference ref = myFragments.get(position); + WeakReference<SendWizardFragment> ref = myFragments.get(position); if (ref != null) return myFragments.get(position).get(); else return null; } + @NonNull @Override public SendWizardFragment getItem(int position) { Timber.d("getItem(%d) CREATE", position); @@ -415,7 +401,7 @@ public class SendFragment extends Fragment } @Override - public int getItemPosition(Object object) { + public int getItemPosition(@NonNull Object object) { Timber.d("getItemPosition %s", String.valueOf(object)); if (object instanceof SendAddressWizardFragment) { // keep these pages 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 d90bb63f..9d2d8ba2 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/layout/TransactionInfoAdapter.java +++ b/app/src/main/java/com/m2049r/xmrwallet/layout/TransactionInfoAdapter.java @@ -17,18 +17,20 @@ package com.m2049r.xmrwallet.layout; import android.content.Context; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; + import com.m2049r.xmrwallet.R; +import com.m2049r.xmrwallet.data.Crypto; +import com.m2049r.xmrwallet.data.UserNotes; import com.m2049r.xmrwallet.model.TransactionInfo; import com.m2049r.xmrwallet.util.Helper; -import com.m2049r.xmrwallet.data.UserNotes; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -141,7 +143,13 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter<TransactionInfo UserNotes userNotes = new UserNotes(infoItem.notes); if (userNotes.xmrtoKey != null) { - ivTxType.setVisibility(View.VISIBLE); + final Crypto crypto = Crypto.withSymbol(userNotes.xmrtoCurrency); + if (crypto != null) { + ivTxType.setImageResource(crypto.getIconEnabledId()); + ivTxType.setVisibility(View.VISIBLE); + } else {// otherwirse pretend we don't know it's a shift + ivTxType.setVisibility(View.GONE); + } } else { ivTxType.setVisibility(View.GONE); // gives us more space for the amount } diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/CreateOrder.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/CreateOrder.java index e36e2eaf..f738956b 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/CreateOrder.java +++ b/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/CreateOrder.java @@ -21,6 +21,8 @@ import java.util.Date; public interface CreateOrder { String TAG = "side"; + String getBtcCurrency(); + double getBtcAmount(); String getBtcAddress(); diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/SideShiftApi.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/SideShiftApi.java index 1bad6cc0..6c9331c9 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/SideShiftApi.java +++ b/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/api/SideShiftApi.java @@ -23,8 +23,6 @@ import androidx.annotation.NonNull; import com.m2049r.xmrwallet.service.shift.ShiftCallback; public interface SideShiftApi { - - String ASSET = "btc"; int QUERY_INTERVAL = 5000; // ms /** diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/CreateOrderImpl.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/CreateOrderImpl.java index d209c40e..258cf4d7 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/CreateOrderImpl.java +++ b/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/CreateOrderImpl.java @@ -25,6 +25,7 @@ import com.m2049r.xmrwallet.service.shift.ShiftCallback; import com.m2049r.xmrwallet.service.shift.sideshift.api.CreateOrder; import com.m2049r.xmrwallet.service.shift.sideshift.api.SideShiftApi; import com.m2049r.xmrwallet.util.DateHelper; +import com.m2049r.xmrwallet.util.ServiceHelper; import org.json.JSONException; import org.json.JSONObject; @@ -35,6 +36,8 @@ import java.util.Date; import lombok.Getter; class CreateOrderImpl implements CreateOrder { + @Getter + private final String btcCurrency; @Getter private final double btcAmount; @Getter @@ -56,9 +59,10 @@ class CreateOrderImpl implements CreateOrder { // sanity checks final String depositMethod = jsonObject.getString("depositMethodId"); final String settleMethod = jsonObject.getString("settleMethodId"); - if (!"xmr".equals(depositMethod) || !SideShiftApi.ASSET.equals(settleMethod)) + if (!"xmr".equals(depositMethod) || !ServiceHelper.ASSET.equals(settleMethod)) throw new IllegalStateException(); + btcCurrency = settleMethod.toUpperCase(); btcAmount = jsonObject.getDouble("settleAmount"); JSONObject settleAddress = jsonObject.getJSONObject("settleAddress"); btcAddress = settleAddress.getString("address"); diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/QueryOrderParametersImpl.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/QueryOrderParametersImpl.java index a1bf31c9..afa5527c 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/QueryOrderParametersImpl.java +++ b/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/QueryOrderParametersImpl.java @@ -23,6 +23,7 @@ import com.m2049r.xmrwallet.service.shift.ShiftApiCall; import com.m2049r.xmrwallet.service.shift.sideshift.api.QueryOrderParameters; import com.m2049r.xmrwallet.service.shift.sideshift.api.SideShiftApi; import com.m2049r.xmrwallet.service.shift.ShiftCallback; +import com.m2049r.xmrwallet.util.ServiceHelper; import org.json.JSONException; import org.json.JSONObject; @@ -53,7 +54,7 @@ class QueryOrderParametersImpl implements QueryOrderParameters { public static void call(@NonNull final ShiftApiCall api, @NonNull final ShiftCallback<QueryOrderParameters> callback) { - api.call("pairs/xmr/" + SideShiftApi.ASSET, new NetworkCallback() { + api.call("pairs/xmr/" + ServiceHelper.ASSET, new NetworkCallback() { @Override public void onSuccess(JSONObject jsonObject) { try { diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/RequestQuoteImpl.java b/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/RequestQuoteImpl.java index 91addc56..6a1b8023 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/RequestQuoteImpl.java +++ b/app/src/main/java/com/m2049r/xmrwallet/service/shift/sideshift/network/RequestQuoteImpl.java @@ -24,6 +24,7 @@ import com.m2049r.xmrwallet.util.DateHelper; import com.m2049r.xmrwallet.service.shift.sideshift.api.RequestQuote; import com.m2049r.xmrwallet.service.shift.sideshift.api.SideShiftApi; import com.m2049r.xmrwallet.service.shift.ShiftCallback; +import com.m2049r.xmrwallet.util.ServiceHelper; import org.json.JSONException; import org.json.JSONObject; @@ -55,7 +56,7 @@ class RequestQuoteImpl implements RequestQuote { // sanity checks final String depositMethod = jsonObject.getString("depositMethod"); final String settleMethod = jsonObject.getString("settleMethod"); - if (!"xmr".equals(depositMethod) || !SideShiftApi.ASSET.equals(settleMethod)) + if (!"xmr".equals(depositMethod) || !ServiceHelper.ASSET.equals(settleMethod)) throw new IllegalStateException(); btcAmount = jsonObject.getDouble("settleAmount"); @@ -106,7 +107,7 @@ class RequestQuoteImpl implements RequestQuote { static JSONObject createRequest(final double xmrAmount) throws JSONException { final JSONObject jsonObject = new JSONObject(); jsonObject.put("depositMethod", "xmr"); - jsonObject.put("settleMethod", SideShiftApi.ASSET); + jsonObject.put("settleMethod", ServiceHelper.ASSET); // #sideshift is silly and likes numbers as strings String amount = AmountFormatter.format(xmrAmount); jsonObject.put("depositAmount", amount); diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java b/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java index 326da625..66a37045 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java +++ b/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java @@ -323,15 +323,6 @@ public class Helper { return ShakeAnimation; } - static public HttpUrl getXmrToBaseUrl() { - if ((WalletManager.getInstance() == null) - || (WalletManager.getInstance().getNetworkType() != NetworkType.NetworkType_Mainnet)) { - throw new IllegalStateException("Only mainnet not supported"); - } else { - return HttpUrl.parse("https://sideshift.ai/api/v1/"); - } - } - private final static char[] HexArray = "0123456789ABCDEF".toCharArray(); public static String bytesToHex(byte[] data) { @@ -639,10 +630,6 @@ public class Helper { } } - static public ExchangeApi getExchangeApi() { - return new com.m2049r.xmrwallet.service.exchange.krakenEcb.ExchangeApiImpl(OkHttpHelper.getOkHttpClient()); - } - public interface Action { boolean run(); } diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/OpenAliasHelper.java b/app/src/main/java/com/m2049r/xmrwallet/util/OpenAliasHelper.java index 4b9c784c..b710fbc8 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/util/OpenAliasHelper.java +++ b/app/src/main/java/com/m2049r/xmrwallet/util/OpenAliasHelper.java @@ -21,6 +21,7 @@ package com.m2049r.xmrwallet.util; import android.os.AsyncTask; import com.m2049r.xmrwallet.data.BarcodeData; +import com.m2049r.xmrwallet.data.Crypto; import org.jitsi.dnssec.validator.ValidatingResolver; import org.xbill.DNS.DClass; @@ -52,7 +53,6 @@ public class OpenAliasHelper { public static final String OA1_NAME = "recipient_name"; public static final String OA1_DESCRIPTION = "tx_description"; public static final String OA1_AMOUNT = "tx_amount"; - public static final String OA1_PAYMENTID = "tx_payment_id"; public static final int DNS_LOOKUP_TIMEOUT = 2500; // ms @@ -65,7 +65,7 @@ public class OpenAliasHelper { } public interface OnResolvedListener { - void onResolved(Map<BarcodeData.Asset, BarcodeData> dataMap); + void onResolved(Map<Crypto, BarcodeData> dataMap); void onFailure(); } @@ -138,7 +138,7 @@ public class OpenAliasHelper { public void onPostExecute(Boolean success) { if (resolvedListener != null) if (success) { - Map<BarcodeData.Asset, BarcodeData> dataMap = new HashMap<>(); + Map<Crypto, BarcodeData> dataMap = new HashMap<>(); for (String txt : txts) { BarcodeData bc = BarcodeData.parseOpenAlias(txt, dnssec); if (bc != null) { diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/ServiceHelper.java b/app/src/main/java/com/m2049r/xmrwallet/util/ServiceHelper.java new file mode 100644 index 00000000..6221682b --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/util/ServiceHelper.java @@ -0,0 +1,24 @@ +package com.m2049r.xmrwallet.util; + +import com.m2049r.xmrwallet.model.NetworkType; +import com.m2049r.xmrwallet.model.WalletManager; +import com.m2049r.xmrwallet.service.exchange.api.ExchangeApi; + +import okhttp3.HttpUrl; + +public class ServiceHelper { + public static String ASSET = null; + + static public HttpUrl getXmrToBaseUrl() { + if ((WalletManager.getInstance() == null) + || (WalletManager.getInstance().getNetworkType() != NetworkType.NetworkType_Mainnet)) { + throw new IllegalStateException("Only mainnet not supported"); + } else { + return HttpUrl.parse("https://sideshift.ai/api/v1/"); + } + } + + static public ExchangeApi getExchangeApi() { + return new com.m2049r.xmrwallet.service.exchange.krakenEcb.ExchangeApiImpl(OkHttpHelper.getOkHttpClient()); + } +} diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/validator/BitcoinAddressType.java b/app/src/main/java/com/m2049r/xmrwallet/util/validator/BitcoinAddressType.java new file mode 100644 index 00000000..a1415b1e --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/util/validator/BitcoinAddressType.java @@ -0,0 +1,51 @@ +package com.m2049r.xmrwallet.util.validator; + +import lombok.Getter; + +public enum BitcoinAddressType { + BTC(Type.BTC, Type.BTC_BECH32_PREFIX), + LTC(Type.LTC, Type.LTC_BECH32_PREFIX), + DASH(Type.DASH, null), + DOGE(Type.DOGE, null); + + @Getter + private final byte[] production; + @Getter + private final byte[] testnet; + + @Getter + private final String productionBech32Prefix; + @Getter + private final String testnetBech32Prefix; + + public boolean hasBech32() { + return productionBech32Prefix != null; + } + + public String getBech32Prefix(boolean testnet) { + return testnet ? testnetBech32Prefix : productionBech32Prefix; + } + + BitcoinAddressType(byte[][] types, String[] bech32Prefix) { + production = types[0]; + testnet = types[1]; + if (bech32Prefix != null) { + productionBech32Prefix = bech32Prefix[0]; + testnetBech32Prefix = bech32Prefix[1]; + } else { + productionBech32Prefix = null; + testnetBech32Prefix = null; + } + } + + // Java is silly and doesn't allow array initializers in the construction + private static class Type { + private static final byte[][] BTC = {{0x00, 0x05}, {0x6f, (byte) 0xc4}}; + private static final String[] BTC_BECH32_PREFIX = {"bc", "tb"}; + private static final byte[][] LTC = {{0x30, 0x05, 0x32}, {0x6f, (byte) 0xc4, 0x3a}}; + private static final String[] LTC_BECH32_PREFIX = {"ltc", "tltc"}; + private static final byte[][] DASH = {{0x4c, 0x10}, {(byte) 0x8c, 0x13}}; + private static final byte[][] DOGE = {{0x1e, 0x16}, {0x71, (byte) 0xc4}}; + } + +} diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/BitcoinAddressValidator.java b/app/src/main/java/com/m2049r/xmrwallet/util/validator/BitcoinAddressValidator.java similarity index 74% rename from app/src/main/java/com/m2049r/xmrwallet/util/BitcoinAddressValidator.java rename to app/src/main/java/com/m2049r/xmrwallet/util/validator/BitcoinAddressValidator.java index 76fa8979..ce5cec04 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/util/BitcoinAddressValidator.java +++ b/app/src/main/java/com/m2049r/xmrwallet/util/validator/BitcoinAddressValidator.java @@ -14,10 +14,11 @@ * limitations under the License. */ -package com.m2049r.xmrwallet.util; +package com.m2049r.xmrwallet.util.validator; // mostly based on https://rosettacode.org/wiki/Bitcoin/address_validation#Java +import com.m2049r.xmrwallet.data.Crypto; import com.m2049r.xmrwallet.model.NetworkType; import com.m2049r.xmrwallet.model.WalletManager; @@ -28,28 +29,47 @@ import java.security.NoSuchAlgorithmException; import java.util.Arrays; public class BitcoinAddressValidator { - private static final String ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; - public static boolean validate(String addrress) { - boolean testnet = WalletManager.getInstance().getNetworkType() != NetworkType.NetworkType_Mainnet; - if (validate(addrress, testnet)) return true; - return validateBech32Segwit(addrress, testnet); + public static Crypto validate(String address) { + for (BitcoinAddressType type : BitcoinAddressType.values()) { + if (validate(address, type)) + return Crypto.valueOf(type.name()); + } + return null; } - public static boolean validate(String addrress, boolean testnet) { + // just for tests + public static boolean validateBTC(String addrress, boolean testnet) { + return validate(addrress, BitcoinAddressType.BTC, testnet); + } + + public static boolean validate(String addrress, BitcoinAddressType type, boolean testnet) { + if (validate(addrress, testnet ? type.getTestnet() : type.getProduction())) + return true; + if (type.hasBech32()) + return validateBech32Segwit(addrress, type, testnet); + else + return false; + } + + public static boolean validate(String addrress, BitcoinAddressType type) { + final boolean testnet = WalletManager.getInstance().getNetworkType() != NetworkType.NetworkType_Mainnet; + return validate(addrress, type, testnet); + } + + public static boolean validate(String addrress, byte[] addressTypes) { if (addrress.length() < 26 || addrress.length() > 35) return false; byte[] decoded = decodeBase58To25Bytes(addrress); if (decoded == null) return false; - int v = decoded[0] & 0xFF; - if (!testnet) { - if ((v != 0x00) && (v != 0x05)) return false; - } else { - if ((v != 0x6f) && (v != 0xc4)) return false; + boolean nok = true; + for (byte b : addressTypes) { + nok = nok && (v != (b & 0xFF)); } + if (nok) return false; byte[] hash1 = sha256(Arrays.copyOfRange(decoded, 0, 21)); byte[] hash2 = sha256(hash1); @@ -95,18 +115,20 @@ public class BitcoinAddressValidator { private static final String DATA_CHARS = "qpzry9x8gf2tvdw0s3jn54khce6mua7l"; - public static boolean validateBech32Segwit(String bech32, boolean testnet) { + public static boolean validateBech32Segwit(String bech32, BitcoinAddressType type, boolean testnet) { if (!bech32.equals(bech32.toLowerCase()) && !bech32.equals(bech32.toUpperCase())) { return false; // mixing upper and lower case not allowed } bech32 = bech32.toLowerCase(); - if (testnet && !bech32.startsWith("tb1")) return false; - if (!testnet && !bech32.startsWith("bc1")) return false; + if (!bech32.startsWith(type.getBech32Prefix(testnet))) return false; - if ((bech32.length() < 14) || (bech32.length() > 74)) return false; - int mod = bech32.length() % 8; - if ((mod == 0) || (mod == 3) || (mod == 5)) return false; + final int hrpLength = type.getBech32Prefix(testnet).length(); + + if ((bech32.length() < (12 + hrpLength)) || (bech32.length() > (72 + hrpLength))) + return false; + int mod = (bech32.length() - hrpLength) % 8; + if ((mod == 6) || (mod == 1) || (mod == 3)) return false; int sep = -1; final byte[] bytes = bech32.getBytes(StandardCharsets.US_ASCII); @@ -117,7 +139,7 @@ public class BitcoinAddressValidator { if (bytes[i] == 49) sep = i; // 49 := '1' in ASCII } - if (sep != 2) return false; // bech32 always has len(hrp)==2 + if (sep != hrpLength) return false; if (sep > bytes.length - 7) { return false; // min 6 bytes data } @@ -158,12 +180,12 @@ public class BitcoinAddressValidator { private static byte[] hrpExpand(byte[] hrp) { final byte[] expanded = new byte[(2 * hrp.length) + 1]; int i = 0; - for (int j = 0; j < hrp.length; j++) { - expanded[i++] = (byte) (hrp[j] >> 5); + for (byte b : hrp) { + expanded[i++] = (byte) (b >> 5); } expanded[i++] = 0; - for (int j = 0; j < hrp.length; j++) { - expanded[i++] = (byte) (hrp[j] & 0x1f); + for (byte b : hrp) { + expanded[i++] = (byte) (b & 0x1f); } return expanded; } @@ -195,4 +217,4 @@ public class BitcoinAddressValidator { return true; } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/validator/EthAddressValidator.java b/app/src/main/java/com/m2049r/xmrwallet/util/validator/EthAddressValidator.java new file mode 100644 index 00000000..3e4c4763 --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/util/validator/EthAddressValidator.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2017 m2049r er al. + * + * 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. + */ + +package com.m2049r.xmrwallet.util.validator; + +// mostly based on https://github.com/ognus/wallet-address-validator/blob/master/src/ethereum_validator.js + +import com.theromus.sha.Keccak; +import com.theromus.sha.Parameters; + +import java.nio.charset.StandardCharsets; +import java.util.regex.Pattern; + +public class EthAddressValidator { + static private final Pattern ETH_ADDRESS = Pattern.compile("^0x[0-9a-fA-F]{40}$"); + static private final Pattern ETH_ALLLOWER = Pattern.compile("^0x[0-9a-f]{40}$"); + static private final Pattern ETH_ALLUPPER = Pattern.compile("^0x[0-9A-F]{40}$"); + + public static boolean validate(String address) { + // Check if it has the basic requirements of an address + if (!ETH_ADDRESS.matcher(address).matches()) + return false; + + // If it's all small caps or all all caps, return true + if (ETH_ALLLOWER.matcher(address).matches() || ETH_ALLUPPER.matcher(address).matches()) { + return true; + } + + // Otherwise check each case + return validateChecksum(address); + } + + private static boolean validateChecksum(String address) { + // Check each case + address = address.substring(2); // strip 0x + + Keccak keccak = new Keccak(); + final byte[] addressHash = keccak.getHash( + address.toLowerCase().getBytes(StandardCharsets.US_ASCII), + Parameters.KECCAK_256); + for (int i = 0; i < 40; i++) { + boolean upper = (addressHash[i / 2] & ((i % 2) == 0 ? 128 : 8)) != 0; + char c = address.charAt(i); + if (Character.isAlphabetic(c)) { + if (Character.isUpperCase(c) && !upper) return false; + if (Character.isLowerCase(c) && upper) return false; + } + } + return true; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeEditText.java b/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeEditText.java index a85900f5..6602cb79 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeEditText.java +++ b/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeEditText.java @@ -40,6 +40,7 @@ import com.m2049r.xmrwallet.service.exchange.api.ExchangeApi; import com.m2049r.xmrwallet.service.exchange.api.ExchangeCallback; import com.m2049r.xmrwallet.service.exchange.api.ExchangeRate; import com.m2049r.xmrwallet.util.Helper; +import com.m2049r.xmrwallet.util.ServiceHelper; import java.util.ArrayList; import java.util.Arrays; @@ -184,6 +185,12 @@ public class ExchangeEditText extends LinearLayout { private boolean isInitialized = false; + void postInitialize() { + setInitialSpinnerSelections(sCurrencyA, sCurrencyB); + isInitialized = true; + startExchange(); + } + @Override protected void onFinishInflate() { super.onFinishInflate(); @@ -212,14 +219,7 @@ public class ExchangeEditText extends LinearLayout { setCurrencyAdapter(sCurrencyA); setCurrencyAdapter(sCurrencyB); - post(new Runnable() { - @Override - public void run() { - setInitialSpinnerSelections(sCurrencyA, sCurrencyB); - isInitialized = true; - startExchange(); - } - }); + post(this::postInitialize); // make progress circle gray pbExchange.getIndeterminateDrawable(). @@ -296,7 +296,7 @@ public class ExchangeEditText extends LinearLayout { } } - private final ExchangeApi exchangeApi = Helper.getExchangeApi(); + private final ExchangeApi exchangeApi = ServiceHelper.getExchangeApi(); // starts exchange through exchange api void startExchange() { diff --git a/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeOtherEditText.java b/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeOtherEditText.java index 3b57d07e..3dd344ef 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeOtherEditText.java +++ b/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeOtherEditText.java @@ -25,6 +25,8 @@ import android.os.Looper; import android.util.AttributeSet; import android.widget.Spinner; +import androidx.annotation.NonNull; + import com.m2049r.xmrwallet.R; import com.m2049r.xmrwallet.service.exchange.api.ExchangeCallback; import com.m2049r.xmrwallet.service.exchange.api.ExchangeRate; @@ -46,12 +48,15 @@ public class ExchangeOtherEditText extends ExchangeEditText { public void setExchangeRate(double rate) { exchangeRate = rate; - post(new Runnable() { - @Override - public void run() { - startExchange(); - } - }); + post(this::startExchange); + } + + public void setBaseCurrency(@NonNull String symbol) { + if (symbol.equals(baseCurrency)) return; + baseCurrency = symbol; + setCurrencyAdapter(sCurrencyA); + setCurrencyAdapter(sCurrencyB); + post(this::postInitialize); } private void setBaseCurrency(Context context, AttributeSet attrs) { @@ -184,12 +189,7 @@ public class ExchangeOtherEditText extends ExchangeEditText { @Override public void onError(final Exception e) { Timber.e(e.getLocalizedMessage()); - new Handler(Looper.getMainLooper()).post(new Runnable() { - @Override - public void run() { - exchangeFailed(); - } - }); + new Handler(Looper.getMainLooper()).post(() -> exchangeFailed()); } }); } diff --git a/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeView.java b/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeView.java index dceb376a..b35a0b6a 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeView.java +++ b/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeView.java @@ -44,6 +44,7 @@ import com.m2049r.xmrwallet.service.exchange.api.ExchangeCallback; import com.m2049r.xmrwallet.service.exchange.api.ExchangeRate; import com.m2049r.xmrwallet.util.ColorHelper; import com.m2049r.xmrwallet.util.Helper; +import com.m2049r.xmrwallet.util.ServiceHelper; import java.util.ArrayList; import java.util.Arrays; @@ -311,7 +312,7 @@ public class ExchangeView extends LinearLayout { } } - private final ExchangeApi exchangeApi = Helper.getExchangeApi(); + private final ExchangeApi exchangeApi = ServiceHelper.getExchangeApi(); void startExchange() { showProgress(); diff --git a/app/src/main/res/drawable/ic_monero.xml b/app/src/main/res/drawable/ic_monero.xml new file mode 100644 index 00000000..b50ba671 --- /dev/null +++ b/app/src/main/res/drawable/ic_monero.xml @@ -0,0 +1,12 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32dp" + android:height="32dp" + android:viewportWidth="256" + android:viewportHeight="256"> + <path + android:fillColor="#F60" + android:pathData="M127.998,0C57.318,0 0,57.317 0,127.999c0,14.127 2.29,27.716 6.518,40.43H44.8V60.733l83.2,83.2 83.198,-83.2v107.695h38.282c4.231,-12.714 6.521,-26.303 6.521,-40.43C256,57.314 198.681,0 127.998,0" /> + <path + android:fillColor="#4C4C4C" + android:pathData="M108.867,163.062l-36.31,-36.311v67.765H18.623c22.47,36.863 63.051,61.48 109.373,61.48s86.907,-24.617 109.374,-61.48h-53.933V126.75l-36.31,36.31 -19.13,19.129 -19.128,-19.128h-0.002z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_monero_bw.xml b/app/src/main/res/drawable/ic_monero_bw.xml new file mode 100644 index 00000000..1b4cef11 --- /dev/null +++ b/app/src/main/res/drawable/ic_monero_bw.xml @@ -0,0 +1,12 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32dp" + android:height="32dp" + android:viewportWidth="256" + android:viewportHeight="256"> + <path + android:fillColor="@color/monerujoPrimary" + android:pathData="M127.998,0C57.318,0 0,57.317 0,127.999c0,14.127 2.29,27.716 6.518,40.43H44.8V60.733l83.2,83.2 83.198,-83.2v107.695h38.282c4.231,-12.714 6.521,-26.303 6.521,-40.43C256,57.314 198.681,0 127.998,0" /> + <path + android:fillColor="@color/monerujoPrimary" + android:pathData="M108.867,163.062l-36.31,-36.311v67.765H18.623c22.47,36.863 63.051,61.48 109.373,61.48s86.907,-24.617 109.374,-61.48h-53.933V126.75l-36.31,36.31 -19.13,19.129 -19.128,-19.128h-0.002z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_sideshift_circle.xml b/app/src/main/res/drawable/ic_sideshift_circle.xml new file mode 100644 index 00000000..366f959d --- /dev/null +++ b/app/src/main/res/drawable/ic_sideshift_circle.xml @@ -0,0 +1,12 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32dp" + android:height="32dp" + android:viewportWidth="80.52" + android:viewportHeight="80.46"> + <path + android:fillColor="@color/monerujoPrimary" + android:pathData="M66.07,9.67A40,40 0,0 0,9.69 66.11Z" />> + <path + android:fillColor="@color/monerujoPrimary" + android:pathData="M13.92,70.34a40,40 0,0 0,56.45 -56.5Z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_sideshift_white.xml b/app/src/main/res/drawable/ic_sideshift_white.xml index 7d8a3284..76d8891b 100644 --- a/app/src/main/res/drawable/ic_sideshift_white.xml +++ b/app/src/main/res/drawable/ic_sideshift_white.xml @@ -3,46 +3,46 @@ android:height="80dp" android:viewportWidth="648" android:viewportHeight="80"> - <path - android:pathData="M65.94,9.56A40,40 0,0 0,9.56 66Z" - android:fillColor="@color/monerujoPrimary"/> - <path - android:pathData="M13.79,70.23a40,40 0,0 0,56.45 -56.5Z" - android:fillColor="@color/monerujoPrimary"/> - <path - android:pathData="M144.75,28a9.12,9.12 0,0 0,-1 -4.48A8.81,8.81 0,0 0,141 20.29a14.14,14.14 0,0 0,-4 -1.95,15.61 15.61,0 0,0 -4.84,-0.68 15.34,15.34 0,0 0,-4.24 0.58,11.88 11.88,0 0,0 -3.55,1.66 7.15,7.15 0,0 0,-2.47 2.63,7.26 7.26,0 0,0 -0.88,3.61v0.49a7.11,7.11 0,0 0,0.88 3.7A6.91,6.91 0,0 0,124.53 33,19 19,0 0,0 129,34.82a58.17,58.17 0,0 0,6.31 1.27C140.9,37 145,38.52 147.61,41a12.31,12.31 0,0 1,3.94 9.66v0.87a16,16 0,0 1,-1.18 6.25,13.23 13.23,0 0,1 -3.55,4.87 17,17 0,0 1,-5.72 3.22,24.6 24.6,0 0,1 -8,1.17A26.21,26.21 0,0 1,124 65.54a18,18 0,0 1,-6.6 -4.1,18.51 18.51,0 0,1 -4.05,-6.14A21.41,21.41 0,0 1,112 47.59V45.35h6.41V47.2c0,4.68 1.28,8.1 3.85,10.44s6.11,3.51 10.75,3.51c4,0 7,-0.88 9,-2.63a8.82,8.82 0,0 0,3 -6.93V51.1a7.26,7.26 0,0 0,-3 -6.33q-3.12,-2.21 -10.06,-3.22a38.07,38.07 0,0 1,-7.3 -1.66,17.24 17.24,0 0,1 -5.53,-2.83 13.62,13.62 0,0 1,-3.55 -4.29,13.48 13.48,0 0,1 -1.18,-5.85V26a11.87,11.87 0,0 1,1.28 -5.65,13.37 13.37,0 0,1 3.65,-4.49A16.94,16.94 0,0 1,124.92 13a26.31,26.31 0,0 1,15.19 0.29,21.17 21.17,0 0,1 6,3.41 14.69,14.69 0,0 1,5 11.12V31h-6.41V28Z" - android:fillColor="@color/monerujoPrimary"/> - <path - android:pathData="M161.91,12.68h33.93v5.85H182.13V59.59h13.71v5.85H161.91V59.59h13.71v-41H161.91Z" - android:fillColor="@color/monerujoPrimary"/> - <path - android:pathData="M207.78,12.68h17.56q9.91,0 14.5,4.68c3,3.12 4.53,8.1 4.53,14.92L244.37,45.84c0,6.82 -1.48,11.8 -4.53,14.92s-7.89,4.68 -14.5,4.68L207.78,65.44L207.78,59.49h4.54L212.32,18.63h-4.54ZM224.45,59.68a22.74,22.74 0,0 0,6.11 -0.69,9.73 9.73,0 0,0 4.24,-2.34 9.43,9.43 0,0 0,2.47 -4.39,26.62 26.62,0 0,0 0.79,-6.82L238.06,32.77a26.2,26.2 0,0 0,-0.79 -6.83,10 10,0 0,0 -2.47,-4.38 9.73,9.73 0,0 0,-4.24 -2.34,22.26 22.26,0 0,0 -6.11,-0.69h-5.62L218.83,59.59h5.62Z" - android:fillColor="@color/monerujoPrimary"/> - <path - android:pathData="M256.21,12.68h32.35v5.85H262.62V36.09h25.55v5.85H262.62V59.59h26.43v5.85H256.21Z" - android:fillColor="@color/monerujoPrimary"/> - <path - android:pathData="M331.67,28a9.12,9.12 0,0 0,-1 -4.48,8.81 8.81,0 0,0 -2.76,-3.22 14.2,14.2 0,0 0,-4.05 -1.95,15.55 15.55,0 0,0 -4.83,-0.68 15.34,15.34 0,0 0,-4.24 0.58,11.77 11.77,0 0,0 -3.55,1.66 7.07,7.07 0,0 0,-2.47 2.63,7.26 7.26,0 0,0 -0.89,3.61v0.49a7.11,7.11 0,0 0,0.89 3.7A6.91,6.91 0,0 0,311.45 33a19,19 0,0 0,4.44 1.85,58.17 58.17,0 0,0 6.31,1.27c5.62,0.87 9.76,2.43 12.33,4.87a12.31,12.31 0,0 1,3.94 9.66v0.87a16,16 0,0 1,-1.18 6.25,13.23 13.23,0 0,1 -3.55,4.87A17,17 0,0 1,328 65.83,24.64 24.64,0 0,1 320,67 26.21,26.21 0,0 1,311 65.54a18.09,18.09 0,0 1,-6.61 -4.1,18.63 18.63,0 0,1 -4,-6.14 21.41,21.41 0,0 1,-1.38 -7.71V45.35h6.41V47.2c0,4.68 1.28,8.1 3.85,10.44s6.11,3.51 10.75,3.51c3.94,0 7,-0.88 9,-2.63A8.8,8.8 0,0 0,332 51.59V51.1a7.24,7.24 0,0 0,-3.06 -6.33q-3.11,-2.21 -10.06,-3.22a38,38 0,0 1,-7.29 -1.66A17.24,17.24 0,0 1,306 37.06a13.62,13.62 0,0 1,-3.55 -4.29,13.48 13.48,0 0,1 -1.18,-5.85V26a11.87,11.87 0,0 1,1.28 -5.65,13.37 13.37,0 0,1 3.65,-4.49A16.94,16.94 0,0 1,311.84 13a26.31,26.31 0,0 1,15.19 0.29,21.17 21.17,0 0,1 6,3.41 14.69,14.69 0,0 1,5 11.12V31h-6.41Z" - android:fillColor="@color/monerujoPrimary"/> - <path - android:pathData="M348,12.68h6.41V36.09h22.79V12.68h6.41V65.54h-6.41V42H354.45V65.63H348Z" - android:fillColor="@color/monerujoPrimary"/> - <path - android:pathData="M395.68,12.68h33.93v5.85H415.9V59.59h13.71v5.85H395.68V59.59h13.71v-41H395.68Z" - android:fillColor="@color/monerujoPrimary"/> - <path - android:pathData="M443.23,12.68h32.84v5.85H449.64V36.09h25.94v5.85H449.64v23.6h-6.41V12.68Z" - android:fillColor="@color/monerujoPrimary"/> - <path - android:pathData="M487.32,12.68H524.9v5.85H509.32v47H502.9V18.63H487.32V12.68Z" - android:fillColor="@color/monerujoPrimary"/> - <path - android:pathData="M537.33,61.34a4.74,4.74 0,0 1,1.58 -3.7,5 5,0 0,1 3.74,-1.56A5.36,5.36 0,0 1,548 61.34a4.76,4.76 0,0 1,-1.58 3.71,5 5,0 0,1 -3.75,1.56 4.86,4.86 0,0 1,-3.74 -1.56A4.76,4.76 0,0 1,537.33 61.34Z" - android:fillColor="@color/monerujoPrimary"/> - <path - android:pathData="M595.82,52.47H572.94l-3.85,13.16h-6.91l16.08,-52.95h12l16.17,52.86h-6.9ZM583.89,15.41l-9.28,31.11H594l-9.27,-31.11Z" - android:fillColor="@color/monerujoPrimary"/> - <path - android:pathData="M614.07,12.68H648v5.85H634.29V59.59H648v5.85H614.07V59.59h13.71v-41H614.07Z" - android:fillColor="@color/monerujoPrimary"/> + <path + android:fillColor="@color/monerujoPrimary" + android:pathData="M65.94,9.56A40,40 0,0 0,9.56 66Z" /> + <path + android:fillColor="@color/monerujoPrimary" + android:pathData="M13.79,70.23a40,40 0,0 0,56.45 -56.5Z" /> + <path + android:fillColor="@color/monerujoPrimary" + android:pathData="M144.75,28a9.12,9.12 0,0 0,-1 -4.48A8.81,8.81 0,0 0,141 20.29a14.14,14.14 0,0 0,-4 -1.95,15.61 15.61,0 0,0 -4.84,-0.68 15.34,15.34 0,0 0,-4.24 0.58,11.88 11.88,0 0,0 -3.55,1.66 7.15,7.15 0,0 0,-2.47 2.63,7.26 7.26,0 0,0 -0.88,3.61v0.49a7.11,7.11 0,0 0,0.88 3.7A6.91,6.91 0,0 0,124.53 33,19 19,0 0,0 129,34.82a58.17,58.17 0,0 0,6.31 1.27C140.9,37 145,38.52 147.61,41a12.31,12.31 0,0 1,3.94 9.66v0.87a16,16 0,0 1,-1.18 6.25,13.23 13.23,0 0,1 -3.55,4.87 17,17 0,0 1,-5.72 3.22,24.6 24.6,0 0,1 -8,1.17A26.21,26.21 0,0 1,124 65.54a18,18 0,0 1,-6.6 -4.1,18.51 18.51,0 0,1 -4.05,-6.14A21.41,21.41 0,0 1,112 47.59V45.35h6.41V47.2c0,4.68 1.28,8.1 3.85,10.44s6.11,3.51 10.75,3.51c4,0 7,-0.88 9,-2.63a8.82,8.82 0,0 0,3 -6.93V51.1a7.26,7.26 0,0 0,-3 -6.33q-3.12,-2.21 -10.06,-3.22a38.07,38.07 0,0 1,-7.3 -1.66,17.24 17.24,0 0,1 -5.53,-2.83 13.62,13.62 0,0 1,-3.55 -4.29,13.48 13.48,0 0,1 -1.18,-5.85V26a11.87,11.87 0,0 1,1.28 -5.65,13.37 13.37,0 0,1 3.65,-4.49A16.94,16.94 0,0 1,124.92 13a26.31,26.31 0,0 1,15.19 0.29,21.17 21.17,0 0,1 6,3.41 14.69,14.69 0,0 1,5 11.12V31h-6.41V28Z" /> + <path + android:fillColor="@color/monerujoPrimary" + android:pathData="M161.91,12.68h33.93v5.85H182.13V59.59h13.71v5.85H161.91V59.59h13.71v-41H161.91Z" /> + <path + android:fillColor="@color/monerujoPrimary" + android:pathData="M207.78,12.68h17.56q9.91,0 14.5,4.68c3,3.12 4.53,8.1 4.53,14.92L244.37,45.84c0,6.82 -1.48,11.8 -4.53,14.92s-7.89,4.68 -14.5,4.68L207.78,65.44L207.78,59.49h4.54L212.32,18.63h-4.54ZM224.45,59.68a22.74,22.74 0,0 0,6.11 -0.69,9.73 9.73,0 0,0 4.24,-2.34 9.43,9.43 0,0 0,2.47 -4.39,26.62 26.62,0 0,0 0.79,-6.82L238.06,32.77a26.2,26.2 0,0 0,-0.79 -6.83,10 10,0 0,0 -2.47,-4.38 9.73,9.73 0,0 0,-4.24 -2.34,22.26 22.26,0 0,0 -6.11,-0.69h-5.62L218.83,59.59h5.62Z" /> + <path + android:fillColor="@color/monerujoPrimary" + android:pathData="M256.21,12.68h32.35v5.85H262.62V36.09h25.55v5.85H262.62V59.59h26.43v5.85H256.21Z" /> + <path + android:fillColor="@color/monerujoPrimary" + android:pathData="M331.67,28a9.12,9.12 0,0 0,-1 -4.48,8.81 8.81,0 0,0 -2.76,-3.22 14.2,14.2 0,0 0,-4.05 -1.95,15.55 15.55,0 0,0 -4.83,-0.68 15.34,15.34 0,0 0,-4.24 0.58,11.77 11.77,0 0,0 -3.55,1.66 7.07,7.07 0,0 0,-2.47 2.63,7.26 7.26,0 0,0 -0.89,3.61v0.49a7.11,7.11 0,0 0,0.89 3.7A6.91,6.91 0,0 0,311.45 33a19,19 0,0 0,4.44 1.85,58.17 58.17,0 0,0 6.31,1.27c5.62,0.87 9.76,2.43 12.33,4.87a12.31,12.31 0,0 1,3.94 9.66v0.87a16,16 0,0 1,-1.18 6.25,13.23 13.23,0 0,1 -3.55,4.87A17,17 0,0 1,328 65.83,24.64 24.64,0 0,1 320,67 26.21,26.21 0,0 1,311 65.54a18.09,18.09 0,0 1,-6.61 -4.1,18.63 18.63,0 0,1 -4,-6.14 21.41,21.41 0,0 1,-1.38 -7.71V45.35h6.41V47.2c0,4.68 1.28,8.1 3.85,10.44s6.11,3.51 10.75,3.51c3.94,0 7,-0.88 9,-2.63A8.8,8.8 0,0 0,332 51.59V51.1a7.24,7.24 0,0 0,-3.06 -6.33q-3.11,-2.21 -10.06,-3.22a38,38 0,0 1,-7.29 -1.66A17.24,17.24 0,0 1,306 37.06a13.62,13.62 0,0 1,-3.55 -4.29,13.48 13.48,0 0,1 -1.18,-5.85V26a11.87,11.87 0,0 1,1.28 -5.65,13.37 13.37,0 0,1 3.65,-4.49A16.94,16.94 0,0 1,311.84 13a26.31,26.31 0,0 1,15.19 0.29,21.17 21.17,0 0,1 6,3.41 14.69,14.69 0,0 1,5 11.12V31h-6.41Z" /> + <path + android:fillColor="@color/monerujoPrimary" + android:pathData="M348,12.68h6.41V36.09h22.79V12.68h6.41V65.54h-6.41V42H354.45V65.63H348Z" /> + <path + android:fillColor="@color/monerujoPrimary" + android:pathData="M395.68,12.68h33.93v5.85H415.9V59.59h13.71v5.85H395.68V59.59h13.71v-41H395.68Z" /> + <path + android:fillColor="@color/monerujoPrimary" + android:pathData="M443.23,12.68h32.84v5.85H449.64V36.09h25.94v5.85H449.64v23.6h-6.41V12.68Z" /> + <path + android:fillColor="@color/monerujoPrimary" + android:pathData="M487.32,12.68H524.9v5.85H509.32v47H502.9V18.63H487.32V12.68Z" /> + <path + android:fillColor="@color/monerujoPrimary" + android:pathData="M537.33,61.34a4.74,4.74 0,0 1,1.58 -3.7,5 5,0 0,1 3.74,-1.56A5.36,5.36 0,0 1,548 61.34a4.76,4.76 0,0 1,-1.58 3.71,5 5,0 0,1 -3.75,1.56 4.86,4.86 0,0 1,-3.74 -1.56A4.76,4.76 0,0 1,537.33 61.34Z" /> + <path + android:fillColor="@color/monerujoPrimary" + android:pathData="M595.82,52.47H572.94l-3.85,13.16h-6.91l16.08,-52.95h12l16.17,52.86h-6.9ZM583.89,15.41l-9.28,31.11H594l-9.27,-31.11Z" /> + <path + android:fillColor="@color/monerujoPrimary" + android:pathData="M614.07,12.68H648v5.85H634.29V59.59H648v5.85H614.07V59.59h13.71v-41H614.07Z" /> </vector> diff --git a/app/src/main/res/drawable/ic_xmrto_32dp.png b/app/src/main/res/drawable/ic_xmrto_32dp.png deleted file mode 100644 index b9cec90c..00000000 Binary files a/app/src/main/res/drawable/ic_xmrto_32dp.png and /dev/null differ diff --git a/app/src/main/res/drawable/ic_xmrto_btc.xml b/app/src/main/res/drawable/ic_xmrto_btc.xml new file mode 100644 index 00000000..60efbe25 --- /dev/null +++ b/app/src/main/res/drawable/ic_xmrto_btc.xml @@ -0,0 +1,14 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32dp" + android:height="32dp" + android:viewportWidth="32" + android:viewportHeight="32"> + <path + android:fillColor="#F7931A" + android:fillType="evenOdd" + android:pathData="M16,16m-16,0a16,16 0,1 1,32 0a16,16 0,1 1,-32 0" /> + <path + android:fillColor="#FFF" + android:fillType="nonZero" + android:pathData="M23.189,14.02c0.314,-2.096 -1.283,-3.223 -3.465,-3.975l0.708,-2.84 -1.728,-0.43 -0.69,2.765c-0.454,-0.114 -0.92,-0.22 -1.385,-0.326l0.695,-2.783L15.596,6l-0.708,2.839c-0.376,-0.086 -0.746,-0.17 -1.104,-0.26l0.002,-0.009 -2.384,-0.595 -0.46,1.846s1.283,0.294 1.256,0.312c0.7,0.175 0.826,0.638 0.805,1.006l-0.806,3.235c0.048,0.012 0.11,0.03 0.18,0.057l-0.183,-0.045 -1.13,4.532c-0.086,0.212 -0.303,0.531 -0.793,0.41 0.018,0.025 -1.256,-0.313 -1.256,-0.313l-0.858,1.978 2.25,0.561c0.418,0.105 0.828,0.215 1.231,0.318l-0.715,2.872 1.727,0.43 0.708,-2.84c0.472,0.127 0.93,0.245 1.378,0.357l-0.706,2.828 1.728,0.43 0.715,-2.866c2.948,0.558 5.164,0.333 6.097,-2.333 0.752,-2.146 -0.037,-3.385 -1.588,-4.192 1.13,-0.26 1.98,-1.003 2.207,-2.538zM19.239,19.558c-0.533,2.147 -4.148,0.986 -5.32,0.695l0.95,-3.805c1.172,0.293 4.929,0.872 4.37,3.11zM19.774,13.989c-0.487,1.953 -3.495,0.96 -4.47,0.717l0.86,-3.45c0.975,0.243 4.118,0.696 3.61,2.733z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_xmrto_btc_off.xml b/app/src/main/res/drawable/ic_xmrto_btc_off.xml new file mode 100644 index 00000000..5a49d3da --- /dev/null +++ b/app/src/main/res/drawable/ic_xmrto_btc_off.xml @@ -0,0 +1,14 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32dp" + android:height="32dp" + android:viewportWidth="32" + android:viewportHeight="32"> + <path + android:fillColor="@color/monerujoPrimary" + android:fillType="evenOdd" + android:pathData="M16,16m-16,0a16,16 0,1 1,32 0a16,16 0,1 1,-32 0" /> + <path + android:fillColor="@color/monerujoBackground" + android:fillType="nonZero" + android:pathData="M23.189,14.02c0.314,-2.096 -1.283,-3.223 -3.465,-3.975l0.708,-2.84 -1.728,-0.43 -0.69,2.765c-0.454,-0.114 -0.92,-0.22 -1.385,-0.326l0.695,-2.783L15.596,6l-0.708,2.839c-0.376,-0.086 -0.746,-0.17 -1.104,-0.26l0.002,-0.009 -2.384,-0.595 -0.46,1.846s1.283,0.294 1.256,0.312c0.7,0.175 0.826,0.638 0.805,1.006l-0.806,3.235c0.048,0.012 0.11,0.03 0.18,0.057l-0.183,-0.045 -1.13,4.532c-0.086,0.212 -0.303,0.531 -0.793,0.41 0.018,0.025 -1.256,-0.313 -1.256,-0.313l-0.858,1.978 2.25,0.561c0.418,0.105 0.828,0.215 1.231,0.318l-0.715,2.872 1.727,0.43 0.708,-2.84c0.472,0.127 0.93,0.245 1.378,0.357l-0.706,2.828 1.728,0.43 0.715,-2.866c2.948,0.558 5.164,0.333 6.097,-2.333 0.752,-2.146 -0.037,-3.385 -1.588,-4.192 1.13,-0.26 1.98,-1.003 2.207,-2.538zM19.239,19.558c-0.533,2.147 -4.148,0.986 -5.32,0.695l0.95,-3.805c1.172,0.293 4.929,0.872 4.37,3.11zM19.774,13.989c-0.487,1.953 -3.495,0.96 -4.47,0.717l0.86,-3.45c0.975,0.243 4.118,0.696 3.61,2.733z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_xmrto_dash.xml b/app/src/main/res/drawable/ic_xmrto_dash.xml new file mode 100644 index 00000000..a3ace157 --- /dev/null +++ b/app/src/main/res/drawable/ic_xmrto_dash.xml @@ -0,0 +1,15 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32dp" + android:height="32dp" + android:viewportWidth="32" + android:viewportHeight="32"> + <path + android:fillColor="#008CE7" + android:pathData="M16,16m-16,0a16,16 0,1 1,32 0a16,16 0,1 1,-32 0" /> + <path + android:fillColor="#FFF" + android:pathData="M19.086,8.004H11.81l-0.602,3.367 6.562,0.01c3.231,0 4.19,1.173 4.159,3.12 -0.014,0.998 -0.449,2.686 -0.633,3.23 -0.497,1.46 -1.521,3.122 -5.359,3.117l-6.378,-0.004 -0.602,3.371h7.257c2.559,0 3.649,-0.299 4.8,-0.83 2.554,-1.178 4.075,-3.701 4.686,-6.994 0.906,-4.9 -0.224,-8.387 -6.615,-8.387z" /> + <path + android:fillColor="#FFF" + android:pathData="M15.807,15.798c0.237,-0.985 0.312,-1.38 0.312,-1.38H8.673c-1.904,0 -2.176,1.24 -2.357,1.99 -0.237,0.981 -0.312,1.381 -0.312,1.381h7.447c1.903,0 2.175,-1.24 2.356,-1.991z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_xmrto_dash_off.xml b/app/src/main/res/drawable/ic_xmrto_dash_off.xml new file mode 100644 index 00000000..28a712fd --- /dev/null +++ b/app/src/main/res/drawable/ic_xmrto_dash_off.xml @@ -0,0 +1,15 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32dp" + android:height="32dp" + android:viewportWidth="32" + android:viewportHeight="32"> + <path + android:fillColor="@color/monerujoPrimary" + android:pathData="M16,16m-16,0a16,16 0,1 1,32 0a16,16 0,1 1,-32 0" /> + <path + android:fillColor="@color/monerujoBackground" + android:pathData="M19.086,8.004H11.81l-0.602,3.367 6.562,0.01c3.231,0 4.19,1.173 4.159,3.12 -0.014,0.998 -0.449,2.686 -0.633,3.23 -0.497,1.46 -1.521,3.122 -5.359,3.117l-6.378,-0.004 -0.602,3.371h7.257c2.559,0 3.649,-0.299 4.8,-0.83 2.554,-1.178 4.075,-3.701 4.686,-6.994 0.906,-4.9 -0.224,-8.387 -6.615,-8.387z" /> + <path + android:fillColor="@color/monerujoBackground" + android:pathData="M15.807,15.798c0.237,-0.985 0.312,-1.38 0.312,-1.38H8.673c-1.904,0 -2.176,1.24 -2.357,1.99 -0.237,0.981 -0.312,1.381 -0.312,1.381h7.447c1.903,0 2.175,-1.24 2.356,-1.991z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_xmrto_doge.xml b/app/src/main/res/drawable/ic_xmrto_doge.xml new file mode 100644 index 00000000..c8bfcd78 --- /dev/null +++ b/app/src/main/res/drawable/ic_xmrto_doge.xml @@ -0,0 +1,14 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32dp" + android:height="32dp" + android:viewportWidth="32" + android:viewportHeight="32"> + <path + android:fillColor="#C3A634" + android:fillType="evenOdd" + android:pathData="M16,16m-16,0a16,16 0,1 1,32 0a16,16 0,1 1,-32 0" /> + <path + android:fillColor="#FFF" + android:fillType="evenOdd" + android:pathData="M13.248,14.61h4.314v2.286h-4.314v4.818h2.721c1.077,0 1.958,-0.145 2.644,-0.437 0.686,-0.291 1.224,-0.694 1.615,-1.21a4.4,4.4 0,0 0,0.796 -1.815,11.4 11.4,0 0,0 0.21,-2.252 11.4,11.4 0,0 0,-0.21 -2.252,4.396 4.396,0 0,0 -0.796,-1.815c-0.391,-0.516 -0.93,-0.919 -1.615,-1.21 -0.686,-0.292 -1.567,-0.437 -2.644,-0.437h-2.721v4.325zM10.482,16.896L9,16.896v-2.285h1.482L10.482,8h6.549c1.21,0 2.257,0.21 3.142,0.627 0.885,0.419 1.607,0.99 2.168,1.715 0.56,0.724 0.977,1.572 1.25,2.543 0.273,0.971 0.409,2.01 0.409,3.115a11.47,11.47 0,0 1,-0.41 3.115c-0.272,0.97 -0.689,1.819 -1.25,2.543 -0.56,0.725 -1.282,1.296 -2.167,1.715 -0.885,0.418 -1.933,0.627 -3.142,0.627h-6.549v-7.104z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_xmrto_doge_off.xml b/app/src/main/res/drawable/ic_xmrto_doge_off.xml new file mode 100644 index 00000000..51f0639a --- /dev/null +++ b/app/src/main/res/drawable/ic_xmrto_doge_off.xml @@ -0,0 +1,14 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32dp" + android:height="32dp" + android:viewportWidth="32" + android:viewportHeight="32"> + <path + android:fillColor="@color/monerujoPrimary" + android:fillType="evenOdd" + android:pathData="M16,16m-16,0a16,16 0,1 1,32 0a16,16 0,1 1,-32 0" /> + <path + android:fillColor="@color/monerujoBackground" + android:fillType="evenOdd" + android:pathData="M13.248,14.61h4.314v2.286h-4.314v4.818h2.721c1.077,0 1.958,-0.145 2.644,-0.437 0.686,-0.291 1.224,-0.694 1.615,-1.21a4.4,4.4 0,0 0,0.796 -1.815,11.4 11.4,0 0,0 0.21,-2.252 11.4,11.4 0,0 0,-0.21 -2.252,4.396 4.396,0 0,0 -0.796,-1.815c-0.391,-0.516 -0.93,-0.919 -1.615,-1.21 -0.686,-0.292 -1.567,-0.437 -2.644,-0.437h-2.721v4.325zM10.482,16.896L9,16.896v-2.285h1.482L10.482,8h6.549c1.21,0 2.257,0.21 3.142,0.627 0.885,0.419 1.607,0.99 2.168,1.715 0.56,0.724 0.977,1.572 1.25,2.543 0.273,0.971 0.409,2.01 0.409,3.115a11.47,11.47 0,0 1,-0.41 3.115c-0.272,0.97 -0.689,1.819 -1.25,2.543 -0.56,0.725 -1.282,1.296 -2.167,1.715 -0.885,0.418 -1.933,0.627 -3.142,0.627h-6.549v-7.104z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_xmrto_eth.xml b/app/src/main/res/drawable/ic_xmrto_eth.xml new file mode 100644 index 00000000..9569125f --- /dev/null +++ b/app/src/main/res/drawable/ic_xmrto_eth.xml @@ -0,0 +1,38 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32dp" + android:height="32dp" + android:viewportWidth="32" + android:viewportHeight="32"> + <path + android:fillColor="#627EEA" + android:fillType="evenOdd" + android:pathData="M16,16m-16,0a16,16 0,1 1,32 0a16,16 0,1 1,-32 0" /> + <path + android:fillAlpha="0.602" + android:fillColor="#FFF" + android:fillType="nonZero" + android:pathData="M16.498,4v8.87l7.497,3.35z" /> + <path + android:fillColor="#FFF" + android:fillType="nonZero" + android:pathData="M16.498,4L9,16.22l7.498,-3.35z" /> + <path + android:fillAlpha="0.602" + android:fillColor="#FFF" + android:fillType="nonZero" + android:pathData="M16.498,21.968v6.027L24,17.616z" /> + <path + android:fillColor="#FFF" + android:fillType="nonZero" + android:pathData="M16.498,27.995v-6.028L9,17.616z" /> + <path + android:fillAlpha="0.2" + android:fillColor="#FFF" + android:fillType="nonZero" + android:pathData="M16.498,20.573l7.497,-4.353 -7.497,-3.348z" /> + <path + android:fillAlpha="0.602" + android:fillColor="#FFF" + android:fillType="nonZero" + android:pathData="M9,16.22l7.498,4.353v-7.701z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_xmrto_eth_off.xml b/app/src/main/res/drawable/ic_xmrto_eth_off.xml new file mode 100644 index 00000000..04da5f01 --- /dev/null +++ b/app/src/main/res/drawable/ic_xmrto_eth_off.xml @@ -0,0 +1,38 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32dp" + android:height="32dp" + android:viewportWidth="32" + android:viewportHeight="32"> + <path + android:fillColor="@color/monerujoPrimary" + android:fillType="evenOdd" + android:pathData="M16,16m-16,0a16,16 0,1 1,32 0a16,16 0,1 1,-32 0" /> + <path + android:fillAlpha="0.602" + android:fillColor="@color/monerujoBackground" + android:fillType="nonZero" + android:pathData="M16.498,4v8.87l7.497,3.35z" /> + <path + android:fillColor="@color/monerujoBackground" + android:fillType="nonZero" + android:pathData="M16.498,4L9,16.22l7.498,-3.35z" /> + <path + android:fillAlpha="0.602" + android:fillColor="@color/monerujoBackground" + android:fillType="nonZero" + android:pathData="M16.498,21.968v6.027L24,17.616z" /> + <path + android:fillColor="@color/monerujoBackground" + android:fillType="nonZero" + android:pathData="M16.498,27.995v-6.028L9,17.616z" /> + <path + android:fillAlpha="0.2" + android:fillColor="@color/monerujoBackground" + android:fillType="nonZero" + android:pathData="M16.498,20.573l7.497,-4.353 -7.497,-3.348z" /> + <path + android:fillAlpha="0.602" + android:fillColor="@color/monerujoBackground" + android:fillType="nonZero" + android:pathData="M9,16.22l7.498,4.353v-7.701z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_xmrto_ltc.xml b/app/src/main/res/drawable/ic_xmrto_ltc.xml new file mode 100644 index 00000000..5bb3470a --- /dev/null +++ b/app/src/main/res/drawable/ic_xmrto_ltc.xml @@ -0,0 +1,14 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32dp" + android:height="32dp" + android:viewportWidth="32" + android:viewportHeight="32"> + <path + android:fillColor="#315d9e" + android:fillType="evenOdd" + android:pathData="M16,16m-16,0a16,16 0,1 1,32 0a16,16 0,1 1,-32 0" /> + <path + android:fillColor="#FFF" + android:fillType="evenOdd" + android:pathData="M10.427,19.214L9,19.768l0.688,-2.759 1.444,-0.58L13.213,8h5.129l-1.519,6.196 1.41,-0.571 -0.68,2.75 -1.427,0.571 -0.848,3.483H23L22.127,24H9.252z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_xmrto_ltc_off.xml b/app/src/main/res/drawable/ic_xmrto_ltc_off.xml new file mode 100644 index 00000000..663c2476 --- /dev/null +++ b/app/src/main/res/drawable/ic_xmrto_ltc_off.xml @@ -0,0 +1,14 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32dp" + android:height="32dp" + android:viewportWidth="32" + android:viewportHeight="32"> + <path + android:fillColor="@color/monerujoPrimary" + android:fillType="evenOdd" + android:pathData="M16,16m-16,0a16,16 0,1 1,32 0a16,16 0,1 1,-32 0" /> + <path + android:fillColor="@color/monerujoBackground" + android:fillType="evenOdd" + android:pathData="M10.427,19.214L9,19.768l0.688,-2.759 1.444,-0.58L13.213,8h5.129l-1.519,6.196 1.41,-0.571 -0.68,2.75 -1.427,0.571 -0.848,3.483H23L22.127,24H9.252z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_xmrto_whitestroke_24px.png b/app/src/main/res/drawable/ic_xmrto_whitestroke_24px.png deleted file mode 100644 index a1650c38..00000000 Binary files a/app/src/main/res/drawable/ic_xmrto_whitestroke_24px.png and /dev/null differ diff --git a/app/src/main/res/layout/fragment_send_address.xml b/app/src/main/res/layout/fragment_send_address.xml index ded4ab8f..29dcfcba 100644 --- a/app/src/main/res/layout/fragment_send_address.xml +++ b/app/src/main/res/layout/fragment_send_address.xml @@ -29,14 +29,12 @@ android:orientation="horizontal"> <com.google.android.material.textfield.TextInputLayout - style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" android:id="@+id/etAddress" + style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_alignParentStart="true" android:layout_toStartOf="@+id/bPasteAddress" - app:counterEnabled="true" - app:counterMaxLength="95" app:errorEnabled="true"> <com.google.android.material.textfield.TextInputEditText @@ -61,57 +59,94 @@ android:src="@drawable/ic_content_paste_24dp" /> </RelativeLayout> - <FrameLayout + <LinearLayout android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <TextView - android:id="@+id/tvPaymentIdIntegrated" - style="@style/MoneroText.Info" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="start|center_vertical" - android:layout_margin="8dp" - android:drawablePadding="8dp" - android:gravity="center" - android:text="@string/info_paymentid_integrated" - android:textSize="18sp" - android:visibility="invisible" - app:drawableStartCompat="@drawable/ic_check_gray_24dp" /> - + android:layout_height="wrap_content" + android:orientation="vertical"> <LinearLayout - android:id="@+id/llXmrTo" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_gravity="center" android:orientation="horizontal" - android:visibility="invisible"> + android:weightSum="6"> - <ImageView + <ImageButton + android:id="@+id/ibXMR" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="top" - android:paddingTop="8dp" - android:src="@drawable/gunther_24dp" /> + android:layout_weight="1" + android:background="@null" + android:padding="8dp" + android:src="@drawable/ic_monero" /> - <TextView - android:id="@+id/tvXmrTo" - style="@style/MoneroText.Info" - android:layout_width="match_parent" + <ImageButton + android:id="@+id/ibBTC" + android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginLeft="8dp" - android:layout_marginRight="8dp" - android:gravity="start|top" - android:singleLine="false" - android:textSize="18sp" - tools:text="@string/info_xmrto" /> + android:layout_weight="1" + android:background="@null" + android:padding="8dp" + android:src="@drawable/ic_xmrto_btc_off" /> + + <ImageButton + android:id="@+id/ibLTC" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="1" + android:background="@null" + android:padding="8dp" + android:src="@drawable/ic_xmrto_ltc_off" /> + + <ImageButton + android:id="@+id/ibETH" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="1" + android:background="@null" + android:padding="8dp" + android:src="@drawable/ic_xmrto_eth_off" /> + + <ImageButton + android:id="@+id/ibDASH" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="1" + android:background="@null" + android:padding="8dp" + android:src="@drawable/ic_xmrto_dash_off" /> + + <ImageButton + android:id="@+id/ibDOGE" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="1" + android:background="@null" + android:padding="8dp" + android:src="@drawable/ic_xmrto_doge_off" /> </LinearLayout> - </FrameLayout> + + <TextView + android:id="@+id/tvXmrTo" + style="@style/MoneroText.Info" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginLeft="8dp" + android:layout_marginTop="16dp" + android:layout_marginRight="8dp" + android:layout_marginBottom="16dp" + android:drawablePadding="8dp" + android:gravity="start" + android:singleLine="false" + android:text="@string/label_send_btc_xmrto_key" + android:textSize="18sp" + android:visibility="invisible" + app:drawableStartCompat="@drawable/gunther_24dp" + tools:text="@string/info_xmrto" /> + </LinearLayout> <com.google.android.material.textfield.TextInputLayout - style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" android:id="@+id/etNotes" + style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" android:layout_width="match_parent" android:layout_height="wrap_content"> diff --git a/app/src/main/res/layout/fragment_send_btc_amount.xml b/app/src/main/res/layout/fragment_send_btc_amount.xml index 00e5a7d8..fd1b9f8b 100644 --- a/app/src/main/res/layout/fragment_send_btc_amount.xml +++ b/app/src/main/res/layout/fragment_send_btc_amount.xml @@ -12,7 +12,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" - android:gravity="center" + android:layout_marginStart="56dp" tools:text="@string/send_available_btc" /> <FrameLayout @@ -34,11 +34,11 @@ android:visibility="invisible"> <ImageView - android:layout_width="wrap_content" - android:layout_height="wrap_content" + android:layout_width="48dp" + android:layout_height="48dp" android:layout_gravity="top" android:paddingTop="8dp" - android:src="@drawable/ic_xmrto_32dp" /> + android:src="@drawable/ic_sideshift_circle" /> <TextView android:id="@+id/tvXmrToParms" diff --git a/app/src/main/res/layout/fragment_send_btc_confirm.xml b/app/src/main/res/layout/fragment_send_btc_confirm.xml index ef0408e5..72a2fb98 100644 --- a/app/src/main/res/layout/fragment_send_btc_confirm.xml +++ b/app/src/main/res/layout/fragment_send_btc_confirm.xml @@ -91,7 +91,7 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:orientation="vertical" - android:visibility="invisible"> + android:visibility="visible"> <TextView style="@style/MoneroText.Confirm.Label" @@ -101,7 +101,7 @@ android:drawablePadding="8dp" android:gravity="center_vertical" android:text="@string/label_send_btc_xmrto_key" - card_view:drawableStartCompat="@drawable/ic_xmrto_32dp" /> + card_view:drawableStartCompat="@drawable/ic_sideshift_circle" /> <TextView android:id="@+id/tvTxXmrToKey" @@ -127,6 +127,7 @@ android:text="@string/label_send_btc_xmrto_info" /> <TextView + android:id="@+id/tvTxBtcAddressLabel" style="@style/MoneroText.Confirm.Label" android:layout_width="wrap_content" android:layout_height="wrap_content" diff --git a/app/src/main/res/layout/fragment_send_btc_success.xml b/app/src/main/res/layout/fragment_send_btc_success.xml index 3e2ee2de..321b5c86 100644 --- a/app/src/main/res/layout/fragment_send_btc_success.xml +++ b/app/src/main/res/layout/fragment_send_btc_success.xml @@ -19,10 +19,10 @@ <ImageView android:layout_width="72dp" android:layout_height="72dp" - android:layout_gravity="top" + android:layout_gravity="center_vertical" android:layout_marginEnd="24dp" android:padding="6dp" - android:src="@drawable/ic_check_circle_xmr" /> + android:src="@drawable/ic_monero" /> <LinearLayout android:layout_width="match_parent" @@ -38,7 +38,7 @@ <TextView android:id="@+id/tvTxAmount" - style="@style/MoneroText.Balance.Orange" + style="@style/MoneroText.Balance.Orange.Smaller" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="2" @@ -108,7 +108,7 @@ <com.google.android.material.card.MaterialCardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="8dp" + android:layout_marginTop="24dp" android:layout_marginBottom="16dp" card_view:contentPadding="8dp"> @@ -128,6 +128,13 @@ android:layout_height="wrap_content" android:layout_centerInParent="true"> + <ImageView + android:id="@+id/ivXmrToIcon" + android:layout_width="48dp" + android:layout_height="48dp" + android:layout_gravity="center" + android:src="@drawable/ic_xmrto_btc" /> + <ProgressBar android:id="@+id/pbXmrto" android:layout_width="match_parent" @@ -141,7 +148,7 @@ android:id="@+id/ivXmrToStatus" android:layout_width="24dp" android:layout_height="24dp" - android:layout_gravity="center" + android:layout_gravity="bottom|right" android:src="@drawable/ic_pending_orange_24dp" android:visibility="visible" /> @@ -151,15 +158,6 @@ android:layout_height="72dp" android:layout_gravity="center" android:visibility="invisible" /> - - <ImageView - android:layout_width="24dp" - android:layout_height="24dp" - android:layout_gravity="top|start" - android:layout_marginStart="10dp" - android:layout_marginTop="0dp" - android:src="@drawable/ic_xmrto_whitestroke_24px" /> - </FrameLayout> <TextView @@ -206,9 +204,7 @@ android:layout_height="wrap_content" android:background="?android:attr/colorBackground" android:drawablePadding="8dp" - android:paddingStart="16dp" android:paddingTop="8dp" - android:paddingEnd="8dp" android:paddingBottom="8dp" android:textColor="?attr/colorPrimary" card_view:drawableEndCompat="@drawable/ic_content_copy_24dp" @@ -219,7 +215,7 @@ style="@style/MoneroText.Medium" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center" + android:layout_gravity="start" android:layout_marginTop="8dp" android:layout_marginBottom="8dp" android:drawablePadding="8dp" diff --git a/app/src/main/res/layout/fragment_send_success.xml b/app/src/main/res/layout/fragment_send_success.xml index 02fc1f98..55585acd 100644 --- a/app/src/main/res/layout/fragment_send_success.xml +++ b/app/src/main/res/layout/fragment_send_success.xml @@ -1,6 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> @@ -20,10 +19,10 @@ <ImageView android:layout_width="72dp" android:layout_height="72dp" - android:layout_gravity="top" + android:layout_gravity="center_vertical" android:layout_marginEnd="24dp" android:padding="6dp" - android:src="@drawable/ic_check_circle" /> + android:src="@drawable/ic_monero" /> <LinearLayout android:layout_width="match_parent" @@ -39,7 +38,7 @@ <TextView android:id="@+id/tvTxAmount" - style="@style/MoneroText.Balance.Orange" + style="@style/MoneroText.Balance.Orange.Smaller" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="2" diff --git a/app/src/main/res/layout/fragment_tx_info.xml b/app/src/main/res/layout/fragment_tx_info.xml index c160b61a..307ae8b6 100644 --- a/app/src/main/res/layout/fragment_tx_info.xml +++ b/app/src/main/res/layout/fragment_tx_info.xml @@ -91,7 +91,7 @@ android:layout_gravity="center_vertical" android:gravity="end" android:padding="8dp" - android:text="@string/tx_amount_btc" /> + android:text="@string/tx_amount" /> <TextView android:id="@+id/tvTxAmountBtc" @@ -113,7 +113,7 @@ android:layout_gravity="top" android:gravity="end" android:padding="8dp" - android:text="@string/tx_destination_btc" /> + android:text="@string/tx_destination" /> <TextView android:id="@+id/tvDestinationBtc" @@ -148,7 +148,7 @@ android:layout_height="wrap_content" android:background="?android:attr/colorBackground" android:drawablePadding="16dp" - android:paddingStart="24dp" + android:paddingStart="8dp" android:paddingTop="8dp" android:paddingEnd="8dp" android:paddingBottom="8dp" diff --git a/app/src/main/res/layout/item_transaction.xml b/app/src/main/res/layout/item_transaction.xml index 3ec4cc26..00d66df9 100644 --- a/app/src/main/res/layout/item_transaction.xml +++ b/app/src/main/res/layout/item_transaction.xml @@ -24,7 +24,7 @@ android:layout_width="16dp" android:layout_height="16dp" android:layout_gravity="center" - android:src="@drawable/ic_xmrto_32dp" + android:src="@drawable/ic_xmrto_btc" android:visibility="visible" /> <LinearLayout diff --git a/app/src/main/res/values-cat/strings.xml b/app/src/main/res/values-cat/strings.xml index 4fa83670..9d8a2e57 100644 --- a/app/src/main/res/values-cat/strings.xml +++ b/app/src/main/res/values-cat/strings.xml @@ -35,29 +35,26 @@ <string name="info_ledger_enabled">Ledger habilitat, premi aquí per més informació.</string> <string name="info_xmrto"><![CDATA[ - <b>Heu introduït una adreça de Bitcoin.</b><br/> - <i>Està a punt d\'enviar XMR i el destinatari rebrà BTC a través del servei <b>SideShift.ai</b> service.</i> + <b>Heu introduït una adreça %1$s.</b><br/> + <i>Està a punt d\'enviar XMR i el destinatari rebrà %1$s a través del servei <b>SideShift.ai</b> service.</i> ]]></string> <string name="info_send_xmrto_success_order_label">Ordre SideShift.ai</string> - <string name="info_send_xmrto_success_btc">%1$s BTC</string> + <string name="info_send_xmrto_success_btc">%1$s %2$s</string> <string name="info_send_xmrto_paid">Confirmació Pendent</string> <string name="info_send_xmrto_unpaid">Pagament Pendent</string> <string name="info_send_xmrto_error">Error de SideShift.ai (%1$s)</string> - <string name="info_send_xmrto_sent">BTC Enviats!</string> + <string name="info_send_xmrto_sent">%1$s Enviats!</string> <string name="info_send_xmrto_query">Consultant …</string> <string name="info_send_xmrto_parms"><![CDATA[ - <b>You can send %1$s — %2$s BTC</b>.<br/> - <i><b>SideShift.ai</b> està oferint una tasa de canvi de <b>%3$s BTC</b> <u>en aquest moment</u></i>. - ]]></string> - <string name="info_send_xmrto_zeroconf"><![CDATA[ - <i>Quantitats fins a <b>%1$s BTC</b> seran enviats <u>a l\'instant</u>!</i> + <b>You can send %1$s — %2$s %4$s</b>.<br/> + <i><b>SideShift.ai</b> està oferint una tasa de canvi de <b>%3$s %4$s/XMR</b> <u>en aquest moment</u></i>. ]]></string> - <string name="send_available_btc">Balanç: %2$s BTC (%1$s XMR)</string> + <string name="send_available_btc">Balanç: %2$s %3$s (%1$s XMR)</string> <string name="info_paymentid_integrated">✔ ID de pagment integrat</string> <string name="info_prepare_tx">Preparant la seva transacció</string> @@ -75,13 +72,13 @@ <string name="text_noretry_monero">Vatua l\'olla! Sembla ser que estem encallats!</string> <string name="text_noretry">Ups, sembla que SideShift.ai no està disponible ara mateix!</string> - <string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string> - <string name="text_send_btc_rate">(Canvi: %1$s BTC/XMR)</string> + <string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string> + <string name="text_send_btc_rate">(Canvi: %1$s %2$s/XMR)</string> <string name="label_send_btc_xmrto_info">Visita SideShift.ai per suport i seguiment</string> <string name="label_send_btc_xmrto_key_lb">Clau secreta\nSideShift.ai</string> <string name="label_send_btc_xmrto_key">Clau secreta SideShift.ai</string> - <string name="label_send_btc_address">Adreça BTC de destí</string> + <string name="label_send_btc_address">Adreça %1$s de destí</string> <string name="label_send_btc_amount">Quantitat</string> <string name="label_send_txid">ID de transacció</string> @@ -251,11 +248,9 @@ <string name="tx_id">ID de transacció</string> <string name="tx_key">Clau de transacció</string> <string name="tx_destination">Destí</string> - <string name="tx_destination_btc">Destí\n(BTC)</string> <string name="tx_paymentId">ID de pagament</string> <string name="tx_blockheight">Bloc</string> <string name="tx_amount">Quantitat</string> - <string name="tx_amount_btc">Quantitat\n(BTC)</string> <string name="tx_fee">Comissió</string> <string name="tx_transfers">Transferències</string> <string name="tx_notes">Notes</string> @@ -354,11 +349,6 @@ <string name="send_address_hint">Receptor</string> - <string name="xmrto_error_001">SideShift.ai fora de línia - intenti-ho més tard</string> - <string name="xmrto_error_004">Quantitat de BTC fora dels límits</string> - <string name="xmrto_error_010">URL de pagament no vàlida o obsoleta</string> - <string name="xmrto_error_012">Massa peticions</string> - <string name="street_sweep_amount">TOT!</string> <string name="menu_ledger_seed">Convertir la llavor del Ledger</string> @@ -381,8 +371,8 @@ <string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string> <string name="onboarding_seed_title">Keep your seed safe</string> <string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string> - <string name="onboarding_xmrto_title">Send Bitcoin</string> - <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string> + <string name="onboarding_xmrto_title">Send Crypto</string> + <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string> <string name="onboarding_nodes_title">Nodes, your way</string> <string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string> <string name="onboarding_fpsend_title">Send with fingerprint</string> @@ -406,4 +396,18 @@ <string name="shift_noquote">Cannot get quote</string> <string name="shift_checkamount">Check amount and try again</string> + + <string name="info_xmrto_ambiguous"><![CDATA[ + <b>Ambiguous address.</b><br/> + <i>Please select the type above.</i> + ]]></string> + + <string name="info_xmrto_help"><![CDATA[ + <b>Please enter or scan a %1$s address.</b><br/> + <i>You'll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i> + ]]></string> + + <string name="info_xmrto_help_xmr"><![CDATA[ + <b>Please enter or scan a Monero address.</b> + ]]></string> </resources> diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index b73a8454..94d5ee5f 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -35,30 +35,26 @@ <string name="info_ledger_enabled">Ledger aktiviert – Tippe für mehr Infos.</string> <string name="info_xmrto"><![CDATA[ - <b>Du hast eine BTC-Adresse eingegeben.</b><br/> - <i>Du wirst XMR versenden und der Empfänger durch den <b>SideShift.ai</b> Service BTC erhalten.</i> + <b>Du hast eine %1$s-Adresse eingegeben.</b><br/> + <i>Du wirst XMR versenden und der Empfänger durch den <b>SideShift.ai</b> Service %1$s erhalten.</i> ]]></string> <string name="info_send_xmrto_success_order_label">SideShift.ai-Auftrag</string> - <string name="info_send_xmrto_success_btc">%1$s BTC</string> - + <string name="info_send_xmrto_success_btc">%1$s %2$s</string> <string name="info_send_xmrto_paid">Bestätigung ausstehend</string> <string name="info_send_xmrto_unpaid">Bezahlung ausstehend</string> <string name="info_send_xmrto_error">SideShift.ai-Fehler (%1$s)</string> - <string name="info_send_xmrto_sent">BTC gesendet!</string> + <string name="info_send_xmrto_sent">%1$s gesendet!</string> <string name="info_send_xmrto_query">Frage ab …</string> <string name="info_send_xmrto_parms"><![CDATA[ - <b>Du kannst %1$s — %2$s BTC senden</b>.<br/> - <i><b>SideShift.ai</b> gibt dir <u>aktuell</u> einen Wechselkurs von <b>%3$s BTC</b></i>. - ]]></string> - <string name="info_send_xmrto_zeroconf"><![CDATA[ - <i>Beträge bis zu <b>%1$s BTC</b> werden <u>sofort</u> versendet!</i> + <b>Du kannst %1$s — %2$s %4$s senden</b>.<br/> + <i><b>SideShift.ai</b> gibt dir <u>aktuell</u> einen Wechselkurs von <b>%3$s %4$s/XMR</b></i>. ]]></string> - <string name="send_available_btc">Guthaben: %2$s BTC (%1$s XMR)</string> + <string name="send_available_btc">Guthaben: %2$s %3$s (%1$s XMR)</string> <string name="info_paymentid_integrated">✔ Zahlungs-ID integriert</string> <string name="info_prepare_tx">Bereite deine Transaktion vor</string> @@ -76,13 +72,13 @@ <string name="text_noretry_monero">Jetzt hängen wir hier fest!</string> <string name="text_noretry">Oh oh – SideShift.ai scheint im Moment nicht verfügbar zu sein!</string> - <string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string> - <string name="text_send_btc_rate">(Kurs: %1$s BTC/XMR)</string> + <string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string> + <string name="text_send_btc_rate">(Kurs: %1$s %2$s/XMR)</string> <string name="label_send_btc_xmrto_info">Besuche SideShift.ai für Support & Nachverfolgung</string> <string name="label_send_btc_xmrto_key_lb">Geheimer Schlüssel\nSideShift.ai</string> <string name="label_send_btc_xmrto_key">SideShift.ai – Geheimer Schlüssel</string> - <string name="label_send_btc_address">BTC-Zieladresse</string> + <string name="label_send_btc_address">%1$s-Zieladresse</string> <string name="label_send_btc_amount">Betrag</string> <string name="label_send_txid">Transaktions-ID</string> @@ -246,11 +242,9 @@ <string name="tx_id">Transaktions-ID</string> <string name="tx_key">Transaktionsschlüssel</string> <string name="tx_destination">Ziel</string> - <string name="tx_destination_btc">Ziel\n(BTC)</string> <string name="tx_paymentId">Zahlungs-ID</string> <string name="tx_blockheight">Block</string> <string name="tx_amount">Betrag</string> - <string name="tx_amount_btc">Betrag\n(BTC)</string> <string name="tx_fee">Gebühr</string> <string name="tx_transfers">Transfers</string> <string name="tx_notes">Notizen</string> @@ -357,11 +351,6 @@ <string name="send_address_hint">Empfänger</string> - <string name="xmrto_error_001">SideShift.ai nicht erreichbar – versuche es später nochmal</string> - <string name="xmrto_error_004">BTC-Betrag außerhalb des gültigen Bereiches</string> - <string name="xmrto_error_010">Ungültige oder veraltete Zahlungs-URL</string> - <string name="xmrto_error_012">Zu viele Anfragen</string> - <string name="street_sweep_amount">ALLES!</string> <!-- as in: "everything in the account" = "all the money" --> <string name="menu_ledger_seed">Konvertiere Ledger-Seed</string> @@ -384,8 +373,8 @@ <string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string> <string name="onboarding_seed_title">Keep your seed safe</string> <string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string> - <string name="onboarding_xmrto_title">Send Bitcoin</string> - <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string> + <string name="onboarding_xmrto_title">Send Crypto</string> + <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string> <string name="onboarding_nodes_title">Nodes, your way</string> <string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string> <string name="onboarding_fpsend_title">Send with fingerprint</string> @@ -409,4 +398,18 @@ <string name="shift_noquote">Cannot get quote</string> <string name="shift_checkamount">Check amount and try again</string> + + <string name="info_xmrto_ambiguous"><![CDATA[ + <b>Ambiguous address.</b><br/> + <i>Please select the type above.</i> + ]]></string> + + <string name="info_xmrto_help"><![CDATA[ + <b>Please enter or scan a %1$s address.</b><br/> + <i>You'll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i> + ]]></string> + + <string name="info_xmrto_help_xmr"><![CDATA[ + <b>Please enter or scan a Monero address.</b> + ]]></string> </resources> diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 675f8415..f2c4815a 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -34,29 +34,26 @@ <string name="info_ledger_enabled">Ledger ενεργοποιήθηκε, πάτα για περισσότερες πληροφορείες.</string> <string name="info_xmrto"><![CDATA[ - <b>Έβαλες μια διεύθυνση bitcoin.</b><br/> - <i>Θα στείλεις XMR και ο παραλήπτης θα πάρει BTC μέσο της υπηρεσίας <b>SideShift.ai</b>.</i> + <b>Έβαλες μια διεύθυνση %1$s.</b><br/> + <i>Θα στείλεις XMR και ο παραλήπτης θα πάρει %1$s μέσο της υπηρεσίας <b>SideShift.ai</b>.</i> ]]></string> <string name="info_send_xmrto_success_order_label">Εντολή SideShift.ai</string> - <string name="info_send_xmrto_success_btc">%1$s BTC</string> + <string name="info_send_xmrto_success_btc">%1$s %2$s</string> <string name="info_send_xmrto_paid">Επιβεβαίωση Εκκρεμεί</string> <string name="info_send_xmrto_unpaid">Πληρωμή σε εκκρεμότητα</string> <string name="info_send_xmrto_error">SideShift.ai Σφάλμα (%1$s)</string> - <string name="info_send_xmrto_sent">BTC Αποστάλθηκαν!</string> + <string name="info_send_xmrto_sent">%1$s Αποστάλθηκαν!</string> <string name="info_send_xmrto_query">Αίτηση …</string> <string name="info_send_xmrto_parms"><![CDATA[ - <b>Μπορείς να στείλεις %1$s — %2$s BTC</b>.<br/> - <i>Το <b>SideShift.ai</b> σου δίνει ισοτιμία ανταλλαγής <b>%3$s BTC</b> <u>αυτή τη στιγμή</u></i>. - ]]></string> - <string name="info_send_xmrto_zeroconf"><![CDATA[ - <i>Ποσά μέχρι <b>%1$s BTC</b> θα σταλούν <u>άμεσα</u>!</i> + <b>Μπορείς να στείλεις %1$s — %2$s %4$s</b>.<br/> + <i>Το <b>SideShift.ai</b> σου δίνει ισοτιμία ανταλλαγής <b>%3$s %4$s/XMR</b> <u>αυτή τη στιγμή</u></i>. ]]></string> - <string name="send_available_btc">Σύνολο: %2$s BTC (%1$s XMR)</string> + <string name="send_available_btc">Σύνολο: %2$s %3$s (%1$s XMR)</string> <string name="info_paymentid_integrated">✔ ID πληρωμής ενσωματωμένο</string> <string name="info_prepare_tx">Προετοιμασία της συναλλαγής σου</string> @@ -74,13 +71,13 @@ <string name="text_noretry_monero">Τώρα έχουμε κολλήσει εδώ!</string> <string name="text_noretry">Ωχ,το SideShift.ai φαίνεται να μην ειναι προσωρινά διαθέσιμο!</string> - <string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string> - <string name="text_send_btc_rate">(Rate: %1$s BTC/XMR)</string> + <string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string> + <string name="text_send_btc_rate">(Rate: %1$s %2$s/XMR)</string> <string name="label_send_btc_xmrto_info">Επίσκεψη στο SideShift.ai για υποστήριξη & με εντοπισμό συναλλαγής</string> <string name="label_send_btc_xmrto_key_lb">Μυστικό Κλειδί\nSideShift.ai</string> <string name="label_send_btc_xmrto_key">SideShift.ai Μυστικό Κλειδί</string> - <string name="label_send_btc_address">BTC Διεύθυνση Παραλήπτη</string> + <string name="label_send_btc_address">%1$s Διεύθυνση Παραλήπτη</string> <string name="label_send_btc_amount">Ποσό</string> <string name="label_send_txid">ID Συναλλαγής</string> @@ -220,11 +217,9 @@ <string name="tx_id">ID Συναλλαγής(TX ID)</string> <string name="tx_key">Κλειδί συναλλαγής(TX Key)</string> <string name="tx_destination">Προορισμός</string> - <string name="tx_destination_btc">Προορισμός\n(BTC)</string> <string name="tx_paymentId">ID Πληρωμής(Payment ID)</string> <string name="tx_blockheight">Μπλοκ</string> <string name="tx_amount">Ποσό</string> - <string name="tx_amount_btc">Ποσό\n(BTC)</string> <string name="tx_fee">Κόμιστρο</string> <string name="tx_transfers">Συναλλαγές</string> <string name="tx_notes">Σημειώσεις</string> @@ -356,11 +351,6 @@ <string name="send_address_hint">Receiver</string> - <string name="xmrto_error_001">SideShift.ai offline - try again later</string> - <string name="xmrto_error_004">BTC amount out of bounds</string> - <string name="xmrto_error_010">Invalid or outdated Payment URL</string> - <string name="xmrto_error_012">Too many requests</string> - <string name="street_sweep_amount">EVERYTHING!</string> <!-- as in: "everything in the account" = "all the money" --> <string name="menu_ledger_seed">Convert Ledger Seed</string> @@ -383,8 +373,8 @@ <string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string> <string name="onboarding_seed_title">Keep your seed safe</string> <string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string> - <string name="onboarding_xmrto_title">Send Bitcoin</string> - <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string> + <string name="onboarding_xmrto_title">Send Crypto</string> + <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string> <string name="onboarding_nodes_title">Nodes, your way</string> <string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string> <string name="onboarding_fpsend_title">Send with fingerprint</string> @@ -408,4 +398,18 @@ <string name="shift_noquote">Cannot get quote</string> <string name="shift_checkamount">Check amount and try again</string> + + <string name="info_xmrto_ambiguous"><![CDATA[ + <b>Ambiguous address.</b><br/> + <i>Please select the type above.</i> + ]]></string> + + <string name="info_xmrto_help"><![CDATA[ + <b>Please enter or scan a %1$s address.</b><br/> + <i>You'll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i> + ]]></string> + + <string name="info_xmrto_help_xmr"><![CDATA[ + <b>Please enter or scan a Monero address.</b> + ]]></string> </resources> diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index 6bafaf02..a112287c 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -35,29 +35,26 @@ <string name="info_ledger_enabled">Ledger permesita, frapetu por detaloj.</string> <string name="info_xmrto"><![CDATA[ - <b>Vi entajpis Bitmono-adreson.</b><br/> - <i>Vi sendos XMR-on, kaj per la<b>SideShift.ai</b>-servo, la ricevanto havos BTC-on.</i> + <b>Vi entajpis %1$s-adreson.</b><br/> + <i>Vi sendos XMR-on, kaj per la<b>SideShift.ai</b>-servo, la ricevanto havos %1$s-on.</i> ]]></string> <string name="info_send_xmrto_success_order_label">mendo al SideShift.ai</string> - <string name="info_send_xmrto_success_btc">%1$s BTC</string> + <string name="info_send_xmrto_success_btc">%1$s %2$s</string> <string name="info_send_xmrto_paid">Konfirmo okazonta</string> <string name="info_send_xmrto_unpaid">Pago okazonta</string> <string name="info_send_xmrto_error">SideShift.ai eraro (%1$s)</string> - <string name="info_send_xmrto_sent">BTC sendiĝis!</string> + <string name="info_send_xmrto_sent">%1$s sendiĝis!</string> <string name="info_send_xmrto_query">Informpetante …</string> <string name="info_send_xmrto_parms"><![CDATA[ - <b>Vi povas sendi %1$s — %2$s BTC</b>.<br/> - <i><b>SideShift.ai</b> proponas al vi tiun kurzon: <b>%3$s BTC</b> <u>nun</u></i>. - ]]></string> - <string name="info_send_xmrto_zeroconf"><![CDATA[ - <i>Kvantoj ĝis <b>%1$s BTC</b> sendiĝos <u>senatende</u>!</i> + <b>Vi povas sendi %1$s — %2$s %4$s</b>.<br/> + <i><b>SideShift.ai</b> proponas al vi tiun kurzon: <b>%3$s %4$s/XMR</b> <u>nun</u></i>. ]]></string> - <string name="send_available_btc">Saldo: %2$s BTC (%1$s XMR)</string> + <string name="send_available_btc">Saldo: %2$s %3$s (%1$s XMR)</string> <string name="info_paymentid_integrated">✔ Paga-ID integriĝis</string> <string name="info_prepare_tx">Preparante vian transakcion</string> @@ -75,13 +72,13 @@ <string name="text_noretry_monero">Ni blokiĝis ĉi tie!</string> <string name="text_noretry">Uh-oh, ŝajne SideShift.ai ne disponas momente!</string> - <string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string> - <string name="text_send_btc_rate">(kurzo: %1$s BTC/XMR)</string> + <string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string> + <string name="text_send_btc_rate">(kurzo: %1$s %2$s/XMR)</string> <string name="label_send_btc_xmrto_info">Vizitu SideShift.ai por helpo kaj sekvado</string> <string name="label_send_btc_xmrto_key_lb">Sekreta ŝlosilo\nSideShift.ai</string> <string name="label_send_btc_xmrto_key">SideShift.ai sekreta ŝlosilo</string> - <string name="label_send_btc_address">Ricevanta BTC-adreso</string> + <string name="label_send_btc_address">Ricevanta %1$s-adreso</string> <string name="label_send_btc_amount">Kvanto</string> <string name="label_send_txid">Transakcia ID</string> @@ -251,11 +248,9 @@ <string name="tx_id">TX ID</string> <string name="tx_key">TX Ŝlosilo</string> <string name="tx_destination">Destino</string> - <string name="tx_destination_btc">Destino\n(BTC)</string> <string name="tx_paymentId">Paga-ID</string> <string name="tx_blockheight">Bloko</string> <string name="tx_amount">Kvanto</string> - <string name="tx_amount_btc">Kvanto\n(BTC)</string> <string name="tx_fee">Kosto</string> <string name="tx_transfers">Transigoj</string> <string name="tx_notes">Notoj</string> @@ -356,11 +351,6 @@ <string name="send_address_hint">Ricevanto</string> - <string name="xmrto_error_001">SideShift.ai ne enretas - provu pli poste</string> - <string name="xmrto_error_004">BTC-kvanto tro grandas</string> - <string name="xmrto_error_010">La paga URL malvalidas aŭ ne ĝisdatiĝis</string> - <string name="xmrto_error_012">Tro da mendoj</string> - <string name="street_sweep_amount">ĈIO!</string> <string name="menu_ledger_seed">Convert Ledger Seed</string> @@ -383,8 +373,8 @@ <string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string> <string name="onboarding_seed_title">Keep your seed safe</string> <string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string> - <string name="onboarding_xmrto_title">Send Bitcoin</string> - <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string> + <string name="onboarding_xmrto_title">Send Crypto</string> + <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string> <string name="onboarding_nodes_title">Nodes, your way</string> <string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string> <string name="onboarding_fpsend_title">Send with fingerprint</string> @@ -408,4 +398,18 @@ <string name="shift_noquote">Cannot get quote</string> <string name="shift_checkamount">Check amount and try again</string> + + <string name="info_xmrto_ambiguous"><![CDATA[ + <b>Ambiguous address.</b><br/> + <i>Please select the type above.</i> + ]]></string> + + <string name="info_xmrto_help"><![CDATA[ + <b>Please enter or scan a %1$s address.</b><br/> + <i>You'll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i> + ]]></string> + + <string name="info_xmrto_help_xmr"><![CDATA[ + <b>Please enter or scan a Monero address.</b> + ]]></string> </resources> diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 2b84f3d4..99974d0a 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -218,23 +218,20 @@ <string name="fab_restore_key">Restaurar monedero con claves privadas</string> <string name="fab_restore_seed">Restaurar monedero con semilla de 25 palabras</string> <string name="info_xmrto"><![CDATA[ - <b>Ingresaste una dirección Bitcoin</b><br/> - <i>Vas a enviar XMR y el destinatario recibirá BTC usando el servicio <b>SideShift.ai</b>.</i> + <b>Ingresaste una dirección %1$s</b><br/> + <i>Vas a enviar XMR y el destinatario recibirá %1$s usando el servicio <b>SideShift.ai</b>.</i> ]]></string> - <string name="info_send_xmrto_success_btc">%1$s BTC</string> + <string name="info_send_xmrto_success_btc">%1$s %2$s</string> <string name="info_send_xmrto_paid">Confirmación pendiente</string> <string name="info_send_xmrto_unpaid">Pago pendiente</string> <string name="info_send_xmrto_error">Error de SideShift.ai (%1$s)</string> - <string name="info_send_xmrto_sent">BTC Enviados!</string> + <string name="info_send_xmrto_sent">%1$s Enviados!</string> <string name="info_send_xmrto_query">Consultando …</string> <string name="info_send_xmrto_parms"><![CDATA[ - <b>Puedes enviar %1$s — %2$s BTC</b>.<br/> - <i><b>SideShift.ai</b> está ofreciendo una tasa de cambio de <b>%3$s BTC</b> <u>en este momento</u></i>. + <b>Puedes enviar %1$s — %2$s %4$s</b>.<br/> + <i><b>SideShift.ai</b> está ofreciendo una tasa de cambio de <b>%3$s %4$s/XMR</b> <u>en este momento</u></i>. ]]></string> - <string name="info_send_xmrto_zeroconf"><![CDATA[ - <i>Montos hasta <b>%1$s BTC</b> serán enviados <u>en el momento</u>!</i> - ]]></string> - <string name="send_available_btc">Saldo: %2$s BTC (%1$s XMR)</string> + <string name="send_available_btc">Saldo: %2$s %3$s (%1$s XMR)</string> <string name="label_send_progress_xmrto_create">Creando orden SideShift.ai</string> <string name="label_send_progress_xmrto_query">Consultando orden SideShift.ai</string> <string name="label_send_progress_create_tx">Preparando transacción Monero</string> @@ -244,12 +241,12 @@ <string name="text_retry">Toca para reintentar</string> <string name="text_noretry_monero">Parece que estamos atascados!</string> <string name="text_noretry">Oh-oh, parece que SideShift.ai no está disponible ahora!</string> - <string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string> - <string name="text_send_btc_rate">(Cambio: %1$s BTC/XMR)</string> + <string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string> + <string name="text_send_btc_rate">(Cambio: %1$s %2$s/XMR)</string> <string name="label_send_btc_xmrto_info">Visita https://sideshift.ai para soporte y rastreo</string> <string name="label_send_btc_xmrto_key_lb">Clave secreta\nSideShift.ai</string> <string name="label_send_btc_xmrto_key">Clave secreta SideShift.ai</string> - <string name="label_send_btc_address">Dirección BTC destino</string> + <string name="label_send_btc_address">Dirección %1$s destino</string> <string name="label_send_btc_amount">Monto</string> <string name="send_xmrto_timeout">Oye, esperaste demasiado!</string> <string name="label_copy_xmrtokey">Clave</string> @@ -261,8 +258,6 @@ <string name="send_total_btc_label">Total (XMR)</string> <string name="send_amount">%1$s XMR</string> <string name="send_fee">+%1$s Comisión</string> - <string name="tx_destination_btc">Destino\n(BTC)</string> - <string name="tx_amount_btc">Monto\n(BTC)</string> <string name="about_whoami">Soy monerujo</string> <string name="info_send_xmrto_success_order_label">Orden SideShift.ai</string> @@ -347,11 +342,6 @@ <!-- please verify this means "Receiver" or "Recipient" as in "Receiver in the transaction" --> <string name="send_address_hint">Receptor</string> - <string name="xmrto_error_001">SideShift.ai offline - try again later</string> - <string name="xmrto_error_004">BTC amount out of bounds</string> - <string name="xmrto_error_010">Invalid or outdated Payment URL</string> - <string name="xmrto_error_012">Too many requests</string> - <string name="street_sweep_amount">EVERYTHING!</string> <!-- as in: "everything in the account" = "all the money" --> <string name="menu_ledger_seed">Convert Ledger Seed</string> @@ -374,8 +364,8 @@ <string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string> <string name="onboarding_seed_title">Keep your seed safe</string> <string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string> - <string name="onboarding_xmrto_title">Send Bitcoin</string> - <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string> + <string name="onboarding_xmrto_title">Send Crypto</string> + <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string> <string name="onboarding_nodes_title">Nodes, your way</string> <string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string> <string name="onboarding_fpsend_title">Send with fingerprint</string> @@ -399,4 +389,18 @@ <string name="shift_noquote">Cannot get quote</string> <string name="shift_checkamount">Check amount and try again</string> + + <string name="info_xmrto_ambiguous"><![CDATA[ + <b>Ambiguous address.</b><br/> + <i>Please select the type above.</i> + ]]></string> + + <string name="info_xmrto_help"><![CDATA[ + <b>Please enter or scan a %1$s address.</b><br/> + <i>You'll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i> + ]]></string> + + <string name="info_xmrto_help_xmr"><![CDATA[ + <b>Please enter or scan a Monero address.</b> + ]]></string> </resources> diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 8b10e14e..ad8e6cc1 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -35,29 +35,26 @@ <string name="info_ledger_enabled">Ledger\'i tugi sisse lülitatud, puuduta lisainfo saamiseks.</string> <string name="info_xmrto"><![CDATA[ - <b>Sa sisestasid Bitcoini aadressi.</b><br/> - <i>See tähendab, et sa saadad Monerosid ning kohale jõuavad Bitcoinid kasutades SideShift.ai teenust.</i> + <b>Sa sisestasid %1$s aadressi.</b><br/> + <i>See tähendab, et sa saadad Monerosid ning kohale jõuavad %1$s kasutades SideShift.ai teenust.</i> ]]></string> <string name="info_send_xmrto_success_order_label">SideShift.ai tellimus</string> - <string name="info_send_xmrto_success_btc">%1$s BTC</string> + <string name="info_send_xmrto_success_btc">%1$s %2$s</string> <string name="info_send_xmrto_paid">Ootan kinnitust</string> <string name="info_send_xmrto_unpaid">Ootan makset</string> <string name="info_send_xmrto_error">SideShift.ai viga (%1$s)</string> - <string name="info_send_xmrto_sent">BTC saadetud!</string> + <string name="info_send_xmrto_sent">%1$s saadetud!</string> <string name="info_send_xmrto_query">Küsin …</string> <string name="info_send_xmrto_parms"><![CDATA[ - <b>Sa saad saata %1$s — %2$s BTC</b>.<br/> - <i><b>SideShift.ai</b> annab <u>hetkel</u> vahetuskursiks <b>%3$s BTC</b></i>. - ]]></string> - <string name="info_send_xmrto_zeroconf"><![CDATA[ - <i>Kuni <b>%1$s BTC</b> saadetakse <u>viivitamatult</u>!</i> + <b>Sa saad saata %1$s — %2$s %4$s</b>.<br/> + <i><b>SideShift.ai</b> annab <u>hetkel</u> vahetuskursiks <b>%3$s %4$s/XMR</b></i>. ]]></string> - <string name="send_available_btc">Kontojääk: %2$s BTC (%1$s XMR)</string> + <string name="send_available_btc">Kontojääk: %2$s %3$s (%1$s XMR)</string> <string name="info_paymentid_integrated">✔ Makse ID integreeritud</string> <string name="info_prepare_tx">Valmistan ülekannet ette</string> @@ -75,13 +72,13 @@ <string name="text_noretry_monero">Nüüd jõudsime küll tupikusse!</string> <string name="text_noretry">Oh ei, SideShift.ai ei ole hetkel saadaval!</string> - <string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string> - <string name="text_send_btc_rate">(Kurss: %1$s BTC/XMR)</string> + <string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string> + <string name="text_send_btc_rate">(Kurss: %1$s %2$s/XMR)</string> <string name="label_send_btc_xmrto_info">Külasta SideShift.ai lisainfo saamiseks & jälgin</string> <string name="label_send_btc_xmrto_key_lb">Privaatvõti\nSideShift.ai</string> <string name="label_send_btc_xmrto_key">SideShift.ai privaatvõti</string> - <string name="label_send_btc_address">Sihtkoha Bitcoini aadress</string> + <string name="label_send_btc_address">Sihtkoha %1$s aadress</string> <string name="label_send_btc_amount">Kogus</string> <string name="label_send_txid">Ülekande ID</string> @@ -246,11 +243,9 @@ <string name="tx_id">Ülekande ID</string> <string name="tx_key">Ülekande võti</string> <string name="tx_destination">Sihtkoht</string> - <string name="tx_destination_btc">Sihtkoht\n(BTC)</string> <string name="tx_paymentId">Makse ID</string> <string name="tx_blockheight">Plokk</string> <string name="tx_amount">Kogus</string> - <string name="tx_amount_btc">Kogus\n(BTC)</string> <string name="tx_fee">Teenustasu</string> <string name="tx_transfers">Ülekanded</string> <string name="tx_notes">Kommentaarid</string> @@ -354,11 +349,6 @@ <!-- please verify this means "Receiver" or "Recipient" as in "Receiver in the transaction" --> <string name="send_address_hint">Saaja</string> - <string name="xmrto_error_001">SideShift.ai offline - try again later</string> - <string name="xmrto_error_004">BTC amount out of bounds</string> - <string name="xmrto_error_010">Invalid or outdated Payment URL</string> - <string name="xmrto_error_012">Too many requests</string> - <string name="street_sweep_amount">EVERYTHING!</string> <!-- as in: "everything in the account" = "all the money" --> <string name="menu_ledger_seed">Convert Ledger Seed</string> @@ -381,8 +371,8 @@ <string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string> <string name="onboarding_seed_title">Keep your seed safe</string> <string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string> - <string name="onboarding_xmrto_title">Send Bitcoin</string> - <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string> + <string name="onboarding_xmrto_title">Send Crypto</string> + <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string> <string name="onboarding_nodes_title">Nodes, your way</string> <string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string> <string name="onboarding_fpsend_title">Send with fingerprint</string> @@ -406,4 +396,18 @@ <string name="shift_noquote">Cannot get quote</string> <string name="shift_checkamount">Check amount and try again</string> + + <string name="info_xmrto_ambiguous"><![CDATA[ + <b>Ambiguous address.</b><br/> + <i>Please select the type above.</i> + ]]></string> + + <string name="info_xmrto_help"><![CDATA[ + <b>Please enter or scan a %1$s address.</b><br/> + <i>You'll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i> + ]]></string> + + <string name="info_xmrto_help_xmr"><![CDATA[ + <b>Please enter or scan a Monero address.</b> + ]]></string> </resources> diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 41f29981..563431a8 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -35,30 +35,27 @@ <string name="info_ledger_enabled">Ledger activé, tapez pour plus d\'infos.</string> <string name="info_xmrto"><![CDATA[ - <b>Vous avez entré une adresse Bitcoin.</b><br/> - <i>Vous envoyez des XMR et le destinataire recevra des BTC via le service <b>SideShift.ai</b>.</i> + <b>Vous avez entré une adresse %1$s.</b><br/> + <i>Vous envoyez des XMR et le destinataire recevra des %1$s via le service <b>SideShift.ai</b>.</i> ]]></string> <string name="info_send_xmrto_success_order_label">Ordres SideShift.ai</string> - <string name="info_send_xmrto_success_btc">%1$s BTC</string> + <string name="info_send_xmrto_success_btc">%1$s %2$s</string> <string name="info_send_xmrto_paid">En Attente de Confirmation</string> <string name="info_send_xmrto_unpaid">En Attente de Paiement</string> <string name="info_send_xmrto_error">Erreur SideShift.ai (%1$s)</string> - <string name="info_send_xmrto_sent">BTC Envoyé !</string> + <string name="info_send_xmrto_sent">%1$s Envoyé !</string> <string name="info_send_xmrto_query">Interrogation …</string> <string name="info_send_xmrto_parms"><![CDATA[ - <b>Vous pouvez envoyer %1$s — %2$s BTC</b>.<br/> - <i><b>SideShift.ai</b> vous donne un taux de change de <b>%3$s BTC</b> <u>actuellement</u></i>. - ]]></string> - <string name="info_send_xmrto_zeroconf"><![CDATA[ - <i>Les montant n\'excédant pas <b>%1$s BTC</b> seront envoyés <u>immédiatement</u>!</i> + <b>Vous pouvez envoyer %1$s — %2$s %4$s</b>.<br/> + <i><b>SideShift.ai</b> vous donne un taux de change de <b>%3$s %4$s/XMR</b> <u>actuellement</u></i>. ]]></string> - <string name="send_available_btc">Solde : %2$s BTC (%1$s XMR)</string> + <string name="send_available_btc">Solde : %2$s %3$s (%1$s XMR)</string> <string name="info_paymentid_integrated">✔ ID de Paiement intégré</string> <string name="info_prepare_tx">Préparation de votre transaction</string> @@ -76,13 +73,13 @@ <string name="text_noretry_monero">Maintenant on est coincé ici !</string> <string name="text_noretry">Oh-oh, SideShift.ai n\'a pas l\'air disponible pour le moment !</string> - <string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string> - <string name="text_send_btc_rate">(Taux : %1$s BTC/XMR)</string> + <string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string> + <string name="text_send_btc_rate">(Taux : %1$s %2$s/XMR)</string> <string name="label_send_btc_xmrto_info">Visitez SideShift.ai pour l\'assistance & le suivi</string> <string name="label_send_btc_xmrto_key_lb">Clef Secrète\nSideShift.ai</string> <string name="label_send_btc_xmrto_key">Clef Secrète SideShift.ai</string> - <string name="label_send_btc_address">Adresse BTC Destination</string> + <string name="label_send_btc_address">Adresse %1$s Destination</string> <string name="label_send_btc_amount">Montant</string> <string name="label_send_txid">ID de Transaction</string> @@ -248,11 +245,9 @@ <string name="tx_id">ID TX</string> <string name="tx_key">Clef TX</string> <string name="tx_destination">Destination</string> - <string name="tx_destination_btc">Destination\n(BTC)</string> <string name="tx_paymentId">ID de Paiement</string> <string name="tx_blockheight">Bloc</string> <string name="tx_amount">Montant</string> - <string name="tx_amount_btc">Montant\n(BTC)</string> <string name="tx_fee">Frais</string> <string name="tx_transfers">Transferts</string> <string name="tx_notes">Notes</string> @@ -360,11 +355,6 @@ <!-- please verify this means "Receiver" or "Recipient" as in "Receiver in the transaction" --> <string name="send_address_hint">Destinataire</string> - <string name="xmrto_error_001">SideShift.ai hors ligne - réessayer ultérieurement</string> - <string name="xmrto_error_004">Montant BTC hors limites</string> - <string name="xmrto_error_010">URL de Paiement invalide ou périmée</string> - <string name="xmrto_error_012">Trop de requêtes</string> - <string name="street_sweep_amount">TOTALITÉ!</string> <!-- as in: "everything in the account" = "all the money" --> <string name="menu_ledger_seed">Convertir mnémonique Ledger</string> @@ -387,8 +377,8 @@ <string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string> <string name="onboarding_seed_title">Keep your seed safe</string> <string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string> - <string name="onboarding_xmrto_title">Send Bitcoin</string> - <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string> + <string name="onboarding_xmrto_title">Send Crypto</string> + <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string> <string name="onboarding_nodes_title">Nodes, your way</string> <string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string> <string name="onboarding_fpsend_title">Send with fingerprint</string> @@ -412,4 +402,18 @@ <string name="shift_noquote">Cannot get quote</string> <string name="shift_checkamount">Check amount and try again</string> + + <string name="info_xmrto_ambiguous"><![CDATA[ + <b>Ambiguous address.</b><br/> + <i>Please select the type above.</i> + ]]></string> + + <string name="info_xmrto_help"><![CDATA[ + <b>Please enter or scan a %1$s address.</b><br/> + <i>You'll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i> + ]]></string> + + <string name="info_xmrto_help_xmr"><![CDATA[ + <b>Please enter or scan a Monero address.</b> + ]]></string> </resources> diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 5892dde8..429404b9 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -35,29 +35,26 @@ <string name="info_ledger_enabled">Ledger engedélyezve, koppints ide a részletekért</string> <string name="info_xmrto"><![CDATA[ - <b>Bitcoin-címet adtál meg.</b><br/> - <i>XMR-t fogsz küldeni, a fogadó pedig BTC-t fog kapni az <b>SideShift.ai</b> szolgáltatásán keresztül.</i> + <b>%1$s-címet adtál meg.</b><br/> + <i>XMR-t fogsz küldeni, a fogadó pedig %1$s-t fog kapni az <b>SideShift.ai</b> szolgáltatásán keresztül.</i> ]]></string> <string name="info_send_xmrto_success_order_label">SideShift.ai megrendelés</string> - <string name="info_send_xmrto_success_btc">%1$s BTC</string> + <string name="info_send_xmrto_success_btc">%1$s %2$s</string> <string name="info_send_xmrto_paid">Megerősítés folyamatban</string> <string name="info_send_xmrto_unpaid">Kifizetés folyamatban</string> <string name="info_send_xmrto_error">SideShift.ai-hiba (%1$s)</string> - <string name="info_send_xmrto_sent">BTC elküldve!</string> + <string name="info_send_xmrto_sent">%1$s elküldve!</string> <string name="info_send_xmrto_query">Lekérdezés…</string> <string name="info_send_xmrto_parms"><![CDATA[ - <b>Elküldhetsz: %1$s — %2$s BTC</b>.<br/> - <i>Az <b>SideShift.ai</b> <u>aktuális</u> árfolyama: <b>%3$s BTC</b></i>. - ]]></string> - <string name="info_send_xmrto_zeroconf"><![CDATA[ - <i>A legfeljebb <b>%1$s BTC</b> nagyságú összegek <u>azonnal</u> elküldésre kerülnek!</i> + <b>Elküldhetsz: %1$s — %2$s %4$s</b>.<br/> + <i>Az <b>SideShift.ai</b> <u>aktuális</u> árfolyama: <b>%3$s %4$s/XMR</b></i>. ]]></string> - <string name="send_available_btc">Egyenleg: %2$s BTC (%1$s XMR)</string> + <string name="send_available_btc">Egyenleg: %2$s %3$s (%1$s XMR)</string> <string name="info_paymentid_integrated">✔ Fizetési azonosító integrálva</string> <string name="info_prepare_tx">Tranzakció előkészítése</string> @@ -75,13 +72,13 @@ <string name="text_noretry_monero">Itt most elakadtunk!</string> <string name="text_noretry">Ajjaj! Úgy néz ki, az SideShift.ai most nem elérhető!</string> - <string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string> - <string name="text_send_btc_rate">(Arány: %1$s BTC/XMR)</string> + <string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string> + <string name="text_send_btc_rate">(Arány: %1$s %2$s/XMR)</string> <string name="label_send_btc_xmrto_info">Segítségért és nyomonkövetésért látogass el az SideShift.ai weboldalra</string> <string name="label_send_btc_xmrto_key_lb">Titkos kulcs\nSideShift.ai</string> <string name="label_send_btc_xmrto_key">SideShift.ai titkos kulcs</string> - <string name="label_send_btc_address">Kedvezményezett BTC-címe</string> + <string name="label_send_btc_address">Kedvezményezett %1$s-címe</string> <string name="label_send_btc_amount">Mennyiség</string> <string name="label_send_txid">Tranzakcióazonosító</string> @@ -245,11 +242,9 @@ <string name="tx_id">Tranzakcióazonosító</string> <string name="tx_key">Tranzkaciós kulcs</string> <string name="tx_destination">Cél</string> - <string name="tx_destination_btc">Cél\n(BTC)</string> <string name="tx_paymentId">Fizetési azonosító</string> <string name="tx_blockheight">Blokk</string> <string name="tx_amount">Mennyiség</string> - <string name="tx_amount_btc">Mennyiség\n(BTC)</string> <string name="tx_fee">Díj</string> <string name="tx_transfers">Transzferek</string> <string name="tx_notes">Közlemény</string> @@ -358,11 +353,6 @@ <string name="send_address_hint">Receiver</string> - <string name="xmrto_error_001">SideShift.ai offline - try again later</string> - <string name="xmrto_error_004">BTC amount out of bounds</string> - <string name="xmrto_error_010">Invalid or outdated Payment URL</string> - <string name="xmrto_error_012">Too many requests</string> - <string name="street_sweep_amount">EVERYTHING!</string> <!-- as in: "everything in the account" = "all the money" --> <string name="menu_ledger_seed">Convert Ledger Seed</string> @@ -385,8 +375,8 @@ <string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string> <string name="onboarding_seed_title">Keep your seed safe</string> <string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string> - <string name="onboarding_xmrto_title">Send Bitcoin</string> - <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string> + <string name="onboarding_xmrto_title">Send Crypto</string> + <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string> <string name="onboarding_nodes_title">Nodes, your way</string> <string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string> <string name="onboarding_fpsend_title">Send with fingerprint</string> @@ -410,4 +400,18 @@ <string name="shift_noquote">Cannot get quote</string> <string name="shift_checkamount">Check amount and try again</string> + + <string name="info_xmrto_ambiguous"><![CDATA[ + <b>Ambiguous address.</b><br/> + <i>Please select the type above.</i> + ]]></string> + + <string name="info_xmrto_help"><![CDATA[ + <b>Please enter or scan a %1$s address.</b><br/> + <i>You'll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i> + ]]></string> + + <string name="info_xmrto_help_xmr"><![CDATA[ + <b>Please enter or scan a Monero address.</b> + ]]></string> </resources> diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index b79b5003..92d9060b 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -35,30 +35,27 @@ <string name="info_ledger_enabled">Ledger abilitato, tocca per maggiori informazioni.</string> <string name="info_xmrto"><![CDATA[ - <b>Hai inserito un indirizzo Bitcoin.</b><br/> - <i>Invierai XMR e il destinatario riceverà BTC tramite il servizio <b>SideShift.ai</b>.</i> + <b>Hai inserito un indirizzo %1$s.</b><br/> + <i>Invierai XMR e il destinatario riceverà %1$s tramite il servizio <b>SideShift.ai</b>.</i> ]]></string> <string name="info_send_xmrto_success_order_label">Ordine SideShift.ai</string> - <string name="info_send_xmrto_success_btc">%1$s BTC</string> + <string name="info_send_xmrto_success_btc">%1$s %2$s</string> <string name="info_send_xmrto_paid">In attesa di conferma</string> <string name="info_send_xmrto_unpaid">In attesa del pagamento</string> <string name="info_send_xmrto_error">Errore SideShift.ai (%1$s)</string> - <string name="info_send_xmrto_sent">BTC Inviati!</string> + <string name="info_send_xmrto_sent">%1$s Inviati!</string> <string name="info_send_xmrto_query">Richiedendo …</string> <string name="info_send_xmrto_parms"><![CDATA[ - <b>Puoi inviare %1$s — %2$s BTC</b>.<br/> - <i><b>SideShift.ai</b> ti sta <u>attualmente</u> concedendo un tasso di cambio di <b>%3$s BTC</b></i>. - ]]></string> - <string name="info_send_xmrto_zeroconf"><![CDATA[ - <i>Ammontare fino a <b>%1$s BTC</b> inviati <u>istantaneamente</u>!</i> + <b>Puoi inviare %1$s — %2$s %4$s</b>.<br/> + <i><b>SideShift.ai</b> ti sta <u>attualmente</u> concedendo un tasso di cambio di <b>%3$s %4$s/XMR</b></i>. ]]></string> - <string name="send_available_btc">Saldo: %2$s BTC (%1$s XMR)</string> + <string name="send_available_btc">Saldo: %2$s %3$s (%1$s XMR)</string> <string name="info_paymentid_integrated">✔ ID pagamento integrato</string> <string name="info_prepare_tx">Preparando la tua transazione</string> @@ -76,13 +73,13 @@ <string name="text_noretry_monero">Ora siamo bloccati qui!!</string> <string name="text_noretry">Oh Oh, SideShift.ai sembra non essere disponibile in questo momento!</string> - <string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string> - <string name="text_send_btc_rate">(Tasso: %1$s BTC/XMR)</string> + <string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string> + <string name="text_send_btc_rate">(Tasso: %1$s %2$s/XMR)</string> <string name="label_send_btc_xmrto_info">Visita SideShift.ai per supporto e tracciamento</string> <string name="label_send_btc_xmrto_key_lb">Chiave segreta\nSideShift.ai</string> <string name="label_send_btc_xmrto_key">Chiave segreta SideShift.ai</string> - <string name="label_send_btc_address">Indirizzo BTC di destinazione</string> + <string name="label_send_btc_address">Indirizzo %1$s di destinazione</string> <string name="label_send_btc_amount">Ammontare</string> <string name="label_send_txid">ID Transazione</string> @@ -247,11 +244,9 @@ <string name="tx_id">ID TX</string> <string name="tx_key">Chiave TX</string> <string name="tx_destination">Destinazione</string> - <string name="tx_destination_btc">Destinazione\n(BTC)</string> <string name="tx_paymentId">ID Pagamento</string> <string name="tx_blockheight">Blocco</string> <string name="tx_amount">Ammontare</string> - <string name="tx_amount_btc">Ammontare\n(BTC)</string> <string name="tx_fee">Commissione</string> <string name="tx_transfers">Trasferimenti</string> <string name="tx_notes">Note</string> @@ -359,11 +354,6 @@ <!-- please verify this means "Receiver" or "Recipient" as in "Receiver in the transaction" --> <string name="send_address_hint">Ricevente</string> - <string name="xmrto_error_001">SideShift.ai è offline - prova più tardi</string> - <string name="xmrto_error_004">Ammontare in BTC fuori dai limiti</string> - <string name="xmrto_error_010">URL di pagamento obsoleto o invalido</string> - <string name="xmrto_error_012">Troppe richieste</string> - <string name="street_sweep_amount">TUTTO!</string> <!-- as in: "everything in the account" = "all the money" --> <string name="menu_ledger_seed">Converti seed Ledger</string> @@ -386,8 +376,8 @@ <string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string> <string name="onboarding_seed_title">Keep your seed safe</string> <string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string> - <string name="onboarding_xmrto_title">Send Bitcoin</string> - <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string> + <string name="onboarding_xmrto_title">Send Crypto</string> + <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string> <string name="onboarding_nodes_title">Nodes, your way</string> <string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string> <string name="onboarding_fpsend_title">Send with fingerprint</string> @@ -411,4 +401,18 @@ <string name="shift_noquote">Cannot get quote</string> <string name="shift_checkamount">Check amount and try again</string> + + <string name="info_xmrto_ambiguous"><![CDATA[ + <b>Ambiguous address.</b><br/> + <i>Please select the type above.</i> + ]]></string> + + <string name="info_xmrto_help"><![CDATA[ + <b>Please enter or scan a %1$s address.</b><br/> + <i>You'll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i> + ]]></string> + + <string name="info_xmrto_help_xmr"><![CDATA[ + <b>Please enter or scan a Monero address.</b> + ]]></string> </resources> diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index c40f1505..fec82efe 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -35,29 +35,26 @@ <string name="info_ledger_enabled">レッジャーは有効化されています。詳細はタップしてください。</string> <string name="info_xmrto"><![CDATA[ - <b>あなたが入力したのはビットコインのアドレスです。</b><br/> - <i>あなたはXMRを送金し、受け手は SideShift.ai のサービスを利用してBTCを受取ります。</i> + <b>あなたが入力したのは%1$sのアドレスです。</b><br/> + <i>あなたはXMRを送金し、受け手は SideShift.ai のサービスを利用して%1$sを受取ります。</i> ]]></string> <string name="info_send_xmrto_success_order_label">SideShift.ai の注文</string> - <string name="info_send_xmrto_success_btc">%1$s BTC</string> + <string name="info_send_xmrto_success_btc">%1$s %2$s</string> <string name="info_send_xmrto_paid">承認を待っています</string> <string name="info_send_xmrto_unpaid">支払いを待っています</string> <string name="info_send_xmrto_error">SideShift.ai のエラー (%1$s)</string> - <string name="info_send_xmrto_sent">BTCが送金されました!</string> + <string name="info_send_xmrto_sent">%1$sが送金されました!</string> <string name="info_send_xmrto_query">問い合わせ中 …</string> <string name="info_send_xmrto_parms"><![CDATA[ - <b>%1$s から %2$s BTC を送金することができます。</b><br/> - <i><b>SideShift.ai</b> での交換レートは<u>現在</u><b>%3$s BTC</b>です。</i> - ]]></string> - <string name="info_send_xmrto_zeroconf"><![CDATA[ - <i><b>%1$s BTC</b> までの数量は <u>即時に</u>送金可能です!</i> + <b>%1$s から %2$s %4$s を送金することができます。</b><br/> + <i><b>SideShift.ai</b> での交換レートは<u>現在</u><b>%3$s %4$s/XMR</b>です。</i> ]]></string> - <string name="send_available_btc">残高: %2$s BTC (%1$s XMR)</string> + <string name="send_available_btc">残高: %2$s %3$s (%1$s XMR)</string> <string name="info_paymentid_integrated">✔ ペイメントID組み込み済み</string> <string name="info_prepare_tx">取引を準備しています</string> @@ -75,13 +72,13 @@ <string name="text_noretry_monero">私達はここで立ち往生のようです!</string> <string name="text_noretry">あーあ、 SideShift.ai は現在利用不能のようです!</string> - <string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string> - <string name="text_send_btc_rate">(レート: %1$s BTC/XMR)</string> + <string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string> + <string name="text_send_btc_rate">(レート: %1$s %2$s/XMR)</string> <string name="label_send_btc_xmrto_info">サポートと追跡については SideShift.ai をご覧ください</string> <string name="label_send_btc_xmrto_key_lb">シークレットキー\nSideShift.ai</string> <string name="label_send_btc_xmrto_key">SideShift.ai のシークレットキー</string> - <string name="label_send_btc_address">支払先の BTC アドレス</string> + <string name="label_send_btc_address">支払先の %1$s アドレス</string> <string name="label_send_btc_amount">数量</string> <string name="label_send_txid">取引ID</string> @@ -251,11 +248,9 @@ <string name="tx_id">取引ID</string> <string name="tx_key">取引キー</string> <string name="tx_destination">送金先</string> - <string name="tx_destination_btc">送金先\n(BTC)</string> <string name="tx_paymentId">ペイメントID</string> <string name="tx_blockheight">ブロック</string> <string name="tx_amount">数量</string> - <string name="tx_amount_btc">数量\n(BTC)</string> <string name="tx_fee">手数料</string> <string name="tx_transfers">送金</string> <string name="tx_notes">メモ</string> @@ -359,11 +354,6 @@ <!-- please verify this means "Receiver" or "Recipient" as in "Receiver in the transaction" --> <string name="send_address_hint">受け取り手</string> - <string name="xmrto_error_001">SideShift.aiはオフラインです。もう一度お試しください</string> - <string name="xmrto_error_004">BTCの金額は範囲外</string> - <string name="xmrto_error_010">ペイメントURLは不正古いです</string> - <string name="xmrto_error_012">リクエストは多すぎます</string> - <string name="street_sweep_amount">残高合計!</string> <!-- as in: "everything in the account" = "all the money" --> <string name="menu_ledger_seed">Ledgerシードを転換</string> @@ -386,8 +376,8 @@ <string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string> <string name="onboarding_seed_title">Keep your seed safe</string> <string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string> - <string name="onboarding_xmrto_title">Send Bitcoin</string> - <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string> + <string name="onboarding_xmrto_title">Send Crypto</string> + <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string> <string name="onboarding_nodes_title">Nodes, your way</string> <string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string> <string name="onboarding_fpsend_title">Send with fingerprint</string> @@ -411,4 +401,18 @@ <string name="shift_noquote">Cannot get quote</string> <string name="shift_checkamount">Check amount and try again</string> + + <string name="info_xmrto_ambiguous"><![CDATA[ + <b>Ambiguous address.</b><br/> + <i>Please select the type above.</i> + ]]></string> + + <string name="info_xmrto_help"><![CDATA[ + <b>Please enter or scan a %1$s address.</b><br/> + <i>You'll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i> + ]]></string> + + <string name="info_xmrto_help_xmr"><![CDATA[ + <b>Please enter or scan a Monero address.</b> + ]]></string> </resources> diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 73deac15..bc9ba418 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -35,28 +35,25 @@ <string name="info_ledger_enabled">Ledger tilgjengelig, trykk for mer info.</string> <string name="info_xmrto"><![CDATA[ - <b>Du skrev inn en Bitcoin addresse.</b><br/> - <i>Du vil sende XMR og mottakeren vil få BTC gjennom <b>SideShift.ai</b> tjenesten.</i> + <b>Du skrev inn en %1$s addresse.</b><br/> + <i>Du vil sende XMR og mottakeren vil få %1$s gjennom <b>SideShift.ai</b> tjenesten.</i> ]]></string> <string name="info_send_xmrto_success_order_label">SideShift.ai Ordre</string> - <string name="info_send_xmrto_success_btc">%1$s BTC</string> + <string name="info_send_xmrto_success_btc">%1$s %2$s</string> <string name="info_send_xmrto_paid">Bekreftelse venter</string> <string name="info_send_xmrto_unpaid">Betaling venter</string> <string name="info_send_xmrto_error">SideShift.ai error (%1$s)</string> - <string name="info_send_xmrto_sent">BTC sendt!</string> + <string name="info_send_xmrto_sent">%1$s sendt!</string> <string name="info_send_xmrto_query">Spør …</string> <string name="info_send_xmrto_parms"><![CDATA[ - <b>Du kan sende %1$s — %2$s BTC</b>.<br/> - <i><b>SideShift.ai</b> gir deg en vekslingskurs på <b>%3$s BTC</b> <u>akkurat nå</u></i>. - ]]></string> - <string name="info_send_xmrto_zeroconf"><![CDATA[ - <i>Mengder opp til <b>%1$s BTC</b> vil bli sendt <u>umiddelbart</u>!</i> + <b>Du kan sende %1$s — %2$s %4$s</b>.<br/> + <i><b>SideShift.ai</b> gir deg en vekslingskurs på <b>%3$s %4$s/XMR</b> <u>akkurat nå</u></i>. ]]></string> - <string name="send_available_btc">Saldo: %2$s BTC (%1$s XMR)</string> + <string name="send_available_btc">Saldo: %2$s %3$s (%1$s XMR)</string> <string name="info_paymentid_integrated">✔ Betalings ID integrert</string> <string name="info_prepare_tx">Forbereder din transaksjon</string> @@ -74,13 +71,13 @@ <string name="text_noretry_monero">Nå sitter vi fast her!</string> <string name="text_noretry">Ops, det ser ikke ut til at SideShift.ai er tilgjengelig for øyeblikket!</string> - <string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string> - <string name="text_send_btc_rate">(Rate: %1$s BTC/XMR)</string> + <string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string> + <string name="text_send_btc_rate">(Rate: %1$s %2$s/XMR)</string> <string name="label_send_btc_xmrto_info">Besøk SideShift.ai for støtte og sporing</string> <string name="label_send_btc_xmrto_key_lb">Hemmelig nøkkel\nSideShift.ai</string> <string name="label_send_btc_xmrto_key">SideShift.ai Hemmelig nøkkel</string> - <string name="label_send_btc_address">BTC destinasjonsadresse</string> + <string name="label_send_btc_address">%1$s destinasjonsadresse</string> <string name="label_send_btc_amount">Mengde</string> <string name="label_send_txid">Transaksjons-ID</string> @@ -245,11 +242,9 @@ <string name="tx_id">TX ID</string> <string name="tx_key">TX-nøkkel</string> <string name="tx_destination">Destinasjon</string> - <string name="tx_destination_btc">Destinasjon\n(BTC)</string> <string name="tx_paymentId">Betalings-ID</string> <string name="tx_blockheight">Blokk</string> <string name="tx_amount">Mengde</string> - <string name="tx_amount_btc">Mengde\n(BTC)</string> <string name="tx_fee">Avgift</string> <string name="tx_transfers">Overføringer</string> <string name="tx_notes">Notater</string> @@ -356,11 +351,6 @@ <string name="send_address_hint">Receiver</string> - <string name="xmrto_error_001">SideShift.ai offline - try again later</string> - <string name="xmrto_error_004">BTC amount out of bounds</string> - <string name="xmrto_error_010">Invalid or outdated Payment URL</string> - <string name="xmrto_error_012">Too many requests</string> - <string name="street_sweep_amount">EVERYTHING!</string> <!-- as in: "everything in the account" = "all the money" --> <string name="menu_ledger_seed">Convert Ledger Seed</string> @@ -383,8 +373,8 @@ <string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string> <string name="onboarding_seed_title">Keep your seed safe</string> <string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string> - <string name="onboarding_xmrto_title">Send Bitcoin</string> - <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string> + <string name="onboarding_xmrto_title">Send Crypto</string> + <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string> <string name="onboarding_nodes_title">Nodes, your way</string> <string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string> <string name="onboarding_fpsend_title">Send with fingerprint</string> @@ -408,4 +398,18 @@ <string name="shift_noquote">Cannot get quote</string> <string name="shift_checkamount">Check amount and try again</string> + + <string name="info_xmrto_ambiguous"><![CDATA[ + <b>Ambiguous address.</b><br/> + <i>Please select the type above.</i> + ]]></string> + + <string name="info_xmrto_help"><![CDATA[ + <b>Please enter or scan a %1$s address.</b><br/> + <i>You'll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i> + ]]></string> + + <string name="info_xmrto_help_xmr"><![CDATA[ + <b>Please enter or scan a Monero address.</b> + ]]></string> </resources> diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index b44da6cf..b903a592 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -35,29 +35,26 @@ <string name="info_ledger_enabled">Ledger ingeschakeld. Tik voor meer info.</string> <string name="info_xmrto"><![CDATA[ - <b>Je hebt een Bitcoin-adres ingevoerd.</b><br/> - <i>Je verzendt XMR en de ontvanger krijgt BTC via <b>SideShift.ai</b>.</i> + <b>Je hebt een %1$s-adres ingevoerd.</b><br/> + <i>Je verzendt XMR en de ontvanger krijgt %1$s via <b>SideShift.ai</b>.</i> ]]></string> <string name="info_send_xmrto_success_order_label">SideShift.ai-opdracht</string> - <string name="info_send_xmrto_success_btc">%1$s BTC</string> + <string name="info_send_xmrto_success_btc">%1$s %2$s</string> <string name="info_send_xmrto_paid">Wacht op bevestiging</string> <string name="info_send_xmrto_unpaid">Wacht op betaling</string> <string name="info_send_xmrto_error">Fout bij SideShift.ai (%1$s)</string> - <string name="info_send_xmrto_sent">BTC verzonden!</string> + <string name="info_send_xmrto_sent">%1$s verzonden!</string> <string name="info_send_xmrto_query">Aanvragen…</string> <string name="info_send_xmrto_parms"><![CDATA[ - <b>Je kunt %1$s — %2$s BTC verzenden</b>.<br/> - <i><b>SideShift.ai</b> biedt <u>nu</u> een wisselkoers van <b>%3$s BTC</b> aan</i>. - ]]></string> - <string name="info_send_xmrto_zeroconf"><![CDATA[ - <i>Bedragen tot <b>%1$s BTC</b> worden <u>meteen</u> verzonden!</i> + <b>Je kunt %1$s — %2$s %4$s verzenden</b>.<br/> + <i><b>SideShift.ai</b> biedt <u>nu</u> een wisselkoers van <b>%3$s %4$s/XMR</b> aan</i>. ]]></string> - <string name="send_available_btc">Saldo: %2$s BTC (%1$s XMR)</string> + <string name="send_available_btc">Saldo: %2$s %3$s (%1$s XMR)</string> <string name="info_paymentid_integrated">✔ Betalings-ID geïntegreerd</string> <string name="info_prepare_tx">Transactie wordt voorbereid</string> @@ -75,13 +72,13 @@ <string name="text_noretry_monero">Nu zitten we vast…</string> <string name="text_noretry">Oeps, SideShift.ai is op dit moment niet beschikbaar.</string> - <string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string> - <string name="text_send_btc_rate">(Koers: %1$s BTC/XMR)</string> + <string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string> + <string name="text_send_btc_rate">(Koers: %1$s %2$s/XMR)</string> <string name="label_send_btc_xmrto_info">Ga naar SideShift.ai voor hulp en traceren</string> <string name="label_send_btc_xmrto_key_lb">Geheime sleutel\nSideShift.ai</string> <string name="label_send_btc_xmrto_key">Geheime sleutel SideShift.ai</string> - <string name="label_send_btc_address">BTC-doeladres</string> + <string name="label_send_btc_address">%1$s-doeladres</string> <string name="label_send_btc_amount">Bedrag</string> <string name="label_send_txid">Transactie-ID</string> @@ -242,11 +239,9 @@ <string name="tx_id">Transactie-ID</string> <string name="tx_key">Transactiesleutel</string> <string name="tx_destination">Bestemming</string> - <string name="tx_destination_btc">Bestemming\nBTC</string> <string name="tx_paymentId">Betalings-ID</string> <string name="tx_blockheight">Blok</string> <string name="tx_amount">Bedrag</string> - <string name="tx_amount_btc">Bedrag\nBTC</string> <string name="tx_fee">Vergoeding</string> <string name="tx_transfers">Betalingen</string> <string name="tx_notes">Opmerkingen</string> @@ -356,11 +351,6 @@ <!-- please verify this means "Receiver" or "Recipient" as in "Receiver in the transaction" --> <string name="send_address_hint">Ontvanger</string> - <string name="xmrto_error_001">SideShift.ai offline - try again later</string> - <string name="xmrto_error_004">BTC amount out of bounds</string> - <string name="xmrto_error_010">Invalid or outdated Payment URL</string> - <string name="xmrto_error_012">Too many requests</string> - <string name="street_sweep_amount">EVERYTHING!</string> <!-- as in: "everything in the account" = "all the money" --> <string name="menu_ledger_seed">Convert Ledger Seed</string> @@ -383,8 +373,8 @@ <string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string> <string name="onboarding_seed_title">Keep your seed safe</string> <string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string> - <string name="onboarding_xmrto_title">Send Bitcoin</string> - <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string> + <string name="onboarding_xmrto_title">Send Crypto</string> + <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string> <string name="onboarding_nodes_title">Nodes, your way</string> <string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string> <string name="onboarding_fpsend_title">Send with fingerprint</string> @@ -408,4 +398,18 @@ <string name="shift_noquote">Cannot get quote</string> <string name="shift_checkamount">Check amount and try again</string> + + <string name="info_xmrto_ambiguous"><![CDATA[ + <b>Ambiguous address.</b><br/> + <i>Please select the type above.</i> + ]]></string> + + <string name="info_xmrto_help"><![CDATA[ + <b>Please enter or scan a %1$s address.</b><br/> + <i>You'll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i> + ]]></string> + + <string name="info_xmrto_help_xmr"><![CDATA[ + <b>Please enter or scan a Monero address.</b> + ]]></string> </resources> diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index cd7f7200..7e42d762 100755 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -35,29 +35,26 @@ <string name="info_ledger_enabled">Ledger ativada, toque para mais informações.</string> <string name="info_xmrto"><![CDATA[ - <b>Você colocou um endereço Bitcoin.</b><br/> - <i>Você enviará XMR e o destinatário receberá BTC via o serviço <b>SideShift.ai</b></i> + <b>Você colocou um endereço %1$s.</b><br/> + <i>Você enviará XMR e o destinatário receberá %1$s via o serviço <b>SideShift.ai</b></i> ]]></string> <string name="info_send_xmrto_success_order_label">Ordem no SideShift.ai</string> - <string name="info_send_xmrto_success_btc">%1$s BTC</string> + <string name="info_send_xmrto_success_btc">%1$s %2$s</string> <string name="info_send_xmrto_paid">Confirmação Pendente</string> <string name="info_send_xmrto_unpaid">Pagamento Pendente</string> <string name="info_send_xmrto_error">Erro SideShift.ai (%1$s)</string> - <string name="info_send_xmrto_sent">BTC Enviado!</string> + <string name="info_send_xmrto_sent">%1$s Enviado!</string> <string name="info_send_xmrto_query">Consultando …</string> <string name="info_send_xmrto_parms"><![CDATA[ - <b>Você pode enviar %1$s — %2$s BTC</b>.<br/> - <i><b>SideShift.ai</b> enviou a cotação de <b>%3$s BTC</b> <u>neste momento</u></i>. - ]]></string> - <string name="info_send_xmrto_zeroconf"><![CDATA[ - <i>Quantias até <b>%1$s BTC</b> serão enviadas <u>instantaneamente</u>!</i> + <b>Você pode enviar %1$s — %2$s %4$s</b>.<br/> + <i><b>SideShift.ai</b> enviou a cotação de <b>%3$s %4$s/XMR</b> <u>neste momento</u></i>. ]]></string> - <string name="send_available_btc">Saldo: %2$s BTC (%1$s XMR)</string> + <string name="send_available_btc">Saldo: %2$s %3$s (%1$s XMR)</string> <string name="info_paymentid_integrated">✔ ID do pagamento integrado</string> <string name="info_prepare_tx">Preparando sua transação</string> @@ -75,13 +72,13 @@ <string name="text_noretry_monero">Opa, estamos travados aqui!</string> <string name="text_noretry">Hm, parece que o SideShift.ai não está disponível no momento</string> - <string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string> - <string name="text_send_btc_rate">(Cotação: %1$s BTC/XMR)</string> + <string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string> + <string name="text_send_btc_rate">(Cotação: %1$s %2$s/XMR)</string> <string name="label_send_btc_xmrto_info">Visite o SideShift.ai para suporte & rastreio da ordem</string> <string name="label_send_btc_xmrto_key_lb">Chave secreta\nSideShift.ai</string> <string name="label_send_btc_xmrto_key">Chave secreta SideShift.ai</string> - <string name="label_send_btc_address">Endereço BTC de destino</string> + <string name="label_send_btc_address">Endereço %1$s de destino</string> <string name="label_send_btc_amount">Valor</string> <string name="label_send_txid">ID da Transação</string> @@ -244,11 +241,9 @@ <string name="tx_id">ID TX</string> <string name="tx_key">Chave TX</string> <string name="tx_destination">Destino</string> - <string name="tx_destination_btc">Destino\n(BTC)</string> <string name="tx_paymentId">ID do Pagamento</string> <string name="tx_blockheight">Bloco</string> <string name="tx_amount">Valor</string> - <string name="tx_amount_btc">Valor\n(BTC)</string> <string name="tx_fee">Taxa</string> <string name="tx_transfers">Transferências</string> <string name="tx_notes">Notas</string> @@ -348,11 +343,6 @@ <string name="send_address_hint">Destinatário</string> - <string name="xmrto_error_001">SideShift.ai offline - tente novamente mais tarde</string> - <string name="xmrto_error_004">Valor BTC fora dos limites</string> - <string name="xmrto_error_010">URL de pagamento inválido</string> - <string name="xmrto_error_012">Solicitações em excesso</string> - <string name="street_sweep_amount">TUDO!</string> <!-- as in: "everything in the account" = "all the money" --> <string name="menu_ledger_seed">Converter semente da Ledger</string> @@ -375,8 +365,8 @@ <string name="onboarding_welcome_information">Esse aplicativo permite que você crie e use carteiras Monero. Você poderá guardar seus queridos moneroj aqui.</string> <string name="onboarding_seed_title">Mantenha sua semente em segurança</string> <string name="onboarding_seed_information">A semente dá acesso total a qualquer pessoa que a tenha. Se você perdê-la, nós não conseguiremos lhe ajudar a recuperá-la e você perderá seus amados moneroj.</string> - <string name="onboarding_xmrto_title">Enviar Bitcoin</string> - <string name="onboarding_xmrto_information">A Monerujo possui o SideShift.ai integrado. Basta colar ou escaner um endereço Bitcoin e você estará enviando BTC, mas gastando em XMR.</string> + <string name="onboarding_xmrto_title">Enviar Crypto</string> + <string name="onboarding_xmrto_information">A Monerujo possui o SideShift.ai integrado. Basta colar ou escaner um endereço BTC, LTC, ETH, DASH ou DOGE e você estará enviando cripto, mas gastando em XMR.</string> <string name="onboarding_nodes_title">"Nós", do seu jeito</string> <string name="onboarding_nodes_information">Os nós conectam você à rede Monero. Escolha entre nós públicos ou seja completamente "cypherpunk" e utilize seu próprio nó.</string> <string name="onboarding_fpsend_title">Enviar usando a digital</string> @@ -400,4 +390,18 @@ <string name="shift_noquote">Cannot get quote</string> <string name="shift_checkamount">Check amount and try again</string> + + <string name="info_xmrto_ambiguous"><![CDATA[ + <b>Ambiguous address.</b><br/> + <i>Please select the type above.</i> + ]]></string> + + <string name="info_xmrto_help"><![CDATA[ + <b>Please enter or scan a %1$s address.</b><br/> + <i>You'll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i> + ]]></string> + + <string name="info_xmrto_help_xmr"><![CDATA[ + <b>Please enter or scan a Monero address.</b> + ]]></string> </resources> diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 9b6fea95..b6cc1d42 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -35,29 +35,26 @@ <string name="info_ledger_enabled">Ledger activa, toca para mais informação.</string> <string name="info_xmrto"><![CDATA[ - <b>Introduziu um endereço Bitcoin.</b><br/> - <i>Vai enviar em XMR e o destinatário vai receber BTC através do serviço <b>SideShift.ai</b></i> + <b>Introduziu um endereço %1$s.</b><br/> + <i>Vai enviar em XMR e o destinatário vai receber %1$s através do serviço <b>SideShift.ai</b></i> ]]></string> <string name="info_send_xmrto_success_order_label">SideShift.ai Order</string> - <string name="info_send_xmrto_success_btc">%1$s BTC</string> + <string name="info_send_xmrto_success_btc">%1$s %2$s</string> <string name="info_send_xmrto_paid">Confirmação Pendente</string> <string name="info_send_xmrto_unpaid">Pagamento Pendente</string> <string name="info_send_xmrto_error">Erro SideShift.ai (%1$s)</string> - <string name="info_send_xmrto_sent">BTC Enviadas!</string> + <string name="info_send_xmrto_sent">%1$s Enviadas!</string> <string name="info_send_xmrto_query">A comunicar …</string> <string name="info_send_xmrto_parms"><![CDATA[ - <b>Pode enviar %1$s — %2$s BTC</b>.<br/> - <i><b>SideShift.ai</b> está com uma taxa de conversão de <b>%3$s BTC</b> <u>neste momento</u></i>. - ]]></string> - <string name="info_send_xmrto_zeroconf"><![CDATA[ - <i>Quantidades até <b>%1$s BTC</b> serão enviadas <u>instantaneament</u>!</i> + <b>Pode enviar %1$s — %2$s %4$s</b>.<br/> + <i><b>SideShift.ai</b> está com uma taxa de conversão de <b>%3$s %4$s/XMR</b> <u>neste momento</u></i>. ]]></string> - <string name="send_available_btc">Saldo: %2$s BTC (%1$s XMR)</string> + <string name="send_available_btc">Saldo: %2$s %3$s (%1$s XMR)</string> <string name="info_paymentid_integrated">✔ ID do pagamento integrado</string> <string name="info_prepare_tx">A preparar a transacção</string> @@ -75,13 +72,13 @@ <string name="text_noretry_monero">Agora estamos emperrados aqui!</string> <string name="text_noretry">Ups, SideShift.ai não parece estar disponível neste momento!</string> - <string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string> - <string name="text_send_btc_rate">(Rácio: %1$s BTC/XMR)</string> + <string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string> + <string name="text_send_btc_rate">(Rácio: %1$s %2$s/XMR)</string> <string name="label_send_btc_xmrto_info">Vai a SideShift.ai para suporte & seguimento</string> <string name="label_send_btc_xmrto_key_lb">Chave secreta\nSideShift.ai</string> <string name="label_send_btc_xmrto_key">SideShift.ai Chave secreta</string> - <string name="label_send_btc_address">Endereço BTC de destino</string> + <string name="label_send_btc_address">Endereço %1$s de destino</string> <string name="label_send_btc_amount">Quantidade</string> <string name="label_send_txid">ID da Transacção</string> @@ -244,11 +241,9 @@ <string name="tx_id">ID TX</string> <string name="tx_key">Chave TX</string> <string name="tx_destination">Destino</string> - <string name="tx_destination_btc">Destino\n(BTC)</string> <string name="tx_paymentId">ID Pagamento</string> <string name="tx_blockheight">Bloco</string> <string name="tx_amount">Quantidade</string> - <string name="tx_amount_btc">Quantidade\n(BTC)</string> <string name="tx_fee">Taxa</string> <string name="tx_transfers">Transferências</string> <string name="tx_notes">Notas</string> @@ -360,11 +355,6 @@ <string name="send_address_hint">Receptor</string> - <string name="xmrto_error_001">SideShift.ai offline - tenta mais tarde</string> - <string name="xmrto_error_004">Montante de BTC fora dos limites</string> - <string name="xmrto_error_010">URL de pagamento invalido ou fora de prazo</string> - <string name="xmrto_error_012">Demasiadas solicitações</string> - <string name="street_sweep_amount">A TOTALIDADE!</string> <!-- as in: "everything in the account" = "all the money" --> <string name="menu_ledger_seed">Converter semente do Ledger</string> @@ -387,8 +377,8 @@ <string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string> <string name="onboarding_seed_title">Keep your seed safe</string> <string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string> - <string name="onboarding_xmrto_title">Send Bitcoin</string> - <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string> + <string name="onboarding_xmrto_title">Send Crypto</string> + <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string> <string name="onboarding_nodes_title">Nodes, your way</string> <string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string> <string name="onboarding_fpsend_title">Send with fingerprint</string> @@ -412,4 +402,18 @@ <string name="shift_noquote">Cannot get quote</string> <string name="shift_checkamount">Check amount and try again</string> + + <string name="info_xmrto_ambiguous"><![CDATA[ + <b>Ambiguous address.</b><br/> + <i>Please select the type above.</i> + ]]></string> + + <string name="info_xmrto_help"><![CDATA[ + <b>Please enter or scan a %1$s address.</b><br/> + <i>You'll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i> + ]]></string> + + <string name="info_xmrto_help_xmr"><![CDATA[ + <b>Please enter or scan a Monero address.</b> + ]]></string> </resources> diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 6a37db66..5d2861cb 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -34,29 +34,26 @@ <string name="info_ledger_enabled">Ledger activată, apasă pentru mai multe informații.</string> <string name="info_xmrto"><![CDATA[ - <b>Ai introdus o adresă de Bitcoin.</b><br/> - <i>Vei trimite XMR și destinatarul va primi BTC folosind serviciul <b>SideShift.ai</b>.</i> + <b>Ai introdus o adresă de %1$s.</b><br/> + <i>Vei trimite XMR și destinatarul va primi %1$s folosind serviciul <b>SideShift.ai</b>.</i> ]]></string> <string name="info_send_xmrto_success_order_label">Ordin SideShift.ai</string> - <string name="info_send_xmrto_success_btc">%1$s BTC</string> + <string name="info_send_xmrto_success_btc">%1$s %2$s</string> <string name="info_send_xmrto_paid">Confirmare în așteptare</string> <string name="info_send_xmrto_unpaid">Plată în așteptare</string> <string name="info_send_xmrto_error">Eroare SideShift.ai (%1$s)</string> - <string name="info_send_xmrto_sent">BTC trimis!</string> + <string name="info_send_xmrto_sent">%1$s trimis!</string> <string name="info_send_xmrto_query">Interogare …</string> <string name="info_send_xmrto_parms"><![CDATA[ - <b>Poți trimite %1$s — %2$s BTC</b>.<br/> - <i><b>SideShift.ai</b> îți oferă un curs de <b>%3$s BTC</b> <u>în acest moment</u></i>. - ]]></string> - <string name="info_send_xmrto_zeroconf"><![CDATA[ - <i>Sume până la <b>%1$s BTC</b> vor fi trimise <u>instantaneu</u>!</i> + <b>Poți trimite %1$s — %2$s %4$s</b>.<br/> + <i><b>SideShift.ai</b> îți oferă un curs de <b>%3$s %4$s/XMR</b> <u>în acest moment</u></i>. ]]></string> - <string name="send_available_btc">Balanță: %2$s BTC (%1$s XMR)</string> + <string name="send_available_btc">Balanță: %2$s %3$s (%1$s XMR)</string> <string name="info_paymentid_integrated">✔ Payment ID integrat</string> <string name="info_prepare_tx">Se pregătește tranzacția</string> @@ -74,13 +71,13 @@ <string name="text_noretry_monero">Pff.. ne-am blocat cum!</string> <string name="text_noretry">Oh, serviciul SideShift.ai este momentan indisponibil!</string> - <string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string> - <string name="text_send_btc_rate">(Rată: %1$s BTC/XMR)</string> + <string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string> + <string name="text_send_btc_rate">(Rată: %1$s %2$s/XMR)</string> <string name="label_send_btc_xmrto_info">Vizitează SideShift.ai pentru suport & interogare</string> <string name="label_send_btc_xmrto_key_lb">Cheia secretă \nSideShift.ai</string> <string name="label_send_btc_xmrto_key">Cheia secretă SideShift.ai </string> - <string name="label_send_btc_address">Destinație adresă BTC</string> + <string name="label_send_btc_address">Destinație adresă %1$s</string> <string name="label_send_btc_amount">Sumă</string> <string name="label_send_txid">ID Tranzacție </string> @@ -220,11 +217,9 @@ <string name="tx_id">ID Tranzacție</string> <string name="tx_key">Cheie tranzacție</string> <string name="tx_destination">Destinație</string> - <string name="tx_destination_btc">Destinație\n(BTC)</string> <string name="tx_paymentId">Payment ID</string> <string name="tx_blockheight">Monobloc</string> <string name="tx_amount">Sumă</string> - <string name="tx_amount_btc">Sumă\n(BTC)</string> <string name="tx_fee">Comision</string> <string name="tx_transfers">Transferuri</string> <string name="tx_notes">Notițe</string> @@ -356,11 +351,6 @@ <string name="send_address_hint">Receiver</string> - <string name="xmrto_error_001">SideShift.ai offline - try again later</string> - <string name="xmrto_error_004">BTC amount out of bounds</string> - <string name="xmrto_error_010">Invalid or outdated Payment URL</string> - <string name="xmrto_error_012">Too many requests</string> - <string name="street_sweep_amount">EVERYTHING!</string> <!-- as in: "everything in the account" = "all the money" --> <string name="menu_ledger_seed">Convert Ledger Seed</string> @@ -383,8 +373,8 @@ <string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string> <string name="onboarding_seed_title">Keep your seed safe</string> <string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string> - <string name="onboarding_xmrto_title">Send Bitcoin</string> - <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string> + <string name="onboarding_xmrto_title">Send Crypto</string> + <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string> <string name="onboarding_nodes_title">Nodes, your way</string> <string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string> <string name="onboarding_fpsend_title">Send with fingerprint</string> @@ -408,4 +398,18 @@ <string name="shift_noquote">Cannot get quote</string> <string name="shift_checkamount">Check amount and try again</string> + + <string name="info_xmrto_ambiguous"><![CDATA[ + <b>Ambiguous address.</b><br/> + <i>Please select the type above.</i> + ]]></string> + + <string name="info_xmrto_help"><![CDATA[ + <b>Please enter or scan a %1$s address.</b><br/> + <i>You'll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i> + ]]></string> + + <string name="info_xmrto_help_xmr"><![CDATA[ + <b>Please enter or scan a Monero address.</b> + ]]></string> </resources> diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index a04c2157..0d97e893 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -35,30 +35,27 @@ <string name="info_ledger_enabled">Доступен Ledger, нажмите для доп. информации</string> <string name="info_xmrto"><![CDATA[ - <b>Вы ввели Bitcoin адрес.</b><br/> - <i>Отправляйте XMR, получатель получит BTC, используя сервис SideShift.ai</i> + <b>Вы ввели %1$s адрес.</b><br/> + <i>Отправляйте XMR, получатель получит %1$s, используя сервис SideShift.ai</i> ]]></string> <string name="info_send_xmrto_success_order_label">Заказ SideShift.ai</string> - <string name="info_send_xmrto_success_btc">%1$s BTC</string> + <string name="info_send_xmrto_success_btc">%1$s %2$s</string> <string name="info_send_xmrto_paid">Ожидание подтверждения</string> <string name="info_send_xmrto_unpaid">Ожидание платежа</string> <string name="info_send_xmrto_error">Ошибка SideShift.ai (%1$s)</string> - <string name="info_send_xmrto_sent">BTC успешно отправлены!</string> + <string name="info_send_xmrto_sent">%1$s успешно отправлены!</string> <string name="info_send_xmrto_query">Запрос …</string> <string name="info_send_xmrto_parms"><![CDATA[ - <b>Вы можете отправить %1$s — %2$s BTC</b>.<br/> - <i><b>SideShift.ai</b> устанавливает курс обмена <b>%3$s BTC</b> <u>в данный момент</u></i>. - ]]></string> - <string name="info_send_xmrto_zeroconf"><![CDATA[ - <i>Сумма до <b>%1$s BTC</b> будет отправлена <u>немедленно</u>!</i> + <b>Вы можете отправить %1$s — %2$s %4$s</b>.<br/> + <i><b>SideShift.ai</b> устанавливает курс обмена <b>%3$s %4$s/XMR</b> <u>в данный момент</u></i>. ]]></string> - <string name="send_available_btc">Баланс: %2$s BTC (%1$s XMR)</string> + <string name="send_available_btc">Баланс: %2$s %3$s (%1$s XMR)</string> <string name="info_paymentid_integrated">✔ Интегрированный ID платежа</string> <string name="info_prepare_tx">Подготовка транзакции</string> @@ -76,13 +73,13 @@ <string name="text_noretry_monero">Теперь мы застряли здесь!</string> <string name="text_noretry">Ой-ой! Кажется SideShift.ai недоступен в данный момент!</string> - <string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string> - <string name="text_send_btc_rate">(Курс: %1$s BTC/XMR)</string> + <string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string> + <string name="text_send_btc_rate">(Курс: %1$s %2$s/XMR)</string> <string name="label_send_btc_xmrto_info">Посетите SideShift.ai для получения помощи &</string> <string name="label_send_btc_xmrto_key_lb">Секретный ключ\nSideShift.ai</string> <string name="label_send_btc_xmrto_key">SideShift.ai секретный ключ</string> - <string name="label_send_btc_address">Адрес получателя BTC</string> + <string name="label_send_btc_address">Адрес получателя %1$s</string> <string name="label_send_btc_amount">Сумма</string> <string name="label_send_txid">ID транзакции</string> @@ -246,11 +243,9 @@ <string name="tx_id">TX ID</string> <string name="tx_key">Ключ TX</string> <string name="tx_destination">Адресат</string> - <string name="tx_destination_btc">Адресат\n(BTC)</string> <string name="tx_paymentId">ID платежа</string> <string name="tx_blockheight">Блок</string> <string name="tx_amount">Сумма</string> - <string name="tx_amount_btc">Сумма\n(BTC)</string> <string name="tx_fee">Комиссия</string> <string name="tx_transfers">Переводы</string> <string name="tx_notes">Заметки</string> @@ -360,11 +355,6 @@ <!-- please verify this means "Receiver" or "Recipient" as in "Receiver in the transaction" --> <string name="send_address_hint">Получатель</string> - <string name="xmrto_error_001">SideShift.ai недоступен - повторите попытку позже</string> - <string name="xmrto_error_004">Сумма BTC выходит за доступные пределы</string> - <string name="xmrto_error_010">Неверный или устаревший платежный URL</string> - <string name="xmrto_error_012">Превышен лимит запросов</string> - <string name="street_sweep_amount">ВСЕ!</string> <!-- as in: "everything in the account" = "all the money" --> <string name="menu_ledger_seed">Преобразовать фразу Ledger</string> @@ -387,8 +377,8 @@ <string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string> <string name="onboarding_seed_title">Keep your seed safe</string> <string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string> - <string name="onboarding_xmrto_title">Send Bitcoin</string> - <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string> + <string name="onboarding_xmrto_title">Send Crypto</string> + <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string> <string name="onboarding_nodes_title">Nodes, your way</string> <string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string> <string name="onboarding_fpsend_title">Send with fingerprint</string> @@ -412,4 +402,18 @@ <string name="shift_noquote">Cannot get quote</string> <string name="shift_checkamount">Check amount and try again</string> + + <string name="info_xmrto_ambiguous"><![CDATA[ + <b>Ambiguous address.</b><br/> + <i>Please select the type above.</i> + ]]></string> + + <string name="info_xmrto_help"><![CDATA[ + <b>Please enter or scan a %1$s address.</b><br/> + <i>You'll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i> + ]]></string> + + <string name="info_xmrto_help_xmr"><![CDATA[ + <b>Please enter or scan a Monero address.</b> + ]]></string> </resources> diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 1384e297..86e720cb 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -35,30 +35,27 @@ <string name="info_ledger_enabled">Ledger aktivovaný, klepni pre viac info.</string> <string name="info_xmrto"><![CDATA[ - <b>Vložil si Bitcoin adresu.</b><br/> - <i>Pošleš XMR a adresát dostane BTC cez službu <b>SideShift.ai</b>.</i> + <b>Vložil si %1$s adresu.</b><br/> + <i>Pošleš XMR a adresát dostane %1$s cez službu <b>SideShift.ai</b>.</i> ]]></string> <string name="info_send_xmrto_success_order_label">SideShift.ai Objednávka</string> - <string name="info_send_xmrto_success_btc">%1$s BTC</string> + <string name="info_send_xmrto_success_btc">%1$s %2$s</string> <string name="info_send_xmrto_paid">Čaká na Potvrdenie</string> <string name="info_send_xmrto_unpaid">Čakajúca Platba</string> <string name="info_send_xmrto_error">SideShift.ai Chyba (%1$s)</string> - <string name="info_send_xmrto_sent">BTC Odoslané!</string> + <string name="info_send_xmrto_sent">%1$s Odoslané!</string> <string name="info_send_xmrto_query">Zisťujem …</string> <string name="info_send_xmrto_parms"><![CDATA[ - <b>Môžeš poslať %1$s — %2$s BTC</b>.<br/> - <i><b>SideShift.ai</b> ti dáva výmenný kurz of <b>%3$s BTC</b> <u>práve teraz</u></i>. - ]]></string> - <string name="info_send_xmrto_zeroconf"><![CDATA[ - <i>čiastka do <b>%1$s BTC</b> bude odoslaná <u>okamžite</u>!</i> + <b>Môžeš poslať %1$s — %2$s %4$s</b>.<br/> + <i><b>SideShift.ai</b> ti dáva výmenný kurz of <b>%3$s %4$s/XMR</b> <u>práve teraz</u></i>. ]]></string> - <string name="send_available_btc">Zostatok: %2$s BTC (%1$s XMR)</string> + <string name="send_available_btc">Zostatok: %2$s %3$s (%1$s XMR)</string> <string name="info_paymentid_integrated">✔ Payment ID integrované</string> <string name="info_prepare_tx">Pripravujem transakciu</string> @@ -76,13 +73,13 @@ <string name="text_noretry_monero">Uviazli sme tu!</string> <string name="text_noretry">Myslím, že služba SideShift.ai nie je momentálne dostupná!</string> - <string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string> - <string name="text_send_btc_rate">(Kurz: %1$s BTC/XMR)</string> + <string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string> + <string name="text_send_btc_rate">(Kurz: %1$s %2$s/XMR)</string> <string name="label_send_btc_xmrto_info">Navštív SideShift.ai pre podporu & tracking</string> <string name="label_send_btc_xmrto_key_lb">Tajný kľúč\nSideShift.ai</string> <string name="label_send_btc_xmrto_key">SideShift.ai Tajný kľúč</string> - <string name="label_send_btc_address">Cieľová BTC Adresa</string> + <string name="label_send_btc_address">Cieľová %1$s Adresa</string> <string name="label_send_btc_amount">Čiastka</string> <string name="label_send_txid">ID Transakcie</string> @@ -243,11 +240,9 @@ <string name="tx_id">TX ID</string> <string name="tx_key">Kľúč Transakcie</string> <string name="tx_destination">Cieľ</string> - <string name="tx_destination_btc">Cieľová (BTC)</string> <string name="tx_paymentId">ID Platby</string> <string name="tx_blockheight">Blok</string> <string name="tx_amount">Suma</string> - <string name="tx_amount_btc">Čiastka\n(BTC)</string> <string name="tx_fee">poplatok</string> <string name="tx_transfers">Poslaných</string> <string name="tx_notes">Poznámky</string> @@ -357,11 +352,6 @@ <!-- please verify this means "Receiver" or "Recipient" as in "Receiver in the transaction" --> <string name="send_address_hint">Príjemca</string> - <string name="xmrto_error_001">SideShift.ai je offline - skús neskôr</string> - <string name="xmrto_error_004">Množstvo BTC je mimo rámca</string> - <string name="xmrto_error_010">Neplatná alebo stará URL platby</string> - <string name="xmrto_error_012">Príliš veľa požiadaviek</string> - <string name="street_sweep_amount">VŠETKO!</string> <!-- as in: "everything in the account" = "all the money" --> <string name="menu_ledger_seed">Konvertuj Ledger Seed</string> @@ -384,8 +374,8 @@ <string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string> <string name="onboarding_seed_title">Keep your seed safe</string> <string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string> - <string name="onboarding_xmrto_title">Send Bitcoin</string> - <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string> + <string name="onboarding_xmrto_title">Send Crypto</string> + <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string> <string name="onboarding_nodes_title">Nodes, your way</string> <string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string> <string name="onboarding_fpsend_title">Send with fingerprint</string> @@ -409,4 +399,18 @@ <string name="shift_noquote">Cannot get quote</string> <string name="shift_checkamount">Check amount and try again</string> + + <string name="info_xmrto_ambiguous"><![CDATA[ + <b>Ambiguous address.</b><br/> + <i>Please select the type above.</i> + ]]></string> + + <string name="info_xmrto_help"><![CDATA[ + <b>Please enter or scan a %1$s address.</b><br/> + <i>You'll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i> + ]]></string> + + <string name="info_xmrto_help_xmr"><![CDATA[ + <b>Please enter or scan a Monero address.</b> + ]]></string> </resources> diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 3a44afdf..ad42e37b 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -35,29 +35,26 @@ <string name="info_ledger_enabled">Knjiga računa omogućena, tapni za više info.</string> <string name="info_xmrto"><![CDATA[ - <b>Ubacio/la si Bitkoin adresu.</b><br/> - <i>You'će poslati XMR a primalac će dobiti BTC koristeći <b>SideShift.ai</b> servis.</i> + <b>Ubacio/la si %1$s adresu.</b><br/> + <i>You'će poslati XMR a primalac će dobiti %1$s koristeći <b>SideShift.ai</b> servis.</i> ]]></string> <string name="info_send_xmrto_success_order_label">SideShift.ai Nalog</string> - <string name="info_send_xmrto_success_btc">%1$s BTC</string> + <string name="info_send_xmrto_success_btc">%1$s %2$s</string> <string name="info_send_xmrto_paid">Potvrda u toku</string> <string name="info_send_xmrto_unpaid">Plaćanje u toku</string> <string name="info_send_xmrto_error">SideShift.ai Greška (%1$s)</string> - <string name="info_send_xmrto_sent">BTC Poslato!</string> + <string name="info_send_xmrto_sent">%1$s Poslato!</string> <string name="info_send_xmrto_query">Ispitivanje …</string> <string name="info_send_xmrto_parms"><![CDATA[ - <b>Možeš poslati %1$s — %2$s BTC</b>.<br/> - <i><b>SideShift.ai</b> daje ti devizni kurs od <b>%3$s BTC</b> <u>trenutno</u></i>. - ]]></string> - <string name="info_send_xmrto_zeroconf"><![CDATA[ - <i>Sume do <b>%1$s BTC</b> biće poslate <u>instantly</u>!</i> + <b>Možeš poslati %1$s — %2$s %4$s</b>.<br/> + <i><b>SideShift.ai</b> daje ti devizni kurs od <b>%3$s %4$s/XMR</b> <u>trenutno</u></i>. ]]></string> - <string name="send_available_btc">Stanje: %2$s BTC (%1$s XMR)</string> + <string name="send_available_btc">Stanje: %2$s %3$s (%1$s XMR)</string> <string name="info_paymentid_integrated">✔ ID plaćanja integrisan</string> <string name="info_prepare_tx">Priprema tvoje transakcije</string> @@ -75,13 +72,13 @@ <string name="text_noretry_monero">Sada se zaglavismo!</string> <string name="text_noretry">Uh, SideShift.ai izgleda da sad nije dostupan!</string> - <string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string> - <string name="text_send_btc_rate">(Rate: %1$s BTC/XMR)</string> + <string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string> + <string name="text_send_btc_rate">(Rate: %1$s %2$s/XMR)</string> <string name="label_send_btc_xmrto_info">Poseti SideShift.ai za bekap & praćenje</string> <string name="label_send_btc_xmrto_key_lb">Tajna šifra\nSideShift.ai</string> <string name="label_send_btc_xmrto_key">SideShift.ai Tajna šifra</string> - <string name="label_send_btc_address">Odredište BTC adrese</string> + <string name="label_send_btc_address">Odredište %1$s adrese</string> <string name="label_send_btc_amount">Suma</string> <string name="label_send_txid">ID transakcije</string> @@ -252,11 +249,9 @@ <string name="tx_id">TX ID</string> <string name="tx_key">TX šifra</string> <string name="tx_destination">Odredište</string> - <string name="tx_destination_btc">Odredište\n(BTC)</string> <string name="tx_paymentId">ID plaćanja</string> <string name="tx_blockheight">Blok</string> <string name="tx_amount">Suma</string> - <string name="tx_amount_btc">Suma\n(BTC)</string> <string name="tx_fee">Naknada</string> <string name="tx_transfers">Transferi</string> <string name="tx_notes">Čvorovi</string> @@ -355,11 +350,6 @@ <string name="send_address_hint">Primalac</string> - <string name="xmrto_error_001">SideShift.ai van mreže - pokušajte kasnije ponovo</string> - <string name="xmrto_error_004">BTC iznos izvan granica</string> - <string name="xmrto_error_010">Nevalidan ili neažuriran URL plaćanja</string> - <string name="xmrto_error_012">Previše zahteva</string> - <string name="street_sweep_amount">SVE!</string> <string name="menu_ledger_seed">Pretvori seme iz knjige računa</string> @@ -382,8 +372,8 @@ <string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string> <string name="onboarding_seed_title">Keep your seed safe</string> <string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string> - <string name="onboarding_xmrto_title">Send Bitcoin</string> - <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string> + <string name="onboarding_xmrto_title">Send Crypto</string> + <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string> <string name="onboarding_nodes_title">Nodes, your way</string> <string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string> <string name="onboarding_fpsend_title">Send with fingerprint</string> @@ -407,4 +397,18 @@ <string name="shift_noquote">Cannot get quote</string> <string name="shift_checkamount">Check amount and try again</string> + + <string name="info_xmrto_ambiguous"><![CDATA[ + <b>Ambiguous address.</b><br/> + <i>Please select the type above.</i> + ]]></string> + + <string name="info_xmrto_help"><![CDATA[ + <b>Please enter or scan a %1$s address.</b><br/> + <i>You'll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i> + ]]></string> + + <string name="info_xmrto_help_xmr"><![CDATA[ + <b>Please enter or scan a Monero address.</b> + ]]></string> </resources> diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index c4680bc5..d11cfcbc 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -34,22 +34,27 @@ <string name="info_xmrto_enabled">BTC-betalning aktiverad, tryck för mer info.</string> <string name="info_ledger_enabled">Ledger aktiverat, tryck för mer info.</string> - <string name="info_xmrto"><![CDATA[<b>Du har angivit en Bitcoin-adress.</b><br/> <i>Du kommer att skicka XMR och mottagaren får BTC via tjänsten <b>SideShift.ai</b>.</i>]]></string> + <string name="info_xmrto"><![CDATA[ + <b>Du har angivit en %1$s-adress.</b><br/> + <i>Du kommer att skicka XMR och mottagaren får %1$s via tjänsten <b>SideShift.ai</b>.</i> + ]]></string> <string name="info_send_xmrto_success_order_label">SideShift.ai-beställning</string> - <string name="info_send_xmrto_success_btc">%1$s BTC</string> + <string name="info_send_xmrto_success_btc">%1$s %2$s</string> <string name="info_send_xmrto_paid">Väntar på bekräftelse</string> <string name="info_send_xmrto_unpaid">Väntar på betalning</string> <string name="info_send_xmrto_error">SideShift.ai-fel (%1$s)</string> - <string name="info_send_xmrto_sent">BTC skickades!</string> + <string name="info_send_xmrto_sent">%1$s skickades!</string> <string name="info_send_xmrto_query">Frågar …</string> - <string name="info_send_xmrto_parms"><![CDATA[<b>Du kan skicka %1$s — %2$s BTC</b>.<br/> <i><b>SideShift.ai</b> ger dig <u>just nu</u> en växelkurs på <b>%3$s BTC</b></i>.]]></string> - <string name="info_send_xmrto_zeroconf"><![CDATA[<i>Belopp upp till <b>%1$s BTC</b> skickas <u>omedelbart</u>!</i>]]></string> + <string name="info_send_xmrto_parms"><![CDATA[ + <b>Du kan skicka %1$s — %2$s %4$s</b>.<br/> + <i><b>SideShift.ai</b> ger dig <u>just nu</u> en växelkurs på <b>%3$s %4$s/XMR</b></i>. + ]]></string> - <string name="send_available_btc">Saldo: %2$s BTC (%1$s XMR)</string> + <string name="send_available_btc">Saldo: %2$s %3$s (%1$s XMR)</string> <string name="info_paymentid_integrated">✔ Betalnings-ID integrerat</string> <string name="info_prepare_tx">Förbereder din transaktion</string> @@ -67,13 +72,13 @@ <string name="text_noretry_monero">Nu har vi kört fast!</string> <string name="text_noretry">Åh nej, SideShift.ai verkar inte vara tillgänglig just nu!</string> - <string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string> - <string name="text_send_btc_rate">(Kurs: %1$s BTC/XMR)</string> + <string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string> + <string name="text_send_btc_rate">(Kurs: %1$s %2$s/XMR)</string> <string name="label_send_btc_xmrto_info">Besök SideShift.ai för support & spårning</string> <string name="label_send_btc_xmrto_key_lb">Hemlig nyckel\nSideShift.ai</string> <string name="label_send_btc_xmrto_key">SideShift.ai hemlig nyckel</string> - <string name="label_send_btc_address">Måladress för BTC</string> + <string name="label_send_btc_address">Måladress för %1$s</string> <string name="label_send_btc_amount">Belopp</string> <string name="label_send_txid">Transaktions-ID</string> @@ -225,11 +230,9 @@ <string name="tx_id">TX-ID</string> <string name="tx_key">TX-nyckel</string> <string name="tx_destination">Mål</string> - <string name="tx_destination_btc">Mål\n(BTC)</string> <string name="tx_paymentId">Betalnings-ID</string> <string name="tx_blockheight">Block</string> <string name="tx_amount">Belopp</string> - <string name="tx_amount_btc">Belopp\n(BTC)</string> <string name="tx_fee">Avgift</string> <string name="tx_transfers">Överföringar</string> <string name="tx_notes">Anteckningar</string> @@ -340,11 +343,6 @@ <!-- please verify this means "Receiver" or "Recipient" as in "Receiver in the transaction" --> <string name="send_address_hint">Mottagaren</string> - <string name="xmrto_error_001">SideShift.ai offline - try again later</string> - <string name="xmrto_error_004">BTC amount out of bounds</string> - <string name="xmrto_error_010">Invalid or outdated Payment URL</string> - <string name="xmrto_error_012">Too many requests</string> - <string name="street_sweep_amount">EVERYTHING!</string> <!-- as in: "everything in the account" = "all the money" --> <string name="menu_ledger_seed">Convert Ledger Seed</string> @@ -367,8 +365,8 @@ <string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string> <string name="onboarding_seed_title">Keep your seed safe</string> <string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string> - <string name="onboarding_xmrto_title">Send Bitcoin</string> - <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string> + <string name="onboarding_xmrto_title">Send Crypto</string> + <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string> <string name="onboarding_nodes_title">Nodes, your way</string> <string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string> <string name="onboarding_fpsend_title">Send with fingerprint</string> @@ -392,4 +390,18 @@ <string name="shift_noquote">Cannot get quote</string> <string name="shift_checkamount">Check amount and try again</string> + + <string name="info_xmrto_ambiguous"><![CDATA[ + <b>Ambiguous address.</b><br/> + <i>Please select the type above.</i> + ]]></string> + + <string name="info_xmrto_help"><![CDATA[ + <b>Please enter or scan a %1$s address.</b><br/> + <i>You'll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i> + ]]></string> + + <string name="info_xmrto_help_xmr"><![CDATA[ + <b>Please enter or scan a Monero address.</b> + ]]></string> </resources> diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 2489199e..bf66f77c 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -35,30 +35,27 @@ <string name="info_ledger_enabled">Доступний Ledger, натисніть для доп. інформації</string> <string name="info_xmrto"><![CDATA[ - <b>Ви ввели Bitcoin адресу.</b><br/> - <i>Надсилайте XMR, одержувач отримає BTC, використовуючи сервіс SideShift.ai</i> + <b>Ви ввели %1$s адресу.</b><br/> + <i>Надсилайте XMR, одержувач отримає %1$s, використовуючи сервіс SideShift.ai</i> ]]></string> <string name="info_send_xmrto_success_order_label">Заявка SideShift.ai</string> - <string name="info_send_xmrto_success_btc">%1$s BTC</string> + <string name="info_send_xmrto_success_btc">%1$s %2$s</string> <string name="info_send_xmrto_paid">Очікування підтвердження</string> <string name="info_send_xmrto_unpaid">Очікування платежу</string> <string name="info_send_xmrto_error">Помилка SideShift.ai (%1$s)</string> - <string name="info_send_xmrto_sent">BTC успішно відправлені!</string> + <string name="info_send_xmrto_sent">%1$s успішно відправлені!</string> <string name="info_send_xmrto_query">Запит …</string> <string name="info_send_xmrto_parms"><![CDATA[ - <b>Ви можете відправити %1$s — %2$s BTC</b>.<br/> - <i><b>SideShift.ai</b> встановлює курс обміну <b>%3$s BTC</b> <u>в даний момент</u></i>. - ]]></string> - <string name="info_send_xmrto_zeroconf"><![CDATA[ - <i>Сума до <b>%1$s BTC</b> буде відправлена <u>негайно</u>!</i> + <b>Ви можете відправити %1$s — %2$s %4$s</b>.<br/> + <i><b>SideShift.ai</b> встановлює курс обміну <b>%3$s %4$s/XMR</b> <u>в даний момент</u></i>. ]]></string> - <string name="send_available_btc">Баланс: %2$s BTC (%1$s XMR)</string> + <string name="send_available_btc">Баланс: %2$s %3$s (%1$s XMR)</string> <string name="info_paymentid_integrated">✔ Інтегрований ID платежу</string> <string name="info_prepare_tx">Підготовка транзакції</string> @@ -76,13 +73,13 @@ <string name="text_noretry_monero">Тепер ми застрягли тут!</string> <string name="text_noretry">Ой ой! Здається SideShift.ai недоступний в даний момент!</string> - <string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string> - <string name="text_send_btc_rate">(Курс: %1$s BTC/XMR)</string> + <string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string> + <string name="text_send_btc_rate">(Курс: %1$s %2$s/XMR)</string> <string name="label_send_btc_xmrto_info">Відвідайте SideShift.ai для отримання допомоги &</string> <string name="label_send_btc_xmrto_key_lb">Секретний ключ\nSideShift.ai</string> <string name="label_send_btc_xmrto_key">SideShift.ai секретний ключ</string> - <string name="label_send_btc_address">Адреса отримувача BTC</string> + <string name="label_send_btc_address">Адреса отримувача %1$s</string> <string name="label_send_btc_amount">Сума</string> <string name="label_send_txid">ID транзакції</string> @@ -246,11 +243,9 @@ <string name="tx_id">TX ID</string> <string name="tx_key">Ключ TX</string> <string name="tx_destination">Адресат</string> - <string name="tx_destination_btc">Адресат\n(BTC)</string> <string name="tx_paymentId">ID платежу</string> <string name="tx_blockheight">Блок</string> <string name="tx_amount">Сума</string> - <string name="tx_amount_btc">Сума\n(BTC)</string> <string name="tx_fee">Комісія</string> <string name="tx_transfers">Перекази</string> <string name="tx_notes">Замітки</string> @@ -360,11 +355,6 @@ <!-- please verify this means "Receiver" or "Recipient" as in "Receiver in the transaction" --> <string name="send_address_hint">Отримувач</string> - <string name="xmrto_error_001">SideShift.ai недоступний - спробуйте пізніше</string> - <string name="xmrto_error_004">Сума BTC виходить за допустимі ліміти</string> - <string name="xmrto_error_010">Невірний або застарілий платіжний URL</string> - <string name="xmrto_error_012">Перевищено кількість запитів</string> - <string name="street_sweep_amount">ВСЕ!</string> <!-- as in: "everything in the account" = "all the money" --> <string name="menu_ledger_seed">Конвертувати фразу Ledger</string> @@ -387,8 +377,8 @@ <string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string> <string name="onboarding_seed_title">Keep your seed safe</string> <string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string> - <string name="onboarding_xmrto_title">Send Bitcoin</string> - <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string> + <string name="onboarding_xmrto_title">Send Crypto</string> + <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string> <string name="onboarding_nodes_title">Nodes, your way</string> <string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string> <string name="onboarding_fpsend_title">Send with fingerprint</string> @@ -412,4 +402,18 @@ <string name="shift_noquote">Cannot get quote</string> <string name="shift_checkamount">Check amount and try again</string> + + <string name="info_xmrto_ambiguous"><![CDATA[ + <b>Ambiguous address.</b><br/> + <i>Please select the type above.</i> + ]]></string> + + <string name="info_xmrto_help"><![CDATA[ + <b>Please enter or scan a %1$s address.</b><br/> + <i>You'll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i> + ]]></string> + + <string name="info_xmrto_help_xmr"><![CDATA[ + <b>Please enter or scan a Monero address.</b> + ]]></string> </resources> diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 6021d308..622c2a96 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -27,24 +27,21 @@ <string name="info_xmrto_enabled">已支持比特币支付,点此了解更多</string> <string name="info_ledger_enabled">已支持Ledger硬件钱包,点此了解更多</string> <string name="info_xmrto"><![CDATA[ -<b>您输入了一个比特币地址</b><br/> -<i>您发送的门罗币将通过<b>SideShift.ai</b>服务,转换为比特币发送给对方。</i> -]]></string> + <b>您输入了一个%1$s地址</b><br/> + <i>您发送的门罗币将通过<b>SideShift.ai</b>服务,转换为%1$s发送给对方。</i> + ]]></string> <string name="info_send_xmrto_success_order_label">SideShift.ai订单</string> - <string name="info_send_xmrto_success_btc">%1$s BTC</string> + <string name="info_send_xmrto_success_btc">%1$s %2$s</string> <string name="info_send_xmrto_paid">等待确认中</string> <string name="info_send_xmrto_unpaid">等待支付中</string> <string name="info_send_xmrto_error">SideShift.ai错误(%1$s)</string> - <string name="info_send_xmrto_sent">成功发送比特币!</string> + <string name="info_send_xmrto_sent">成功发送%1$s!</string> <string name="info_send_xmrto_query">查询中…</string> <string name="info_send_xmrto_parms"><![CDATA[ -<b>您可以发送%1$s — %2$s BTC</b>.<br/> -<i><u>此刻</u><b>SideShift.ai</b>的汇率是<b>%3$s BTC</b> </i>. -]]></string> - <string name="info_send_xmrto_zeroconf"><![CDATA[ -<i>至多<b>%1$s BTC</b>将会<u>即刻</u>发送!</i> -]]></string> - <string name="send_available_btc">余额: %2$s BTC (%1$s XMR)</string> + <b>您可以发送%1$s — %2$s %4$s</b>.<br/> + <i><u>此刻</u><b>SideShift.ai</b>的汇率是<b>%3$s %4$s/XMR</b> </i>. + ]]></string> + <string name="send_available_btc">余额: %2$s %3$s (%1$s XMR)</string> <string name="info_paymentid_integrated">✔ 支付ID已集成</string> <string name="info_prepare_tx">正在为您的交易做准备工作</string> <string name="label_send_progress_xmrto_create">创建SideShift.ai订单</string> @@ -56,12 +53,12 @@ <string name="text_retry">再次尝试</string> <string name="text_noretry_monero">我们遇到了困难!</string> <string name="text_noretry">抱歉, SideShift.ai服务现在似乎不可用</string> - <string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string> - <string name="text_send_btc_rate">(Rate: %1$s BTC/XMR)</string> + <string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string> + <string name="text_send_btc_rate">(Rate: %1$s %2$s/XMR)</string> <string name="label_send_btc_xmrto_info">访问SideShift.ai以获得更多支持</string> <string name="label_send_btc_xmrto_key_lb">密钥\nSideShift.ai</string> <string name="label_send_btc_xmrto_key">SideShift.ai密钥</string> - <string name="label_send_btc_address">比特币收款地址</string> + <string name="label_send_btc_address">%1$s收款地址</string> <string name="label_send_btc_amount">金额</string> <string name="label_send_txid">交易ID</string> <string name="label_send_address">收款地址</string> @@ -196,11 +193,9 @@ <string name="tx_id">交易ID</string> <string name="tx_key">交易密钥</string> <string name="tx_destination">目标地址</string> - <string name="tx_destination_btc">目标地址\n(BTC)</string> <string name="tx_paymentId">支付ID</string> <string name="tx_blockheight">区块</string> <string name="tx_amount">金额</string> - <string name="tx_amount_btc">金额\n(BTC)</string> <string name="tx_fee">手续费</string> <string name="tx_transfers">转账</string> <string name="tx_notes">备注</string> @@ -281,10 +276,6 @@ <string name="node_nobookmark">已自动将最佳%1$d节点加入书签</string> <string name="label_test">测试</string><!--note: as in "Test a network connection"--> <string name="send_address_hint">收款人</string> - <string name="xmrto_error_001">SideShift.ai离线-请稍后重试</string> - <string name="xmrto_error_004">比特币金额超出限制</string> - <string name="xmrto_error_010">无效或过期的支付URL</string> - <string name="xmrto_error_012">当前请求数过多</string> <string name="street_sweep_amount">全部资产!</string> <string name="menu_ledger_seed">转换Ledger种子密语</string> <string name="prompt_ledger_seed">Ledger种子密语</string> @@ -306,8 +297,8 @@ <string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string> <string name="onboarding_seed_title">Keep your seed safe</string> <string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string> - <string name="onboarding_xmrto_title">Send Bitcoin</string> - <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string> + <string name="onboarding_xmrto_title">Send Crypto</string> + <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string> <string name="onboarding_nodes_title">Nodes, your way</string> <string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string> <string name="onboarding_fpsend_title">Send with fingerprint</string> @@ -331,4 +322,18 @@ <string name="shift_noquote">Cannot get quote</string> <string name="shift_checkamount">Check amount and try again</string> + + <string name="info_xmrto_ambiguous"><![CDATA[ + <b>Ambiguous address.</b><br/> + <i>Please select the type above.</i> + ]]></string> + + <string name="info_xmrto_help"><![CDATA[ + <b>Please enter or scan a %1$s address.</b><br/> + <i>You'll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i> + ]]></string> + + <string name="info_xmrto_help_xmr"><![CDATA[ + <b>Please enter or scan a Monero address.</b> + ]]></string> </resources> diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 98ea2481..12d518ab 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -35,30 +35,27 @@ <string name="info_ledger_enabled">Ledger 已啟用,點選了解更多</string> <string name="info_xmrto"><![CDATA[ - <b>你輸入了 Bitcoin 地址</b><br/> - <i>你將會發送 XMR 而收款方將會收到 BTC (由 <b>SideShift.ai</b> 提供轉換)</i> + <b>你輸入了 %1$s 地址</b><br/> + <i>你將會發送 XMR 而收款方將會收到 %1$s (由 <b>SideShift.ai</b> 提供轉換)</i> ]]></string> <string name="info_send_xmrto_success_order_label">SideShift.ai 訂單</string> - <string name="info_send_xmrto_success_btc">%1$s BTC</string> + <string name="info_send_xmrto_success_btc">%1$s %2$s</string> <string name="info_send_xmrto_paid">等待確認中</string> <string name="info_send_xmrto_unpaid">等待付款中</string> <string name="info_send_xmrto_error">SideShift.ai 發生錯誤 (%1$s)</string> - <string name="info_send_xmrto_sent">BTC 已發送!</string> + <string name="info_send_xmrto_sent">%1$s 已發送!</string> <string name="info_send_xmrto_query">查詢中 …</string> <string name="info_send_xmrto_parms"><![CDATA[ - <b>你可發送 %1$s — %2$s BTC</b>.<br/> - <i><b>SideShift.ai</b> 提供的<u>即時</u>匯率為 <b>%3$s BTC</b></i>. - ]]></string> - <string name="info_send_xmrto_zeroconf"><![CDATA[ - <i>金額少於 <b>%1$s BTC</b> ,將會<u>馬上</u>發送!</i> + <b>你可發送 %1$s — %2$s %4$s</b>.<br/> + <i><b>SideShift.ai</b> 提供的<u>即時</u>匯率為 <b>%3$s %4$s/XMR</b></i>. ]]></string> - <string name="send_available_btc">餘額:%2$s BTC (%1$s XMR)</string> + <string name="send_available_btc">餘額:%2$s %3$s (%1$s XMR)</string> <string name="info_paymentid_integrated">✔ 已加入付款 ID</string> <string name="info_prepare_tx">正在準備你的交易</string> @@ -76,13 +73,13 @@ <string name="text_noretry_monero">我們卡住了!</string> <string name="text_noretry">不好,SideShift.ai 現在似乎無法提供服務!</string> - <string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string> - <string name="text_send_btc_rate">(匯率:%1$s BTC/XMR)</string> + <string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string> + <string name="text_send_btc_rate">(匯率:%1$s %2$s/XMR)</string> <string name="label_send_btc_xmrto_info">參訪 SideShift.ai 以獲得支援及追蹤交易</string> <string name="label_send_btc_xmrto_key_lb">私鑰\nSideShift.ai</string> <string name="label_send_btc_xmrto_key">SideShift.ai 私鑰</string> - <string name="label_send_btc_address">目的地 BTC 地址</string> + <string name="label_send_btc_address">目的地 %1$s 地址</string> <string name="label_send_btc_amount">金額</string> <string name="label_send_txid">交易 ID</string> @@ -244,11 +241,9 @@ <string name="tx_id">交易 ID (TXID)</string> <string name="tx_key">交易金鑰 (TX Key)</string> <string name="tx_destination">收款地址</string> - <string name="tx_destination_btc">收款地址\n(BTC)</string> <string name="tx_paymentId">付款 ID</string> <string name="tx_blockheight">區塊</string> <string name="tx_amount">金額</string> - <string name="tx_amount_btc">金額\n(BTC)</string> <string name="tx_fee">手續費</string> <string name="tx_transfers">轉帳</string> <string name="tx_notes">附註</string> @@ -355,11 +350,6 @@ <string name="send_address_hint">收款者</string> - <string name="xmrto_error_001">SideShift.ai 無法使用 - 請稍候再試</string> - <string name="xmrto_error_004">BTC 金額超出限制</string> - <string name="xmrto_error_010">無效或過期的付款網址</string> - <string name="xmrto_error_012">請求過於頻繁</string> - <string name="street_sweep_amount">全部!</string> <string name="menu_ledger_seed">轉換 Ledger 種子碼</string> @@ -382,8 +372,8 @@ <string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string> <string name="onboarding_seed_title">Keep your seed safe</string> <string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string> - <string name="onboarding_xmrto_title">Send Bitcoin</string> - <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string> + <string name="onboarding_xmrto_title">Send Crypto</string> + <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string> <string name="onboarding_nodes_title">Nodes, your way</string> <string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string> <string name="onboarding_fpsend_title">Send with fingerprint</string> @@ -407,4 +397,18 @@ <string name="shift_noquote">Cannot get quote</string> <string name="shift_checkamount">Check amount and try again</string> + + <string name="info_xmrto_ambiguous"><![CDATA[ + <b>Ambiguous address.</b><br/> + <i>Please select the type above.</i> + ]]></string> + + <string name="info_xmrto_help"><![CDATA[ + <b>Please enter or scan a %1$s address.</b><br/> + <i>You'll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i> + ]]></string> + + <string name="info_xmrto_help_xmr"><![CDATA[ + <b>Please enter or scan a Monero address.</b> + ]]></string> </resources> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 219f14d4..6157b4b6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -32,33 +32,30 @@ <string name="label_receive_info_gen_qr_code">Touch for QR Code</string> - <string name="info_xmrto_enabled">BTC payment enabled, tap for more info.</string> + <string name="info_xmrto_enabled">Non-XMR payments enabled, tap for more info.</string> <string name="info_ledger_enabled">Ledger enabled, tap for more info.</string> <string name="info_xmrto"><![CDATA[ - <b>You entered a Bitcoin address.</b><br/> - <i>You'll send XMR and the receiver will get BTC using the <b>SideShift.ai</b> service.</i> + <b>You entered a %1$s address.</b><br/> + <i>You'll send XMR and the receiver will get %1$s using the <b>SideShift.ai</b> service.</i> ]]></string> <string name="info_send_xmrto_success_order_label">SideShift.ai Order</string> - <string name="info_send_xmrto_success_btc">%1$s BTC</string> + <string name="info_send_xmrto_success_btc">%1$s %2$s</string> <string name="info_send_xmrto_paid">Confirmation Pending</string> <string name="info_send_xmrto_unpaid">Payment Pending</string> <string name="info_send_xmrto_error">SideShift.ai Error (%1$s)</string> - <string name="info_send_xmrto_sent">BTC Sent!</string> + <string name="info_send_xmrto_sent">%1$s Sent!</string> <string name="info_send_xmrto_query">Querying …</string> <string name="info_send_xmrto_parms"><![CDATA[ - <b>You can send %1$s — %2$s BTC</b>.<br/> - <i><b>SideShift.ai</b> is giving you an exchange rate of <b>%3$s BTC</b> <u>right now</u></i>. - ]]></string> - <string name="info_send_xmrto_zeroconf"><![CDATA[ - <i>Amounts up to <b>%1$s BTC</b> will be sent <u>instantly</u>!</i> + <b>You can send %1$s — %2$s %4$s</b>.<br/> + <i><b>SideShift.ai</b> is giving you an exchange rate of <b>%3$s %4$s/XMR</b> <u>right now</u></i>. ]]></string> - <string name="send_available_btc">Balance: %2$s BTC (%1$s XMR)</string> + <string name="send_available_btc">Balance: %2$s %3$s (%1$s XMR)</string> <string name="info_paymentid_integrated">✔ Payment ID integrated</string> <string name="info_prepare_tx">Preparing your transaction</string> @@ -76,13 +73,13 @@ <string name="text_noretry_monero">Now we\'re stuck here!</string> <string name="text_noretry">Uh-oh, SideShift.ai does not seem be available right now!</string> - <string name="text_send_btc_amount">%1$s BTC = %2$s XMR</string> - <string name="text_send_btc_rate">(Rate: %1$s BTC/XMR)</string> + <string name="text_send_btc_amount">%1$s %3$s = %2$s XMR</string> + <string name="text_send_btc_rate">(Rate: %1$s %2$s/XMR)</string> <string name="label_send_btc_xmrto_info">Visit SideShift.ai for support & tracking</string> <string name="label_send_btc_xmrto_key_lb">Secret Key\nSideShift.ai</string> <string name="label_send_btc_xmrto_key">SideShift.ai Secret Key</string> - <string name="label_send_btc_address">Destination BTC Address</string> + <string name="label_send_btc_address">Destination %1$s Address</string> <string name="label_send_btc_amount">Amount</string> <string name="label_send_txid">Transaction ID</string> @@ -256,11 +253,9 @@ <string name="tx_id">TX ID</string> <string name="tx_key">TX Key</string> <string name="tx_destination">Destination</string> - <string name="tx_destination_btc">Destination\n(BTC)</string> <string name="tx_paymentId">Payment ID</string> <string name="tx_blockheight">Block</string> <string name="tx_amount">Amount</string> - <string name="tx_amount_btc">Amount\n(BTC)</string> <string name="tx_fee">Fee</string> <string name="tx_transfers">Transfers</string> <string name="tx_notes">Notes</string> @@ -403,13 +398,6 @@ <string name="send_address_hint">Receiver</string> - <string name="xmrto_error_001">SideShift.ai offline - try again later</string> - <string name="xmrto_error_004">BTC amount out of bounds</string> - <string name="xmrto_error_010">Invalid or outdated Payment URL</string> - <string name="xmrto_error_012">Too many requests</string> - - <string name="xmrto_error" translatable="false">SideShift.ai Service Error</string> - <string name="street_sweep_amount">EVERYTHING!</string> <string name="menu_ledger_seed">Convert Ledger Seed</string> @@ -434,8 +422,8 @@ <string name="onboarding_welcome_information">This app allows you to create and use Monero wallets. You can store your sweet moneroj in them.</string> <string name="onboarding_seed_title">Keep your seed safe</string> <string name="onboarding_seed_information">The seed grants full access to whoever has it. If you lose it, we cannot help you recover it and you lose your beloved moneroj.</string> - <string name="onboarding_xmrto_title">Send Bitcoin</string> - <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a Bitcoin address and you\'ll be sending BTC by spending XMR.</string> + <string name="onboarding_xmrto_title">Send Crypto</string> + <string name="onboarding_xmrto_information">Monerujo has SideShift.ai support built-in. Just paste or scan a BTC, LTC, ETH, DASH or DOGE address and you\'ll be sending these cryptos by spending XMR.</string> <string name="onboarding_nodes_title">Nodes, your way</string> <string name="onboarding_nodes_information">Nodes connect you to the Monero network. Choose between public nodes or go full cypherpunk using your own.</string> <string name="onboarding_fpsend_title">Send with fingerprint</string> @@ -459,4 +447,28 @@ <string name="shift_noquote">Cannot get quote</string> <string name="shift_checkamount">Check amount and try again</string> + + <string name="info_xmrto_ambiguous"><![CDATA[ + <b>Ambiguous address.</b><br/> + <i>Please select the type above.</i> + ]]></string> + + <string name="info_xmrto_help"><![CDATA[ + <b>Please enter or scan a %1$s address.</b><br/> + <i>You'll send XMR and the receiver will get %2$s using the <b>SideShift.ai</b> service.</i> + ]]></string> + + <string name="info_xmrto_help_xmr"><![CDATA[ + <b>Please enter or scan a Monero address.</b> + ]]></string> + + <!-- order must be the same as in com.m2049r.xmrwallet.data.Crypto--> + <string-array name="cryptos" translatable="false"> + <item>Monero</item> + <item>Bitcoin</item> + <item>Dash</item> + <item>Dogecoin</item> + <item>Ethereum</item> + <item>Litecoin</item> + </string-array> </resources> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 7b58d137..9359a130 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -95,6 +95,11 @@ <!--item name="android:textColor">@color/gradientOrange</item--> </style> + <style name="MoneroText.Balance.Orange.Smaller"> + <item name="android:textSize">24sp</item> + </style> + + <style name="MoneroText.Unconfirmed"> <item name="android:textSize">14sp</item> <!--item name="android:textColor">@color/moneroGray</item--> diff --git a/app/src/test/java/com/m2049r/xmrwallet/util/BitcoinAddressValidatorTest.java b/app/src/test/java/com/m2049r/xmrwallet/util/BitcoinAddressValidatorTest.java deleted file mode 100644 index c2502fb4..00000000 --- a/app/src/test/java/com/m2049r/xmrwallet/util/BitcoinAddressValidatorTest.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2017 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. - */ - -package com.m2049r.xmrwallet.util; - -import org.junit.Test; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - - -public class BitcoinAddressValidatorTest { - - @Test - public void validateBTC_shouldValidate() { - assertTrue(BitcoinAddressValidator.validate("2NBMEXXS4v8ubajzfQUjYvh2ptLkxzH8uTC", true)); - assertTrue(BitcoinAddressValidator.validate("2N9fzq66uZYQXp7uqrPBH6jKBhjrgTzpGCy", true)); - assertTrue(BitcoinAddressValidator.validate("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i", false)); - assertTrue(BitcoinAddressValidator.validate("1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9", false)); - assertTrue(BitcoinAddressValidator.validate("3R2MPpTNQLCNs13qnHz89Rm82jQ27bAwft", false)); - assertTrue(BitcoinAddressValidator.validate("34QjytsE8GVRbUBvYNheftqJ5CHfDHvQRD", false)); - assertTrue(BitcoinAddressValidator.validate("3GsAUrD4dnCqtaTTUzzsQWoymHNkEFrgGF", false)); - assertTrue(BitcoinAddressValidator.validate("3NagLCvw8fLwtoUrK7s2mJPy9k6hoyWvTU", false)); - assertTrue(BitcoinAddressValidator.validate("mjn127C5wRQCULksMYMFHLp9UTdQuCfbZ9", true)); - } - - @Test - public void validateBTC_shouldNotValidate() { - assertTrue(BitcoinAddressValidator.validate("3NagLCvw8fLwtoUrK7s2mJPy9k6hoyWvTU", false)); - assertTrue(BitcoinAddressValidator.validate("mjn127C5wRQCULksMYMFHLp9UTdQuCfbZ9", true)); - assertTrue(!BitcoinAddressValidator.validate("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62j", true)); - assertTrue(!BitcoinAddressValidator.validate("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62X", true)); - assertTrue(!BitcoinAddressValidator.validate("1ANNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i", true)); - assertTrue(!BitcoinAddressValidator.validate("1A Na15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i", true)); - assertTrue(!BitcoinAddressValidator.validate("BZbvjr", true)); - assertTrue(!BitcoinAddressValidator.validate("i55j", true)); - assertTrue(!BitcoinAddressValidator.validate("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62!", true)); - assertTrue(!BitcoinAddressValidator.validate("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62iz", false)); - assertTrue(!BitcoinAddressValidator.validate("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62izz", false)); - assertTrue(!BitcoinAddressValidator.validate("1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nJ9", false)); - assertTrue(!BitcoinAddressValidator.validate("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62I", false)); - assertTrue(!BitcoinAddressValidator.validate("3NagLCvw8fLwtoUrK7s2mJPy9k6hoyWvTU ", false)); - assertTrue(!BitcoinAddressValidator.validate(" 3NagLCvw8fLwtoUrK7s2mJPy9k6hoyWvTU ", false)); - } - - @Test - public void validSegwit() { - // see https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki - assertTrue(BitcoinAddressValidator.validateBech32Segwit("bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4", false)); - assertTrue(BitcoinAddressValidator.validateBech32Segwit("tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx", true)); - assertTrue(BitcoinAddressValidator.validateBech32Segwit("bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qccfmv3", false)); - assertTrue(BitcoinAddressValidator.validateBech32Segwit("tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7", true)); - - assertTrue(BitcoinAddressValidator.validateBech32Segwit("BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4", false)); - assertTrue(BitcoinAddressValidator.validateBech32Segwit("tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7", true)); - assertTrue(BitcoinAddressValidator.validateBech32Segwit("bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7k7grplx", false)); - assertTrue(BitcoinAddressValidator.validateBech32Segwit("BC1SW50QA3JX3S", false)); - assertTrue(BitcoinAddressValidator.validateBech32Segwit("bc1zw508d6qejxtdg4y5r3zarvaryvg6kdaj", false)); - assertTrue(BitcoinAddressValidator.validateBech32Segwit("tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy", true)); - - assertTrue(BitcoinAddressValidator.validateBech32Segwit("bc1q76awjp3nmklgnf0yyu0qncsekktf4e3qj248t4", false)); // electrum blog - - } - - @Test - public void invalidSegwit() { - // see https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki - assertFalse(BitcoinAddressValidator.validateBech32Segwit("tc1qw508d6qejxtdg4y5r3zarvary0c5xw7kg3g4ty", true)); // Invalid human-readable part - assertFalse(BitcoinAddressValidator.validateBech32Segwit("bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t5", true)); // Invalid checksum - assertFalse(BitcoinAddressValidator.validateBech32Segwit("BC13W508D6QEJXTDG4Y5R3ZARVARY0C5XW7KN40WF2", true)); // Invalid witness version - assertFalse(BitcoinAddressValidator.validateBech32Segwit("bc1rw5uspcuh", true)); // Invalid program length - assertFalse(BitcoinAddressValidator.validateBech32Segwit("bc10w508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kw5rljs90", true)); // Invalid program length - assertFalse(BitcoinAddressValidator.validateBech32Segwit("BC1QR508D6QEJXTDG4Y5R3ZARVARYV98GJ9P", true)); // Invalid program length for witness version 0 (per BIP141) - assertFalse(BitcoinAddressValidator.validateBech32Segwit("tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sL5k7", true)); // Mixed case - assertFalse(BitcoinAddressValidator.validateBech32Segwit("bc1zw508d6qejxtdg4y5r3zarvaryvqyzf3du", true)); // zero padding of more than 4 bits - assertFalse(BitcoinAddressValidator.validateBech32Segwit("tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3pjxtptv", true)); // Non-zero padding in 8-to-5 conversion - assertFalse(BitcoinAddressValidator.validateBech32Segwit("bc1gmk9yu", true)); // Empty data section - } -} diff --git a/app/src/test/java/com/m2049r/xmrwallet/util/OpenAliasHelperTest.java b/app/src/test/java/com/m2049r/xmrwallet/util/OpenAliasHelperTest.java index 2f7c5d20..b1062723 100644 --- a/app/src/test/java/com/m2049r/xmrwallet/util/OpenAliasHelperTest.java +++ b/app/src/test/java/com/m2049r/xmrwallet/util/OpenAliasHelperTest.java @@ -39,7 +39,7 @@ public class OpenAliasHelperTest { public void asset() { Map<String, String> attrs = OpenAliasHelper.parse(MONERUJO); assertNotNull(attrs); - assertTrue(BarcodeData.OA_XMR_ASSET.equals(attrs.get(OpenAliasHelper.OA1_ASSET))); + assertTrue("xmr".equals(attrs.get(OpenAliasHelper.OA1_ASSET))); } @Test diff --git a/app/src/test/java/com/m2049r/xmrwallet/util/validator/BitcoinAddressValidatorTest.java b/app/src/test/java/com/m2049r/xmrwallet/util/validator/BitcoinAddressValidatorTest.java new file mode 100644 index 00000000..9696d83d --- /dev/null +++ b/app/src/test/java/com/m2049r/xmrwallet/util/validator/BitcoinAddressValidatorTest.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2017 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. + */ + +package com.m2049r.xmrwallet.util.validator; + +import org.junit.Test; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + + +public class BitcoinAddressValidatorTest { + + @Test + public void validateBTC_shouldValidate() { + assertTrue(BitcoinAddressValidator.validateBTC("2NBMEXXS4v8ubajzfQUjYvh2ptLkxzH8uTC", true)); + assertTrue(BitcoinAddressValidator.validateBTC("2N9fzq66uZYQXp7uqrPBH6jKBhjrgTzpGCy", true)); + assertTrue(BitcoinAddressValidator.validateBTC("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i", false)); + assertTrue(BitcoinAddressValidator.validateBTC("1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9", false)); + assertTrue(BitcoinAddressValidator.validateBTC("3R2MPpTNQLCNs13qnHz89Rm82jQ27bAwft", false)); + assertTrue(BitcoinAddressValidator.validateBTC("34QjytsE8GVRbUBvYNheftqJ5CHfDHvQRD", false)); + assertTrue(BitcoinAddressValidator.validateBTC("3GsAUrD4dnCqtaTTUzzsQWoymHNkEFrgGF", false)); + assertTrue(BitcoinAddressValidator.validateBTC("3NagLCvw8fLwtoUrK7s2mJPy9k6hoyWvTU", false)); + assertTrue(BitcoinAddressValidator.validateBTC("mjn127C5wRQCULksMYMFHLp9UTdQuCfbZ9", true)); + } + + @Test + public void validateBTC_shouldNotValidate() { + assertTrue(BitcoinAddressValidator.validateBTC("3NagLCvw8fLwtoUrK7s2mJPy9k6hoyWvTU", false)); + assertTrue(BitcoinAddressValidator.validateBTC("mjn127C5wRQCULksMYMFHLp9UTdQuCfbZ9", true)); + assertTrue(!BitcoinAddressValidator.validateBTC("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62j", true)); + assertTrue(!BitcoinAddressValidator.validateBTC("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62X", true)); + assertTrue(!BitcoinAddressValidator.validateBTC("1ANNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i", true)); + assertTrue(!BitcoinAddressValidator.validateBTC("1A Na15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i", true)); + assertTrue(!BitcoinAddressValidator.validateBTC("BZbvjr", true)); + assertTrue(!BitcoinAddressValidator.validateBTC("i55j", true)); + assertTrue(!BitcoinAddressValidator.validateBTC("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62!", true)); + assertTrue(!BitcoinAddressValidator.validateBTC("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62iz", false)); + assertTrue(!BitcoinAddressValidator.validateBTC("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62izz", false)); + assertTrue(!BitcoinAddressValidator.validateBTC("1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nJ9", false)); + assertTrue(!BitcoinAddressValidator.validateBTC("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62I", false)); + assertTrue(!BitcoinAddressValidator.validateBTC("3NagLCvw8fLwtoUrK7s2mJPy9k6hoyWvTU ", false)); + assertTrue(!BitcoinAddressValidator.validateBTC(" 3NagLCvw8fLwtoUrK7s2mJPy9k6hoyWvTU ", false)); + } + + @Test + public void validSegwit() { + // see https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki + assertTrue(BitcoinAddressValidator.validateBTC("bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4", false)); + assertTrue(BitcoinAddressValidator.validateBTC("tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx", true)); + assertTrue(BitcoinAddressValidator.validateBTC("bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qccfmv3", false)); + assertTrue(BitcoinAddressValidator.validateBTC("tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7", true)); + + assertTrue(BitcoinAddressValidator.validateBTC("BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4", false)); + assertTrue(BitcoinAddressValidator.validateBTC("tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7", true)); + assertTrue(BitcoinAddressValidator.validateBTC("bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7k7grplx", false)); + assertTrue(BitcoinAddressValidator.validateBTC("BC1SW50QA3JX3S", false)); + assertTrue(BitcoinAddressValidator.validateBTC("bc1zw508d6qejxtdg4y5r3zarvaryvg6kdaj", false)); + assertTrue(BitcoinAddressValidator.validateBTC("tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy", true)); + + assertTrue(BitcoinAddressValidator.validateBTC("bc1q76awjp3nmklgnf0yyu0qncsekktf4e3qj248t4", false)); // electrum blog + + } + + @Test + public void invalidSegwit() { + // see https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki + assertFalse(BitcoinAddressValidator.validateBTC("tc1qw508d6qejxtdg4y5r3zarvary0c5xw7kg3g4ty", true)); // Invalid human-readable part + assertFalse(BitcoinAddressValidator.validateBTC("bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t5", true)); // Invalid checksum + assertFalse(BitcoinAddressValidator.validateBTC("BC13W508D6QEJXTDG4Y5R3ZARVARY0C5XW7KN40WF2", true)); // Invalid witness version + assertFalse(BitcoinAddressValidator.validateBTC("bc1rw5uspcuh", true)); // Invalid program length + assertFalse(BitcoinAddressValidator.validateBTC("bc10w508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kw5rljs90", true)); // Invalid program length + assertFalse(BitcoinAddressValidator.validateBTC("BC1QR508D6QEJXTDG4Y5R3ZARVARYV98GJ9P", true)); // Invalid program length for witness version 0 (per BIP141) + assertFalse(BitcoinAddressValidator.validateBTC("tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sL5k7", true)); // Mixed case + assertFalse(BitcoinAddressValidator.validateBTC("bc1zw508d6qejxtdg4y5r3zarvaryvqyzf3du", true)); // zero padding of more than 4 bits + assertFalse(BitcoinAddressValidator.validateBTC("tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3pjxtptv", true)); // Non-zero padding in 8-to-5 conversion + assertFalse(BitcoinAddressValidator.validateBTC("bc1gmk9yu", true)); // Empty data section + } + + @Test + public void validateLTC_shouldValidate() { + assertTrue(BitcoinAddressValidator.validate("ltc1qmgne2vzyk9c9zk7mak6u5gy02h242f5498pnsd", BitcoinAddressType.LTC, false)); + assertTrue(BitcoinAddressValidator.validate("M9pTFxP6MPTZT61EeNJcmenqR5G8gD3m9a", BitcoinAddressType.LTC, false)); + assertTrue(BitcoinAddressValidator.validate("LfiJ12PCWSFrRxoPiemiSXLUkT74oXWMv6", BitcoinAddressType.LTC, false)); + + assertTrue(BitcoinAddressValidator.validate("ltc1qwg8d8240h8y8mcrn7j56mz9896y24rzdevf978", BitcoinAddressType.LTC, false)); + assertTrue(BitcoinAddressValidator.validate("ltc1qmqhg2ynwzdxphrw786xwkv5sl62xkwljpmas0y", BitcoinAddressType.LTC, false)); + assertTrue(BitcoinAddressValidator.validate("ltc1qz67ddnsl92r6skfrxyk2u4dv7qdy9zxpepn0vm", BitcoinAddressType.LTC, false)); + assertTrue(BitcoinAddressValidator.validate("ltc1qffjjuwfgylx685s00yfjk9l0mx4jsp7xvwwvqr", BitcoinAddressType.LTC, false)); + + assertTrue(BitcoinAddressValidator.validate("LZNhSpMWsczM4VWm7poPVCLHf1iwmXynAn", BitcoinAddressType.LTC, false)); + assertTrue(BitcoinAddressValidator.validate("MFAECqt8RD3t4CeGLhteCCHAaK9KzNqvec", BitcoinAddressType.LTC, false)); + } + + @Test + public void validateLTC_shouldNotValidate() { + assertFalse(BitcoinAddressValidator.validate("bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4", BitcoinAddressType.LTC, false)); + assertFalse(BitcoinAddressValidator.validate("2N9fzq66uZYQXp7uqrPBH6jKBhjrgTzpGCy", BitcoinAddressType.LTC, false)); + } + + @Test + public void validateDASH_shouldValidate() { + assertTrue(BitcoinAddressValidator.validate("XoSxpd5VYNQvKbXbEaDKt6P1aZANzAkXrJ", BitcoinAddressType.DASH, false)); + assertTrue(BitcoinAddressValidator.validate("Xgxd38qtwqEJDLJK1gSyzLWVtgTV26foGK", BitcoinAddressType.DASH, false)); + assertTrue(BitcoinAddressValidator.validate("XkfCmxuMwU8DSeUpEMqfmjz4QWyhebwPCD", BitcoinAddressType.DASH, false)); + } + + @Test + public void validateDASH_shouldNotValidate() { + assertFalse(BitcoinAddressValidator.validate("XkfCmxuMwU8DSeUpEMqfmjz4QWyhebwPCd", BitcoinAddressType.DASH, false)); + assertFalse(BitcoinAddressValidator.validate("2N9fzq66uZYQXp7uqrPBH6jKBhjrgTzpGCy", BitcoinAddressType.DASH, false)); + } + + @Test + public void validateDOGE_shouldValidate() { + assertTrue(BitcoinAddressValidator.validate("DPpJVPpvPNP6i6tMj4rTycAGh8wReTqaSU", BitcoinAddressType.DOGE, false)); + assertTrue(BitcoinAddressValidator.validate("DPS6iZj7roHquvwRYXNBua9QtKPzigUUhM", BitcoinAddressType.DOGE, false)); + assertTrue(BitcoinAddressValidator.validate("DFs6qrdCp4K4evv6jU5R3y2WjaWQbXzGsX", BitcoinAddressType.DOGE, false)); + } + + @Test + public void validateDOGE_shouldNotValidate() { + assertFalse(BitcoinAddressValidator.validate("Xgxd38qtwqEJDLJK1gSyzLWVtgTV26foGK", BitcoinAddressType.DOGE, false)); + assertFalse(BitcoinAddressValidator.validate("M9pTFxP6MPTZT61EeNJcmenqR5G8gD3m9a", BitcoinAddressType.DOGE, false)); + } +} diff --git a/app/src/test/java/com/m2049r/xmrwallet/util/validator/EthAddressValidatorTest.java b/app/src/test/java/com/m2049r/xmrwallet/util/validator/EthAddressValidatorTest.java new file mode 100644 index 00000000..4dfc2324 --- /dev/null +++ b/app/src/test/java/com/m2049r/xmrwallet/util/validator/EthAddressValidatorTest.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2017 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. + */ + +package com.m2049r.xmrwallet.util.validator; + +import org.junit.Test; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + + +public class EthAddressValidatorTest { + + @Test + public void validateETH_shouldValidate() { + assertTrue(EthAddressValidator.validate("0x52d1d0de32322ec51c923b3d4d6c5ffcfcfa01a4")); + assertTrue(EthAddressValidator.validate("0x74c287ad5328daca276c6a1c1f149415b12c148d")); + assertTrue(EthAddressValidator.validate("0x12ae66cdc592e10b60f9097a7b0d3c59fce29876")); + assertTrue(EthAddressValidator.validate("0x12AE66CDc592e10B60f9097a7b0D3C59fce29876")); + assertTrue(EthAddressValidator.validate("0x541071beFDD2e68deaFb4889c8fdf005Bfdf2fb7")); + } + + @Test + public void validateETH_shouldNotValidate() { + assertFalse(EthAddressValidator.validate("0x12AE66CDc592e10B60f9097a7b0d3C59fce29876")); + assertFalse(EthAddressValidator.validate("052d1d0de32322ec51c923b3d4d6c5ffcfcfa01a4")); + assertFalse(EthAddressValidator.validate("x74c287ad5328daca276c6a1c1f149415b12c148d")); + assertFalse(EthAddressValidator.validate("12ae66cdc592e10b60f9097a7b0d3c59fce29876")); + assertFalse(EthAddressValidator.validate("0x12ae66cdc592e10b60f9097a7b0d3c59fce2987")); + assertFalse(EthAddressValidator.validate("0x12ae66cdc592e10b60f9097a7b0d3c59fce2987 ")); + assertFalse(EthAddressValidator.validate(" x12ae66cdc592e10b60f9097a7b0d3c59fce2987 ")); + } +}