tweaks to barcode/tag reading (#494)

- deal with empty payment_id
- use btc message as description
- BarcodeData is final
This commit is contained in:
m2049r 2018-12-02 10:23:07 +01:00 committed by GitHub
parent 94f87a5193
commit 7e9bf84640
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 42 additions and 26 deletions

View File

@ -38,6 +38,7 @@ public class BarcodeData {
public static final String OA_BTC_ASSET = "btc"; public static final String OA_BTC_ASSET = "btc";
static final String BTC_SCHEME = "bitcoin:"; static final String BTC_SCHEME = "bitcoin:";
static final String BTC_DESCRIPTION = "message";
static final String BTC_AMOUNT = "amount"; static final String BTC_AMOUNT = "amount";
public enum Asset { public enum Asset {
@ -50,28 +51,32 @@ public class BarcodeData {
OA_DNSSEC OA_DNSSEC
} }
public Asset asset = null; final public Asset asset;
public String addressName = null; final public String address;
public String address = null; final public String addressName;
public String paymentId = null; final public String paymentId;
public String amount = null; final public String amount;
public String description = null; final public String description;
public Security security = Security.NORMAL; final public Security security;
public BarcodeData(String uri) {
this.asset = asset;
this.address = address;
}
public BarcodeData(Asset asset, String address) { public BarcodeData(Asset asset, String address) {
this.asset = asset; this.asset = asset;
this.address = address; this.address = address;
amount = null;
paymentId = null;
addressName = null;
description = null;
this.security = Security.NORMAL;
} }
public BarcodeData(Asset asset, String address, String amount) { public BarcodeData(Asset asset, String address, String amount) {
this.asset = asset; this.asset = asset;
this.address = address; this.address = address;
this.amount = amount; this.amount = amount;
paymentId = null;
addressName = null;
description = null;
this.security = Security.NORMAL;
} }
public BarcodeData(Asset asset, String address, String paymentId, String amount) { public BarcodeData(Asset asset, String address, String paymentId, String amount) {
@ -79,6 +84,9 @@ public class BarcodeData {
this.address = address; this.address = address;
this.paymentId = paymentId; this.paymentId = paymentId;
this.amount = amount; this.amount = amount;
addressName = null;
description = null;
this.security = Security.NORMAL;
} }
public BarcodeData(Asset asset, String address, String paymentId, String description, String amount) { public BarcodeData(Asset asset, String address, String paymentId, String description, String amount) {
@ -87,14 +95,18 @@ public class BarcodeData {
this.paymentId = paymentId; this.paymentId = paymentId;
this.description = description; this.description = description;
this.amount = amount; this.amount = amount;
addressName = null;
this.security = Security.NORMAL;
} }
public void setAddressName(String name) { public BarcodeData(Asset asset, String address, String addressName, String paymentId, String description, String amount, Security sec) {
addressName = name; this.asset = asset;
} this.address = address;
this.addressName = addressName;
public void setSecurity(Security security) { this.paymentId = paymentId;
this.security = security; this.description = description;
this.amount = amount;
this.security = sec;
} }
public Uri getUri() { public Uri getUri() {
@ -140,7 +152,7 @@ public class BarcodeData {
} }
// check for OpenAlias // check for OpenAlias
if (bcData == null) { if (bcData == null) {
bcData = parseOpenAlias(qrCode); bcData = parseOpenAlias(qrCode, false);
} }
return bcData; return bcData;
} }
@ -175,7 +187,11 @@ public class BarcodeData {
} }
} }
String address = monero.getPath(); String address = monero.getPath();
String paymentId = parms.get(XMR_PAYMENTID); String paymentId = parms.get(XMR_PAYMENTID);
// deal with empty payment_id created by non-spec-conforming apps
if ((paymentId != null) && paymentId.isEmpty()) paymentId = null;
String description = parms.get(XMR_DESCRIPTION); String description = parms.get(XMR_DESCRIPTION);
String amount = parms.get(XMR_AMOUNT); String amount = parms.get(XMR_AMOUNT);
if (amount != null) { if (amount != null) {
@ -235,6 +251,7 @@ public class BarcodeData {
} }
} }
String address = bitcoin.getPath(); String address = bitcoin.getPath();
String description = parms.get(BTC_DESCRIPTION);
String amount = parms.get(BTC_AMOUNT); String amount = parms.get(BTC_AMOUNT);
if (amount != null) { if (amount != null) {
try { try {
@ -248,7 +265,7 @@ public class BarcodeData {
Timber.d("address invalid"); Timber.d("address invalid");
return null; return null;
} }
return new BarcodeData(BarcodeData.Asset.BTC, address, amount); return new BarcodeData(BarcodeData.Asset.BTC, address, null, description, amount);
} }
static public BarcodeData parseBitcoinNaked(String address) { static public BarcodeData parseBitcoinNaked(String address) {
@ -264,7 +281,7 @@ public class BarcodeData {
return new BarcodeData(BarcodeData.Asset.BTC, address); return new BarcodeData(BarcodeData.Asset.BTC, address);
} }
static public BarcodeData parseOpenAlias(String oaString) { static public BarcodeData parseOpenAlias(String oaString, boolean dnssec) {
Timber.d("parseOpenAlias=%s", oaString); Timber.d("parseOpenAlias=%s", oaString);
if (oaString == null) return null; if (oaString == null) return null;
@ -316,8 +333,8 @@ public class BarcodeData {
return null; return null;
} }
BarcodeData bc = new BarcodeData(asset, address, paymentId, description, amount); Security sec = dnssec ? BarcodeData.Security.OA_DNSSEC : BarcodeData.Security.OA_NO_DNSSEC;
bc.setAddressName(addressName);
return bc; return new BarcodeData(asset, address, addressName, paymentId, description, amount, sec);
} }
} }

View File

@ -140,9 +140,8 @@ public class OpenAliasHelper {
if (success) { if (success) {
Map<BarcodeData.Asset, BarcodeData> dataMap = new HashMap<>(); Map<BarcodeData.Asset, BarcodeData> dataMap = new HashMap<>();
for (String txt : txts) { for (String txt : txts) {
BarcodeData bc = BarcodeData.parseOpenAlias(txt); BarcodeData bc = BarcodeData.parseOpenAlias(txt, dnssec);
if (bc != null) { if (bc != null) {
bc.setSecurity(dnssec ? BarcodeData.Security.OA_DNSSEC : BarcodeData.Security.OA_NO_DNSSEC);
if (!dataMap.containsKey(bc.asset)) { if (!dataMap.containsKey(bc.asset)) {
dataMap.put(bc.asset, bc); dataMap.put(bc.asset, bc);
} }