gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-taler-android] 05/15: [wallet] Display transactions by scopeInfo


From: gnunet
Subject: [taler-taler-android] 05/15: [wallet] Display transactions by scopeInfo instead of currency
Date: Wed, 27 Mar 2024 18:27:08 +0100

This is an automated email from the git hooks/post-receive script.

torsten-grote pushed a commit to branch master
in repository taler-android.

commit e305ddba1455a33e8dec037d4fcef8498e0b21a5
Author: Iván Ávalos <avalos@disroot.org>
AuthorDate: Tue Feb 20 11:54:14 2024 -0600

    [wallet] Display transactions by scopeInfo instead of currency
    
    (cherry picked from commit 04da36054f8996b1e9d70f84506bf8be2ba3abe6)
---
 .../src/main/java/net/taler/wallet/MainActivity.kt |  5 ++--
 .../src/main/java/net/taler/wallet/MainFragment.kt | 22 +++++++--------
 .../main/java/net/taler/wallet/MainViewModel.kt    | 11 ++++----
 .../java/net/taler/wallet/ReceiveFundsFragment.kt  | 12 ++++++--
 .../java/net/taler/wallet/SendFundsFragment.kt     | 12 +++++---
 .../net/taler/wallet/balances/BalanceAdapter.kt    |  2 +-
 .../net/taler/wallet/balances/BalancesFragment.kt  |  6 ++--
 .../taler/wallet/exchanges/ExchangeListFragment.kt |  2 +-
 .../wallet/transactions/TransactionManager.kt      | 32 ++++++++++++----------
 .../wallet/transactions/TransactionsFragment.kt    |  7 ++---
 10 files changed, 63 insertions(+), 48 deletions(-)

diff --git a/wallet/src/main/java/net/taler/wallet/MainActivity.kt 
b/wallet/src/main/java/net/taler/wallet/MainActivity.kt
index 65e5c2a..5dfd920 100644
--- a/wallet/src/main/java/net/taler/wallet/MainActivity.kt
+++ b/wallet/src/main/java/net/taler/wallet/MainActivity.kt
@@ -346,8 +346,9 @@ class MainActivity : AppCompatActivity(), 
OnNavigationItemSelectedListener,
                     val transactionId = status.response.transactionId
                     val transaction = 
model.transactionManager.getTransactionById(transactionId)
                     if (transaction != null) {
-                        val currency = transaction.amountRaw.currency
-                        model.showTransactions(currency)
+                        // TODO: currency what? scopes are the cool thing now
+                        // val currency = transaction.amountRaw.currency
+                        // model.showTransactions(currency)
                         Snackbar.make(ui.navView, 
getString(R.string.refund_success), LENGTH_LONG).show()
                     }
                 }
diff --git a/wallet/src/main/java/net/taler/wallet/MainFragment.kt 
b/wallet/src/main/java/net/taler/wallet/MainFragment.kt
index 656db63..9fa9838 100644
--- a/wallet/src/main/java/net/taler/wallet/MainFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/MainFragment.kt
@@ -24,20 +24,20 @@ import androidx.fragment.app.Fragment
 import androidx.fragment.app.activityViewModels
 import androidx.navigation.fragment.findNavController
 import net.taler.common.EventObserver
-import net.taler.wallet.CurrencyMode.MULTI
-import net.taler.wallet.CurrencyMode.SINGLE
+import net.taler.wallet.ScopeMode.MULTI
+import net.taler.wallet.ScopeMode.SINGLE
 import net.taler.wallet.balances.BalanceState
 import net.taler.wallet.balances.BalanceState.Success
 import net.taler.wallet.balances.BalancesFragment
 import net.taler.wallet.databinding.FragmentMainBinding
 import net.taler.wallet.transactions.TransactionsFragment
 
