zircles-android/app/src/main/java/cash/z/ecc/android/ui/detail/TransactionViewHolder.kt

110 lines
4.4 KiB
Kotlin
Raw Normal View History

2020-01-02 15:53:06 -08:00
package cash.z.ecc.android.ui.detail
2019-12-23 16:07:10 -08:00
import android.view.View
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import cash.z.ecc.android.R
import cash.z.ecc.android.ext.goneIf
2020-01-02 15:53:06 -08:00
import cash.z.ecc.android.ext.toAppColor
2020-01-13 16:09:22 -08:00
import cash.z.ecc.android.ui.MainActivity
2019-12-23 16:07:10 -08:00
import cash.z.wallet.sdk.entity.ConfirmedTransaction
import cash.z.wallet.sdk.ext.ZcashSdk
2019-12-23 16:07:10 -08:00
import cash.z.wallet.sdk.ext.convertZatoshiToZecString
import cash.z.wallet.sdk.ext.isShielded
2020-01-13 16:09:22 -08:00
import cash.z.wallet.sdk.ext.toAbbreviatedAddress
import com.google.android.material.dialog.MaterialAlertDialogBuilder
2019-12-23 16:07:10 -08:00
import java.text.SimpleDateFormat
import java.util.*
class TransactionViewHolder<T : ConfirmedTransaction>(itemView: View) : RecyclerView.ViewHolder(itemView) {
2020-01-02 15:53:06 -08:00
private val indicator = itemView.findViewById<View>(R.id.indicator)
2019-12-23 16:07:10 -08:00
private val amountText = itemView.findViewById<TextView>(R.id.text_transaction_amount)
2020-01-02 15:53:06 -08:00
private val topText = itemView.findViewById<TextView>(R.id.text_transaction_top)
private val bottomText = itemView.findViewById<TextView>(R.id.text_transaction_bottom)
private val shieldIcon = itemView.findViewById<View>(R.id.image_shield)
2019-12-23 16:07:10 -08:00
private val formatter = SimpleDateFormat("M/d h:mma", Locale.getDefault())
fun bindTo(transaction: T?) {
// update view
2020-01-02 15:53:06 -08:00
var lineOne: String = ""
var lineTwo: String = ""
var amount: String = ""
var amountColor: Int = 0
var indicatorBackground: Int = 0
2020-01-13 16:09:22 -08:00
2020-01-02 15:53:06 -08:00
transaction?.apply {
2020-01-13 16:09:22 -08:00
itemView.setOnClickListener {
onTransactionClicked(this)
}
2020-01-02 15:53:06 -08:00
amount = value.convertZatoshiToZecString()
// TODO: these might be good extension functions
val timestamp = formatter.format(blockTimeInSeconds * 1000L)
val isMined = blockTimeInSeconds != 0L
when {
!toAddress.isNullOrEmpty() -> {
lineOne = "You paid ${toAddress?.toAbbreviatedAddress()}"
2020-01-02 15:53:06 -08:00
lineTwo = if (isMined) "Sent $timestamp" else "Pending confirmation"
amount = "- $amount"
amountColor = R.color.zcashRed
indicatorBackground = R.drawable.background_indicator_outbound
2020-01-02 15:53:06 -08:00
}
raw == null || raw?.isEmpty() == true -> {
lineOne = "Unknown paid you"
lineTwo = "Received $timestamp"
amount = "+ $amount"
amountColor = R.color.zcashGreen
indicatorBackground = R.drawable.background_indicator_inbound
2020-01-02 15:53:06 -08:00
}
else -> {
lineOne = "Unknown"
lineTwo = "Unknown"
}
}
// sanitize amount
if (value < ZcashSdk.MINERS_FEE_ZATOSHI) amount = "< 0.001"
else if (amount.length > 8) amount = "tap to view"
2020-01-02 15:53:06 -08:00
}
2020-01-02 15:53:06 -08:00
topText.text = lineOne
bottomText.text = lineTwo
amountText.text = amount
amountText.setTextColor(amountColor.toAppColor())
val context = itemView.context
indicator.background = context.resources.getDrawable(indicatorBackground)
2020-01-13 16:09:22 -08:00
shieldIcon.goneIf((transaction?.raw != null || transaction?.expiryHeight != null) && !transaction?.toAddress.isShielded())
2019-12-23 16:07:10 -08:00
}
2020-01-13 16:09:22 -08:00
private fun onTransactionClicked(transaction: ConfirmedTransaction) {
val txId = transaction.rawTransactionId.toTxId()
val detailsMessage: String = "Zatoshi amount: ${transaction.value}\n\n" +
"Transaction: $txId" +
"${if (transaction.toAddress != null) "\nto: ${transaction.toAddress}" else ""}" +
"${if (transaction.memo != null) "\nmemo: ${transaction.toAddress}" else ""}"
2020-01-13 16:09:22 -08:00
MaterialAlertDialogBuilder(itemView.context)
.setMessage(detailsMessage)
.setTitle("Transaction Details")
.setCancelable(true)
.setPositiveButton("Ok") { dialog, _ ->
dialog.dismiss()
}
.setNegativeButton("Copy TX") { dialog, _ ->
(itemView.context as MainActivity).copyText(txId, "Transaction Id")
dialog.dismiss()
}
.show()
}
}
private fun ByteArray.toTxId(): String {
val sb = StringBuilder(size * 2)
for(i in (size - 1) downTo 0) {
sb.append(String.format("%02x", this[i]))
}
return sb.toString()
}