/* * 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.exchanges import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.View.GONE import android.view.ViewGroup import android.widget.TextView import androidx.core.content.ContextCompat.getColor import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.recyclerview.widget.RecyclerView.Adapter import androidx.recyclerview.widget.RecyclerView.ViewHolder import kotlinx.android.synthetic.main.fragment_select_exchange.* import net.taler.common.Amount import net.taler.common.toRelativeTime import net.taler.common.toShortDate import net.taler.wallet.MainViewModel import net.taler.wallet.R import net.taler.wallet.exchanges.CoinFeeAdapter.CoinFeeViewHolder import net.taler.wallet.exchanges.WireFeeAdapter.WireFeeViewHolder class SelectExchangeFragment : Fragment() { private val model: MainViewModel by activityViewModels() private val withdrawManager by lazy { model.withdrawManager } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { return inflater.inflate(R.layout.fragment_select_exchange, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { val fees = withdrawManager.exchangeFees ?: throw IllegalStateException() if (fees.withdrawFee.isZero()) { withdrawFeeLabel.visibility = GONE withdrawFeeView.visibility = GONE } else withdrawFeeView.setAmount(fees.withdrawFee) if (fees.overhead.isZero()) { overheadLabel.visibility = GONE overheadView.visibility = GONE } else overheadView.setAmount(fees.overhead) expirationView.text = fees.earliestDepositExpiration.ms.toRelativeTime(requireContext()) coinFeesList.adapter = CoinFeeAdapter(fees.coinFees) wireFeesList.adapter = WireFeeAdapter(fees.wireFees) } private fun TextView.setAmount(amount: Amount) { if (amount.isZero()) text = amount.toString() else { text = getString(R.string.amount_negative, amount) setTextColor(getColor(context, R.color.red)) } } } private class CoinFeeAdapter(private val items: List) : Adapter() { override fun getItemCount() = items.size override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CoinFeeViewHolder { val v = LayoutInflater.from(parent.context).inflate(R.layout.list_item_coin_fee, parent, false) return CoinFeeViewHolder(v) } override fun onBindViewHolder(holder: CoinFeeViewHolder, position: Int) { holder.bind(items[position]) } private class CoinFeeViewHolder(private val v: View) : ViewHolder(v) { private val res = v.context.resources private val coinView: TextView = v.findViewById(R.id.coinView) private val withdrawFeeView: TextView = v.findViewById(R.id.withdrawFeeView) private val depositFeeView: TextView = v.findViewById(R.id.depositFeeView) private val refreshFeeView: TextView = v.findViewById(R.id.refreshFeeView) private val refundFeeView: TextView = v.findViewById(R.id.refundFeeView) fun bind(item: CoinFee) { coinView.text = res.getQuantityString( R.plurals.exchange_fee_coin, item.quantity, item.coin, item.quantity ) withdrawFeeView.text = v.context.getString(R.string.exchange_fee_withdraw_fee, item.feeWithdraw) depositFeeView.text = v.context.getString(R.string.exchange_fee_deposit_fee, item.feeDeposit) refreshFeeView.text = v.context.getString(R.string.exchange_fee_refresh_fee, item.feeRefresh) refundFeeView.text = v.context.getString(R.string.exchange_fee_refund_fee, item.feeRefresh) } } } private class WireFeeAdapter(private val items: List) : Adapter() { override fun getItemCount() = items.size override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WireFeeViewHolder { val v = LayoutInflater.from(parent.context).inflate(R.layout.list_item_wire_fee, parent, false) return WireFeeViewHolder(v) } override fun onBindViewHolder(holder: WireFeeViewHolder, position: Int) { holder.bind(items[position]) } private class WireFeeViewHolder(private val v: View) : ViewHolder(v) { private val validityView: TextView = v.findViewById(R.id.validityView) private val wireFeeView: TextView = v.findViewById(R.id.wireFeeView) private val closingFeeView: TextView = v.findViewById(R.id.closingFeeView) fun bind(item: WireFee) { validityView.text = v.context.getString( R.string.exchange_fee_wire_fee_timespan, item.start.ms.toShortDate(v.context), item.end.ms.toShortDate(v.context) ) wireFeeView.text = v.context.getString(R.string.exchange_fee_wire_fee_wire_fee, item.wireFee) closingFeeView.text = v.context.getString(R.string.exchange_fee_wire_fee_closing_fee, item.closingFee) } } }