diff --git a/app/src/main/cpp/monerujo.cpp b/app/src/main/cpp/monerujo.cpp index 1470cd3..1e1a045 100644 --- a/app/src/main/cpp/monerujo.cpp +++ b/app/src/main/cpp/monerujo.cpp @@ -848,6 +848,31 @@ Java_com_m2049r_xmrwallet_model_Wallet_createTransactionJ(JNIEnv *env, jobject i return reinterpret_cast(tx); } +JNIEXPORT jlong JNICALL +Java_com_m2049r_xmrwallet_model_Wallet_createSweepTransaction(JNIEnv *env, jobject instance, + jstring dst_addr, jstring payment_id, + jint mixin_count, + jint priority, + jint accountIndex) { + + const char *_dst_addr = env->GetStringUTFChars(dst_addr, NULL); + const char *_payment_id = env->GetStringUTFChars(payment_id, NULL); + Bitmonero::PendingTransaction::Priority _priority = + static_cast(priority); + Bitmonero::Wallet *wallet = getHandle(env, instance); + + Monero::optional empty; + + Bitmonero::PendingTransaction *tx = wallet->createTransaction(_dst_addr, _payment_id, + empty, (uint32_t) mixin_count, + _priority, + (uint32_t) accountIndex); + + env->ReleaseStringUTFChars(dst_addr, _dst_addr); + env->ReleaseStringUTFChars(payment_id, _payment_id); + return reinterpret_cast(tx); +} + JNIEXPORT jlong JNICALL Java_com_m2049r_xmrwallet_model_Wallet_createSweepUnmixableTransactionJ(JNIEnv *env, jobject instance) { 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 2ea8207..4e75a11 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 @@ -20,6 +20,9 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.TextView; import com.m2049r.xmrwallet.R; @@ -57,8 +60,10 @@ public class SendAmountWizardFragment extends SendWizardFragment { private TextView tvFunds; private ExchangeTextView evAmount; - //private Button bSendAll; private NumberPadView numberPad; + private View llAmount; + private View ivSweep; + private ImageButton ibSweep; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -76,34 +81,62 @@ public class SendAmountWizardFragment extends SendWizardFragment { numberPad = (NumberPadView) view.findViewById(R.id.numberPad); numberPad.setListener(evAmount); - /* - bSendAll = (Button) view.findViewById(R.id.bSendAll); - bSendAll.setOnClickListener(new View.OnClickListener() { + llAmount = view.findViewById(R.id.llAmount); + ivSweep = view.findViewById(R.id.ivSweep); + ivSweep.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - // TODO: send all - figure out how to display this + sweepAll(false); + } + }); + + ibSweep = (ImageButton) view.findViewById(R.id.ibSweep); + + ibSweep.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + sweepAll(true); } }); -*/ Helper.hideKeyboard(getActivity()); return view; } + private boolean spendAllMode = false; + + private void sweepAll(boolean spendAllMode) { + if (spendAllMode) { + ibSweep.setVisibility(View.INVISIBLE); + llAmount.setVisibility(View.GONE); + ivSweep.setVisibility(View.VISIBLE); + } else { + ibSweep.setVisibility(View.VISIBLE); + llAmount.setVisibility(View.VISIBLE); + ivSweep.setVisibility(View.GONE); + } + this.spendAllMode = spendAllMode; + } @Override public boolean onValidateFields() { - if (!evAmount.validate(maxFunds)) { - return false; - } + if (spendAllMode) { + if (sendListener != null) { + sendListener.getTxData().setAmount(Wallet.SWEEP_ALL); + } + } else { + if (!evAmount.validate(maxFunds)) { + return false; + } - if (sendListener != null) { - String xmr = evAmount.getAmount(); - if (xmr != null) { - sendListener.getTxData().setAmount(Wallet.getAmountFromString(xmr)); - } else { - sendListener.getTxData().setAmount(0L); + if (sendListener != null) { + String xmr = evAmount.getAmount(); + if (xmr != null) { + sendListener.getTxData().setAmount(Wallet.getAmountFromString(xmr)); + } else { + sendListener.getTxData().setAmount(0L); + } } } return true; 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 a7a1eac..09dcdca 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/model/Wallet.java +++ b/app/src/main/java/com/m2049r/xmrwallet/model/Wallet.java @@ -23,6 +23,8 @@ import java.io.File; import timber.log.Timber; public class Wallet { + final static public long SWEEP_ALL = Long.MAX_VALUE; + static { System.loadLibrary("monerujo"); } @@ -231,8 +233,12 @@ public class Wallet { PendingTransaction.Priority priority) { disposePendingTransaction(); int _priority = priority.getValue(); - long txHandle = createTransactionJ(dst_addr, payment_id, amount, mixin_count, _priority, - accountIndex); + long txHandle = + (amount == SWEEP_ALL ? + createSweepTransaction(dst_addr, payment_id, mixin_count, _priority, + accountIndex) : + createTransactionJ(dst_addr, payment_id, amount, mixin_count, _priority, + accountIndex)); pendingTransaction = new PendingTransaction(txHandle); return pendingTransaction; } @@ -241,6 +247,10 @@ public class Wallet { long amount, int mixin_count, int priority, int accountIndex); + private native long createSweepTransaction(String dst_addr, String payment_id, + int mixin_count, + int priority, int accountIndex); + public PendingTransaction createSweepUnmixableTransaction() { disposePendingTransaction(); diff --git a/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeTextView.java b/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeTextView.java index bfe49e5..6043c0b 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeTextView.java +++ b/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeTextView.java @@ -25,6 +25,7 @@ import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.AdapterView; +import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; @@ -45,6 +46,8 @@ import timber.log.Timber; public class ExchangeTextView extends LinearLayout implements NumberPadView.NumberPadListener { + private static String MAX = "\u221E"; + String xmrAmount = null; String notXmrAmount = null; @@ -68,7 +71,7 @@ public class ExchangeTextView extends LinearLayout if (amount > max) { ok = false; } - if (amount <= 0) { + if (amount <= 0) { ///////////////////////////// ok = false; } } catch (NumberFormatException ex) { diff --git a/app/src/main/res/drawable/ic_all_inclusive_24dp.xml b/app/src/main/res/drawable/ic_all_inclusive_24dp.xml new file mode 100644 index 0000000..676a4e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_all_inclusive_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/fragment_send_amount.xml b/app/src/main/res/layout/fragment_send_amount.xml index 7446afc..f2d3a3f 100644 --- a/app/src/main/res/layout/fragment_send_amount.xml +++ b/app/src/main/res/layout/fragment_send_amount.xml @@ -1,30 +1,67 @@ - + android:orientation="horizontal"> - + - + + + + android:orientation="vertical" + android:visibility="visible"> + + + + + + + +