taler-android

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

TransactionDetailFragment.kt (6800B)


      1 /*
      2  * This file is part of GNU Taler
      3  * (C) 2020 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.transactions
     18 
     19 import android.os.Bundle
     20 import android.util.Log
     21 import android.view.View
     22 import androidx.fragment.app.Fragment
     23 import androidx.fragment.app.activityViewModels
     24 import androidx.lifecycle.Lifecycle
     25 import androidx.lifecycle.lifecycleScope
     26 import androidx.lifecycle.repeatOnLifecycle
     27 import androidx.navigation.fragment.findNavController
     28 import com.google.android.material.dialog.MaterialAlertDialogBuilder
     29 import kotlinx.coroutines.launch
     30 import net.taler.common.showError
     31 import net.taler.wallet.R
     32 import net.taler.wallet.main.MainViewModel
     33 import net.taler.wallet.main.TAG
     34 import net.taler.wallet.showError
     35 import net.taler.wallet.transactions.TransactionAction.Abort
     36 import net.taler.wallet.transactions.TransactionAction.Delete
     37 import net.taler.wallet.transactions.TransactionAction.Fail
     38 import net.taler.wallet.transactions.TransactionAction.Resume
     39 import net.taler.wallet.transactions.TransactionAction.Retry
     40 import net.taler.wallet.transactions.TransactionAction.Suspend
     41 
     42 abstract class TransactionDetailFragment : Fragment() {
     43 
     44     private val model: MainViewModel by activityViewModels()
     45     protected val transactionManager by lazy { model.transactionManager }
     46     protected val balanceManager by lazy { model.balanceManager }
     47     protected val exchangeManager by lazy { model.exchangeManager }
     48     protected val withdrawManager by lazy { model.withdrawManager }
     49     protected val devMode get() = model.devMode.value == true
     50 
     51     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
     52         super.onViewCreated(view, savedInstanceState)
     53         lifecycleScope.launch {
     54             viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
     55                 transactionManager.selectedTransaction.collect {
     56                     requireActivity().apply {
     57                         it?.generalTitleRes?.let {
     58                             title = getString(it)
     59                         }
     60                     }
     61                 }
     62             }
     63         }
     64     }
     65 
     66     override fun onDestroy() {
     67         super.onDestroy()
     68         transactionManager.selectTransaction(null)
     69     }
     70 
     71     private fun dialogTitle(t: TransactionAction): Int = when (t) {
     72         Delete -> R.string.transactions_delete_dialog_title
     73         Abort -> R.string.transactions_abort_dialog_title
     74         Fail -> R.string.transactions_fail_dialog_title
     75         else -> error("unsupported action: $t")
     76     }
     77 
     78     private fun dialogMessage(t: TransactionAction): Int = when (t) {
     79         Delete -> R.string.transactions_delete_dialog_message
     80         Abort -> R.string.transactions_abort_dialog_message
     81         Fail -> R.string.transactions_fail_dialog_message
     82         else -> error("unsupported action: $t")
     83     }
     84 
     85     private fun dialogButton(t: TransactionAction): Int = when (t) {
     86         Delete -> R.string.transactions_delete
     87         Abort -> R.string.transactions_abort
     88         Fail -> R.string.transactions_fail
     89         else -> error("unsupported")
     90     }
     91 
     92     protected fun onTransitionButtonClicked(t: Transaction, ta: TransactionAction) = when (ta) {
     93         Delete -> showDialog(ta) { deleteTransaction(t) }
     94         Abort -> showDialog(ta) { abortTransaction(t) }
     95         Fail -> showDialog(ta) { failTransaction(t) }
     96         Retry -> retryTransaction(t)
     97         Suspend -> suspendTransaction(t)
     98         Resume -> resumeTransaction(t)
     99     }
    100 
    101     private fun showDialog(tt: TransactionAction, onAction: () -> Unit) {
    102         MaterialAlertDialogBuilder(requireContext(), R.style.MaterialAlertDialog_Material3)
    103             .setTitle(dialogTitle(tt))
    104             .setMessage(dialogMessage(tt))
    105             .setNeutralButton(R.string.cancel) { dialog, _ ->
    106                 dialog.cancel()
    107             }
    108             .setNegativeButton(dialogButton(tt)) { dialog, _ ->
    109                 onAction()
    110                 dialog.dismiss()
    111             }
    112             .show()
    113     }
    114 
    115     private fun deleteTransaction(t: Transaction) {
    116         transactionManager.deleteTransaction(t.transactionId) {
    117             Log.e(TAG, "Error deleteTransaction $it")
    118             if (model.devMode.value == true) {
    119                 showError(it)
    120             } else {
    121                 showError(it.userFacingMsg)
    122             }
    123         }
    124         findNavController().popBackStack()
    125     }
    126 
    127     private fun retryTransaction(t: Transaction) {
    128         transactionManager.retryTransaction(t.transactionId) {
    129             Log.e(TAG, "Error retryTransaction $it")
    130             if (model.devMode.value == true) {
    131                 showError(it)
    132             } else {
    133                 showError(it.userFacingMsg)
    134             }
    135         }
    136     }
    137 
    138     private fun abortTransaction(t: Transaction) {
    139         transactionManager.abortTransaction(
    140             t.transactionId,
    141             onSuccess = {},
    142             onError = {
    143                 Log.e(TAG, "Error abortTransaction $it")
    144                 if (model.devMode.value == true) {
    145                     showError(it)
    146                 } else {
    147                     showError(it.userFacingMsg)
    148                 }
    149             }
    150         )
    151     }
    152 
    153     private fun failTransaction(t: Transaction) {
    154         transactionManager.failTransaction(t.transactionId) {
    155             Log.e(TAG, "Error failTransaction $it")
    156             if (model.devMode.value == true) {
    157                 showError(it)
    158             } else {
    159                 showError(it.userFacingMsg)
    160             }
    161         }
    162     }
    163 
    164     private fun suspendTransaction(t: Transaction) {
    165         transactionManager.suspendTransaction(t.transactionId) {
    166             Log.e(TAG, "Error suspendTransaction $it")
    167             if (model.devMode.value == true) {
    168                 showError(it)
    169             } else {
    170                 showError(it.userFacingMsg)
    171             }
    172         }
    173     }
    174 
    175     private fun resumeTransaction(t: Transaction) {
    176         transactionManager.resumeTransaction(t.transactionId) {
    177             Log.e(TAG, "Error resumeTransaction $it")
    178             if (model.devMode.value == true) {
    179                 showError(it)
    180             } else {
    181                 showError(it.userFacingMsg)
    182             }
    183         }
    184     }
    185 }