diff options
author | Torsten Grote <t@grobox.de> | 2020-02-12 16:53:03 -0300 |
---|---|---|
committer | Torsten Grote <t@grobox.de> | 2020-02-12 17:09:09 -0300 |
commit | ada382885e9c103fe0795817a8585270a3079302 (patch) | |
tree | 3da610aa39d2c767307d974d54f2f4eb32be9188 /app/src/main/java/net/taler/wallet/payment/PaymentManager.kt | |
parent | c20a7945f2b37863264c3b9bdcc85454018bd4cd (diff) | |
download | wallet-android-ada382885e9c103fe0795817a8585270a3079302.tar.gz wallet-android-ada382885e9c103fe0795817a8585270a3079302.tar.bz2 wallet-android-ada382885e9c103fe0795817a8585270a3079302.zip |
Refactor payment code to make it easier to extend
Diffstat (limited to 'app/src/main/java/net/taler/wallet/payment/PaymentManager.kt')
-rw-r--r-- | app/src/main/java/net/taler/wallet/payment/PaymentManager.kt | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/app/src/main/java/net/taler/wallet/payment/PaymentManager.kt b/app/src/main/java/net/taler/wallet/payment/PaymentManager.kt new file mode 100644 index 0000000..2e40250 --- /dev/null +++ b/app/src/main/java/net/taler/wallet/payment/PaymentManager.kt @@ -0,0 +1,108 @@ +package net.taler.wallet.payment + +import android.util.Log +import androidx.annotation.UiThread +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import net.taler.wallet.Amount +import net.taler.wallet.TAG +import net.taler.wallet.backend.WalletBackendApi +import org.json.JSONObject + +class PaymentManager(private val walletBackendApi: WalletBackendApi) { + + private val mPayStatus = MutableLiveData<PayStatus>(PayStatus.None) + internal val payStatus: LiveData<PayStatus> = mPayStatus + + private var currentPayRequestId = 0 + + @UiThread + fun preparePay(url: String) { + mPayStatus.value = PayStatus.Loading + + val args = JSONObject(mapOf("url" to url)) + + currentPayRequestId += 1 + val payRequestId = currentPayRequestId + + walletBackendApi.sendRequest("preparePay", args) { isError, result -> + when { + isError -> { + Log.v(TAG, "got preparePay error result") + mPayStatus.value = PayStatus.Error(result.toString()) + } + payRequestId != this.currentPayRequestId -> { + Log.v(TAG, "preparePay result was for old request") + } + else -> { + val status = result.getString("status") + mPayStatus.postValue(getPayStatusUpdate(status, result)) + } + } + } + } + + private fun getPayStatusUpdate(status: String, json: JSONObject) = when (status) { + "payment-possible" -> PayStatus.Prepared( + contractTerms = getContractTerms(json), + proposalId = json.getString("proposalId"), + totalFees = Amount.fromJson(json.getJSONObject("totalFees")) + ) + "paid" -> PayStatus.AlreadyPaid(getContractTerms(json)) + "insufficient-balance" -> PayStatus.InsufficientBalance(getContractTerms(json)) + "error" -> PayStatus.Error("got some error") + else -> PayStatus.Error("unknown status") + } + + private fun getContractTerms(json: JSONObject): ContractTerms { + val ctJson = JSONObject(json.getString("contractTermsRaw")) + val amount = Amount.fromString(ctJson.getString("amount")) + val summary = ctJson.getString("summary") + return ContractTerms(summary, amount) + } + + fun confirmPay(proposalId: String) { + val args = JSONObject(mapOf("proposalId" to proposalId)) + + walletBackendApi.sendRequest("confirmPay", args) { _, _ -> + mPayStatus.postValue(PayStatus.Success) + } + } + + fun abortProposal(proposalId: String) { + val args = JSONObject(mapOf("proposalId" to proposalId)) + + Log.i(TAG, "aborting proposal") + + walletBackendApi.sendRequest("abortProposal", args) { isError, _ -> + if (isError) { + Log.e(TAG, "received error response to abortProposal") + return@sendRequest + } + mPayStatus.postValue(PayStatus.None) + } + } + + @UiThread + fun resetPayStatus() { + mPayStatus.value = PayStatus.None + } + +} + +sealed class PayStatus { + object None : PayStatus() + object Loading : PayStatus() + data class Prepared( + val contractTerms: ContractTerms, + val proposalId: String, + val totalFees: Amount + ) : PayStatus() + + data class InsufficientBalance(val contractTerms: ContractTerms) : PayStatus() + data class AlreadyPaid(val contractTerms: ContractTerms) : PayStatus() + data class Error(val error: String) : PayStatus() + object Success : PayStatus() +} + +data class ContractTerms(val summary: String, val amount: Amount) |