From a66b2179638ba8c458aaba86d0707c7046ad881b Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Mon, 30 Mar 2020 14:47:52 -0300 Subject: [wallet] Add basic support for refunds --- .../src/main/java/net/taler/wallet/MainActivity.kt | 15 +++++-- .../main/java/net/taler/wallet/WalletViewModel.kt | 2 + .../wallet/pending/PendingOperationsManager.kt | 2 +- .../java/net/taler/wallet/refund/RefundManager.kt | 48 ++++++++++++++++++++++ wallet/src/main/res/values/strings.xml | 3 ++ 5 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 wallet/src/main/java/net/taler/wallet/refund/RefundManager.kt diff --git a/wallet/src/main/java/net/taler/wallet/MainActivity.kt b/wallet/src/main/java/net/taler/wallet/MainActivity.kt index df7bdc6..26af3f0 100644 --- a/wallet/src/main/java/net/taler/wallet/MainActivity.kt +++ b/wallet/src/main/java/net/taler/wallet/MainActivity.kt @@ -38,8 +38,9 @@ import androidx.navigation.fragment.NavHostFragment import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.setupWithNavController import com.google.android.material.navigation.NavigationView.OnNavigationItemSelectedListener +import com.google.android.material.snackbar.BaseTransientBottomBar.LENGTH_LONG +import com.google.android.material.snackbar.BaseTransientBottomBar.LENGTH_SHORT import com.google.android.material.snackbar.Snackbar -import com.google.android.material.snackbar.Snackbar.LENGTH_SHORT import com.google.zxing.integration.android.IntentIntegrator import com.google.zxing.integration.android.IntentIntegrator.parseActivityResult import kotlinx.android.synthetic.main.activity_main.* @@ -50,6 +51,7 @@ import net.taler.wallet.HostCardEmulatorService.Companion.HTTP_TUNNEL_RESPONSE import net.taler.wallet.HostCardEmulatorService.Companion.MERCHANT_NFC_CONNECTED import net.taler.wallet.HostCardEmulatorService.Companion.MERCHANT_NFC_DISCONNECTED import net.taler.wallet.HostCardEmulatorService.Companion.TRIGGER_PAYMENT_ACTION +import net.taler.wallet.refund.RefundStatus import java.util.Locale.ROOT class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener, @@ -150,8 +152,15 @@ class MainActivity : AppCompatActivity(), OnNavigationItemSelectedListener, model.withdrawManager.getWithdrawalInfo(url) } url.toLowerCase(ROOT).startsWith("taler://refund/") -> { - // TODO implement refunds - Snackbar.make(nav_view, "Refunds are not yet implemented", LENGTH_SHORT).show() + model.showProgressBar.value = true + model.refundManager.refund(url).observe(this, Observer { status -> + model.showProgressBar.value = false + val res = when (status) { + is RefundStatus.Error -> R.string.refund_error + is RefundStatus.Success -> R.string.refund_success + } + Snackbar.make(nav_view, res, LENGTH_LONG).show() + }) } else -> { Snackbar.make( diff --git a/wallet/src/main/java/net/taler/wallet/WalletViewModel.kt b/wallet/src/main/java/net/taler/wallet/WalletViewModel.kt index 9599123..fc17c7c 100644 --- a/wallet/src/main/java/net/taler/wallet/WalletViewModel.kt +++ b/wallet/src/main/java/net/taler/wallet/WalletViewModel.kt @@ -31,6 +31,7 @@ import net.taler.wallet.backend.WalletBackendApi import net.taler.wallet.history.HistoryManager import net.taler.wallet.payment.PaymentManager import net.taler.wallet.pending.PendingOperationsManager +import net.taler.wallet.refund.RefundManager import net.taler.wallet.withdraw.WithdrawManager import org.json.JSONObject @@ -67,6 +68,7 @@ class WalletViewModel(val app: Application) : AndroidViewModel(app) { val pendingOperationsManager: PendingOperationsManager = PendingOperationsManager(walletBackendApi) val historyManager = HistoryManager(walletBackendApi, mapper) + val refundManager = RefundManager(walletBackendApi) override fun onCleared() { walletBackendApi.destroy() diff --git a/wallet/src/main/java/net/taler/wallet/pending/PendingOperationsManager.kt b/wallet/src/main/java/net/taler/wallet/pending/PendingOperationsManager.kt index 2125dbc..694c5da 100644 --- a/wallet/src/main/java/net/taler/wallet/pending/PendingOperationsManager.kt +++ b/wallet/src/main/java/net/taler/wallet/pending/PendingOperationsManager.kt @@ -41,7 +41,7 @@ class PendingOperationsManager(private val walletBackendApi: WalletBackendApi) { walletBackendApi.sendRequest("getPendingOperations", null) { isError, result -> activeGetPending-- if (isError) { - Log.i(TAG, "got getPending error result") + Log.i(TAG, "got getPending error result: $result") return@sendRequest } Log.i(TAG, "got getPending result") diff --git a/wallet/src/main/java/net/taler/wallet/refund/RefundManager.kt b/wallet/src/main/java/net/taler/wallet/refund/RefundManager.kt new file mode 100644 index 0000000..21c634e --- /dev/null +++ b/wallet/src/main/java/net/taler/wallet/refund/RefundManager.kt @@ -0,0 +1,48 @@ +/* + * This file is part of GNU Taler + * (C) 2020 Taler Systems S.A. + * + * GNU Taler is free software; you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 3, or (at your option) any later version. + * + * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * GNU Taler; see the file COPYING. If not, see + */ + +package net.taler.wallet.refund + +import android.util.Log +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import net.taler.wallet.TAG +import net.taler.wallet.backend.WalletBackendApi +import org.json.JSONObject + +sealed class RefundStatus { + object Error : RefundStatus() + object Success : RefundStatus() +} + +class RefundManager(private val walletBackendApi: WalletBackendApi) { + + fun refund(refundUri: String): LiveData { + val liveData = MutableLiveData() + val args = JSONObject().also { it.put("talerRefundUri", refundUri) } + walletBackendApi.sendRequest("applyRefund", args) { isError, result -> + if (isError) { + Log.e(TAG, "Refund Error: $result") + liveData.postValue(RefundStatus.Error) + } else { + Log.e(TAG, "Refund Success: $result") + liveData.postValue(RefundStatus.Success) + } + } + return liveData + } + +} diff --git a/wallet/src/main/res/values/strings.xml b/wallet/src/main/res/values/strings.xml index 04a507b..6bc073f 100644 --- a/wallet/src/main/res/values/strings.xml +++ b/wallet/src/main/res/values/strings.xml @@ -102,4 +102,7 @@ Developer Settings (use with caution!) Reset Wallet (dangerous!) + Error processing refund + Refund received + -- cgit v1.2.3