diff options
Diffstat (limited to 'wallet/src/main/java/net/taler/wallet/withdraw/PromptWithdrawFragment.kt')
-rw-r--r-- | wallet/src/main/java/net/taler/wallet/withdraw/PromptWithdrawFragment.kt | 139 |
1 files changed, 113 insertions, 26 deletions
diff --git a/wallet/src/main/java/net/taler/wallet/withdraw/PromptWithdrawFragment.kt b/wallet/src/main/java/net/taler/wallet/withdraw/PromptWithdrawFragment.kt index 38e09fa..56f56f7 100644 --- a/wallet/src/main/java/net/taler/wallet/withdraw/PromptWithdrawFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/withdraw/PromptWithdrawFragment.kt @@ -20,28 +20,37 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ArrayAdapter import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels +import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar.LENGTH_LONG +import kotlinx.coroutines.launch +import net.taler.common.Amount import net.taler.common.EventObserver import net.taler.common.fadeIn import net.taler.common.fadeOut -import net.taler.lib.common.Amount import net.taler.wallet.MainViewModel import net.taler.wallet.R import net.taler.wallet.cleanExchange import net.taler.wallet.databinding.FragmentPromptWithdrawBinding +import net.taler.wallet.exchanges.ExchangeItem +import net.taler.wallet.exchanges.SelectExchangeDialogFragment import net.taler.wallet.withdraw.WithdrawStatus.Loading import net.taler.wallet.withdraw.WithdrawStatus.ReceivedDetails import net.taler.wallet.withdraw.WithdrawStatus.TosReviewRequired import net.taler.wallet.withdraw.WithdrawStatus.Withdrawing +import net.taler.wallet.withdraw.WithdrawStatus.NeedsExchange class PromptWithdrawFragment : Fragment() { private val model: MainViewModel by activityViewModels() private val withdrawManager by lazy { model.withdrawManager } + private val transactionManager by lazy { model.transactionManager } + + private val selectExchangeDialog = SelectExchangeDialogFragment() private lateinit var ui: FragmentPromptWithdrawBinding @@ -49,7 +58,7 @@ class PromptWithdrawFragment : Fragment() { inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?, - ): View? { + ): View { ui = FragmentPromptWithdrawBinding.inflate(inflater, container, false) return ui.root } @@ -57,35 +66,43 @@ class PromptWithdrawFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - withdrawManager.withdrawStatus.observe(viewLifecycleOwner, { + withdrawManager.withdrawStatus.observe(viewLifecycleOwner) { showWithdrawStatus(it) - }) - withdrawManager.exchangeSelection.observe(viewLifecycleOwner, EventObserver { - findNavController().navigate(R.id.action_promptWithdraw_to_selectExchangeFragment) + } + + selectExchangeDialog.exchangeSelection.observe(viewLifecycleOwner, EventObserver { + onExchangeSelected(it) }) } private fun showWithdrawStatus(status: WithdrawStatus?): Any = when (status) { null -> model.showProgressBar.value = false is Loading -> model.showProgressBar.value = true - is WithdrawStatus.NeedsExchange -> { + is NeedsExchange -> { model.showProgressBar.value = false - val exchangeSelection = status.exchangeSelection.getIfNotConsumed() - if (exchangeSelection == null) { // already consumed - findNavController().popBackStack() - } else { - withdrawManager.selectExchange(exchangeSelection) - } + if (selectExchangeDialog.dialog?.isShowing != true) { + selectExchange() + } else {} } is TosReviewRequired -> onTosReviewRequired(status) is ReceivedDetails -> onReceivedDetails(status) is Withdrawing -> model.showProgressBar.value = true + is WithdrawStatus.ManualTransferRequired -> { + model.showProgressBar.value = false + findNavController().navigate(R.id.action_promptWithdraw_to_nav_exchange_manual_withdrawal_success) + } is WithdrawStatus.Success -> { model.showProgressBar.value = false withdrawManager.withdrawStatus.value = null - findNavController().navigate(R.id.action_promptWithdraw_to_nav_main) - model.showTransactions(status.currency) - Snackbar.make(requireView(), R.string.withdraw_initiated, LENGTH_LONG).show() + lifecycleScope.launch { + // now select new transaction based on currency and ID + if (transactionManager.selectTransaction(status.transactionId)) { + findNavController().navigate(R.id.action_promptWithdraw_to_nav_transactions_detail_withdrawal) + } else { + findNavController().navigate(R.id.action_promptWithdraw_to_nav_main) + } + Snackbar.make(requireView(), R.string.withdraw_initiated, LENGTH_LONG).show() + } } is WithdrawStatus.Error -> { model.showProgressBar.value = false @@ -98,7 +115,13 @@ class PromptWithdrawFragment : Fragment() { if (s.showImmediately.getIfNotConsumed() == true) { findNavController().navigate(R.id.action_promptWithdraw_to_reviewExchangeTOS) } else { - showContent(s.amountRaw, s.amountEffective, s.exchangeBaseUrl, s.talerWithdrawUri) + showContent( + amountRaw = s.amountRaw, + amountEffective = s.amountEffective, + exchange = s.exchangeBaseUrl, + uri = s.talerWithdrawUri, + exchanges = s.possibleExchanges, + ) ui.confirmWithdrawButton.apply { text = getString(R.string.withdraw_button_tos) setOnClickListener { @@ -110,13 +133,24 @@ class PromptWithdrawFragment : Fragment() { } private fun onReceivedDetails(s: ReceivedDetails) { - showContent(s.amountRaw, s.amountEffective, s.exchangeBaseUrl, s.talerWithdrawUri) + showContent( + amountRaw = s.amountRaw, + amountEffective = s.amountEffective, + exchange = s.exchangeBaseUrl, + uri = s.talerWithdrawUri, + ageRestrictionOptions = s.ageRestrictionOptions, + exchanges = s.possibleExchanges, + ) ui.confirmWithdrawButton.apply { text = getString(R.string.withdraw_button_confirm) setOnClickListener { it.fadeOut() ui.confirmProgressBar.fadeIn() - withdrawManager.acceptWithdrawal() + val ageRestrict = (ui.ageSelector.selectedItem as String?)?.let { age -> + if (age == context.getString(R.string.withdraw_restrict_age_unrestricted)) null + else age.toIntOrNull() + } + withdrawManager.acceptWithdrawal(ageRestrict) } isEnabled = true } @@ -127,6 +161,8 @@ class PromptWithdrawFragment : Fragment() { amountEffective: Amount, exchange: String, uri: String?, + exchanges: List<ExchangeItem> = emptyList(), + ageRestrictionOptions: List<Int>? = null, ) { model.showProgressBar.value = false ui.progressBar.fadeOut() @@ -139,24 +175,75 @@ class PromptWithdrawFragment : Fragment() { 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() + val fee = amountRaw - amountEffective + if (!fee.isZero()) { + ui.feeLabel.fadeIn() + ui.feeView.text = getString(R.string.amount_negative, fee.toString()) + ui.feeView.fadeIn() + } ui.exchangeIntroView.fadeIn() ui.withdrawExchangeUrl.text = cleanExchange(exchange) ui.withdrawExchangeUrl.fadeIn() - if (uri != null) { // no Uri for manual withdrawals + // no Uri for manual withdrawals, no selection for single exchange + if (uri != null && exchanges.size > 1) { ui.selectExchangeButton.fadeIn() ui.selectExchangeButton.setOnClickListener { - val exchangeSelection = ExchangeSelection(amountRaw, uri) - withdrawManager.selectExchange(exchangeSelection) + selectExchange() } } + if (ageRestrictionOptions != null) { + ui.ageLabel.fadeIn() + val context = requireContext() + val items = listOf(context.getString(R.string.withdraw_restrict_age_unrestricted)) + + ageRestrictionOptions.map { it.toString() } + ui.ageSelector.adapter = ArrayAdapter(context, R.layout.list_item_age, items) + ui.ageSelector.fadeIn() + } + ui.withdrawCard.fadeIn() } + private fun selectExchange() { + val exchanges = when (val status = withdrawManager.withdrawStatus.value) { + is ReceivedDetails -> status.possibleExchanges + is NeedsExchange -> status.possibleExchanges + is TosReviewRequired -> status.possibleExchanges + else -> return + } + selectExchangeDialog.setExchanges(exchanges) + selectExchangeDialog.show(parentFragmentManager, "SELECT_EXCHANGE") + } + + private fun onExchangeSelected(exchange: ExchangeItem) { + val status = withdrawManager.withdrawStatus.value + val amount = when (status) { + is ReceivedDetails -> status.amountRaw + is NeedsExchange -> status.amount + is TosReviewRequired -> status.amountRaw + else -> return + } + val uri = when (status) { + is ReceivedDetails -> status.talerWithdrawUri + is NeedsExchange -> status.talerWithdrawUri + is TosReviewRequired -> status.talerWithdrawUri + else -> return + } + val exchanges = when (status) { + is ReceivedDetails -> status.possibleExchanges + is NeedsExchange -> status.possibleExchanges + is TosReviewRequired -> status.possibleExchanges + else -> return + } + + withdrawManager.getWithdrawalDetails( + exchangeBaseUrl = exchange.exchangeBaseUrl, + amount = amount, + showTosImmediately = false, + uri = uri, + possibleExchanges = exchanges, + ) + } } |