diff --git a/app/src/main/java/com/m2049r/xmrwallet/adapter/TransactionInfoAdapter.java b/app/src/main/java/com/m2049r/xmrwallet/adapter/TransactionInfoAdapter.java index 1a383c3..ce6c17f 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/adapter/TransactionInfoAdapter.java +++ b/app/src/main/java/com/m2049r/xmrwallet/adapter/TransactionInfoAdapter.java @@ -86,7 +86,7 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter dataSet) { this.localDataSet = dataSet; + notifyDataSetChanged(); } // Create new views (invoked by the layout manager) diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/dialog/ReceiveBottomSheetDialog.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/dialog/ReceiveBottomSheetDialog.java index 9bb5fea..b31270b 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/fragment/dialog/ReceiveBottomSheetDialog.java +++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/dialog/ReceiveBottomSheetDialog.java @@ -41,6 +41,7 @@ public class ReceiveBottomSheetDialog extends BottomSheetDialogFragment { AddressService.getInstance().address.observe(getViewLifecycleOwner(), addr -> { if (!addr.isEmpty()) { + System.out.println(addr); addressTextView.setText(addr); addressImageView.setImageBitmap(generate(addr, 256, 256)); } diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/dialog/SendBottomSheetDialog.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/dialog/SendBottomSheetDialog.java index b5c1466..010facc 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/fragment/dialog/SendBottomSheetDialog.java +++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/dialog/SendBottomSheetDialog.java @@ -1,9 +1,11 @@ package com.m2049r.xmrwallet.fragment.dialog; +import android.content.ClipboardManager; import android.os.Bundle; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import com.m2049r.xmrwallet.R; import com.m2049r.xmrwallet.model.Wallet; +import com.m2049r.xmrwallet.service.BalanceService; import com.m2049r.xmrwallet.service.TxService; import android.view.LayoutInflater; @@ -11,12 +13,19 @@ import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; +import android.widget.ImageButton; +import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.Observer; public class SendBottomSheetDialog extends BottomSheetDialogFragment { + private MutableLiveData _sendingMax = new MutableLiveData<>(false); + public LiveData sendingMax = _sendingMax; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -26,26 +35,56 @@ public class SendBottomSheetDialog extends BottomSheetDialogFragment { @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + ImageButton pasteAddressImageButton = view.findViewById(R.id.paste_address_imagebutton); + Button sendMaxButton = view.findViewById(R.id.send_max_button); EditText addressEditText = view.findViewById(R.id.address_edittext); EditText amountEditText = view.findViewById(R.id.amount_edittext); Button sendButton = view.findViewById(R.id.send_button); + TextView sendAllTextView = view.findViewById(R.id.sending_all_textview); TxService.getInstance().clearSendEvent.observe(getViewLifecycleOwner(), o -> { dismiss(); }); + pasteAddressImageButton.setOnClickListener(view1 -> { + + }); + + sendMaxButton.setOnClickListener(view1 -> { + boolean currentValue = sendingMax.getValue() != null ? sendingMax.getValue() : false; + _sendingMax.postValue(!currentValue); + }); + sendButton.setOnClickListener(view1 -> { String address = addressEditText.getText().toString().trim(); String amount = amountEditText.getText().toString().trim(); boolean validAddress = Wallet.isAddressValid(address); if (validAddress && !amount.isEmpty()) { + long amountRaw = Wallet.getAmountFromString(amount); + long balance = BalanceService.getInstance().getUnlockedBalanceRaw(); + if(amountRaw >= balance || amountRaw <= 0) { + Toast.makeText(getActivity(), getString(R.string.send_amount_invalid), Toast.LENGTH_SHORT).show(); + } sendButton.setEnabled(false); - TxService.getInstance().sendTx(address, amount); + boolean sendAll = sendingMax.getValue() != null ? sendingMax.getValue() : false; + TxService.getInstance().sendTx(address, amount, sendAll); } else if (!validAddress) { Toast.makeText(getActivity(), getString(R.string.send_address_invalid), Toast.LENGTH_SHORT).show(); } else if (amount.isEmpty()) { Toast.makeText(getActivity(), getString(R.string.send_amount_empty), Toast.LENGTH_SHORT).show(); } }); + + sendingMax.observe(getViewLifecycleOwner(), sendingMax -> { + if(sendingMax) { + amountEditText.setVisibility(View.INVISIBLE); + sendAllTextView.setVisibility(View.VISIBLE); + sendMaxButton.setText(getText(R.string.undo)); + } else { + amountEditText.setVisibility(View.VISIBLE); + sendAllTextView.setVisibility(View.GONE); + sendMaxButton.setText(getText(R.string.send_max)); + } + }); } } \ No newline at end of file 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 45a026c..5514643 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 @@ -34,6 +34,8 @@ import com.m2049r.xmrwallet.service.BalanceService; import com.m2049r.xmrwallet.service.HistoryService; import com.m2049r.xmrwallet.service.TxService; +import java.util.Collections; + public class HomeFragment extends Fragment implements TransactionInfoAdapter.TxInfoAdapterListener { private HomeViewModel mViewModel; @@ -74,10 +76,20 @@ public class HomeFragment extends Fragment implements TransactionInfoAdapter.TxI private void bindObservers(View view) { RecyclerView txHistoryRecyclerView = view.findViewById(R.id.transaction_history_recyclerview); - TextView balanceTextView = view.findViewById(R.id.balance_textview); + TextView unlockedBalanceTextView = view.findViewById(R.id.balance_unlocked_textview); + TextView lockedBalanceTextView = view.findViewById(R.id.balance_locked_textview); BalanceService.getInstance().balance.observe(getViewLifecycleOwner(), balance -> { - balanceTextView.setText(getString(R.string.wallet_balance_text, Wallet.getDisplayAmount(balance))); + unlockedBalanceTextView.setText(getString(R.string.wallet_balance_text, Wallet.getDisplayAmount(balance))); + }); + + BalanceService.getInstance().lockedBalance.observe(getViewLifecycleOwner(), lockedBalance -> { + if(lockedBalance == 0) { + lockedBalanceTextView.setVisibility(View.INVISIBLE); + } else { + lockedBalanceTextView.setText(getString(R.string.wallet_locked_balance_text, Wallet.getDisplayAmount(lockedBalance))); + lockedBalanceTextView.setVisibility(View.VISIBLE); + } }); TransactionInfoAdapter adapter = new TransactionInfoAdapter(this); @@ -87,6 +99,7 @@ public class HomeFragment extends Fragment implements TransactionInfoAdapter.TxI if(history.isEmpty()) { txHistoryRecyclerView.setVisibility(View.GONE); } else { + Collections.sort(history); adapter.submitList(history); txHistoryRecyclerView.setVisibility(View.VISIBLE); } diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/BalanceService.java b/app/src/main/java/com/m2049r/xmrwallet/service/BalanceService.java index e2b6aa2..1ac45da 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/service/BalanceService.java +++ b/app/src/main/java/com/m2049r/xmrwallet/service/BalanceService.java @@ -15,6 +15,8 @@ public class BalanceService extends ServiceBase { private final MutableLiveData _balance = new MutableLiveData<>(0L); public LiveData balance = _balance; + private final MutableLiveData _lockedBalance = new MutableLiveData<>(0L); + public LiveData lockedBalance = _lockedBalance; public BalanceService(MainActivity mainActivity, MoneroHandlerThread thread) { super(mainActivity, thread); @@ -22,6 +24,19 @@ public class BalanceService extends ServiceBase { } public void refreshBalance() { - _balance.postValue(WalletManager.getInstance().getWallet().getBalance()); + _balance.postValue(getUnlockedBalanceRaw()); + _lockedBalance.postValue(getLockedBalanceRaw()); + } + + public long getUnlockedBalanceRaw() { + return WalletManager.getInstance().getWallet().getUnlockedBalance(); + } + + public long getTotalBalanceRaw() { + return WalletManager.getInstance().getWallet().getBalance(); + } + + public long getLockedBalanceRaw() { + return getTotalBalanceRaw() - getUnlockedBalanceRaw(); } } diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/HistoryService.java b/app/src/main/java/com/m2049r/xmrwallet/service/HistoryService.java index 7873e9c..7efb8cb 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/service/HistoryService.java +++ b/app/src/main/java/com/m2049r/xmrwallet/service/HistoryService.java @@ -7,6 +7,7 @@ import com.m2049r.xmrwallet.MainActivity; import com.m2049r.xmrwallet.model.TransactionInfo; import com.m2049r.xmrwallet.model.WalletManager; +import java.util.Collections; import java.util.List; public class HistoryService extends ServiceBase { @@ -25,7 +26,7 @@ public class HistoryService extends ServiceBase { } public void refreshHistory() { - _history.postValue(WalletManager.getInstance().getWallet().getHistory().getAll()); + _history.postValue(getHistory()); } public List getHistory() { diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/MoneroHandlerThread.java b/app/src/main/java/com/m2049r/xmrwallet/service/MoneroHandlerThread.java index afd7f7a..fb194ad 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/service/MoneroHandlerThread.java +++ b/app/src/main/java/com/m2049r/xmrwallet/service/MoneroHandlerThread.java @@ -97,9 +97,9 @@ public class MoneroHandlerThread extends Thread implements WalletListener { listener.onRefresh(); } - public boolean sendTx(String address, String amountStr) { - long amount = Wallet.getAmountFromString(amountStr); - PendingTransaction pendingTx = wallet.createTransaction(new TxData(address, SWEEP_ALL, 0, PendingTransaction.Priority.Priority_Default)); + public boolean sendTx(String address, String amountStr, boolean sendAll) { + long amount = sendAll ? SWEEP_ALL : Wallet.getAmountFromString(amountStr); + PendingTransaction pendingTx = wallet.createTransaction(new TxData(address, amount, 0, PendingTransaction.Priority.Priority_Default)); return pendingTx.commit("", true); } diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/TxService.java b/app/src/main/java/com/m2049r/xmrwallet/service/TxService.java index 2709806..5ebc85e 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/service/TxService.java +++ b/app/src/main/java/com/m2049r/xmrwallet/service/TxService.java @@ -18,8 +18,8 @@ public class TxService extends ServiceBase { instance = this; } - public void sendTx(String address, String amount) { - boolean success = this.getThread().sendTx(address, amount); + public void sendTx(String address, String amount, boolean sendAll) { + boolean success = this.getThread().sendTx(address, amount, sendAll); if (success) { _clearSendEvent.call(); } diff --git a/app/src/main/res/drawable/ic_content_paste_24dp.xml b/app/src/main/res/drawable/ic_content_paste_24dp.xml index 01dae40..c96b0d0 100644 --- a/app/src/main/res/drawable/ic_content_paste_24dp.xml +++ b/app/src/main/res/drawable/ic_content_paste_24dp.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 16f7db1..ff9a0c5 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -6,35 +6,37 @@ android:layout_height="match_parent" tools:context=".fragment.home.HomeFragment"> - + android:textAlignment="center" + tools:text="UNLOCKED BALANCE" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"/> + app:layout_constraintTop_toBottomOf="@id/balance_unlocked_textview" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/send_bottom_sheet_dialog.xml b/app/src/main/res/layout/send_bottom_sheet_dialog.xml index b2fff4c..c480dc7 100644 --- a/app/src/main/res/layout/send_bottom_sheet_dialog.xml +++ b/app/src/main/res/layout/send_bottom_sheet_dialog.xml @@ -19,25 +19,62 @@ android:layout_height="wrap_content" android:layout_marginStart="24dp" android:layout_marginEnd="24dp" + android:layout_marginBottom="32dp" android:hint="Address" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toTopOf="@id/amount_edittext"/> + - + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toStartOf="@id/send_max_button" + app:layout_constraintBottom_toTopOf="@id/send_button" + tools:visibility="visible"/> + +