diff options
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 |