zcash-android-wallet/app/src/main/java/cash/z/ecc/android/ui/history/HistoryFragment.kt

110 lines
4.2 KiB
Kotlin

package cash.z.ecc.android.ui.history
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import androidx.lifecycle.lifecycleScope
import androidx.paging.PagedList
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import cash.z.ecc.android.R
import cash.z.ecc.android.databinding.FragmentHistoryBinding
import cash.z.ecc.android.di.viewmodel.activityViewModel
import cash.z.ecc.android.ext.WalletZecFormmatter
import cash.z.ecc.android.ext.goneIf
import cash.z.ecc.android.ext.onClickNavUp
import cash.z.ecc.android.ext.pending
import cash.z.ecc.android.ext.toAppString
import cash.z.ecc.android.ext.toColoredSpan
import cash.z.ecc.android.feedback.Report
import cash.z.ecc.android.feedback.Report.Tap.HISTORY_BACK
import cash.z.ecc.android.sdk.db.entity.ConfirmedTransaction
import cash.z.ecc.android.sdk.ext.collectWith
import cash.z.ecc.android.sdk.ext.toAbbreviatedAddress
import cash.z.ecc.android.sdk.ext.twig
import cash.z.ecc.android.sdk.type.WalletBalance
import cash.z.ecc.android.ui.base.BaseFragment
import kotlinx.coroutines.launch
class HistoryFragment : BaseFragment<FragmentHistoryBinding>() {
override val screen = Report.Screen.HISTORY
private val viewModel: HistoryViewModel by activityViewModel()
private lateinit var transactionAdapter: TransactionAdapter<ConfirmedTransaction>
private var isInitialized = false
override fun inflate(inflater: LayoutInflater): FragmentHistoryBinding =
FragmentHistoryBinding.inflate(inflater)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
twig("HistoryFragment.onViewCreated")
super.onViewCreated(view, savedInstanceState)
initTransactionUI()
binding.backButtonHitArea.onClickNavUp { tapped(HISTORY_BACK) }
lifecycleScope.launch {
binding.textAddress.text = viewModel.getAddress().toAbbreviatedAddress(10, 10)
}
}
override fun onResume() {
twig("HistoryFragment.onResume")
super.onResume()
viewModel.balance.collectWith(resumedScope) {
onBalanceUpdated(it)
}
viewModel.transactions.collectWith(resumedScope) { onTransactionsUpdated(it) }
}
private fun onBalanceUpdated(balance: WalletBalance) {
binding.textBalanceAvailable.text = WalletZecFormmatter.toZecStringShort(balance.availableZatoshi)
val change = balance.pending
binding.textBalanceDescription.apply {
goneIf(change <= 0L)
val changeString = WalletZecFormmatter.toZecStringFull(change)
val expecting = R.string.home_banner_expecting.toAppString(true)
text = "($expecting +$changeString ZEC)".toColoredSpan(R.color.text_light, "+$changeString")
}
}
private fun initTransactionUI() {
twig("HistoryFragment.initTransactionUI")
transactionAdapter = TransactionAdapter()
transactionAdapter.stateRestorationPolicy =
RecyclerView.Adapter.StateRestorationPolicy.PREVENT_WHEN_EMPTY
binding.recyclerTransactions.apply {
layoutManager = LinearLayoutManager(activity, LinearLayoutManager.VERTICAL, false)
adapter = transactionAdapter
}
}
private fun onTransactionsUpdated(transactions: PagedList<ConfirmedTransaction>) {
twig("HistoryFragment.onTransactionsUpdated")
transactions.size.let { newCount ->
twig("got a new paged list of transactions of length $newCount")
binding.groupEmptyViews.goneIf(newCount > 0)
val preSize = transactionAdapter.itemCount
transactionAdapter.submitList(transactions)
}
}
private fun scrollToTop() {
twig("scrolling to the top")
binding.recyclerTransactions.apply {
postDelayed(
{
smoothScrollToPosition(0)
},
5L
)
}
}
// TODO: maybe implement this for better fade behavior. Or do an actual scroll behavior instead, yeah do that. Or an item decoration.
fun onLastItemShown(item: ConfirmedTransaction, position: Int) {
binding.footerFade.alpha = position.toFloat() / (binding.recyclerTransactions.adapter?.itemCount ?: 1)
}
}