From c928b458fce0c72c75852ab338a6e4e85a278ed4 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Tue, 1 Sep 2020 11:12:31 -0300 Subject: [wallet] support the new TalerErrorInfo error format Yet another last-minute breaking protocol change. --- .../net/taler/wallet/backend/WalletBackendApi.kt | 18 +++++++++--------- .../taler/wallet/backend/WalletBackendService.kt | 12 +++++++++--- .../java/net/taler/wallet/backend/WalletResponse.kt | 19 +++++++++---------- .../java/net/taler/wallet/payment/PaymentManager.kt | 4 ++-- .../net/taler/wallet/payment/PaymentResponses.kt | 4 ++-- .../taler/wallet/transactions/TransactionAdapter.kt | 2 +- .../net/taler/wallet/transactions/Transactions.kt | 21 +++++++-------------- .../net/taler/wallet/withdraw/WithdrawManager.kt | 4 ++-- 8 files changed, 41 insertions(+), 43 deletions(-) (limited to 'wallet/src/main/java') diff --git a/wallet/src/main/java/net/taler/wallet/backend/WalletBackendApi.kt b/wallet/src/main/java/net/taler/wallet/backend/WalletBackendApi.kt index a72df9c..a2b48b6 100644 --- a/wallet/src/main/java/net/taler/wallet/backend/WalletBackendApi.kt +++ b/wallet/src/main/java/net/taler/wallet/backend/WalletBackendApi.kt @@ -157,20 +157,20 @@ class WalletBackendApi( } } sendRequest(operation, args?.invoke(JSONObject())) { isError, message -> - val response = if (isError) { - val error = - json.decodeFromString(WalletErrorInfo.serializer(), message.toString()) - WalletResponse.Error(error) - } else { - try { + val response = try { + if (isError) { + val error = + json.decodeFromString(TalerErrorInfo.serializer(), message.toString()) + WalletResponse.Error(error) + } else { val t: T = serializer?.let { json.decodeFromString(serializer, message.toString()) } ?: Unit as T WalletResponse.Success(t) - } catch (e: Exception) { - val info = WalletErrorInfo(0, "", e.toString(), null) - WalletResponse.Error(info) } + } catch (e: Exception) { + val info = TalerErrorInfo(0, "", e.toString(), null) + WalletResponse.Error(info) } cont.resume(response) } diff --git a/wallet/src/main/java/net/taler/wallet/backend/WalletBackendService.kt b/wallet/src/main/java/net/taler/wallet/backend/WalletBackendService.kt index 993114c..c8a2bad 100644 --- a/wallet/src/main/java/net/taler/wallet/backend/WalletBackendService.kt +++ b/wallet/src/main/java/net/taler/wallet/backend/WalletBackendService.kt @@ -184,13 +184,16 @@ class WalletBackendService : Service() { private fun handleAkonoMessage(messageStr: String) { val message = JSONObject(messageStr) - Log.v(TAG, "got back message: ${message.toString(2)}") when (val type = message.getString("type")) { "notification" -> { - sendNotify(message.getString("payload")) + val payload = message.getJSONObject("payload") + if (payload.optString("type") != "waiting-for-retry") { + Log.v(TAG, "got back notification: ${message.toString(2)}") + } + sendNotify(payload.toString()) } "tunnelHttp" -> { - Log.v(TAG, "got http tunnel request!") + Log.v(TAG, "got http tunnel request! ${message.toString(2)}") Intent().also { intent -> intent.action = HostCardEmulatorService.HTTP_TUNNEL_REQUEST intent.putExtra("tunnelMessage", messageStr) @@ -204,15 +207,18 @@ class WalletBackendService : Service() { sendNotify(message.toString(2)) } "reset" -> { + Log.v(TAG, "got back message: ${message.toString(2)}") exitProcess(1) } else -> { + Log.v(TAG, "got back response: ${message.toString(2)}") val payload = message.getJSONObject("result").toString(2) handleResponse(false, message, payload) } } } "error" -> { + Log.v(TAG, "got back error: ${message.toString(2)}") val payload = message.getJSONObject("error").toString(2) handleResponse(true, message, payload) } diff --git a/wallet/src/main/java/net/taler/wallet/backend/WalletResponse.kt b/wallet/src/main/java/net/taler/wallet/backend/WalletResponse.kt index 5826997..2476607 100644 --- a/wallet/src/main/java/net/taler/wallet/backend/WalletResponse.kt +++ b/wallet/src/main/java/net/taler/wallet/backend/WalletResponse.kt @@ -38,7 +38,7 @@ sealed class WalletResponse { @Serializable @SerialName("error") data class Error( - val error: WalletErrorInfo + val error: TalerErrorInfo ) : WalletResponse() fun onSuccess(block: (result: T) -> Unit): WalletResponse { @@ -46,35 +46,34 @@ sealed class WalletResponse { return this } - fun onError(block: (result: WalletErrorInfo) -> Unit): WalletResponse { + fun onError(block: (result: TalerErrorInfo) -> Unit): WalletResponse { if (this is Error) block(this.error) return this } } @Serializable -data class WalletErrorInfo( +data class TalerErrorInfo( // Numeric error code defined defined in the // GANA gnu-taler-error-codes registry. - val talerErrorCode: Int, + val code: Int, // English description of the error code. - val talerErrorHint: String, + val hint: String?, // English diagnostic message that can give details // for the instance of the error. - val message: String, + val message: String?, - // Error details, type depends on talerErrorCode + // Error details @Serializable(JSONObjectDeserializer::class) val details: JSONObject? ) { val userFacingMsg: String get() { return StringBuilder().apply { - append(talerErrorCode) - append(" ") - append(message) + append(code) + message?.let { append(" ").append(it) } details?.let { details -> append("\n\n") details.optJSONObject("errorResponse")?.let { errorResponse -> 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 befcd83..c364286 100644 --- a/wallet/src/main/java/net/taler/wallet/payment/PaymentManager.kt +++ b/wallet/src/main/java/net/taler/wallet/payment/PaymentManager.kt @@ -26,7 +26,7 @@ import net.taler.common.ContractTerms import net.taler.lib.common.Amount import net.taler.wallet.TAG import net.taler.wallet.backend.WalletBackendApi -import net.taler.wallet.backend.WalletErrorInfo +import net.taler.wallet.backend.TalerErrorInfo import net.taler.wallet.payment.PayStatus.AlreadyPaid import net.taler.wallet.payment.PayStatus.InsufficientBalance import net.taler.wallet.payment.PreparePayResponse.AlreadyConfirmedResponse @@ -130,7 +130,7 @@ class PaymentManager( mPayStatus.value = PayStatus.None } - private fun handleError(operation: String, error: WalletErrorInfo) { + private fun handleError(operation: String, error: TalerErrorInfo) { Log.e(TAG, "got $operation error result $error") mPayStatus.value = PayStatus.Error(error.userFacingMsg) } diff --git a/wallet/src/main/java/net/taler/wallet/payment/PaymentResponses.kt b/wallet/src/main/java/net/taler/wallet/payment/PaymentResponses.kt index 2e99806..4b908b5 100644 --- a/wallet/src/main/java/net/taler/wallet/payment/PaymentResponses.kt +++ b/wallet/src/main/java/net/taler/wallet/payment/PaymentResponses.kt @@ -21,7 +21,7 @@ import kotlinx.serialization.Serializable import net.taler.common.ContractTerms import net.taler.lib.android.CustomClassDiscriminator import net.taler.lib.common.Amount -import net.taler.wallet.transactions.TransactionError +import net.taler.wallet.backend.TalerErrorInfo @Serializable sealed class PreparePayResponse { @@ -75,5 +75,5 @@ sealed class ConfirmPayResult { @Serializable @SerialName("pending") - data class Pending(val lastError: TransactionError) : ConfirmPayResult() + data class Pending(val lastError: TalerErrorInfo) : ConfirmPayResult() } diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionAdapter.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionAdapter.kt index 9dc2d23..936bbbd 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionAdapter.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionAdapter.kt @@ -104,7 +104,7 @@ internal class TransactionAdapter( private fun bindExtraInfo(transaction: Transaction) { if (transaction.error != null) { extraInfoView.text = - context.getString(R.string.payment_error, transaction.error!!.text) + context.getString(R.string.payment_error, transaction.error!!.userFacingMsg) extraInfoView.setTextColor(red) extraInfoView.visibility = VISIBLE } else if (transaction is TransactionWithdrawal && !transaction.confirmed) { 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 3210093..603b754 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/Transactions.kt @@ -28,6 +28,7 @@ import net.taler.common.ContractProduct import net.taler.lib.common.Amount import net.taler.lib.common.Timestamp import net.taler.wallet.R +import net.taler.wallet.backend.TalerErrorInfo import net.taler.wallet.cleanExchange import net.taler.wallet.transactions.WithdrawalDetails.ManualTransfer import net.taler.wallet.transactions.WithdrawalDetails.TalerBankIntegrationApi @@ -40,7 +41,7 @@ sealed class Transaction { abstract val transactionId: String abstract val timestamp: Timestamp abstract val pending: Boolean - abstract val error: TransactionError? + abstract val error: TalerErrorInfo? abstract val amountRaw: Amount abstract val amountEffective: Amount @@ -64,14 +65,6 @@ sealed class AmountType { object Neutral : AmountType() } -@Serializable -data class TransactionError( - private val ec: Int, - private val hint: String? = null, -) { - val text get() = if (hint == null) "$ec" else "$ec $hint" -} - @Serializable @SerialName("withdrawal") class TransactionWithdrawal( @@ -80,7 +73,7 @@ class TransactionWithdrawal( override val pending: Boolean, val exchangeBaseUrl: String, val withdrawalDetails: WithdrawalDetails, - override val error: TransactionError? = null, + override val error: TalerErrorInfo? = null, override val amountRaw: Amount, override val amountEffective: Amount ) : Transaction() { @@ -137,7 +130,7 @@ class TransactionPayment( override val pending: Boolean, val info: TransactionInfo, val status: PaymentStatus, - override val error: TransactionError? = null, + override val error: TalerErrorInfo? = null, override val amountRaw: Amount, override val amountEffective: Amount ) : Transaction() { @@ -197,7 +190,7 @@ class TransactionRefund( * Part of the refund that couldn't be applied because the refund permissions were expired */ val amountInvalid: Amount? = null, - override val error: TransactionError? = null, + override val error: TalerErrorInfo? = null, @SerialName("amountEffective") // TODO remove when fixed in wallet-core override val amountRaw: Amount, @SerialName("amountRaw") // TODO remove when fixed in wallet-core @@ -224,7 +217,7 @@ class TransactionTip( // TODO status: TipStatus, val exchangeBaseUrl: String, val merchant: ContractMerchant, - override val error: TransactionError? = null, + override val error: TalerErrorInfo? = null, override val amountRaw: Amount, override val amountEffective: Amount ) : Transaction() { @@ -247,7 +240,7 @@ class TransactionRefresh( override val timestamp: Timestamp, override val pending: Boolean, val exchangeBaseUrl: String, - override val error: TransactionError? = null, + override val error: TalerErrorInfo? = null, override val amountRaw: Amount, override val amountEffective: Amount ) : Transaction() { diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt b/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt index 730f704..b6b4285 100644 --- a/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt +++ b/wallet/src/main/java/net/taler/wallet/withdraw/WithdrawManager.kt @@ -25,7 +25,7 @@ import kotlinx.serialization.Serializable import net.taler.lib.common.Amount import net.taler.wallet.TAG import net.taler.wallet.backend.WalletBackendApi -import net.taler.wallet.backend.WalletErrorInfo +import net.taler.wallet.backend.TalerErrorInfo import net.taler.wallet.exchanges.ExchangeFees import net.taler.wallet.exchanges.ExchangeItem import net.taler.wallet.withdraw.WithdrawStatus.ReceivedDetails @@ -201,7 +201,7 @@ class WithdrawManager( } @UiThread - private fun handleError(operation: String, error: WalletErrorInfo) { + private fun handleError(operation: String, error: TalerErrorInfo) { Log.e(TAG, "Error $operation $error") withdrawStatus.value = WithdrawStatus.Error(error.userFacingMsg) } -- cgit v1.2.3