From a37ca4c0e56070a1cee076d0e6b4a1369b2b4d55 Mon Sep 17 00:00:00 2001 From: m2049r <30435443+m2049r@users.noreply.github.com> Date: Sat, 19 Aug 2017 18:59:38 +0200 Subject: [PATCH] tweaks + sweep --- app/src/main/cpp/monerujo.cpp | 7 +++- .../com/m2049r/xmrwallet/SendFragment.java | 42 ++++++++++++++++++- .../com/m2049r/xmrwallet/WalletActivity.java | 35 +++++++++++++++- .../com/m2049r/xmrwallet/WalletFragment.java | 4 +- .../xmrwallet/model/TransactionInfo.java | 2 +- .../com/m2049r/xmrwallet/model/Wallet.java | 10 ++++- .../xmrwallet/service/WalletService.java | 16 +++++++ .../main/res/layout/gen_review_fragment.xml | 38 +++++++++++++++++ app/src/main/res/layout/send_fragment.xml | 5 ++- app/src/main/res/values/strings.xml | 4 ++ 10 files changed, 154 insertions(+), 9 deletions(-) diff --git a/app/src/main/cpp/monerujo.cpp b/app/src/main/cpp/monerujo.cpp index 1658d3d..420affc 100644 --- a/app/src/main/cpp/monerujo.cpp +++ b/app/src/main/cpp/monerujo.cpp @@ -773,7 +773,12 @@ Java_com_m2049r_xmrwallet_model_Wallet_createTransactionJ(JNIEnv *env, jobject i return reinterpret_cast(tx); } -//virtual PendingTransaction * createSweepUnmixableTransaction() = 0; +JNIEXPORT jlong JNICALL +Java_com_m2049r_xmrwallet_model_Wallet_createSweepUnmixableTransactionJ(JNIEnv *env, jobject instance) { + Bitmonero::Wallet *wallet = getHandle(env, instance); + Bitmonero::PendingTransaction *tx = wallet->createSweepUnmixableTransaction(); + return reinterpret_cast(tx); +} //virtual UnsignedTransaction * loadUnsignedTx(const std::string &unsigned_filename) = 0; //virtual bool submitTransaction(const std::string &fileName) = 0; diff --git a/app/src/main/java/com/m2049r/xmrwallet/SendFragment.java b/app/src/main/java/com/m2049r/xmrwallet/SendFragment.java index dc82e01..7e5dc44 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/SendFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/SendFragment.java @@ -51,6 +51,7 @@ public class SendFragment extends Fragment { Spinner sMixin; Spinner sPriority; Button bPrepareSend; + Button bPaymentId; LinearLayout llConfirmSend; TextView tvTxAmount; TextView tvTxFee; @@ -77,6 +78,7 @@ public class SendFragment extends Fragment { etAmount = (EditText) view.findViewById(R.id.etAmount); bSweep = (Button) view.findViewById(R.id.bSweep); bPrepareSend = (Button) view.findViewById(R.id.bPrepareSend); + bPaymentId = (Button) view.findViewById(R.id.bPaymentId); llConfirmSend = (LinearLayout) view.findViewById(R.id.llConfirmSend); tvTxAmount = (TextView) view.findViewById(R.id.tvTxAmount); @@ -177,6 +179,22 @@ public class SendFragment extends Fragment { } }); + bPaymentId.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + etPaymentId.setText((activityCallback.generatePaymentId())); + } + }); + + bSweep.setOnClickListener(new View.OnClickListener() + + { + @Override + public void onClick(View v) { + Helper.hideKeyboard(getActivity()); + prepareSweep(); + } + }); bSend.setOnClickListener(new View.OnClickListener() @@ -212,8 +230,8 @@ public class SendFragment extends Fragment { } private boolean paymentIdOk() { - String spendKey = etPaymentId.getText().toString(); - return ((spendKey.length() == 0) || ((spendKey.length() == 64) && (spendKey.matches("^[0-9a-fA-F]+$")))); + String paymentId = etPaymentId.getText().toString(); + return paymentId.isEmpty() || activityCallback.isPaymentIdValid(paymentId); } private void prepareSend() { @@ -236,12 +254,22 @@ public class SendFragment extends Fragment { activityCallback.onPrepareSend(txData); } + private void prepareSweep() { + etAddress.setText(activityCallback.getWalletAddress()); + etPaymentId.setText(""); + etAmount.setText(""); + disableEdit(); + showProgress(); + activityCallback.onPrepareSweep(); + } + private void disableEdit() { sMixin.setEnabled(false); sPriority.setEnabled(false); etAddress.setEnabled(false); etPaymentId.setEnabled(false); etAmount.setEnabled(false); + bPaymentId.setEnabled(false); bSweep.setEnabled(false); bPrepareSend.setEnabled(false); } @@ -252,11 +280,13 @@ public class SendFragment extends Fragment { etAddress.setEnabled(true); etPaymentId.setEnabled(true); etAmount.setEnabled(true); + bPaymentId.setEnabled(true); bSweep.setEnabled(true); bPrepareSend.setEnabled(true); } private void send() { + disableEdit(); // prevent this being sent more than once activityCallback.onSend(); } @@ -265,8 +295,16 @@ public class SendFragment extends Fragment { public interface Listener { void onPrepareSend(TxData data); + void onPrepareSweep(); + void onSend(); + String generatePaymentId(); + + boolean isPaymentIdValid(String paymentId); + + String getWalletAddress(); + } @Override diff --git a/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java b/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java index 5106bf6..eb18d89 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java +++ b/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java @@ -66,7 +66,6 @@ public class WalletActivity extends AppCompatActivity implements WalletFragment. protected void onStart() { super.onStart(); Log.d(TAG, "onStart()"); - this.synced = false; // init syncing logic } private void startWalletService() { @@ -137,6 +136,13 @@ public class WalletActivity extends AppCompatActivity implements WalletFragment. mBoundService = ((WalletService.WalletServiceBinder) service).getService(); //Log.d(TAG, "setting observer of " + mBoundService); mBoundService.setObserver(WalletActivity.this); + Bundle extras = getIntent().getExtras(); + if (extras != null) { + String walletId = extras.getString(REQUEST_ID); + if (walletId != null) { + setTitle(walletId); + } + } updateProgress(); //TODO show current pbProgress (eg. if the service is already busy saving last wallet) Log.d(TAG, "CONNECTED"); @@ -421,6 +427,33 @@ public class WalletActivity extends AppCompatActivity implements WalletFragment. } } + @Override + public void onPrepareSweep() { + if (mIsBound) { // no point in talking to unbound service + Intent intent = new Intent(getApplicationContext(), WalletService.class); + intent.putExtra(WalletService.REQUEST, WalletService.REQUEST_CMD_SWEEP); + startService(intent); + Log.d(TAG, "SWEEP TX request sent"); + } else { + Log.e(TAG, "Service not bound"); + } + } + + @Override + public String generatePaymentId() { + return getWallet().generatePaymentId(); + } + + @Override + public boolean isPaymentIdValid(String paymentId) { + return getWallet().isPaymentIdValid(paymentId); + } + + @Override + public String getWalletAddress() { + return getWallet().getAddress(); + } + void popFragmentStack(String name) { if (name == null) { getFragmentManager().popBackStack(); diff --git a/app/src/main/java/com/m2049r/xmrwallet/WalletFragment.java b/app/src/main/java/com/m2049r/xmrwallet/WalletFragment.java index b2e804d..914f013 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/WalletFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/WalletFragment.java @@ -106,7 +106,9 @@ public class WalletFragment extends Fragment implements TransactionInfoAdapter.O AlertDialog.Builder builder = new AlertDialog.Builder(ctx); builder.setTitle("Transaction details"); - infoItem.txKey = activityCallback.getTxKey(infoItem.hash); + if (infoItem.txKey == null) { + infoItem.txKey = activityCallback.getTxKey(infoItem.hash); + } builder.setPositiveButton("Copy TX ID", new DialogInterface.OnClickListener() { @Override diff --git a/app/src/main/java/com/m2049r/xmrwallet/model/TransactionInfo.java b/app/src/main/java/com/m2049r/xmrwallet/model/TransactionInfo.java index f278670..d7c4331 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/model/TransactionInfo.java +++ b/app/src/main/java/com/m2049r/xmrwallet/model/TransactionInfo.java @@ -40,7 +40,7 @@ public class TransactionInfo { public long confirmations; public List transfers; - public String txKey; + public String txKey = null; public TransactionInfo( int direction, diff --git a/app/src/main/java/com/m2049r/xmrwallet/model/Wallet.java b/app/src/main/java/com/m2049r/xmrwallet/model/Wallet.java index 99ac4d9..e96c27c 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/model/Wallet.java +++ b/app/src/main/java/com/m2049r/xmrwallet/model/Wallet.java @@ -188,7 +188,15 @@ public class Wallet { long mount, int mixin_count, PendingTransaction.Priority priority); -//virtual PendingTransaction * createSweepUnmixableTransaction() = 0; + + public PendingTransaction createSweepUnmixableTransaction() { + disposePendingTransaction(); + long txHandle = createSweepUnmixableTransactionJ(); + pendingTransaction = new PendingTransaction(txHandle); + return pendingTransaction; + } + + private native long createSweepUnmixableTransactionJ(); //virtual UnsignedTransaction * loadUnsignedTx(const std::string &unsigned_filename) = 0; //virtual bool submitTransaction(const std::string &fileName) = 0; diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/WalletService.java b/app/src/main/java/com/m2049r/xmrwallet/service/WalletService.java index 4b38bae..02e201b 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/service/WalletService.java +++ b/app/src/main/java/com/m2049r/xmrwallet/service/WalletService.java @@ -50,6 +50,8 @@ public class WalletService extends Service { public static final String REQUEST_CMD_TX = "createTX"; public static final String REQUEST_CMD_TX_DATA = "data"; + public static final String REQUEST_CMD_SWEEP = "sweepTX"; + public static final String REQUEST_CMD_SEND = "send"; public static final int START_SERVICE = 1; @@ -295,6 +297,20 @@ public class WalletService extends Service { } else { myWallet.disposePendingTransaction(); } + } else if (cmd.equals(REQUEST_CMD_SWEEP)) { + Wallet myWallet = getWallet(); + Log.d(TAG, "SWEEP TX for wallet: " + myWallet.getName()); + PendingTransaction pendingTransaction = myWallet.createSweepUnmixableTransaction(); + PendingTransaction.Status status = pendingTransaction.getStatus(); + Log.d(TAG, "transaction status " + status); + if (status != PendingTransaction.Status.Status_Ok) { + Log.d(TAG, "Create Transaction failed: " + pendingTransaction.getErrorString()); + } + if (observer != null) { + observer.onCreatedTransaction(pendingTransaction); + } else { + myWallet.disposePendingTransaction(); + } } else if (cmd.equals(REQUEST_CMD_SEND)) { Wallet myWallet = getWallet(); Log.d(TAG, "SEND TX for wallet: " + myWallet.getName()); diff --git a/app/src/main/res/layout/gen_review_fragment.xml b/app/src/main/res/layout/gen_review_fragment.xml index a58744e..6d0a55e 100644 --- a/app/src/main/res/layout/gen_review_fragment.xml +++ b/app/src/main/res/layout/gen_review_fragment.xml @@ -158,4 +158,42 @@ android:text="@string/generate_button_accept" android:visibility="gone" /> + + + + +