diff --git a/app/build.gradle b/app/build.gradle index 3d7629d..0328934 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -98,6 +98,10 @@ dependencies { implementation Deps.AndroidX.Lifecycle.LIFECYCLE_RUNTIME_KTX implementation Deps.AndroidX.Navigation.FRAGMENT_KTX implementation Deps.AndroidX.Navigation.UI_KTX + implementation "androidx.room:room-ktx:2.2.3" + implementation "androidx.paging:paging-runtime-ktx:2.1.1" + implementation 'com.google.guava:guava:27.0.1-android' + kapt "androidx.room:room-compiler:2.2.3" // Google implementation Deps.Google.MATERIAL diff --git a/app/src/main/java/cash/z/ecc/android/ui/detail/TransactionAdapter.kt b/app/src/main/java/cash/z/ecc/android/ui/detail/TransactionAdapter.kt new file mode 100644 index 0000000..d738d35 --- /dev/null +++ b/app/src/main/java/cash/z/ecc/android/ui/detail/TransactionAdapter.kt @@ -0,0 +1,38 @@ +package cash.z.ecc.android.ui.detail + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.paging.PagedListAdapter +import androidx.recyclerview.widget.DiffUtil +import cash.z.ecc.android.R +import cash.z.wallet.sdk.demoapp.demos.listtransactions.TransactionViewHolder +import cash.z.wallet.sdk.entity.ConfirmedTransaction + +class TransactionAdapter : + PagedListAdapter>( + object : DiffUtil.ItemCallback() { + override fun areItemsTheSame( + oldItem: T, + newItem: T + ) = oldItem.minedHeight == newItem.minedHeight + + override fun areContentsTheSame( + oldItem: T, + newItem: T + ) = oldItem.equals(newItem) + } + ) { + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ) = TransactionViewHolder( + LayoutInflater.from(parent.context).inflate(R.layout.item_transaction, parent, false) + ) + + override fun onBindViewHolder( + holder: TransactionViewHolder, + position: Int + ) = holder.bindTo(getItem(position)) + +} diff --git a/app/src/main/java/cash/z/ecc/android/ui/detail/TransactionViewHolder.kt b/app/src/main/java/cash/z/ecc/android/ui/detail/TransactionViewHolder.kt new file mode 100644 index 0000000..8329c63 --- /dev/null +++ b/app/src/main/java/cash/z/ecc/android/ui/detail/TransactionViewHolder.kt @@ -0,0 +1,23 @@ +package cash.z.wallet.sdk.demoapp.demos.listtransactions + +import android.view.View +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import cash.z.ecc.android.R +import cash.z.wallet.sdk.entity.ConfirmedTransaction +import cash.z.wallet.sdk.ext.convertZatoshiToZecString +import java.text.SimpleDateFormat +import java.util.* + +class TransactionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val amountText = itemView.findViewById(R.id.text_transaction_amount) + private val timeText = itemView.findViewById(R.id.text_transaction_timestamp) + private val formatter = SimpleDateFormat("M/d h:mma", Locale.getDefault()) + + fun bindTo(transaction: T?) { + amountText.text = transaction?.value.convertZatoshiToZecString() + timeText.text = + if (transaction == null || transaction?.blockTimeInSeconds == 0L) "Pending" + else formatter.format(transaction.blockTimeInSeconds * 1000L) + } +} \ No newline at end of file diff --git a/app/src/main/java/cash/z/ecc/android/ui/detail/WalletDetailFragment.kt b/app/src/main/java/cash/z/ecc/android/ui/detail/WalletDetailFragment.kt index c5bde3a..ee86ab3 100644 --- a/app/src/main/java/cash/z/ecc/android/ui/detail/WalletDetailFragment.kt +++ b/app/src/main/java/cash/z/ecc/android/ui/detail/WalletDetailFragment.kt @@ -4,6 +4,8 @@ import android.content.Intent import android.os.Bundle import android.view.LayoutInflater import android.view.View +import androidx.paging.PagedList +import androidx.recyclerview.widget.LinearLayoutManager import cash.z.ecc.android.R import cash.z.ecc.android.databinding.FragmentDetailBinding import cash.z.ecc.android.di.annotation.FragmentScope @@ -11,13 +13,19 @@ import cash.z.ecc.android.ext.onClick import cash.z.ecc.android.ext.onClickNavUp import cash.z.ecc.android.feedback.FeedbackFile import cash.z.ecc.android.ui.base.BaseFragment +import cash.z.wallet.sdk.entity.ConfirmedTransaction +import cash.z.wallet.sdk.ext.twig import dagger.Module import dagger.android.ContributesAndroidInjector +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.launch import okio.Okio class WalletDetailFragment : BaseFragment() { + private lateinit var adapter: TransactionAdapter + override fun inflate(inflater: LayoutInflater): FragmentDetailBinding = FragmentDetailBinding.inflate(inflater) @@ -36,10 +44,23 @@ class WalletDetailFragment : BaseFragment() { } } - private fun onSendFeedback() { - mainActivity?.showSnackbar("Feedback not yet implemented.") + override fun onResume() { + super.onResume() + initTransactionUI() } + private fun initTransactionUI() { + binding.recyclerTransactions.layoutManager = + LinearLayoutManager(activity, LinearLayoutManager.VERTICAL, false) + adapter = TransactionAdapter() + resumedScope.launch { + mainActivity?.synchronizer?.receivedTransactions?.collect { onTransactionsUpdated(it) } + } + binding.recyclerTransactions.adapter = adapter + } + + private fun onSendFeedback() { + mainActivity?.showSnackbar("Feedback not yet implemented.") } private fun onViewLogs() { @@ -63,6 +84,11 @@ class WalletDetailFragment : BaseFragment() { mainActivity?.navController?.navigate(R.id.action_nav_detail_to_backup_wallet) } + private fun onTransactionsUpdated(transactions: PagedList) { + twig("got a new paged list of transactions") + adapter.submitList(transactions) + } + private fun loadLogFileAsText(): String? { val feedbackFile: FeedbackFile = mainActivity?.feedbackCoordinator?.findObserver() ?: return null diff --git a/app/src/main/res/drawable/ic_receive.xml b/app/src/main/res/drawable/ic_receive.xml new file mode 100644 index 0000000..e10be10 --- /dev/null +++ b/app/src/main/res/drawable/ic_receive.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/fragment_detail.xml b/app/src/main/res/layout/fragment_detail.xml index c4e014f..dd98112 100644 --- a/app/src/main/res/layout/fragment_detail.xml +++ b/app/src/main/res/layout/fragment_detail.xml @@ -4,6 +4,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" + xmlns:tools="http://schemas.android.com/tools" android:background="@drawable/background_home"> @@ -76,6 +77,21 @@ app:layout_constraintEnd_toEndOf="@id/guideline_keyline_end" app:layout_constraintTop_toTopOf="@id/back_button" /> + + + + + + + + + + + + + + \ No newline at end of file