diff options
author | Torsten Grote <t@grobox.de> | 2024-02-06 14:26:12 -0300 |
---|---|---|
committer | Torsten Grote <t@grobox.de> | 2024-02-06 14:26:12 -0300 |
commit | 20a83c6618236e269b2540990f6a687b5598c889 (patch) | |
tree | 9503c5c28353066024b0781841e43e98ff2f324c /wallet/src/main/java/net/taler/wallet/tip | |
parent | da098a6bd5c7cdc4722a24ac28e0a87334341bbb (diff) | |
download | taler-android-20a83c6618236e269b2540990f6a687b5598c889.tar.gz taler-android-20a83c6618236e269b2540990f6a687b5598c889.tar.bz2 taler-android-20a83c6618236e269b2540990f6a687b5598c889.zip |
[wallet] bye bye tips!
Diffstat (limited to 'wallet/src/main/java/net/taler/wallet/tip')
4 files changed, 0 insertions, 362 deletions
diff --git a/wallet/src/main/java/net/taler/wallet/tip/AlreadyAcceptedFragment.kt b/wallet/src/main/java/net/taler/wallet/tip/AlreadyAcceptedFragment.kt deleted file mode 100644 index 637a2da..0000000 --- a/wallet/src/main/java/net/taler/wallet/tip/AlreadyAcceptedFragment.kt +++ /dev/null @@ -1,50 +0,0 @@ -/* - * 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 <http://www.gnu.org/licenses/> - */ - -package net.taler.wallet.tip - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.fragment.app.Fragment -import androidx.navigation.fragment.findNavController -import net.taler.wallet.databinding.FragmentAlreadyAcceptedBinding - -/** - * Display the message that the user already paid for the order - * that the merchant is proposing. - */ -class AlreadyAcceptedFragment : Fragment() { - - private lateinit var ui: FragmentAlreadyAcceptedBinding - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle?, - ): View { - ui = FragmentAlreadyAcceptedBinding.inflate(inflater, container, false) - return ui.root - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - ui.backButton.setOnClickListener { - findNavController().navigateUp() - } - } - -} diff --git a/wallet/src/main/java/net/taler/wallet/tip/PromptTipFragment.kt b/wallet/src/main/java/net/taler/wallet/tip/PromptTipFragment.kt deleted file mode 100644 index 78969d0..0000000 --- a/wallet/src/main/java/net/taler/wallet/tip/PromptTipFragment.kt +++ /dev/null @@ -1,153 +0,0 @@ -/* - * 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 <http://www.gnu.org/licenses/> - */ - -package net.taler.wallet.tip - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.fragment.app.Fragment -import androidx.fragment.app.activityViewModels -import androidx.navigation.fragment.findNavController -import com.google.android.material.snackbar.Snackbar -import com.google.android.material.snackbar.Snackbar.LENGTH_LONG -import net.taler.common.Amount -import net.taler.common.fadeIn -import net.taler.common.fadeOut -import net.taler.common.showError -import net.taler.wallet.MainViewModel -import net.taler.wallet.R -import net.taler.wallet.cleanExchange -import net.taler.wallet.databinding.FragmentPromptTipBinding - -/** - * Show a tip and ask the user to accept/decline. - */ -class PromptTipFragment : Fragment() { - - private val model: MainViewModel by activityViewModels() - private val tipManager by lazy { model.tipManager } - - private lateinit var ui: FragmentPromptTipBinding - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle?, - ): View { - ui = FragmentPromptTipBinding.inflate(inflater, container, false) - return ui.root - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - tipManager.tipStatus.observe(viewLifecycleOwner, ::onPaymentStatusChanged) - } - - private fun showLoading(show: Boolean) { - model.showProgressBar.value = show - if (show) { - ui.progressBar.fadeIn() - } else { - ui.progressBar.fadeOut() - } - } - - private fun onPaymentStatusChanged(payStatus: TipStatus) = when (payStatus) { - is TipStatus.Prepared -> { - showLoading(false) - showContent( - amountRaw = payStatus.tipAmountRaw, - amountEffective = payStatus.tipAmountEffective, - exchange = payStatus.exchangeBaseUrl, - merchant = payStatus.merchantBaseUrl - ) - ui.confirmWithdrawButton.isEnabled = true - ui.confirmWithdrawButton.setOnClickListener { - tipManager.acceptTip( - payStatus.walletTipId, - payStatus.tipAmountRaw.currency - ) - } - } - is TipStatus.Accepting -> { - model.showProgressBar.value = true - ui.confirmProgressBar.fadeIn() - ui.confirmWithdrawButton.fadeOut() - } - is TipStatus.AlreadyAccepted -> { - showLoading(false) - tipManager.resetTipStatus() - findNavController().navigate(R.id.action_promptTip_to_alreadyAccepted) - } - is TipStatus.Success -> { - showLoading(false) - tipManager.resetTipStatus() - findNavController().navigate(R.id.action_promptTip_to_nav_main) - model.showTransactions(payStatus.currency) - Snackbar.make(requireView(), R.string.tip_received, LENGTH_LONG).show() - } - is TipStatus.Error -> { - showLoading(false) - // TODO pass TalerErrorInfo for JSON rendering - showError(getString(R.string.payment_error, payStatus.error.userFacingMsg)) - ui.confirmProgressBar.fadeOut() - ui.confirmWithdrawButton.fadeIn() - } - is TipStatus.None -> { - // No tip active - showLoading(false) - } - is TipStatus.Loading -> { - // Wait until loaded ... - showLoading(true) - } - } - - private fun showContent( - amountRaw: Amount, - amountEffective: Amount, - exchange: String, - merchant: String, - ) { - model.showProgressBar.value = false - ui.progressBar.fadeOut() - - ui.introView.fadeIn() - ui.effectiveAmountView.text = amountEffective.toString() - ui.effectiveAmountView.fadeIn() - - ui.chosenAmountLabel.fadeIn() - ui.chosenAmountView.text = amountRaw.toString() - ui.chosenAmountView.fadeIn() - - ui.feeLabel.fadeIn() - ui.feeView.text = - getString(R.string.amount_negative, (amountRaw - amountEffective).toString()) - ui.feeView.fadeIn() - - ui.exchangeIntroView.fadeIn() - ui.withdrawExchangeUrl.text = cleanExchange(exchange) - ui.withdrawExchangeUrl.fadeIn() - - ui.merchantIntroView.fadeIn() - ui.withdrawMerchantUrl.text = cleanExchange(merchant) - ui.withdrawMerchantUrl.fadeIn() - - ui.withdrawCard.fadeIn() - } - -} diff --git a/wallet/src/main/java/net/taler/wallet/tip/TipManager.kt b/wallet/src/main/java/net/taler/wallet/tip/TipManager.kt deleted file mode 100644 index 3c54d20..0000000 --- a/wallet/src/main/java/net/taler/wallet/tip/TipManager.kt +++ /dev/null @@ -1,100 +0,0 @@ -/* - * 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 <http://www.gnu.org/licenses/> - */ - -package net.taler.wallet.tip - -import android.util.Log -import androidx.annotation.UiThread -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch -import net.taler.common.Amount -import net.taler.common.Timestamp -import net.taler.wallet.TAG -import net.taler.wallet.backend.TalerErrorInfo -import net.taler.wallet.backend.WalletBackendApi -import net.taler.wallet.tip.PrepareTipResponse.AlreadyAcceptedResponse -import net.taler.wallet.tip.PrepareTipResponse.TipPossibleResponse - -sealed class TipStatus { - object None : TipStatus() - object Loading : TipStatus() - data class Prepared( - val walletTipId: String, - val merchantBaseUrl: String, - val exchangeBaseUrl: String, - val expirationTimestamp: Timestamp, - val tipAmountRaw: Amount, - val tipAmountEffective: Amount, - ) : TipStatus() - object Accepting : TipStatus() - data class AlreadyAccepted( - val walletTipId: String, - ) : TipStatus() - - // TODO bring user to fulfilment URI (not yet in wallet API) - data class Error(val error: TalerErrorInfo) : TipStatus() - data class Success(val currency: String) : TipStatus() -} - -class TipManager( - private val api: WalletBackendApi, - private val scope: CoroutineScope, -) { - - private val mTipStatus = MutableLiveData<TipStatus>(TipStatus.None) - internal val tipStatus: LiveData<TipStatus> = mTipStatus - - @UiThread - fun prepareTip(url: String) = scope.launch { - mTipStatus.value = TipStatus.Loading - api.request("prepareTip", PrepareTipResponse.serializer()) { - put("talerTipUri", url) - }.onError { - handleError("prepareTip", it) - }.onSuccess { response -> - mTipStatus.value = when (response) { - is TipPossibleResponse -> response.toTipStatusPrepared() - is AlreadyAcceptedResponse -> TipStatus.AlreadyAccepted( - response.walletTipId - ) - } - } - } - - fun acceptTip(tipId: String, currency: String) = scope.launch { - mTipStatus.value = TipStatus.Accepting - api.request("acceptTip", ConfirmTipResult.serializer()) { - put("walletTipId", tipId) - }.onError { - handleError("acceptTip", it) - }.onSuccess { - mTipStatus.postValue(TipStatus.Success(currency)) - } - } - - @UiThread - fun resetTipStatus() { - mTipStatus.value = TipStatus.None - } - - private fun handleError(operation: String, error: TalerErrorInfo) { - Log.e(TAG, "got $operation error result $error") - mTipStatus.value = TipStatus.Error(error) - } - -} diff --git a/wallet/src/main/java/net/taler/wallet/tip/TipResponses.kt b/wallet/src/main/java/net/taler/wallet/tip/TipResponses.kt deleted file mode 100644 index b0f6273..0000000 --- a/wallet/src/main/java/net/taler/wallet/tip/TipResponses.kt +++ /dev/null @@ -1,59 +0,0 @@ -/* - * 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 <http://www.gnu.org/licenses/> - */ - -package net.taler.wallet.tip - -import kotlinx.serialization.ExperimentalSerializationApi -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable -import kotlinx.serialization.json.JsonClassDiscriminator -import net.taler.common.Amount -import net.taler.common.Timestamp - -@OptIn(ExperimentalSerializationApi::class) -@Serializable -@JsonClassDiscriminator("accepted") -sealed class PrepareTipResponse { - - @Serializable - @SerialName("false") - data class TipPossibleResponse( - val walletTipId: String, - val merchantBaseUrl: String, - val exchangeBaseUrl: String, - val expirationTimestamp: Timestamp, - val tipAmountRaw: Amount, - val tipAmountEffective: Amount, - ) : PrepareTipResponse() { - fun toTipStatusPrepared() = TipStatus.Prepared( - walletTipId = walletTipId, - merchantBaseUrl = merchantBaseUrl, - exchangeBaseUrl = exchangeBaseUrl, - expirationTimestamp = expirationTimestamp, - tipAmountEffective = tipAmountEffective, - tipAmountRaw = tipAmountRaw, - ) - } - - @Serializable - @SerialName("true") - data class AlreadyAcceptedResponse( - val walletTipId: String, - ) : PrepareTipResponse() -} - -@Serializable -class ConfirmTipResult |