taler-android

Android apps for GNU Taler (wallet, PoS, cashier)
Log | Files | Refs | README | LICENSE

PayTemplateFragment.kt (5034B)


      1 /*
      2  * This file is part of GNU Taler
      3  * (C) 2023 Taler Systems S.A.
      4  *
      5  * GNU Taler is free software; you can redistribute it and/or modify it under the
      6  * terms of the GNU General Public License as published by the Free Software
      7  * Foundation; either version 3, or (at your option) any later version.
      8  *
      9  * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
     10  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
     11  * A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
     12  *
     13  * You should have received a copy of the GNU General Public License along with
     14  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
     15  */
     16 
     17 package net.taler.wallet.payment
     18 
     19 import android.net.Uri
     20 import android.os.Bundle
     21 import android.view.LayoutInflater
     22 import android.view.View
     23 import android.view.ViewGroup
     24 import androidx.compose.runtime.LaunchedEffect
     25 import androidx.compose.runtime.getValue
     26 import androidx.compose.runtime.livedata.observeAsState
     27 import androidx.compose.ui.platform.ComposeView
     28 import androidx.fragment.app.Fragment
     29 import androidx.fragment.app.activityViewModels
     30 import androidx.lifecycle.asFlow
     31 import androidx.navigation.fragment.findNavController
     32 import net.taler.common.showError
     33 import net.taler.wallet.main.MainViewModel
     34 import net.taler.wallet.R
     35 import net.taler.wallet.compose.TalerSurface
     36 import net.taler.wallet.compose.collectAsStateLifecycleAware
     37 import net.taler.wallet.showError
     38 import androidx.core.net.toUri
     39 import net.taler.wallet.balances.BalanceState
     40 import net.taler.wallet.compose.ErrorComposable
     41 import net.taler.wallet.compose.LoadingScreen
     42 
     43 class PayTemplateFragment : Fragment() {
     44 
     45     private val model: MainViewModel by activityViewModels()
     46     private lateinit var uriString: String
     47     private lateinit var uri: Uri
     48 
     49     override fun onCreateView(
     50         inflater: LayoutInflater,
     51         container: ViewGroup?,
     52         savedInstanceState: Bundle?,
     53     ): View {
     54         uriString = arguments?.getString("uri") ?: error("no amount passed")
     55         uri = uriString.toUri()
     56 
     57         val payStatusFlow = model.paymentManager.payStatus.asFlow()
     58 
     59         return ComposeView(requireContext()).apply {
     60             setContent {
     61                 val payStatus = payStatusFlow.collectAsStateLifecycleAware(PayStatus.None)
     62                 val balanceState by model.balanceManager.state.observeAsState(BalanceState.None)
     63                 val devMode by model.devMode.observeAsState(false)
     64                 TalerSurface {
     65                     when (val state = balanceState) {
     66                         is BalanceState.None, is BalanceState.Loading -> LoadingScreen()
     67                         is BalanceState.Error -> ErrorComposable(state.error, devMode = devMode)
     68                         is BalanceState.Success -> PayTemplateComposable(
     69                             currencies = state.balances.map { it.currency },
     70                             payStatus = payStatus.value,
     71                             onCreateAmount = model::createAmount,
     72                             onSubmit = this@PayTemplateFragment::createOrder,
     73                             onError = { this@PayTemplateFragment.showError(it) },
     74                             getCurrencySpec = model.exchangeManager::getSpecForCurrency,
     75                         )
     76                     }
     77 
     78                     LaunchedEffect(balanceState) {
     79                         balanceState
     80                     }
     81 
     82                     LaunchedEffect(Unit) {
     83                         model.balanceManager.loadAssets()
     84                     }
     85                 }
     86             }
     87         }
     88     }
     89 
     90     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
     91         super.onViewCreated(view, savedInstanceState)
     92         checkTemplate()
     93 
     94         model.paymentManager.payStatus.observe(viewLifecycleOwner) { payStatus ->
     95             when (payStatus) {
     96                 is PayStatus.Prepared -> {
     97                     model.paymentManager.preparePay(payStatus.transactionId) {
     98                         findNavController().navigate(R.id.action_global_promptPayment)
     99                     }
    100                 }
    101 
    102                 is PayStatus.Pending -> if (payStatus.error != null && model.devMode.value == true) {
    103                     showError(payStatus.error)
    104                 }
    105 
    106                 is PayStatus.Checked -> {
    107                     val usableCurrencies = model.balanceManager.getCurrencies()
    108                         .intersect(payStatus.supportedCurrencies.toSet())
    109                         .toList()
    110                     if (!payStatus.details.isTemplateEditable(usableCurrencies)) {
    111                         createOrder(payStatus.details.toTemplateParams())
    112                     }
    113                 }
    114 
    115                 else -> {}
    116             }
    117         }
    118     }
    119 
    120     private fun checkTemplate() {
    121         model.paymentManager.checkPayForTemplate(uriString)
    122     }
    123 
    124     private fun createOrder(params: TemplateParams) {
    125         model.paymentManager.preparePayForTemplate(uriString, params)
    126     }
    127 }