From e305ddba1455a33e8dec037d4fcef8498e0b21a5 Mon Sep 17 00:00:00 2001 From: Iván Ávalos Date: Tue, 20 Feb 2024 11:54:14 -0600 Subject: [wallet] Display transactions by scopeInfo instead of currency (cherry picked from commit 04da36054f8996b1e9d70f84506bf8be2ba3abe6) --- .../wallet/transactions/TransactionManager.kt | 32 ++++++++++++---------- .../wallet/transactions/TransactionsFragment.kt | 7 ++--- 2 files changed, 21 insertions(+), 18 deletions(-) (limited to 'wallet/src/main/java/net/taler/wallet/transactions') diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt index 534ed6c..5399287 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt @@ -23,11 +23,15 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.switchMap import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json import net.taler.wallet.TAG import net.taler.wallet.backend.TalerErrorInfo import net.taler.wallet.backend.WalletBackendApi +import net.taler.wallet.balances.ScopeInfo import net.taler.wallet.transactions.TransactionAction.Delete import net.taler.wallet.transactions.TransactionMajorState.Pending +import org.json.JSONObject import java.util.LinkedList sealed class TransactionsResult { @@ -45,34 +49,34 @@ class TransactionManager( // FIXME if the app gets killed, this will not be restored and thus be unexpected null // we should keep this in a savable, maybe using Hilt and SavedStateViewModel - var selectedCurrency: String? = null + var selectedScope: ScopeInfo? = null val searchQuery = MutableLiveData(null) private val mSelectedTransaction = MutableLiveData(null) val selectedTransaction: LiveData = mSelectedTransaction - private val allTransactions = HashMap>() - private val mTransactions = HashMap>() + private val allTransactions = HashMap>() + private val mTransactions = HashMap>() val transactions: LiveData @UiThread get() = searchQuery.switchMap { query -> - val currency = selectedCurrency - check(currency != null) { "Did not select currency before getting transactions" } + val scopeInfo = selectedScope + check(scopeInfo != null) { "Did not select scope before getting transactions" } loadTransactions(query) - mTransactions[currency]!! // non-null because filled in [loadTransactions] + mTransactions[scopeInfo]!! // non-null because filled in [loadTransactions] } @UiThread fun loadTransactions(searchQuery: String? = null) = scope.launch { - val currency = selectedCurrency ?: return@launch - val liveData = mTransactions.getOrPut(currency) { MutableLiveData() } - if (searchQuery == null && allTransactions.containsKey(currency)) { - liveData.value = TransactionsResult.Success(allTransactions[currency]!!) + val scopeInfo = selectedScope ?: return@launch + val liveData = mTransactions.getOrPut(scopeInfo) { MutableLiveData() } + if (searchQuery == null && allTransactions.containsKey(scopeInfo)) { + liveData.value = TransactionsResult.Success(allTransactions[scopeInfo]!!) } if (liveData.value == null) mProgress.value = true api.request("getTransactions", Transactions.serializer()) { if (searchQuery != null) put("search", searchQuery) - put("currency", currency) + put("scopeInfo", JSONObject(Json.encodeToString(scopeInfo))) }.onError { liveData.postValue(TransactionsResult.Error(it)) mProgress.postValue(false) @@ -91,8 +95,8 @@ class TransactionManager( mSelectedTransaction.value = it } - // update all transactions on UiThread if there was a currency - if (searchQuery == null) allTransactions[currency] = transactions + // update all transactions on UiThread if there was a scope info + if (searchQuery == null) allTransactions[scopeInfo] = transactions } } @@ -201,7 +205,7 @@ class TransactionManager( } fun deleteTransactions(transactionIds: List, onError: (it: TalerErrorInfo) -> Unit) { - allTransactions[selectedCurrency]?.filter { transaction -> + allTransactions[selectedScope]?.filter { transaction -> transaction.transactionId in transactionIds }?.forEach { toBeDeletedTx -> if (Delete in toBeDeletedTx.txActions) { 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 2e97484..5243427 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt @@ -59,7 +59,7 @@ class TransactionsFragment : Fragment(), OnTransactionClickListener, ActionMode. 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? = null private var actionMode: ActionMode? = null @@ -114,8 +114,7 @@ class TransactionsFragment : Fragment(), OnTransactionClickListener, ActionMode. // hide extra fab when in single currency mode (uses MainFragment's FAB) if (balances.size == 1) ui.mainFab.visibility = INVISIBLE - // TODO: find via scopeInfo instead of currency - balances.find { it.currency == currency }?.let { balance -> + balances.find { it.scopeInfo == scopeInfo }?.let { balance -> ui.amount.text = balance.available.toString(showSymbol = false) transactionAdapter.setCurrencySpec(balance.available.spec) } @@ -154,7 +153,7 @@ class TransactionsFragment : Fragment(), OnTransactionClickListener, ActionMode. override fun onStart() { super.onStart() - requireActivity().title = getString(R.string.transactions_detail_title_currency, currency) + requireActivity().title = getString(R.string.transactions_detail_title_currency, scopeInfo.currency) } private fun setupSearch(item: MenuItem) { -- cgit v1.2.3