-enum class CurrencyMode { SINGLE, MULTI }
+enum class ScopeMode { SINGLE, MULTI }
 
 class MainFragment : Fragment() {
 
     private val model: MainViewModel by activityViewModels()
-    private var currencyMode: CurrencyMode? = null
+    private var scopeMode: ScopeMode? = null
 
     private lateinit var ui: FragmentMainBinding
 
@@ -54,10 +54,10 @@ class MainFragment : Fragment() {
         model.balanceManager.state.observe(viewLifecycleOwner) {
             onBalancesChanged(it)
         }
-        model.transactionsEvent.observe(viewLifecycleOwner, EventObserver { 
currency ->
-            // we only need to navigate to a dedicated list, when in 
multi-currency mode
-            if (currencyMode == MULTI) {
-                model.transactionManager.selectedCurrency = currency
+        model.transactionsEvent.observe(viewLifecycleOwner, EventObserver { 
scopeInfo ->
+            // we only need to navigate to a dedicated list, when in 
multi-scope mode
+            if (scopeMode == MULTI) {
+                model.transactionManager.selectedScope = scopeInfo
                 
findNavController().navigate(R.id.action_nav_main_to_nav_transactions)
             }
         })
@@ -80,14 +80,14 @@ class MainFragment : Fragment() {
         if (state !is Success) return
         val balances = state.balances
         val mode = if (balances.size == 1) SINGLE else MULTI
-        if (currencyMode != mode) {
+        if (scopeMode != mode) {
             val f = if (mode == SINGLE) {
-                model.transactionManager.selectedCurrency = 
balances[0].available.currency
+                model.transactionManager.selectedScope = balances[0].scopeInfo
                 TransactionsFragment()
             } else {
                 BalancesFragment()
             }
-            currencyMode = mode
+            scopeMode = mode
             childFragmentManager.beginTransaction()
                 .replace(R.id.mainFragmentContainer, f, mode.name)
                 .commitNow()
diff --git a/wallet/src/main/java/net/taler/wallet/MainViewModel.kt 
b/wallet/src/main/java/net/taler/wallet/MainViewModel.kt
index fe11d6a..80e9ef7 100644
--- a/wallet/src/main/java/net/taler/wallet/MainViewModel.kt
+++ b/wallet/src/main/java/net/taler/wallet/MainViewModel.kt
@@ -36,6 +36,7 @@ import net.taler.wallet.backend.VersionReceiver
 import net.taler.wallet.backend.WalletBackendApi
 import net.taler.wallet.backend.WalletCoreVersion
 import net.taler.wallet.balances.BalanceManager
+import net.taler.wallet.balances.ScopeInfo
 import net.taler.wallet.deposit.DepositManager
 import net.taler.wallet.exchanges.ExchangeManager
 import net.taler.wallet.payment.PaymentManager
@@ -81,8 +82,8 @@ class MainViewModel(
     val accountManager: AccountManager = AccountManager(api, viewModelScope)
     val depositManager: DepositManager = DepositManager(api, viewModelScope)
 
-    private val mTransactionsEvent = MutableLiveData<Event<String>>()
-    val transactionsEvent: LiveData<Event<String>> = mTransactionsEvent
+    private val mTransactionsEvent = MutableLiveData<Event<ScopeInfo>>()
+    val transactionsEvent: LiveData<Event<ScopeInfo>> = mTransactionsEvent
 
     private val mScanCodeEvent = MutableLiveData<Event<Boolean>>()
     val scanCodeEvent: LiveData<Event<Boolean>> = mScanCodeEvent
@@ -111,11 +112,11 @@ class MainViewModel(
     }
 
     /**
-     * Navigates to the given currency's transaction list, when [MainFragment] 
is shown.
+     * Navigates to the given scope info's transaction list, when 
[MainFragment] is shown.
      */
     @UiThread
-    fun showTransactions(currency: String) {
-        mTransactionsEvent.value = currency.toEvent()
+    fun showTransactions(scopeInfo: ScopeInfo) {
+        mTransactionsEvent.value = scopeInfo.toEvent()
     }
 
     @UiThread
diff --git a/wallet/src/main/java/net/taler/wallet/ReceiveFundsFragment.kt 
b/wallet/src/main/java/net/taler/wallet/ReceiveFundsFragment.kt
index a25c352..7b9e985 100644
--- a/wallet/src/main/java/net/taler/wallet/ReceiveFundsFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/ReceiveFundsFragment.kt
@@ -51,6 +51,7 @@ import androidx.fragment.app.activityViewModels
 import androidx.lifecycle.lifecycleScope
 import androidx.navigation.fragment.findNavController
 import net.taler.common.Amount
+import net.taler.common.CurrencySpecification
 import net.taler.wallet.compose.AmountInputField
 import net.taler.wallet.compose.TalerSurface
 import net.taler.wallet.exchanges.ExchangeItem
@@ -59,16 +60,20 @@ class ReceiveFundsFragment : Fragment() {
     private val model: MainViewModel by activityViewModels()
     private val exchangeManager get() = model.exchangeManager
     private val withdrawManager get() = model.withdrawManager
+    private val balanceManager get() = model.balanceManager
     private val peerManager get() = model.peerManager
 
+
     override fun onCreateView(
         inflater: LayoutInflater, container: ViewGroup?,
         savedInstanceState: Bundle?,
     ): View = ComposeView(requireContext()).apply {
         setContent {
             TalerSurface {
+                val scopeInfo = model.transactionManager.selectedScope ?: 
error("No scope selected")
                 ReceiveFundsIntro(
-                    model.transactionManager.selectedCurrency ?: error("No 
currency selected"),
+                    scopeInfo.currency,
+                    model.balanceManager.getSpecForScopeInfo(scopeInfo),
                     this@ReceiveFundsFragment::onManualWithdraw,
                     this@ReceiveFundsFragment::onPeerPull,
                 )
@@ -113,6 +118,7 @@ class ReceiveFundsFragment : Fragment() {
 @Composable
 private fun ReceiveFundsIntro(
     currency: String,
+    spec: CurrencySpecification?,
     onManualWithdraw: (Amount) -> Unit,
     onPeerPull: (Amount) -> Unit,
 ) {
@@ -146,7 +152,7 @@ private fun ReceiveFundsIntro(
             )
             Text(
                 modifier = Modifier,
-                text = currency,
+                text = spec?.symbol(Amount.zero(currency)) ?: currency,
                 softWrap = false,
                 style = MaterialTheme.typography.titleLarge,
             )
@@ -189,6 +195,6 @@ private fun ReceiveFundsIntro(
 @Composable
 fun PreviewReceiveFundsIntro() {
     Surface {
-        ReceiveFundsIntro("TESTKUDOS", {}) {}
+        ReceiveFundsIntro("TESTKUDOS", null, {}) {}
     }
 }
diff --git a/wallet/src/main/java/net/taler/wallet/SendFundsFragment.kt 
b/wallet/src/main/java/net/taler/wallet/SendFundsFragment.kt
index 09d33e2..e4df8d8 100644
--- a/wallet/src/main/java/net/taler/wallet/SendFundsFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/SendFundsFragment.kt
@@ -48,11 +48,13 @@ import androidx.fragment.app.Fragment
 import androidx.fragment.app.activityViewModels
 import androidx.navigation.fragment.findNavController
 import net.taler.common.Amount
+import net.taler.common.CurrencySpecification
 import net.taler.wallet.compose.AmountInputField
 import net.taler.wallet.compose.TalerSurface
 
 class SendFundsFragment : Fragment() {
     private val model: MainViewModel by activityViewModels()
+    private val balanceManager get() = model.balanceManager
     private val peerManager get() = model.peerManager
 
     override fun onCreateView(
@@ -62,9 +64,10 @@ class SendFundsFragment : Fragment() {
     ): View = ComposeView(requireContext()).apply {
         setContent {
             TalerSurface {
+                val scopeInfo = model.transactionManager.selectedScope ?: 
error("No scope selected")
                 SendFundsIntro(
-                    currency = model.transactionManager.selectedCurrency
-                        ?: error("No currency selected"),
+                    currency = scopeInfo.currency,
+                    spec = balanceManager.getSpecForScopeInfo(scopeInfo),
                     hasSufficientBalance = model::hasSufficientBalance,
                     onDeposit = this@SendFundsFragment::onDeposit,
                     onPeerPush = this@SendFundsFragment::onPeerPush,
@@ -93,6 +96,7 @@ class SendFundsFragment : Fragment() {
 @Composable
 private fun SendFundsIntro(
     currency: String,
+    spec: CurrencySpecification?,
     hasSufficientBalance: (Amount) -> Boolean,
     onDeposit: (Amount) -> Unit,
     onPeerPush: (Amount) -> Unit,
@@ -132,7 +136,7 @@ private fun SendFundsIntro(
             )
             Text(
                 modifier = Modifier,
-                text = currency,
+                text = spec?.symbol(Amount.zero(currency)) ?: currency,
                 softWrap = false,
                 style = MaterialTheme.typography.titleLarge,
             )
@@ -185,6 +189,6 @@ private fun SendFundsIntro(
 @Composable
 fun PreviewSendFundsIntro() {
     Surface {
-        SendFundsIntro("TESTKUDOS", { true }, {}) {}
+        SendFundsIntro("TESTKUDOS", null, { true }, {}) {}
     }
 }
diff --git a/wallet/src/main/java/net/taler/wallet/balances/BalanceAdapter.kt 
b/wallet/src/main/java/net/taler/wallet/balances/BalanceAdapter.kt
index c7ee859..f40def4 100644
--- a/wallet/src/main/java/net/taler/wallet/balances/BalanceAdapter.kt
+++ b/wallet/src/main/java/net/taler/wallet/balances/BalanceAdapter.kt
@@ -65,7 +65,7 @@ class BalanceAdapter(private val listener: 
BalanceClickListener) : Adapter<Balan
         private val pendingView: TextView = v.findViewById(R.id.pendingView)
 
         fun bind(item: BalanceItem) {
-            v.setOnClickListener { 
listener.onBalanceClick(item.available.currency) }
+            v.setOnClickListener { listener.onBalanceClick(item.scopeInfo) }
             amountView.text = item.available.toString()
 
             val amountIncoming = item.pendingIncoming
diff --git a/wallet/src/main/java/net/taler/wallet/balances/BalancesFragment.kt 
b/wallet/src/main/java/net/taler/wallet/balances/BalancesFragment.kt
index cfbbc46..93636ea 100644
--- a/wallet/src/main/java/net/taler/wallet/balances/BalancesFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/balances/BalancesFragment.kt
@@ -39,7 +39,7 @@ import net.taler.wallet.databinding.FragmentBalancesBinding
 import net.taler.wallet.showError
 
 interface BalanceClickListener {
-    fun onBalanceClick(currency: String)
+    fun onBalanceClick(scopeInfo: ScopeInfo)
 }
 
 class BalancesFragment : Fragment(),
@@ -96,8 +96,8 @@ class BalancesFragment : Fragment(),
         }
     }
 
-    override fun onBalanceClick(currency: String) {
-        model.showTransactions(currency)
+    override fun onBalanceClick(scopeInfo: ScopeInfo) {
+        model.showTransactions(scopeInfo)
     }
 
 }
diff --git 
a/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeListFragment.kt 
b/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeListFragment.kt
index 494b187..5482b5a 100644
--- a/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeListFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeListFragment.kt
@@ -141,7 +141,7 @@ open class ExchangeListFragment : Fragment(), 
ExchangeClickListener {
     }
 
     override fun onPeerReceive(item: ExchangeItem) {
-        transactionManager.selectedCurrency = item.currency
+        transactionManager.selectedScope = item.scopeInfo
         findNavController().navigate(R.id.action_global_receiveFunds)
     }
 
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<String>(null)
     private val mSelectedTransaction = MutableLiveData<Transaction?>(null)
     val selectedTransaction: LiveData<Transaction?> = mSelectedTransaction
-    private val allTransactions = HashMap<String, List<Transaction>>()
-    private val mTransactions = HashMap<String, 
MutableLiveData<TransactionsResult>>()
+    private val allTransactions = HashMap<ScopeInfo, List<Transaction>>()
+    private val mTransactions = HashMap<ScopeInfo, 
MutableLiveData<TransactionsResult>>()
     val transactions: LiveData<TransactionsResult>
         @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<String>, 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<String>? = 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) {

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]