From d13be7c5c1be2492d38959a29e1b1c33df4938ff Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Tue, 11 Aug 2020 15:24:25 -0300 Subject: [wallet] start to move deserialization into the backend API and off the UI thread for less sluggish, i.e. more responsive UI --- .../main/java/net/taler/wallet/MainViewModel.kt | 63 +++++++++++----------- 1 file changed, 31 insertions(+), 32 deletions(-) (limited to 'wallet/src/main/java/net/taler/wallet/MainViewModel.kt') diff --git a/wallet/src/main/java/net/taler/wallet/MainViewModel.kt b/wallet/src/main/java/net/taler/wallet/MainViewModel.kt index 2c5e318..330704e 100644 --- a/wallet/src/main/java/net/taler/wallet/MainViewModel.kt +++ b/wallet/src/main/java/net/taler/wallet/MainViewModel.kt @@ -27,7 +27,8 @@ import androidx.lifecycle.viewModelScope import com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.module.kotlin.KotlinModule -import com.fasterxml.jackson.module.kotlin.readValue +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch import net.taler.common.Amount import net.taler.common.AmountMixin import net.taler.common.Event @@ -37,6 +38,7 @@ import net.taler.common.assertUiThread import net.taler.common.toEvent import net.taler.wallet.backend.WalletBackendApi import net.taler.wallet.balances.BalanceItem +import net.taler.wallet.balances.BalanceResponse import net.taler.wallet.exchanges.ExchangeManager import net.taler.wallet.payment.PaymentManager import net.taler.wallet.pending.PendingOperationsManager @@ -68,15 +70,19 @@ class MainViewModel(val app: Application) : AndroidViewModel(app) { var merchantVersion: String? = null private set - private val walletBackendApi = WalletBackendApi(app, { - // nothing to do when we connect, balance will be requested by BalanceFragment in onStart() - }) { payload -> + private val mapper = ObjectMapper() + .registerModule(KotlinModule()) + .configure(FAIL_ON_UNKNOWN_PROPERTIES, false) + .addMixIn(Amount::class.java, AmountMixin::class.java) + .addMixIn(Timestamp::class.java, TimestampMixin::class.java) + + private val api = WalletBackendApi(app) { payload -> if (payload.optString("operation") == "init") { val result = payload.getJSONObject("result") val versions = result.getJSONObject("supported_protocol_versions") exchangeVersion = versions.getString("exchange") merchantVersion = versions.getString("merchant") - } else if (payload.getString("type") != "waiting-for-retry") { // ignore ping + } else if (payload.getString("type") != "waiting-for-retry") { // ignore ping Log.i(TAG, "Received notification from wallet-core: ${payload.toString(2)}") loadBalances() if (payload.optString("type") in transactionNotifications) { @@ -92,20 +98,12 @@ class MainViewModel(val app: Application) : AndroidViewModel(app) { } } - private val mapper = ObjectMapper() - .registerModule(KotlinModule()) - .configure(FAIL_ON_UNKNOWN_PROPERTIES, false) - .addMixIn(Amount::class.java, AmountMixin::class.java) - .addMixIn(Timestamp::class.java, TimestampMixin::class.java) - - val withdrawManager = WithdrawManager(walletBackendApi, mapper) - val paymentManager = PaymentManager(walletBackendApi, mapper) - val pendingOperationsManager: PendingOperationsManager = - PendingOperationsManager(walletBackendApi) - val transactionManager: TransactionManager = - TransactionManager(walletBackendApi, viewModelScope, mapper) - val refundManager = RefundManager(walletBackendApi) - val exchangeManager: ExchangeManager = ExchangeManager(walletBackendApi, mapper) + val withdrawManager = WithdrawManager(api, viewModelScope) + val paymentManager = PaymentManager(api, mapper) + val pendingOperationsManager: PendingOperationsManager = PendingOperationsManager(api) + val transactionManager: TransactionManager = TransactionManager(api, viewModelScope, mapper) + val refundManager = RefundManager(api) + val exchangeManager: ExchangeManager = ExchangeManager(api, mapper) private val mTransactionsEvent = MutableLiveData>() val transactionsEvent: LiveData> = mTransactionsEvent @@ -118,20 +116,21 @@ class MainViewModel(val app: Application) : AndroidViewModel(app) { val lastBackup: LiveData = mLastBackup override fun onCleared() { - walletBackendApi.destroy() + api.destroy() super.onCleared() } @UiThread - fun loadBalances() { + fun loadBalances(): Job = viewModelScope.launch { showProgressBar.value = true - walletBackendApi.sendRequest("getBalances") { isError, result -> - if (isError) { - Log.e(TAG, "Error retrieving balances: ${result.toString(2)}") - return@sendRequest - } - mBalances.value = mapper.readValue(result.getString("balances")) - showProgressBar.value = false + val response = api.request("getBalances", BalanceResponse.serializer()) + showProgressBar.value = false + response.onError { + // TODO expose in UI + Log.e(TAG, "Error retrieving balances: $it") + } + response.onSuccess { + mBalances.value = it.balances } } @@ -145,22 +144,22 @@ class MainViewModel(val app: Application) : AndroidViewModel(app) { @UiThread fun dangerouslyReset() { - walletBackendApi.sendRequest("reset") + api.sendRequest("reset") withdrawManager.testWithdrawalInProgress.value = false mBalances.value = emptyList() } fun startTunnel() { - walletBackendApi.sendRequest("startTunnel") + api.sendRequest("startTunnel") } fun stopTunnel() { - walletBackendApi.sendRequest("stopTunnel") + api.sendRequest("stopTunnel") } fun tunnelResponse(resp: String) { val respJson = JSONObject(resp) - walletBackendApi.sendRequest("tunnelResponse", respJson) + api.sendRequest("tunnelResponse", respJson) } } -- cgit v1.2.3