From 822128c4c6f58e4f856c2217fe7ffbca7c495a20 Mon Sep 17 00:00:00 2001 From: pokkst Date: Fri, 16 Sep 2022 23:51:14 -0500 Subject: [PATCH] Add support for launching app from Monero URI --- app/src/main/AndroidManifest.xml | 8 +++ .../com/m2049r/xmrwallet/MainActivity.java | 22 ++++++++ .../dialog/SendBottomSheetDialog.java | 36 ++++++------- .../xmrwallet/fragment/home/HomeFragment.java | 3 ++ .../com/m2049r/xmrwallet/util/UriData.java | 54 +++++++++++++++++++ 5 files changed, 102 insertions(+), 21 deletions(-) create mode 100644 app/src/main/java/com/m2049r/xmrwallet/util/UriData.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e0ea990..fb29478 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,6 +24,14 @@ + + + + + + + + { Context ctx = getContext(); if (ctx != null) { @@ -236,27 +246,11 @@ public class SendBottomSheetDialog extends BottomSheetDialogFragment { } private void pasteAddress(String address) { - HashMap params = new HashMap<>(); - String[] uriParts = address.replace(Constants.URI_PREFIX, "").split("\\?"); - String finalAddress = uriParts[0]; - String queryParams = ""; - if(uriParts.length > 1) { - queryParams = uriParts[1]; - String[] queryParts = queryParams.split("&"); - for (String param : queryParts) { - String[] paramParts = param.split("="); - String variable = paramParts[0]; - String value = paramParts[1]; - params.put(variable, value); - } - } - boolean isValid = Wallet.isAddressValid(finalAddress); - if (isValid) { - addressEditText.setText(finalAddress); - if(!params.isEmpty()) { - if(params.containsKey(Constants.URI_ARG_AMOUNT)) { - amountEditText.setText(params.get(Constants.URI_ARG_AMOUNT)); - } + UriData uriData = UriData.parse(address); + if (uriData != null) { + addressEditText.setText(uriData.getAddress()); + if(uriData.hasAmount()) { + amountEditText.setText(uriData.getAmount()); } } else { Toast.makeText(getActivity(), getString(R.string.send_address_invalid), Toast.LENGTH_SHORT).show(); diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/home/HomeFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/home/HomeFragment.java index 08f5a4a..cc322bb 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/fragment/home/HomeFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/home/HomeFragment.java @@ -1,5 +1,7 @@ package com.m2049r.xmrwallet.fragment.home; +import android.content.Intent; +import android.net.Uri; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -30,6 +32,7 @@ import com.m2049r.xmrwallet.model.WalletManager; import com.m2049r.xmrwallet.service.BalanceService; import com.m2049r.xmrwallet.service.BlockchainService; import com.m2049r.xmrwallet.service.HistoryService; +import com.m2049r.xmrwallet.util.UriData; import java.util.Collections; diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/UriData.java b/app/src/main/java/com/m2049r/xmrwallet/util/UriData.java new file mode 100644 index 0000000..60fd2be --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/util/UriData.java @@ -0,0 +1,54 @@ +package com.m2049r.xmrwallet.util; + +import com.m2049r.xmrwallet.model.Wallet; + +import java.util.HashMap; + +public class UriData { + private final String address; + private final HashMap params; + + public UriData(String address, HashMap params) { + this.address = address; + this.params = params; + } + + public HashMap getParams() { + return params; + } + + public String getAddress() { + return address; + } + + public String getAmount() { + return params.get(Constants.URI_ARG_AMOUNT); + } + + public boolean hasAmount() { + return params.containsKey(Constants.URI_ARG_AMOUNT); + } + + public static UriData parse(String uri) { + HashMap params = new HashMap<>(); + String[] uriParts = uri.replace(Constants.URI_PREFIX, "").split("\\?"); + String finalAddress = uriParts[0]; + String queryParams = ""; + if(uriParts.length > 1) { + queryParams = uriParts[1]; + String[] queryParts = queryParams.split("&"); + for (String param : queryParts) { + String[] paramParts = param.split("="); + String variable = paramParts[0]; + String value = paramParts[1]; + params.put(variable, value); + } + } + boolean valid = Wallet.isAddressValid(finalAddress); + if(valid) { + return new UriData(finalAddress, params); + } else { + return null; + } + } +}