commit aa95b912410e6a97b9def4a8e6d045b3c32fb687
parent 36ef5686037c81b12def0509c184d2aa2891fbc6
Author: Iván Ávalos <avalos@disroot.org>
Date: Fri, 30 Aug 2024 10:55:48 +0200
[wallet] move selected transition updates to separate function and always ensure updates
Diffstat:
3 files changed, 20 insertions(+), 11 deletions(-)
diff --git a/wallet/src/main/java/net/taler/wallet/MainViewModel.kt b/wallet/src/main/java/net/taler/wallet/MainViewModel.kt
@@ -162,6 +162,8 @@ class MainViewModel(
if (payload.type in transactionNotifications) viewModelScope.launch(Dispatchers.Main) {
// TODO notification API should give us a currency to update
+ // update currently selected transaction
+ payload.transactionId?.let { transactionManager.updateTransactionIfSelected(it) }
// update currently selected transaction list
transactionManager.loadTransactions()
}
diff --git a/wallet/src/main/java/net/taler/wallet/backend/ApiResponse.kt b/wallet/src/main/java/net/taler/wallet/backend/ApiResponse.kt
@@ -37,6 +37,7 @@ data class NotificationPayload(
val type: String,
val id: String? = null,
val event: ObservabilityEvent? = null,
+ val transactionId: String? = null,
)
@Serializable
diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt
@@ -66,6 +66,23 @@ class TransactionManager(
}
@UiThread
+ fun updateTransactionIfSelected(id: String) = scope.launch {
+ val selectedTransaction = selectedTransaction.value
+ if (selectedTransaction?.transactionId != id) return@launch
+ mProgress.value = true
+ api.request("getTransactionById", Transaction.serializer()) {
+ put("transactionId", id)
+ }.onError {
+ mProgress.value = false
+ }.onSuccess { result ->
+ mProgress.value = false
+ if (result.transactionId != selectedTransaction.transactionId) return@onSuccess
+ Log.d(TAG, "updating selected transaction: ${result.transactionId}")
+ mSelectedTransaction.value = result
+ }
+ }
+
+ @UiThread
fun loadTransactions(searchQuery: String? = null) = scope.launch {
val scopeInfo = selectedScope ?: return@launch
val liveData = mTransactions.getOrPut(scopeInfo) { MutableLiveData() }
@@ -89,17 +106,6 @@ class TransactionManager(
mProgress.value = false
liveData.value = TransactionsResult.Success(transactions)
- // update selected transaction on UiThread (if it exists)
- val selected = selectedTransaction.value
- if (selected != null) transactions.find {
- it.transactionId == selected.transactionId
- }?.let {
- mSelectedTransaction.value = it
- Log.d(TAG, "selected transaction (${it.transactionId}) was updated")
- } ?: let {
- Log.d(TAG, "selected transaction (${selected.transactionId}) was not updated")
- }
-
// update all transactions on UiThread if there was a scope info
if (searchQuery == null) allTransactions[scopeInfo] = transactions
}