diff options
Diffstat (limited to 'wallet/src/main/java/net/taler/wallet/transactions/TransactionAdapter.kt')
-rw-r--r-- | wallet/src/main/java/net/taler/wallet/transactions/TransactionAdapter.kt | 121 |
1 files changed, 98 insertions, 23 deletions
diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionAdapter.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionAdapter.kt index b8bf9af..3b686a6 100644 --- a/wallet/src/main/java/net/taler/wallet/transactions/TransactionAdapter.kt +++ b/wallet/src/main/java/net/taler/wallet/transactions/TransactionAdapter.kt @@ -32,16 +32,25 @@ import androidx.recyclerview.selection.SelectionTracker import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.Adapter import androidx.recyclerview.widget.RecyclerView.ViewHolder +import net.taler.common.CurrencySpecification import net.taler.common.exhaustive import net.taler.common.toRelativeTime import net.taler.wallet.R +import net.taler.wallet.getThemeColor import net.taler.wallet.transactions.TransactionAdapter.TransactionViewHolder +import net.taler.wallet.transactions.TransactionMajorState.Aborted +import net.taler.wallet.transactions.TransactionMajorState.Failed +import net.taler.wallet.transactions.TransactionMajorState.Pending +import net.taler.wallet.transactions.TransactionMinorState.BankConfirmTransfer +import net.taler.wallet.transactions.TransactionMinorState.KycRequired internal class TransactionAdapter( - private val listener: OnTransactionClickListener + private val listener: OnTransactionClickListener, ) : Adapter<TransactionViewHolder>() { private var transactions: List<Transaction> = ArrayList() + private var currencySpec: CurrencySpecification? = null + lateinit var tracker: SelectionTracker<String> val keyProvider = TransactionKeyProvider() @@ -62,6 +71,11 @@ internal class TransactionAdapter( holder.bind(transaction, tracker.isSelected(transaction.transactionId)) } + fun setCurrencySpec(spec: CurrencySpecification?) { + this.currencySpec = spec + this.notifyDataSetChanged() + } + fun update(updatedTransactions: List<Transaction>) { this.transactions = updatedTransactions this.notifyDataSetChanged() @@ -74,6 +88,7 @@ internal class TransactionAdapter( internal inner class TransactionViewHolder(private val v: View) : ViewHolder(v) { private val context: Context = v.context + private val root: ViewGroup = v.findViewById(R.id.root) private val icon: ImageView = v.findViewById(R.id.icon) private val title: TextView = v.findViewById(R.id.title) private val extraInfoView: TextView = v.findViewById(R.id.extraInfoView) @@ -82,12 +97,12 @@ internal class TransactionAdapter( private val pendingView: TextView = v.findViewById(R.id.pendingView) private val amountColor = amount.currentTextColor - private val red = getColor(context, R.color.red) + private val extraInfoColor = extraInfoView.currentTextColor + private val red = context.getThemeColor(R.attr.colorError) private val green = getColor(context, R.color.green) fun bind(transaction: Transaction, selected: Boolean) { v.setOnClickListener { listener.onTransactionClicked(transaction) } - v.isActivated = selected if (transaction.error == null) { icon.setImageResource(transaction.icon) } else { @@ -97,39 +112,98 @@ internal class TransactionAdapter( bindExtraInfo(transaction) time.text = transaction.timestamp.ms.toRelativeTime(context) bindAmount(transaction) - pendingView.visibility = if (transaction.pending) VISIBLE else GONE + pendingView.visibility = if (transaction.txState.major == Pending) VISIBLE else GONE + val bgColor = getColor( + context, + if (selected) R.color.selectedBackground + else android.R.color.transparent + ) + root.setBackgroundColor(bgColor) } private fun bindExtraInfo(transaction: Transaction) { - if (transaction.error != null) { - extraInfoView.text = - context.getString(R.string.payment_error, transaction.error!!.userFacingMsg) - extraInfoView.setTextColor(red) - extraInfoView.visibility = VISIBLE - } else if (transaction is TransactionWithdrawal && !transaction.confirmed) { - extraInfoView.setText(R.string.withdraw_waiting_confirm) - extraInfoView.setTextColor(amountColor) - extraInfoView.visibility = VISIBLE - } else if (transaction is TransactionPayment && transaction.status != PaymentStatus.Paid && transaction.status != PaymentStatus.Accepted) { - extraInfoView.setText(if (transaction.status == PaymentStatus.Aborted) R.string.payment_aborted else R.string.payment_failed) - extraInfoView.setTextColor(amountColor) - extraInfoView.visibility = VISIBLE - } else { - extraInfoView.visibility = GONE + when { + // Goes first so it always shows errors when present + transaction.error != null -> { + extraInfoView.text = + context.getString(R.string.payment_error, transaction.error!!.userFacingMsg) + extraInfoView.setTextColor(red) + extraInfoView.visibility = VISIBLE + } + + transaction.txState.major == Aborted -> { + extraInfoView.setText(R.string.payment_aborted) + extraInfoView.setTextColor(red) + extraInfoView.visibility = VISIBLE + } + + transaction.txState.major == Failed -> { + extraInfoView.setText(R.string.payment_failed) + extraInfoView.setTextColor(red) + extraInfoView.visibility = VISIBLE + } + + transaction.txState.major == Pending -> when (transaction.txState.minor) { + BankConfirmTransfer -> { + extraInfoView.setText(R.string.withdraw_waiting_confirm) + extraInfoView.setTextColor(amountColor) + extraInfoView.visibility = VISIBLE + } + KycRequired -> { + extraInfoView.setText(R.string.transaction_action_kyc) + extraInfoView.setTextColor(amountColor) + extraInfoView.visibility = VISIBLE + } + else -> extraInfoView.visibility = GONE + } + + transaction is TransactionWithdrawal && !transaction.confirmed -> { + extraInfoView.setText(R.string.withdraw_waiting_confirm) + extraInfoView.setTextColor(amountColor) + extraInfoView.visibility = VISIBLE + } + + transaction is TransactionPeerPushCredit && transaction.info.summary != null -> { + extraInfoView.text = transaction.info.summary + extraInfoView.setTextColor(extraInfoColor) + extraInfoView.visibility = VISIBLE + } + + transaction is TransactionPeerPushDebit && transaction.info.summary != null -> { + extraInfoView.text = transaction.info.summary + extraInfoView.setTextColor(extraInfoColor) + extraInfoView.visibility = VISIBLE + } + + transaction is TransactionPeerPullCredit && transaction.info.summary != null -> { + extraInfoView.text = transaction.info.summary + extraInfoView.setTextColor(extraInfoColor) + extraInfoView.visibility = VISIBLE + } + + transaction is TransactionPeerPullDebit && transaction.info.summary != null -> { + extraInfoView.text = transaction.info.summary + extraInfoView.setTextColor(extraInfoColor) + extraInfoView.visibility = VISIBLE + } + + else -> extraInfoView.visibility = GONE } } private fun bindAmount(transaction: Transaction) { - val amountStr = transaction.amountEffective.amountStr + val amountStr = transaction.amountEffective.withSpec(currencySpec).toString(showSymbol = false) when (transaction.amountType) { AmountType.Positive -> { amount.text = context.getString(R.string.amount_positive, amountStr) - amount.setTextColor(if (transaction.pending) amountColor else green) + amount.setTextColor(if (transaction.txState.major == Pending) amountColor else green) } + AmountType.Negative -> { amount.text = context.getString(R.string.amount_negative, amountStr) - amount.setTextColor(if (transaction.pending) amountColor else red) + amount.setTextColor(if (transaction.txState.major == Pending) amountColor else red) } + AmountType.Neutral -> { amount.text = amountStr amount.setTextColor(amountColor) @@ -149,12 +223,13 @@ internal class TransactionAdapter( internal class TransactionLookup( private val list: RecyclerView, - private val adapter: TransactionAdapter + private val adapter: TransactionAdapter, ) : ItemDetailsLookup<String>() { override fun getItemDetails(e: MotionEvent): ItemDetails<String>? { list.findChildViewUnder(e.x, e.y)?.let { view -> val holder = list.getChildViewHolder(view) val position = holder.bindingAdapterPosition + if (position < 0) return null return object : ItemDetails<String>() { override fun getPosition(): Int = position override fun getSelectionKey(): String = adapter.keyProvider.getKey(position) |