summaryrefslogtreecommitdiff
path: root/wallet/src/main/java/net/taler/wallet/history/DevHistoryAdapter.kt
blob: a2684e11dfc2de2acaaa199d774abafee7296541 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/*
 * 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 <http://www.gnu.org/licenses/>
 */

package net.taler.wallet.history

import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.View.GONE
import android.view.View.VISIBLE
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView.Adapter
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import net.taler.common.exhaustive
import net.taler.common.toRelativeTime
import net.taler.wallet.R
import net.taler.wallet.history.DevHistoryAdapter.HistoryViewHolder
import net.taler.wallet.transactions.AmountType

internal class DevHistoryAdapter(
    private val listener: OnEventClickListener
) : Adapter<HistoryViewHolder>() {

    private var history: List<HistoryEvent> = ArrayList()

    init {
        setHasStableIds(false)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HistoryViewHolder {
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.list_item_history, parent, false)
        return HistoryViewHolder(view)
    }

    override fun getItemCount(): Int = history.size

    override fun onBindViewHolder(holder: HistoryViewHolder, position: Int) {
        val transaction = history[position]
        holder.bind(transaction)
    }

    fun update(updatedHistory: List<HistoryEvent>) {
        this.history = updatedHistory
        this.notifyDataSetChanged()
    }

    internal open inner class HistoryViewHolder(private val v: View) : ViewHolder(v) {

        protected val context: Context = v.context

        private val icon: ImageView = v.findViewById(R.id.icon)
        protected val title: TextView = v.findViewById(R.id.title)
        private val time: TextView = v.findViewById(R.id.time)
        private val amount: TextView = v.findViewById(R.id.amount)

        private val amountColor = amount.currentTextColor

        open fun bind(historyEvent: HistoryEvent) {
            v.setOnClickListener { listener.onTransactionClicked(historyEvent) }
            icon.setImageResource(historyEvent.icon)
            title.text = historyEvent.title
            time.text = historyEvent.timestamp.ms.toRelativeTime(context)
            bindAmount(historyEvent.displayAmount)
        }

        private fun bindAmount(displayAmount: DisplayAmount?) {
            if (displayAmount == null) {
                amount.visibility = GONE
            } else {
                amount.visibility = VISIBLE
                when (displayAmount.type) {
                    AmountType.Positive -> {
                        amount.text = context.getString(
                            R.string.amount_positive, displayAmount.amount.amountStr
                        )
                        amount.setTextColor(context.getColor(R.color.green))
                    }
                    AmountType.Negative -> {
                        amount.text = context.getString(
                            R.string.amount_negative, displayAmount.amount.amountStr
                        )
                        amount.setTextColor(context.getColor(R.color.red))
                    }
                    AmountType.Neutral -> {
                        amount.text = displayAmount.amount.amountStr
                        amount.setTextColor(amountColor)
                    }
                }.exhaustive
            }
        }

    }

}