diff options
Diffstat (limited to 'wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt')
-rw-r--r-- | wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt | 97 |
1 files changed, 73 insertions, 24 deletions
diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt index 90510e6..5243427 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt @@ -17,15 +17,15 @@ package net.taler.wallet.transactions import android.os.Bundle +import android.util.Log import android.view.ActionMode import android.view.LayoutInflater import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.view.View +import android.view.View.INVISIBLE import android.view.ViewGroup -import android.widget.Toast -import android.widget.Toast.LENGTH_LONG import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView.OnQueryTextListener import androidx.fragment.app.Fragment @@ -36,11 +36,16 @@ import androidx.recyclerview.selection.SelectionTracker import androidx.recyclerview.selection.StorageStrategy import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager.VERTICAL +import com.google.android.material.dialog.MaterialAlertDialogBuilder import net.taler.common.fadeIn import net.taler.common.fadeOut +import net.taler.common.showError import net.taler.wallet.MainViewModel import net.taler.wallet.R +import net.taler.wallet.TAG +import net.taler.wallet.balances.BalanceState.Success import net.taler.wallet.databinding.FragmentTransactionsBinding +import net.taler.wallet.showError interface OnTransactionClickListener { fun onTransactionClicked(transaction: Transaction) @@ -50,10 +55,11 @@ class TransactionsFragment : Fragment(), OnTransactionClickListener, ActionMode. private val model: MainViewModel by activityViewModels() private val transactionManager by lazy { model.transactionManager } + private val balanceManager by lazy { model.balanceManager } private lateinit var ui: FragmentTransactionsBinding private val transactionAdapter by lazy { TransactionAdapter(this) } - private val currency by lazy { transactionManager.selectedCurrency!! } + private val scopeInfo by lazy { transactionManager.selectedScope!! } private var tracker: SelectionTracker<String>? = null private var actionMode: ActionMode? = null @@ -64,8 +70,8 @@ class TransactionsFragment : Fragment(), OnTransactionClickListener, ActionMode. override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { + savedInstanceState: Bundle?, + ): View { ui = FragmentTransactionsBinding.inflate(inflater, container, false) return ui.root } @@ -102,22 +108,36 @@ class TransactionsFragment : Fragment(), OnTransactionClickListener, ActionMode. } }) - transactionManager.progress.observe(viewLifecycleOwner, { show -> - if (show) ui.progressBar.fadeIn() else ui.progressBar.fadeOut() - }) - transactionManager.transactions.observe(viewLifecycleOwner, { result -> - onTransactionsResult(result) - }) - } + balanceManager.state.observe(viewLifecycleOwner) { state -> + if (state !is Success) return@observe + val balances = state.balances + // hide extra fab when in single currency mode (uses MainFragment's FAB) + if (balances.size == 1) ui.mainFab.visibility = INVISIBLE - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - model.balances.observe(viewLifecycleOwner, { balances -> - balances.find { it.currency == currency }?.available?.let { amount -> - requireActivity().title = - getString(R.string.transactions_detail_title_balance, amount) + balances.find { it.scopeInfo == scopeInfo }?.let { balance -> + ui.amount.text = balance.available.toString(showSymbol = false) + transactionAdapter.setCurrencySpec(balance.available.spec) } - }) + } + transactionManager.progress.observe(viewLifecycleOwner) { show -> + if (show) ui.progressBar.fadeIn() else ui.progressBar.fadeOut() + } + transactionManager.transactions.observe(viewLifecycleOwner) { result -> + onTransactionsResult(result) + } + ui.sendButton.setOnClickListener { + findNavController().navigate(R.id.sendFunds) + } + ui.receiveButton.setOnClickListener { + findNavController().navigate(R.id.action_global_receiveFunds) + } + ui.mainFab.setOnClickListener { + model.scanCode() + } + ui.mainFab.setOnLongClickListener { + findNavController().navigate(R.id.action_nav_transactions_to_nav_uri_input) + true + } } override fun onSaveInstanceState(outState: Bundle) { @@ -125,11 +145,17 @@ class TransactionsFragment : Fragment(), OnTransactionClickListener, ActionMode. tracker?.onSaveInstanceState(outState) } + @Deprecated("Deprecated in Java") override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { inflater.inflate(R.menu.transactions, menu) setupSearch(menu.findItem(R.id.action_search)) } + override fun onStart() { + super.onStart() + requireActivity().title = getString(R.string.transactions_detail_title_currency, scopeInfo.currency) + } + private fun setupSearch(item: MenuItem) { item.setOnActionExpandListener(object : MenuItem.OnActionExpandListener { override fun onMenuItemActionExpand(item: MenuItem) = true @@ -145,7 +171,7 @@ class TransactionsFragment : Fragment(), OnTransactionClickListener, ActionMode. // workaround to avoid issues with some emulators and keyboard devices // firing twice if a keyboard enter is used // see https://code.google.com/p/android/issues/detail?id=24599 - item.actionView.clearFocus() + searchView.clearFocus() onSearch(query) return true } @@ -155,7 +181,7 @@ class TransactionsFragment : Fragment(), OnTransactionClickListener, ActionMode. override fun onTransactionClicked(transaction: Transaction) { if (actionMode != null) return // don't react on clicks while in action mode if (transaction.detailPageNav != 0) { - transactionManager.selectedTransaction = transaction + transactionManager.selectTransaction(transaction) findNavController().navigate(transaction.detailPageNav) } } @@ -163,9 +189,10 @@ class TransactionsFragment : Fragment(), OnTransactionClickListener, ActionMode. private fun onTransactionsResult(result: TransactionsResult) = when (result) { is TransactionsResult.Error -> { ui.list.fadeOut() - ui.emptyState.text = getString(R.string.transactions_error, result.msg) + ui.emptyState.text = getString(R.string.transactions_error, result.error.userFacingMsg) ui.emptyState.fadeIn() } + is TransactionsResult.Success -> { if (result.transactions.isEmpty()) { val isSearch = transactionManager.searchQuery.value != null @@ -203,10 +230,32 @@ class TransactionsFragment : Fragment(), OnTransactionClickListener, ActionMode. override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean { when (item.itemId) { R.id.transaction_delete -> { - val s = "Not yet implemented. Pester Florian! ;)" - Toast.makeText(requireContext(), s, LENGTH_LONG).show() + tracker?.selection?.toList()?.let { transactionIds -> + MaterialAlertDialogBuilder( + requireContext(), + R.style.MaterialAlertDialog_Material3, + ) + .setTitle(R.string.transactions_delete) + .setMessage(R.string.transactions_delete_selected_dialog_message) + .setNeutralButton(R.string.cancel) { dialog, _ -> + dialog.cancel() + } + .setNegativeButton(R.string.transactions_delete) { dialog, _ -> + transactionManager.deleteTransactions(transactionIds) { + Log.e(TAG, "Error deleteTransaction $it") + if (model.devMode.value == true) { + showError(it) + } else { + showError(it.userFacingMsg) + } + } + dialog.dismiss() + } + .show() + } mode.finish() } + R.id.transaction_select_all -> transactionAdapter.selectAll() } return true |