/* * 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 */ package net.taler.wallet.transactions import android.os.Bundle import android.text.SpannableString import android.text.style.UnderlineSpan import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.widget.TextView import androidx.annotation.StringRes import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.navigation.fragment.findNavController import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.serialization.json.Json import net.taler.common.Amount import net.taler.wallet.MainViewModel import net.taler.wallet.R import net.taler.wallet.backend.TalerErrorInfo import net.taler.wallet.compose.copyToClipBoard import net.taler.wallet.getAttrColor import net.taler.wallet.launchInAppBrowser abstract class TransactionDetailFragment : Fragment() { private val model: MainViewModel by activityViewModels() val transactionManager by lazy { model.transactionManager } val devMode by lazy { model.devMode } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setHasOptionsMenu(model.devMode.value == true) } @Deprecated("Deprecated in Java") override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) transactionManager.selectedTransaction.observe(viewLifecycleOwner) { requireActivity().apply { it?.generalTitleRes?.let { title = getString(it) } } } } @Deprecated("Deprecated in Java") override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { inflater.inflate(R.menu.transactions_detail, menu) } @Deprecated("Deprecated in Java") override fun onOptionsItemSelected(item: MenuItem): Boolean { return when (item.itemId) { else -> super.onOptionsItemSelected(item) } } protected fun bindOrderAndFee( orderSummaryView: TextView, orderAmountView: TextView, orderIdView: TextView, feeView: TextView, info: TransactionInfo, raw: Amount, fee: Amount, ) { orderAmountView.text = raw.toString() feeView.text = getString(R.string.amount_negative, fee.toString()) orderSummaryView.text = if (info.fulfillmentMessage == null) { info.summary } else { "${info.summary}\n\n${info.fulfillmentMessage}" } if (info.fulfillmentUrl?.startsWith("http", ignoreCase = true) == true) { val content = SpannableString(info.summary) content.setSpan(UnderlineSpan(), 0, info.summary.length, 0) orderSummaryView.text = content orderSummaryView.setTextColor(requireContext().getAttrColor(android.R.attr.textColorLink)) orderSummaryView.setOnClickListener { launchInAppBrowser(requireContext(), info.fulfillmentUrl) } } orderIdView.text = getString(R.string.transaction_order_id, info.orderId) } @StringRes protected open val deleteDialogTitle = R.string.transactions_delete @StringRes protected open val deleteDialogMessage = R.string.transactions_delete_dialog_message @StringRes protected open val deleteDialogButton = R.string.transactions_delete protected fun onDeleteButtonClicked(t: Transaction) { MaterialAlertDialogBuilder(requireContext(), R.style.MaterialAlertDialog_Material3) .setTitle(deleteDialogTitle) .setMessage(deleteDialogMessage) .setNeutralButton(R.string.cancel) { dialog, _ -> dialog.cancel() } .setNegativeButton(deleteDialogButton) { dialog, _ -> deleteTransaction(t) dialog.dismiss() } .show() } private fun deleteTransaction(t: Transaction) { transactionManager.deleteTransaction(t.transactionId) findNavController().popBackStack() } private val json = Json { prettyPrint = true } protected fun onShowErrorButtonClicked(t: Transaction) { t.error?.let { err -> val message = json.encodeToString(TalerErrorInfo.serializer(), err) MaterialAlertDialogBuilder(requireContext(), R.style.MaterialAlertDialog_Material3) .setTitle(getString(R.string.nav_error)) .setMessage(message) .setNeutralButton(R.string.close) { dialog, _ -> dialog.cancel() } .setPositiveButton(R.string.copy) { _, _ -> copyToClipBoard( requireContext(), getString(R.string.nav_error), message, ) } .show() } } }