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
|
2020-01-10 10:58:10 -08:00
|
|
|
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
|
2020-01-31 08:32:36 -08:00
|
|
|
import cash.z.wallet.sdk.ext.ZcashSdk
|
2019-12-23 16:07:10 -08:00
|
|
|
import cash.z.wallet.sdk.ext.convertZatoshiToZecString
|
2020-01-10 10:58:10 -08:00
|
|
|
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
|
2020-02-12 04:58:41 -08:00
|
|
|
import java.nio.charset.Charset
|
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)
|
2020-01-10 10:58:10 -08:00
|
|
|
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?) {
|
2020-01-10 10:58:10 -08:00
|
|
|
|
|
|
|
// update view
|
2020-01-02 15:53:06 -08:00
|
|
|
var lineOne: String = ""
|
|
|
|
var lineTwo: String = ""
|
|
|
|
var amount: String = ""
|
|
|
|
var amountColor: Int = 0
|
2020-01-09 07:56:03 -08:00
|
|
|
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() -> {
|
2020-01-09 07:56:03 -08:00
|
|
|
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
|
2020-01-09 07:56:03 -08:00
|
|
|
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
|
2020-01-09 07:56:03 -08:00
|
|
|
indicatorBackground = R.drawable.background_indicator_inbound
|
2020-01-02 15:53:06 -08:00
|
|
|
}
|
|
|
|
else -> {
|
|
|
|
lineOne = "Unknown"
|
|
|
|
lineTwo = "Unknown"
|
|
|
|
}
|
|
|
|
}
|
2020-01-31 08:32:36 -08:00
|
|
|
|
|
|
|
// 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-31 08:32:36 -08:00
|
|
|
|
2020-01-02 15:53:06 -08:00
|
|
|
topText.text = lineOne
|
|
|
|
bottomText.text = lineTwo
|
|
|
|
amountText.text = amount
|
|
|
|
amountText.setTextColor(amountColor.toAppColor())
|
2020-01-09 07:56:03 -08:00
|
|
|
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" +
|
2020-01-31 08:32:36 -08:00
|
|
|
"Transaction: $txId" +
|
2020-02-12 04:58:41 -08:00
|
|
|
"${if (transaction.toAddress != null) "\n\nto: ${transaction.toAddress}" else ""}" +
|
|
|
|
"${if (transaction.memo != null) "\n\nmemo: \n${String(transaction.memo!!, Charset.forName("UTF-8"))}" else ""}"
|
2020-01-31 08:32:36 -08:00
|
|
|
|
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()
|
|
|
|
}
|
|
|
|
|