diff options
Diffstat (limited to 'wallet/src/main/java/net/taler/wallet')
19 files changed, 104 insertions, 18 deletions
diff --git a/wallet/src/main/java/net/taler/wallet/MainActivity.kt b/wallet/src/main/java/net/taler/wallet/MainActivity.kt index bf95475..c9901a6 100644 --- a/wallet/src/main/java/net/taler/wallet/MainActivity.kt +++ b/wallet/src/main/java/net/taler/wallet/MainActivity.kt @@ -139,6 +139,7 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener, } if (it) barcodeLauncher.launch(scanOptions) }) + } @Deprecated("Deprecated in Java") @@ -295,7 +296,11 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener, model.showProgressBar.value = false when (status) { is RefundStatus.Error -> { - showError(R.string.refund_error, status.msg) + if (model.devMode.value == false) { + showError(R.string.refund_error, status.error.userFacingMsg) + } else { + showError(status.error) + } } is RefundStatus.Success -> { val amount = status.response.amountRefundGranted diff --git a/wallet/src/main/java/net/taler/wallet/MainViewModel.kt b/wallet/src/main/java/net/taler/wallet/MainViewModel.kt index 2ad6f6b..e8b9d02 100644 --- a/wallet/src/main/java/net/taler/wallet/MainViewModel.kt +++ b/wallet/src/main/java/net/taler/wallet/MainViewModel.kt @@ -34,6 +34,7 @@ import net.taler.common.toEvent import net.taler.wallet.accounts.AccountManager import net.taler.wallet.backend.NotificationPayload import net.taler.wallet.backend.NotificationReceiver +import net.taler.wallet.backend.TalerErrorInfo import net.taler.wallet.backend.VersionReceiver import net.taler.wallet.backend.WalletBackendApi import net.taler.wallet.backend.WalletCoreVersion @@ -121,7 +122,6 @@ class MainViewModel( 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 { diff --git a/wallet/src/main/java/net/taler/wallet/Utils.kt b/wallet/src/main/java/net/taler/wallet/Utils.kt index 435aa96..9dfe541 100644 --- a/wallet/src/main/java/net/taler/wallet/Utils.kt +++ b/wallet/src/main/java/net/taler/wallet/Utils.kt @@ -32,8 +32,13 @@ import android.widget.Toast.LENGTH_LONG import androidx.annotation.RequiresApi import androidx.browser.customtabs.CustomTabsIntent import androidx.core.content.getSystemService +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json import net.taler.common.Amount import net.taler.common.AmountParserException +import net.taler.common.showError import net.taler.common.startActivitySafe import net.taler.wallet.backend.TalerErrorCode.WALLET_WITHDRAWAL_KYC_REQUIRED import net.taler.wallet.backend.TalerErrorInfo @@ -124,4 +129,24 @@ fun launchInAppBrowser(context: Context, url: String) { val intent = builder.build().intent intent.data = Uri.parse(url) context.startActivitySafe(intent) +} + +fun Fragment.showError(error: TalerErrorInfo) { + @Suppress("OPT_IN_USAGE") + val json = Json { + prettyPrint = true + prettyPrintIndent = " " + } + val message = json.encodeToString(error) + this@showError.showError(message) +} + +fun FragmentActivity.showError(error: TalerErrorInfo) { + @Suppress("OPT_IN_USAGE") + val json = Json { + prettyPrint = true + prettyPrintIndent = " " + } + val message = json.encodeToString(error) + this@showError.showError(message) }
\ No newline at end of file diff --git a/wallet/src/main/java/net/taler/wallet/deposit/DepositFragment.kt b/wallet/src/main/java/net/taler/wallet/deposit/DepositFragment.kt index c4b302f..d773293 100644 --- a/wallet/src/main/java/net/taler/wallet/deposit/DepositFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/deposit/DepositFragment.kt @@ -32,6 +32,7 @@ import net.taler.wallet.MainViewModel import net.taler.wallet.R import net.taler.wallet.compose.TalerSurface import net.taler.wallet.compose.collectAsStateLifecycleAware +import net.taler.wallet.showError class DepositFragment : Fragment() { private val model: MainViewModel by activityViewModels() @@ -80,7 +81,11 @@ class DepositFragment : Fragment() { lifecycleScope.launchWhenStarted { depositManager.depositState.collect { state -> if (state is DepositState.Error) { - showError(state.msg) + if (model.devMode.value == false) { + showError(state.error.userFacingMsg) + } else { + showError(state.error) + } } else if (state is DepositState.Success) { findNavController().navigate(R.id.action_nav_deposit_to_nav_main) } diff --git a/wallet/src/main/java/net/taler/wallet/deposit/DepositManager.kt b/wallet/src/main/java/net/taler/wallet/deposit/DepositManager.kt index 91f7ad5..35cca1c 100644 --- a/wallet/src/main/java/net/taler/wallet/deposit/DepositManager.kt +++ b/wallet/src/main/java/net/taler/wallet/deposit/DepositManager.kt @@ -58,7 +58,7 @@ class DepositManager( put("iban", iban) }.onError { Log.e(TAG, "Error validateIban $it") - mDepositState.value = DepositState.Error(it.userFacingMsg) + mDepositState.value = DepositState.Error(it) }.onSuccess { response -> if (response.valid) { // only prepare/make deposit, if IBAN is valid @@ -112,7 +112,7 @@ class DepositManager( put("amount", amount.toJSONString()) }.onError { Log.e(TAG, "Error prepareDeposit $it") - mDepositState.value = DepositState.Error(it.userFacingMsg) + mDepositState.value = DepositState.Error(it) }.onSuccess { mDepositState.value = DepositState.FeesChecked( totalDepositCost = it.totalDepositCost, @@ -138,7 +138,7 @@ class DepositManager( put("amount", amount.toJSONString()) }.onError { Log.e(TAG, "Error createDepositGroup $it") - mDepositState.value = DepositState.Error(it.userFacingMsg) + mDepositState.value = DepositState.Error(it) }.onSuccess { mDepositState.value = DepositState.Success } diff --git a/wallet/src/main/java/net/taler/wallet/deposit/DepositState.kt b/wallet/src/main/java/net/taler/wallet/deposit/DepositState.kt index a019757..168378f 100644 --- a/wallet/src/main/java/net/taler/wallet/deposit/DepositState.kt +++ b/wallet/src/main/java/net/taler/wallet/deposit/DepositState.kt @@ -17,6 +17,7 @@ package net.taler.wallet.deposit import net.taler.common.Amount +import net.taler.wallet.backend.TalerErrorInfo sealed class DepositState { @@ -43,6 +44,6 @@ sealed class DepositState { object Success : DepositState() - class Error(val msg: String) : DepositState() + class Error(val error: TalerErrorInfo) : DepositState() } diff --git a/wallet/src/main/java/net/taler/wallet/deposit/MakeBitcoinDepositComposable.kt b/wallet/src/main/java/net/taler/wallet/deposit/MakeBitcoinDepositComposable.kt index 4505762..d961f34 100644 --- a/wallet/src/main/java/net/taler/wallet/deposit/MakeBitcoinDepositComposable.kt +++ b/wallet/src/main/java/net/taler/wallet/deposit/MakeBitcoinDepositComposable.kt @@ -123,7 +123,7 @@ fun MakeBitcoinDepositComposable( modifier = Modifier.padding(16.dp), fontSize = 18.sp, color = MaterialTheme.colorScheme.error, - text = (state as? DepositState.Error)?.msg ?: "", + text = (state as? DepositState.Error)?.error?.userFacingMsg ?: "", ) } val focusManager = LocalFocusManager.current diff --git a/wallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt b/wallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt index d47970f..d14ed96 100644 --- a/wallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt +++ b/wallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt @@ -200,7 +200,7 @@ fun MakeDepositComposable( modifier = Modifier.padding(16.dp), fontSize = 18.sp, color = MaterialTheme.colorScheme.error, - text = (state as? DepositState.Error)?.msg ?: "", + text = (state as? DepositState.Error)?.error?.userFacingMsg ?: "", ) } val focusManager = LocalFocusManager.current 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 21e31f4..7e1b7cc 100644 --- a/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeListFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeListFragment.kt @@ -33,6 +33,7 @@ import net.taler.common.fadeOut import net.taler.wallet.MainViewModel import net.taler.wallet.R import net.taler.wallet.databinding.FragmentExchangeListBinding +import net.taler.wallet.showError open class ExchangeListFragment : Fragment(), ExchangeClickListener { @@ -68,6 +69,11 @@ open class ExchangeListFragment : Fragment(), ExchangeClickListener { exchangeManager.exchanges.observe(viewLifecycleOwner) { exchanges -> onExchangeUpdate(exchanges) } + exchangeManager.errorEvent.observe(viewLifecycleOwner, EventObserver { error -> + if (model.devMode.value == true) { + showError(error) + } + }) exchangeManager.addError.observe(viewLifecycleOwner, EventObserver { error -> if (error) onAddExchangeFailed() }) diff --git a/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeManager.kt b/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeManager.kt index 4a57068..a97e188 100644 --- a/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeManager.kt +++ b/wallet/src/main/java/net/taler/wallet/exchanges/ExchangeManager.kt @@ -28,6 +28,7 @@ import kotlinx.serialization.Serializable import net.taler.common.Event import net.taler.common.toEvent import net.taler.wallet.TAG +import net.taler.wallet.backend.TalerErrorInfo import net.taler.wallet.backend.WalletBackendApi @Serializable @@ -49,6 +50,9 @@ class ExchangeManager( private val mAddError = MutableLiveData<Event<Boolean>>() val addError: LiveData<Event<Boolean>> = mAddError + private val mErrorEvent = MutableLiveData<Event<TalerErrorInfo>>() + val errorEvent: LiveData<Event<TalerErrorInfo>> = mErrorEvent + var withdrawalExchange: ExchangeItem? = null private fun list(): LiveData<List<ExchangeItem>> { @@ -56,6 +60,7 @@ class ExchangeManager( scope.launch { val response = api.request("listExchanges", ExchangeListResponse.serializer()) response.onError { + mErrorEvent.value = it.toEvent() throw AssertionError("Wallet core failed to return exchanges! ${it.userFacingMsg}") }.onSuccess { Log.d(TAG, "Exchange list: ${it.exchanges}") @@ -71,8 +76,9 @@ class ExchangeManager( api.request<Unit>("addExchange") { put("exchangeBaseUrl", exchangeUrl) }.onError { - mProgress.value = false Log.e(TAG, "Error adding exchange: $it") + mProgress.value = false + mErrorEvent.value = it.toEvent() mAddError.value = true.toEvent() }.onSuccess { mProgress.value = false diff --git a/wallet/src/main/java/net/taler/wallet/payment/PaymentManager.kt b/wallet/src/main/java/net/taler/wallet/payment/PaymentManager.kt index 53cb259..c280304 100644 --- a/wallet/src/main/java/net/taler/wallet/payment/PaymentManager.kt +++ b/wallet/src/main/java/net/taler/wallet/payment/PaymentManager.kt @@ -52,7 +52,7 @@ sealed class PayStatus { // TODO bring user to fulfilment URI object AlreadyPaid : PayStatus() - data class Error(val error: String) : PayStatus() + data class Error(val error: TalerErrorInfo) : PayStatus() data class Success(val currency: String) : PayStatus() } @@ -121,7 +121,7 @@ class PaymentManager( private fun handleError(operation: String, error: TalerErrorInfo) { Log.e(TAG, "got $operation error result $error") - mPayStatus.value = PayStatus.Error(error.userFacingMsg) + mPayStatus.value = PayStatus.Error(error) } } diff --git a/wallet/src/main/java/net/taler/wallet/payment/PromptPaymentFragment.kt b/wallet/src/main/java/net/taler/wallet/payment/PromptPaymentFragment.kt index 7ed1bab..609adb4 100644 --- a/wallet/src/main/java/net/taler/wallet/payment/PromptPaymentFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/payment/PromptPaymentFragment.kt @@ -35,6 +35,7 @@ import net.taler.common.fadeOut import net.taler.wallet.MainViewModel import net.taler.wallet.R import net.taler.wallet.databinding.FragmentPromptPaymentBinding +import net.taler.wallet.showError /** * Show a payment and ask the user to accept/decline. @@ -118,7 +119,10 @@ class PromptPaymentFragment : Fragment(), ProductImageClickListener { } is PayStatus.Error -> { showLoading(false) - ui.details.errorView.text = getString(R.string.payment_error, payStatus.error) + if (model.devMode.value == true) { + showError(payStatus.error) + } + ui.details.errorView.text = getString(R.string.payment_error, payStatus.error.userFacingMsg) ui.details.errorView.fadeIn() } is PayStatus.None -> { diff --git a/wallet/src/main/java/net/taler/wallet/peer/IncomingPullPaymentFragment.kt b/wallet/src/main/java/net/taler/wallet/peer/IncomingPullPaymentFragment.kt index 3aa0963..87abb47 100644 --- a/wallet/src/main/java/net/taler/wallet/peer/IncomingPullPaymentFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/peer/IncomingPullPaymentFragment.kt @@ -29,6 +29,7 @@ import net.taler.wallet.MainViewModel import net.taler.wallet.R import net.taler.wallet.compose.TalerSurface import net.taler.wallet.compose.collectAsStateLifecycleAware +import net.taler.wallet.showError class IncomingPullPaymentFragment : Fragment() { private val model: MainViewModel by activityViewModels() @@ -43,6 +44,8 @@ class IncomingPullPaymentFragment : Fragment() { peerManager.incomingPullState.collect { if (it is IncomingAccepted) { findNavController().navigate(R.id.action_promptPullPayment_to_nav_main) + } else if (it is IncomingError) { + showError(it.info) } } } diff --git a/wallet/src/main/java/net/taler/wallet/peer/IncomingPushPaymentFragment.kt b/wallet/src/main/java/net/taler/wallet/peer/IncomingPushPaymentFragment.kt index 736ccd5..118104e 100644 --- a/wallet/src/main/java/net/taler/wallet/peer/IncomingPushPaymentFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/peer/IncomingPushPaymentFragment.kt @@ -29,6 +29,7 @@ import net.taler.wallet.MainViewModel import net.taler.wallet.R import net.taler.wallet.compose.TalerSurface import net.taler.wallet.compose.collectAsStateLifecycleAware +import net.taler.wallet.showError class IncomingPushPaymentFragment : Fragment() { private val model: MainViewModel by activityViewModels() @@ -43,6 +44,8 @@ class IncomingPushPaymentFragment : Fragment() { peerManager.incomingPushState.collect { if (it is IncomingAccepted) { findNavController().navigate(R.id.action_promptPushPayment_to_nav_main) + } else if (it is IncomingError) { + showError(it.info) } } } diff --git a/wallet/src/main/java/net/taler/wallet/peer/OutgoingPullFragment.kt b/wallet/src/main/java/net/taler/wallet/peer/OutgoingPullFragment.kt index 565aeb1..7b1eee8 100644 --- a/wallet/src/main/java/net/taler/wallet/peer/OutgoingPullFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/peer/OutgoingPullFragment.kt @@ -23,6 +23,7 @@ import android.view.ViewGroup import androidx.compose.ui.platform.ComposeView import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels +import androidx.lifecycle.lifecycleScope import androidx.navigation.findNavController import net.taler.common.Amount import net.taler.wallet.MainViewModel @@ -30,6 +31,7 @@ import net.taler.wallet.R import net.taler.wallet.compose.TalerSurface import net.taler.wallet.compose.collectAsStateLifecycleAware import net.taler.wallet.exchanges.ExchangeItem +import net.taler.wallet.showError class OutgoingPullFragment : Fragment() { private val model: MainViewModel by activityViewModels() @@ -66,6 +68,17 @@ class OutgoingPullFragment : Fragment() { } } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + lifecycleScope.launchWhenStarted { + peerManager.pullState.collect { + if (it is OutgoingError && model.devMode.value == true) { + showError(it.info) + } + } + } + } + override fun onStart() { super.onStart() activity?.setTitle(R.string.receive_peer_title) diff --git a/wallet/src/main/java/net/taler/wallet/peer/OutgoingPushFragment.kt b/wallet/src/main/java/net/taler/wallet/peer/OutgoingPushFragment.kt index 255aee5..c586a1d 100644 --- a/wallet/src/main/java/net/taler/wallet/peer/OutgoingPushFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/peer/OutgoingPushFragment.kt @@ -24,6 +24,7 @@ import androidx.activity.OnBackPressedCallback import androidx.compose.ui.platform.ComposeView import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels +import androidx.lifecycle.lifecycleScope import androidx.navigation.findNavController import androidx.navigation.fragment.findNavController import net.taler.common.Amount @@ -31,6 +32,7 @@ import net.taler.wallet.MainViewModel import net.taler.wallet.R import net.taler.wallet.compose.TalerSurface import net.taler.wallet.compose.collectAsStateLifecycleAware +import net.taler.wallet.showError class OutgoingPushFragment : Fragment() { private val model: MainViewModel by activityViewModels() @@ -80,6 +82,17 @@ class OutgoingPushFragment : Fragment() { } } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + lifecycleScope.launchWhenStarted { + peerManager.pushState.collect { + if (it is OutgoingError && model.devMode.value == true) { + showError(it.info) + } + } + } + } + override fun onStart() { super.onStart() activity?.setTitle(R.string.send_peer_title) diff --git a/wallet/src/main/java/net/taler/wallet/refund/RefundManager.kt b/wallet/src/main/java/net/taler/wallet/refund/RefundManager.kt index f3c41e8..29f18c7 100644 --- a/wallet/src/main/java/net/taler/wallet/refund/RefundManager.kt +++ b/wallet/src/main/java/net/taler/wallet/refund/RefundManager.kt @@ -22,10 +22,11 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import kotlinx.serialization.Serializable import net.taler.common.Amount +import net.taler.wallet.backend.TalerErrorInfo import net.taler.wallet.backend.WalletBackendApi sealed class RefundStatus { - data class Error(val msg: String) : RefundStatus() + data class Error(val error: TalerErrorInfo) : RefundStatus() data class Success(val response: RefundResponse) : RefundStatus() } @@ -48,7 +49,7 @@ class RefundManager( api.request("applyRefund", RefundResponse.serializer()) { put("talerRefundUri", refundUri) }.onError { - liveData.postValue(RefundStatus.Error(it.userFacingMsg)) + liveData.postValue(RefundStatus.Error(it)) }.onSuccess { liveData.postValue(RefundStatus.Success(it)) } 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 fcc7787..ed4c4da 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionManager.kt @@ -24,12 +24,13 @@ import androidx.lifecycle.switchMap import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import net.taler.wallet.TAG +import net.taler.wallet.backend.TalerErrorInfo import net.taler.wallet.backend.WalletBackendApi import net.taler.wallet.transactions.ExtendedStatus.Pending import java.util.LinkedList sealed class TransactionsResult { - class Error(val msg: String) : TransactionsResult() + class Error(val error: TalerErrorInfo) : TransactionsResult() class Success(val transactions: List<Transaction>) : TransactionsResult() } @@ -72,7 +73,7 @@ class TransactionManager( if (searchQuery != null) put("search", searchQuery) put("currency", currency) }.onError { - liveData.postValue(TransactionsResult.Error(it.userFacingMsg)) + liveData.postValue(TransactionsResult.Error(it)) mProgress.postValue(false) }.onSuccess { result -> val transactions = LinkedList(result.transactions) 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 5dff704..bc3c722 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionsFragment.kt @@ -198,7 +198,7 @@ class TransactionsFragment : Fragment(), OnTransactionClickListener, ActionMode. private fun onTransactionsResult(result: TransactionsResult) = when (result) { is TransactionsResult.Error -> { ui.list.fadeOut() - ui.emptyState.text = getString(R.string.transactions_error, result.msg) + ui.emptyState.text = getString(R.string.transactions_error, result.error.userFacingMsg) ui.emptyState.fadeIn() } is TransactionsResult.Success -> { |