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 }