diff --git a/app/src/main/cpp/monerujo.cpp b/app/src/main/cpp/monerujo.cpp index 1470cd31..1e1a0451 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<jlong>(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<Bitmonero::PendingTransaction::Priority>(priority); + Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance); + + Monero::optional<uint64_t> 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<jlong>(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 2ea8207f..4e75a113 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 a7a1eac0..09dcdcae 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 bfe49e59..6043c0ba 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 00000000..676a4e0a --- /dev/null +++ b/app/src/main/res/drawable/ic_all_inclusive_24dp.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportHeight="24.0" + android:viewportWidth="24.0"> + <path + android:fillColor="@color/gradientOrange" + android:pathData="M18.6,6.62c-1.44,0 -2.8,0.56 -3.77,1.53L12,10.66 10.48,12h0.01L7.8,14.39c-0.64,0.64 -1.49,0.99 -2.4,0.99 -1.87,0 -3.39,-1.51 -3.39,-3.38S3.53,8.62 5.4,8.62c0.91,0 1.76,0.35 2.44,1.03l1.13,1 1.51,-1.34L9.22,8.2C8.2,7.18 6.84,6.62 5.4,6.62 2.42,6.62 0,9.04 0,12s2.42,5.38 5.4,5.38c1.44,0 2.8,-0.56 3.77,-1.53l2.83,-2.5 0.01,0.01L13.52,12h-0.01l2.69,-2.39c0.64,-0.64 1.49,-0.99 2.4,-0.99 1.87,0 3.39,1.51 3.39,3.38s-1.52,3.38 -3.39,3.38c-0.9,0 -1.76,-0.35 -2.44,-1.03l-1.14,-1.01 -1.51,1.34 1.27,1.12c1.02,1.01 2.37,1.57 3.82,1.57 2.98,0 5.4,-2.41 5.4,-5.38s-2.42,-5.37 -5.4,-5.37z" /> +</vector> diff --git a/app/src/main/res/layout/fragment_send_amount.xml b/app/src/main/res/layout/fragment_send_amount.xml index 7446afce..f2d3a3f0 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 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> - <TextView - android:id="@+id/tvFunds" - style="@style/MoneroText.Funds" + <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" - android:gravity="center" /> + android:orientation="horizontal"> - <com.m2049r.xmrwallet.widget.ExchangeTextView - android:id="@+id/evAmount" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginBottom="16dp" - android:layout_marginTop="16dp" - android:orientation="vertical" /> + <TextView + android:id="@+id/tvFunds" + style="@style/MoneroText.Funds" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentStart="true" + android:layout_toStartOf="@id/ibSweep" + android:gravity="center" + tools:text="Balance: 70.198276354123 XMR" /> - <com.m2049r.xmrwallet.widget.NumberPadView - android:id="@+id/numberPad" + <ImageButton + android:id="@+id/ibSweep" + style="@style/MoneroLabel.NumPad" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentEnd="true" + android:paddingEnd="12dp" + android:paddingStart="12dp" + android:src="@drawable/ic_all_inclusive_24dp" + android:visibility="visible" /> + </RelativeLayout> + + <LinearLayout + android:id="@+id/llAmount" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/white" - android:gravity="center" /> + android:orientation="vertical" + android:visibility="visible"> + + <com.m2049r.xmrwallet.widget.ExchangeTextView + android:id="@+id/evAmount" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="16dp" + android:layout_marginTop="16dp" + android:orientation="vertical" /> + + <com.m2049r.xmrwallet.widget.NumberPadView + android:id="@+id/numberPad" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@color/white" + android:gravity="center" /> + + </LinearLayout> + + <ImageView + android:id="@+id/ivSweep" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:src="@drawable/ic_all_inclusive_24dp" + android:visibility="gone"/> </LinearLayout>