summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIván Ávalos <avalos@disroot.org>2023-12-04 23:40:03 -0600
committerIván Ávalos <avalos@disroot.org>2023-12-04 23:40:03 -0600
commit269688d7894429d307b8c6190e505c99e9451e0c (patch)
tree1863d9ef178e305bc3b7267333faeef7a0d878d7
parent50f77000e0bb7a0fdf563551eae0f23995abd258 (diff)
downloadtaler-android-dev/ivan-avalos/currencyXYZ.tar.gz
taler-android-dev/ivan-avalos/currencyXYZ.tar.bz2
taler-android-dev/ivan-avalos/currencyXYZ.zip
[wallet] Refactor balances code to make DD51 easierdev/ivan-avalos/currencyXYZ
-rw-r--r--wallet/src/main/java/net/taler/wallet/MainFragment.kt49
-rw-r--r--wallet/src/main/java/net/taler/wallet/MainViewModel.kt35
-rw-r--r--wallet/src/main/java/net/taler/wallet/balances/BalanceManager.kt (renamed from wallet/src/main/java/net/taler/wallet/currency/CurrencyManager.kt)56
-rw-r--r--wallet/src/main/java/net/taler/wallet/balances/BalancesFragment.kt8
-rw-r--r--wallet/src/main/java/net/taler/wallet/balances/CurrencyInfo.kt (renamed from wallet/src/main/java/net/taler/wallet/currency/CurrencyInfo.kt)2
-rw-r--r--wallet/src/main/java/net/taler/wallet/balances/CurrencySpecification.kt (renamed from wallet/src/main/java/net/taler/wallet/currency/CurrencySpecification.kt)2
-rw-r--r--wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt2
-rw-r--r--wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt7
-rw-r--r--wallet/src/main/java/net/taler/wallet/withdraw/TransactionWithdrawalComposable.kt2
-rw-r--r--wallet/src/main/java/net/taler/wallet/withdraw/manual/ScreenTransfer.kt2
10 files changed, 93 insertions, 72 deletions
diff --git a/wallet/src/main/java/net/taler/wallet/MainFragment.kt b/wallet/src/main/java/net/taler/wallet/MainFragment.kt
index 2521e29..0a9ab95 100644
--- a/wallet/src/main/java/net/taler/wallet/MainFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/MainFragment.kt
@@ -17,6 +17,7 @@
package net.taler.wallet
import android.os.Bundle
+import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
@@ -26,7 +27,11 @@ 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.balances.BalanceItem
+import net.taler.wallet.balances.BalanceState
+import net.taler.wallet.balances.BalanceState.Error
+import net.taler.wallet.balances.BalanceState.Loading
+import net.taler.wallet.balances.BalanceState.None
+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
@@ -50,8 +55,8 @@ class MainFragment : Fragment() {
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- model.balances.observe(viewLifecycleOwner) {
- onBalancesChanged(it)
+ model.balanceManager.balanceState.observe(viewLifecycleOwner) {
+ onBalanceStateChanged(it)
}
model.transactionsEvent.observe(viewLifecycleOwner, EventObserver { currency ->
// we only need to navigate to a dedicated list, when in multi-currency mode
@@ -75,19 +80,33 @@ class MainFragment : Fragment() {
model.loadBalances()
}
- private fun onBalancesChanged(balances: List<BalanceItem>) {
- val mode = if (balances.size == 1) SINGLE else MULTI
- if (currencyMode != mode) {
- val f = if (mode == SINGLE) {
- model.transactionManager.selectedCurrency = balances[0].available.currency
- TransactionsFragment()
- } else {
- BalancesFragment()
+ private fun onBalanceStateChanged(state: BalanceState) {
+ when (state) {
+ is Loading -> {
+ model.showProgressBar.value = true
+ }
+ is None -> {
+ model.showProgressBar.value = false
+ }
+ is Success -> {
+ model.showProgressBar.value = false
+ val balances = state.balances
+ val mode = if(balances.size == 1) SINGLE else MULTI
+ val f = if (mode == SINGLE) {
+ model.transactionManager.selectedCurrency = balances[0].available.currency
+ TransactionsFragment()
+ } else {
+ BalancesFragment()
+ }
+ currencyMode = mode
+ childFragmentManager.beginTransaction()
+ .replace(R.id.mainFragmentContainer, f, mode.name)
+ .commitNow()
+ }
+ is Error -> {
+ model.showProgressBar.value = false
+ Log.e(TAG, "Error retrieving balances: ${state.error}")
}
- currencyMode = 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 4614474..9b21d44 100644
--- a/wallet/src/main/java/net/taler/wallet/MainViewModel.kt
+++ b/wallet/src/main/java/net/taler/wallet/MainViewModel.kt
@@ -22,7 +22,6 @@ import androidx.annotation.UiThread
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
-import androidx.lifecycle.distinctUntilChanged
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
@@ -37,8 +36,8 @@ import net.taler.wallet.backend.NotificationReceiver
import net.taler.wallet.backend.VersionReceiver
import net.taler.wallet.backend.WalletBackendApi
import net.taler.wallet.backend.WalletCoreVersion
-import net.taler.wallet.balances.BalanceItem
-import net.taler.wallet.balances.BalanceResponse
+import net.taler.wallet.balances.BalanceManager
+import net.taler.wallet.balances.BalanceState
import net.taler.wallet.deposit.DepositManager
import net.taler.wallet.exchanges.ExchangeManager
import net.taler.wallet.payment.PaymentManager
@@ -61,9 +60,6 @@ class MainViewModel(
app: Application,
) : AndroidViewModel(app), VersionReceiver, NotificationReceiver {
- private val mBalances = MutableLiveData<List<BalanceItem>>()
- val balances: LiveData<List<BalanceItem>> = mBalances.distinctUntilChanged()
-
val devMode = MutableLiveData(BuildConfig.DEBUG)
val showProgressBar = MutableLiveData<Boolean>()
var exchangeVersion: String? = null
@@ -86,6 +82,7 @@ class MainViewModel(
val settingsManager: SettingsManager = SettingsManager(app.applicationContext, api, viewModelScope)
val accountManager: AccountManager = AccountManager(api, viewModelScope)
val depositManager: DepositManager = DepositManager(api, viewModelScope)
+ val balanceManager: BalanceManager = BalanceManager(api, viewModelScope)
private val mTransactionsEvent = MutableLiveData<Event<String>>()
val transactionsEvent: LiveData<Event<String>> = mTransactionsEvent
@@ -120,15 +117,7 @@ class MainViewModel(
@UiThread
fun loadBalances(): Job = viewModelScope.launch {
- showProgressBar.value = true
- val response = api.request("getBalances", BalanceResponse.serializer())
- showProgressBar.value = false
- response.onError {
- Log.e(TAG, "Error retrieving balances: $it")
- }
- response.onSuccess {
- mBalances.value = it.balances
- }
+ balanceManager.listBalances()
}
/**
@@ -141,8 +130,9 @@ class MainViewModel(
@UiThread
fun getCurrencies(): List<String> {
- return balances.value?.map { balanceItem ->
- balanceItem.currency
+ val state = balanceManager.balanceState.value as? BalanceState.Success
+ return state?.balances?.let { balances ->
+ balances.map { it.currency }
} ?: emptyList()
}
@@ -159,9 +149,12 @@ class MainViewModel(
@UiThread
fun hasSufficientBalance(amount: Amount): Boolean {
- balances.value?.forEach { balanceItem ->
- if (balanceItem.currency == amount.currency) {
- return balanceItem.available >= amount
+ val state = balanceManager.balanceState.value as? BalanceState.Success
+ state?.balances?.let { balances ->
+ balances.forEach { balanceItem ->
+ if (balanceItem.currency == amount.currency) {
+ return balanceItem.available >= amount
+ }
}
}
return false
@@ -173,7 +166,7 @@ class MainViewModel(
api.sendRequest("reset")
}
withdrawManager.testWithdrawalStatus.value = null
- mBalances.value = emptyList()
+ balanceManager.resetBalances()
}
fun startTunnel() {
diff --git a/wallet/src/main/java/net/taler/wallet/currency/CurrencyManager.kt b/wallet/src/main/java/net/taler/wallet/balances/BalanceManager.kt
index cc4cbd6..a036281 100644
--- a/wallet/src/main/java/net/taler/wallet/currency/CurrencyManager.kt
+++ b/wallet/src/main/java/net/taler/wallet/balances/BalanceManager.kt
@@ -14,53 +14,59 @@
* GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
-package net.taler.wallet.currency
+package net.taler.wallet.balances
import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.distinctUntilChanged
import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import kotlinx.serialization.Serializable
import net.taler.wallet.TAG
import net.taler.wallet.backend.TalerErrorInfo
import net.taler.wallet.backend.WalletBackendApi
-import net.taler.wallet.balances.ScopeInfo
@Serializable
-data class GetCurrencySpecificationResponse(
- val currencySpecification: CurrencySpecification,
-)
+sealed class BalanceState {
+ data object None: BalanceState()
+ data object Loading: BalanceState()
-class CurrencyManager(
+ data class Success(
+ val balances: List<BalanceItem>,
+ ): BalanceState()
+
+ data class Error(
+ val error: TalerErrorInfo,
+ ): BalanceState()
+}
+
+class BalanceManager(
private val api: WalletBackendApi,
private val scope: CoroutineScope,
) {
- private val mCurrencyInfo = MutableLiveData<CurrencyInfo>()
- val currencyInfo: LiveData<CurrencyInfo> get() = listCurrencies()
+ private val mBalanceState = MutableLiveData<BalanceState>()
+ val balanceState: LiveData<BalanceState> get() = mBalanceState.distinctUntilChanged()
private val mError = MutableLiveData<TalerErrorInfo>()
val error: LiveData<TalerErrorInfo> = mError
- private fun listCurrencies(): LiveData<CurrencyInfo> {
- scope.launch {
- val response = api.request("listCurrencies", CurrencyInfo.serializer())
- response.onError {
- mError.value = it
- }.onSuccess {
- Log.d(TAG, "Currency info: $it")
- mCurrencyInfo.value = it
- }
+ fun listBalances(): Job = scope.launch {
+ mBalanceState.value = BalanceState.Loading
+ val balanceResponse = api.request("getBalances", BalanceResponse.serializer())
+
+ balanceResponse.onError {
+ Log.e(TAG, "Error retrieving balances: $it")
+ mBalanceState.value = BalanceState.Error(it)
+ }
+
+ balanceResponse.onSuccess {
+ mBalanceState.value = BalanceState.Success(it.balances)
}
- return mCurrencyInfo
}
- suspend fun getCurrencySpecification(scopeInfo: ScopeInfo): CurrencySpecification? {
- var spec: CurrencySpecification? = null
- api.request("getCurrencySpecification", GetCurrencySpecificationResponse.serializer())
- .onSuccess {
- spec = it.currencySpecification
- }
- return spec
+ fun resetBalances() {
+ mBalanceState.value = BalanceState.None
}
} \ No newline at end of file
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 c1be674..b9e3ca4 100644
--- a/wallet/src/main/java/net/taler/wallet/balances/BalancesFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/balances/BalancesFragment.kt
@@ -59,12 +59,14 @@ class BalancesFragment : Fragment(),
addItemDecoration(DividerItemDecoration(context, VERTICAL))
}
- model.balances.observe(viewLifecycleOwner) {
- onBalancesChanged(it)
+ model.balanceManager.balanceState.observe(viewLifecycleOwner) {
+ onBalanceStateChanged(it)
}
}
- private fun onBalancesChanged(balances: List<BalanceItem>) {
+ private fun onBalanceStateChanged(state: BalanceState) {
+ val balances = (state as? BalanceState.Success)?.balances ?: return
+
beginDelayedTransition(view as ViewGroup)
if (balances.isEmpty()) {
ui.mainEmptyState.visibility = VISIBLE
diff --git a/wallet/src/main/java/net/taler/wallet/currency/CurrencyInfo.kt b/wallet/src/main/java/net/taler/wallet/balances/CurrencyInfo.kt
index ff1750c..14dbd5c 100644
--- a/wallet/src/main/java/net/taler/wallet/currency/CurrencyInfo.kt
+++ b/wallet/src/main/java/net/taler/wallet/balances/CurrencyInfo.kt
@@ -14,7 +14,7 @@
* GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
-package net.taler.wallet.currency
+package net.taler.wallet.balances
import kotlinx.serialization.Serializable
diff --git a/wallet/src/main/java/net/taler/wallet/currency/CurrencySpecification.kt b/wallet/src/main/java/net/taler/wallet/balances/CurrencySpecification.kt
index de44321..2297c21 100644
--- a/wallet/src/main/java/net/taler/wallet/currency/CurrencySpecification.kt
+++ b/wallet/src/main/java/net/taler/wallet/balances/CurrencySpecification.kt
@@ -14,7 +14,7 @@
* GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
-package net.taler.wallet.currency
+package net.taler.wallet.balances
import kotlinx.serialization.Serializable
diff --git a/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt b/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt
index 3af6aaf..d9bfe92 100644
--- a/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt
+++ b/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt
@@ -42,7 +42,7 @@ import net.taler.wallet.TAG
import net.taler.wallet.backend.TalerErrorCode
import net.taler.wallet.backend.TalerErrorInfo
import net.taler.wallet.cleanExchange
-import net.taler.wallet.currency.CurrencySpecification
+import net.taler.wallet.balances.CurrencySpecification
import net.taler.wallet.refund.RefundPaymentInfo
import net.taler.wallet.transactions.TransactionMajorState.None
import net.taler.wallet.transactions.TransactionMajorState.Pending
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 2f00bf8..2684370 100644
--- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt
@@ -43,10 +43,9 @@ import net.taler.common.fadeOut
import net.taler.wallet.MainViewModel
import net.taler.wallet.R
import net.taler.wallet.TAG
+import net.taler.wallet.balances.BalanceState
import net.taler.wallet.databinding.FragmentTransactionsBinding
import net.taler.wallet.showError
-import net.taler.wallet.transactions.TransactionMajorState.*
-import net.taler.wallet.transactions.TransactionMinorState.*
interface OnTransactionClickListener {
fun onTransactionClicked(transaction: Transaction)
@@ -108,7 +107,9 @@ class TransactionsFragment : Fragment(), OnTransactionClickListener, ActionMode.
}
})
- model.balances.observe(viewLifecycleOwner) { balances ->
+ model.balanceManager.balanceState.observe(viewLifecycleOwner) { state ->
+ val balances = (state as? BalanceState.Success)?.balances ?: return@observe
+
// hide extra fab when in single currency mode (uses MainFragment's FAB)
if (balances.size == 1) ui.mainFab.visibility = INVISIBLE
balances.find { it.currency == currency }?.available?.let { amount: Amount ->
diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/TransactionWithdrawalComposable.kt b/wallet/src/main/java/net/taler/wallet/withdraw/TransactionWithdrawalComposable.kt
index f26f44f..25e5517 100644
--- a/wallet/src/main/java/net/taler/wallet/withdraw/TransactionWithdrawalComposable.kt
+++ b/wallet/src/main/java/net/taler/wallet/withdraw/TransactionWithdrawalComposable.kt
@@ -38,7 +38,7 @@ import net.taler.wallet.R
import net.taler.wallet.backend.TalerErrorCode
import net.taler.wallet.backend.TalerErrorInfo
import net.taler.wallet.cleanExchange
-import net.taler.wallet.currency.CurrencySpecification
+import net.taler.wallet.balances.CurrencySpecification
import net.taler.wallet.transactions.ActionButton
import net.taler.wallet.transactions.ActionListener
import net.taler.wallet.transactions.AmountType
diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/manual/ScreenTransfer.kt b/wallet/src/main/java/net/taler/wallet/withdraw/manual/ScreenTransfer.kt
index 222591b..629c055 100644
--- a/wallet/src/main/java/net/taler/wallet/withdraw/manual/ScreenTransfer.kt
+++ b/wallet/src/main/java/net/taler/wallet/withdraw/manual/ScreenTransfer.kt
@@ -50,7 +50,7 @@ import net.taler.common.Amount
import net.taler.wallet.CURRENCY_BTC
import net.taler.wallet.R
import net.taler.wallet.compose.copyToClipBoard
-import net.taler.wallet.currency.CurrencySpecification
+import net.taler.wallet.balances.CurrencySpecification
import net.taler.wallet.transactions.AmountType
import net.taler.wallet.transactions.TransactionAmountComposable
import net.taler.wallet.transactions.WithdrawalExchangeAccountDetails