Add support for launching app from Monero URI

This commit is contained in:
pokkst 2022-09-16 23:51:14 -05:00
parent f17bd07d67
commit 822128c4c6
No known key found for this signature in database
GPG key ID: 90C2ED85E67A50FF
5 changed files with 102 additions and 21 deletions

View file

@ -24,6 +24,14 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="monero" />
</intent-filter>
</activity>
<activity
android:name="com.journeyapps.barcodescanner.CaptureActivity"

View file

@ -1,5 +1,7 @@
package com.m2049r.xmrwallet;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.widget.Toast;
@ -11,6 +13,7 @@ import androidx.fragment.app.FragmentManager;
import androidx.navigation.fragment.NavHostFragment;
import com.m2049r.xmrwallet.fragment.dialog.PasswordBottomSheetDialog;
import com.m2049r.xmrwallet.fragment.dialog.SendBottomSheetDialog;
import com.m2049r.xmrwallet.livedata.SingleLiveEvent;
import com.m2049r.xmrwallet.model.Wallet;
import com.m2049r.xmrwallet.model.WalletManager;
@ -22,6 +25,7 @@ import com.m2049r.xmrwallet.service.MoneroHandlerThread;
import com.m2049r.xmrwallet.service.PrefService;
import com.m2049r.xmrwallet.service.TxService;
import com.m2049r.xmrwallet.util.Constants;
import com.m2049r.xmrwallet.util.UriData;
import java.io.File;
@ -33,6 +37,9 @@ public class MainActivity extends AppCompatActivity implements MoneroHandlerThre
private HistoryService historyService = null;
private BlockchainService blockchainService = null;
private boolean proceedToSend = false;
private UriData uriData = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@ -48,6 +55,15 @@ public class MainActivity extends AppCompatActivity implements MoneroHandlerThre
passwordDialog.listener = this;
passwordDialog.show(getSupportFragmentManager(), "password_dialog");
}
Intent intent = getIntent();
Uri uri = intent.getData();
if(uri != null) {
uriData = UriData.parse(uri.toString());
if (uriData != null) {
proceedToSend = true;
}
}
} else {
navigate(R.id.onboarding_fragment);
}
@ -101,6 +117,12 @@ public class MainActivity extends AppCompatActivity implements MoneroHandlerThre
File walletFile = new File(getApplicationInfo().dataDir, Constants.WALLET_NAME);
init(walletFile, password);
restartEvents.call();
if(proceedToSend) {
SendBottomSheetDialog sendDialog = new SendBottomSheetDialog();
sendDialog.uriData = uriData;
sendDialog.show(getSupportFragmentManager(), null);
}
}
@Override

View file

@ -31,6 +31,7 @@ import com.m2049r.xmrwallet.service.BalanceService;
import com.m2049r.xmrwallet.service.TxService;
import com.m2049r.xmrwallet.util.Constants;
import com.m2049r.xmrwallet.util.Helper;
import com.m2049r.xmrwallet.util.UriData;
import java.util.HashMap;
import java.util.List;
@ -65,6 +66,8 @@ public class SendBottomSheetDialog extends BottomSheetDialogFragment {
private ImageButton pasteAddressImageButton;
private ImageButton scanAddressImageButton;
public UriData uriData = null;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.send_bottom_sheet_dialog, null);
@ -85,6 +88,13 @@ public class SendBottomSheetDialog extends BottomSheetDialogFragment {
addressTextView = view.findViewById(R.id.address_pending_textview);
amountTextView = view.findViewById(R.id.amount_pending_textview);
if (uriData != null) {
addressEditText.setText(uriData.getAddress());
if(uriData.hasAmount()) {
amountEditText.setText(uriData.getAmount());
}
}
pasteAddressImageButton.setOnClickListener(view1 -> {
Context ctx = getContext();
if (ctx != null) {
@ -236,27 +246,11 @@ public class SendBottomSheetDialog extends BottomSheetDialogFragment {
}
private void pasteAddress(String address) {
HashMap<String, String> 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();

View file

@ -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;

View file

@ -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<String, String> params;
public UriData(String address, HashMap<String, String> params) {
this.address = address;
this.params = params;
}
public HashMap<String, String> 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<String, String> 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;
}
}
}