From dd770fdb5bef9d153fe135e410bbd451b917488b Mon Sep 17 00:00:00 2001 From: Severiano Jaramillo Date: Sat, 1 Dec 2018 08:48:19 -0600 Subject: [PATCH] - Created Balances adapter and ViewModel to show the Account Balances in the BalancesFragment. - Simplified the Balances db table. --- .../activities/MainActivity.kt | 1 - .../adapters/BalancesAdapter.kt | 104 ++++++++++++++++++ .../adapters/TransactionsAdapter.kt | 31 +++--- .../bitsybitshareswallet/entities/Balance.kt | 8 +- .../fragments/BalancesFragment.kt | 26 +++-- .../viewmodels/BalanceViewModel.kt | 16 +++ .../viewmodels/BalancesViewModel.kt | 8 -- 7 files changed, 156 insertions(+), 38 deletions(-) create mode 100644 app/src/main/java/cy/agorise/bitsybitshareswallet/adapters/BalancesAdapter.kt create mode 100644 app/src/main/java/cy/agorise/bitsybitshareswallet/viewmodels/BalanceViewModel.kt delete mode 100644 app/src/main/java/cy/agorise/bitsybitshareswallet/viewmodels/BalancesViewModel.kt diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/activities/MainActivity.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/activities/MainActivity.kt index 75b753b..202f60e 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/activities/MainActivity.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/activities/MainActivity.kt @@ -150,7 +150,6 @@ class MainActivity : ConnectedActivity() { val balances = ArrayList() for (assetBalance in assetBalances) { val balance = Balance( - mCurrentAccount!!.objectId, assetBalance.asset.objectId, assetBalance.amount.toLong(), now diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/adapters/BalancesAdapter.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/adapters/BalancesAdapter.kt new file mode 100644 index 0000000..dc2ad19 --- /dev/null +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/adapters/BalancesAdapter.kt @@ -0,0 +1,104 @@ +package cy.agorise.bitsybitshareswallet.adapters + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.SortedList +import cy.agorise.bitsybitshareswallet.R +import cy.agorise.bitsybitshareswallet.entities.Balance + +class BalancesAdapter(private val context: Context) : + RecyclerView.Adapter() { + + private val mComparator = + Comparator { a, b -> a.assetId.compareTo(b.assetId) } + + private val mSortedList = + SortedList(Balance::class.java, object : SortedList.Callback() { + override fun onInserted(position: Int, count: Int) { + notifyItemRangeInserted(position, count) + } + + override fun onRemoved(position: Int, count: Int) { + notifyItemRangeRemoved(position, count) + } + + override fun onMoved(fromPosition: Int, toPosition: Int) { + notifyItemMoved(fromPosition, toPosition) + } + + override fun onChanged(position: Int, count: Int) { + notifyItemRangeChanged(position, count) + } + + override fun compare(a: Balance, b: Balance): Int { + return mComparator.compare(a, b) + } + + override fun areContentsTheSame(oldItem: Balance, newItem: Balance): Boolean { + return oldItem == newItem + } + + override fun areItemsTheSame(item1: Balance, item2: Balance): Boolean { + return item1.assetId == item2.assetId + } + }) + + inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val tvBalance: TextView = itemView.findViewById(R.id.tvBalance) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BalancesAdapter.ViewHolder { + val inflater = LayoutInflater.from(context) + + val balanceView = inflater.inflate(R.layout.item_balance, parent, false) + + return ViewHolder(balanceView) + } + + override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) { + val balance = mSortedList.get(position) + + val amount = "${balance.assetAmount} ${balance.assetId}" + viewHolder.tvBalance.text = amount + } + + fun add(balance: Balance) { + mSortedList.add(balance) + } + + fun remove(balance: Balance) { + mSortedList.remove(balance) + } + + fun add(balances: List) { + mSortedList.addAll(balances) + } + + fun remove(balances: List) { + mSortedList.beginBatchedUpdates() + for (balance in balances) { + mSortedList.remove(balance) + } + mSortedList.endBatchedUpdates() + } + + fun replaceAll(balances: List) { + mSortedList.beginBatchedUpdates() + for (i in mSortedList.size() - 1 downTo 0) { + val balance = mSortedList.get(i) + if (!balances.contains(balance)) { + mSortedList.remove(balance) + } + } + mSortedList.addAll(balances) + mSortedList.endBatchedUpdates() + } + + override fun getItemCount(): Int { + return mSortedList.size() + } +} diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/adapters/TransactionsAdapter.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/adapters/TransactionsAdapter.kt index e3d5db7..dc70930 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/adapters/TransactionsAdapter.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/adapters/TransactionsAdapter.kt @@ -13,9 +13,12 @@ import androidx.recyclerview.widget.SortedList import cy.agorise.bitsybitshareswallet.R import cy.agorise.bitsybitshareswallet.entities.Transfer -class TransactionsAdapter(private val context: Context, private val mComparator: Comparator) : +class TransactionsAdapter(private val context: Context) : RecyclerView.Adapter() { + private val mComparator = + Comparator { a, b -> a.id.compareTo(b.id) } + private val mSortedList = SortedList(Transfer::class.java, object : SortedList.Callback() { override fun onInserted(position: Int, count: Int) { @@ -48,21 +51,17 @@ class TransactionsAdapter(private val context: Context, private val mComparator: }) inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - val rootView = itemView.findViewById(R.id.rootView) - val vPaymentDirection = itemView.findViewById(R.id.vPaymentDirection) - val tvFrom = itemView.findViewById(R.id.tvFrom) - val ivDirectionArrow = itemView.findViewById(R.id.ivDirectionArrow) - val tvTo = itemView.findViewById(R.id.tvTo) - val llMemo = itemView.findViewById(R.id.llMemo) - val tvMemo = itemView.findViewById(R.id.tvMemo) - val tvDate = itemView.findViewById(R.id.tvDate) - val tvTime = itemView.findViewById(R.id.tvTime) - val tvCryptoAmount = itemView.findViewById(R.id.tvCryptoAmount) - val tvFiatEquivalent = itemView.findViewById(R.id.tvFiatEquivalent) - } - - init { - + val rootView: ConstraintLayout = itemView.findViewById(R.id.rootView) + val vPaymentDirection: View = itemView.findViewById(R.id.vPaymentDirection) + val tvFrom: TextView = itemView.findViewById(R.id.tvFrom) + val ivDirectionArrow: ImageView = itemView.findViewById(R.id.ivDirectionArrow) + val tvTo: TextView = itemView.findViewById(R.id.tvTo) + val llMemo: LinearLayout = itemView.findViewById(R.id.llMemo) + val tvMemo: TextView = itemView.findViewById(R.id.tvMemo) + val tvDate: TextView = itemView.findViewById(R.id.tvDate) + val tvTime: TextView = itemView.findViewById(R.id.tvTime) + val tvCryptoAmount: TextView = itemView.findViewById(R.id.tvCryptoAmount) + val tvFiatEquivalent: TextView = itemView.findViewById(R.id.tvFiatEquivalent) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TransactionsAdapter.ViewHolder { diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/entities/Balance.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/entities/Balance.kt index d51eca2..be42d04 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/entities/Balance.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/entities/Balance.kt @@ -2,12 +2,12 @@ package cy.agorise.bitsybitshareswallet.entities import androidx.room.ColumnInfo import androidx.room.Entity +import androidx.room.PrimaryKey -@Entity(tableName = "balances", primaryKeys = ["user_account_id", "asset_id"]) -// TODO make userAccountId and assetId be ForeignKeys +@Entity(tableName = "balances") data class Balance( - @ColumnInfo(name = "user_account_id") val userAccountId: String, - @ColumnInfo(name = "asset_id") val assetId: String, + @PrimaryKey + @ColumnInfo(name = "asset_id") val assetId: String, // TODO should be foreign key? @ColumnInfo(name = "asset_amount") val assetAmount: Long, @ColumnInfo(name = "last_update") val lastUpdate: Long ) \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/BalancesFragment.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/BalancesFragment.kt index db4b1f3..8da9ba0 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/BalancesFragment.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/BalancesFragment.kt @@ -8,28 +8,27 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.lifecycle.Observer +import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import cy.agorise.bitsybitshareswallet.R +import cy.agorise.bitsybitshareswallet.adapters.BalancesAdapter import cy.agorise.bitsybitshareswallet.adapters.TransactionsAdapter +import cy.agorise.bitsybitshareswallet.entities.Balance import cy.agorise.bitsybitshareswallet.entities.Transfer import cy.agorise.bitsybitshareswallet.entities.UserAccount import cy.agorise.bitsybitshareswallet.utils.Constants -import cy.agorise.bitsybitshareswallet.viewmodels.BalancesViewModel +import cy.agorise.bitsybitshareswallet.viewmodels.BalanceViewModel import cy.agorise.bitsybitshareswallet.viewmodels.TransactionViewModel import cy.agorise.bitsybitshareswallet.viewmodels.UserAccountViewModel import kotlinx.android.synthetic.main.fragment_balances.* -import java.util.Comparator class BalancesFragment : Fragment() { private lateinit var mUserAccountViewModel: UserAccountViewModel - private lateinit var mBalancesViewModel: BalancesViewModel + private lateinit var mBalanceViewModel: BalanceViewModel private lateinit var mTransactionViewModel: TransactionViewModel - private val mComparator = - Comparator { a, b -> a.id.compareTo(b.id) } - override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -40,6 +39,7 @@ class BalancesFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + // Configure UserAccountViewModel to show the current account mUserAccountViewModel = ViewModelProviders.of(this).get(UserAccountViewModel::class.java) val userId = PreferenceManager.getDefaultSharedPreferences(context) @@ -49,13 +49,21 @@ class BalancesFragment : Fragment() { tvAccountName.text = user.name }) + // Configure BalanceViewModel to show the current balances + mBalanceViewModel = ViewModelProviders.of(this).get(BalanceViewModel::class.java) - mBalancesViewModel = ViewModelProviders.of(this).get(BalancesViewModel::class.java) - // TODO: Use the ViewModel + val balancesAdapter = BalancesAdapter(context!!) + rvBalances.adapter = balancesAdapter + rvBalances.layoutManager = GridLayoutManager(context, 2) + mBalanceViewModel.getAll().observe(this, Observer> { balances -> + balancesAdapter.replaceAll(balances) + }) + + // Configure TransactionViewModel to show the transaction history mTransactionViewModel = ViewModelProviders.of(this).get(TransactionViewModel::class.java) - val transactionsAdapter = TransactionsAdapter(context!!, mComparator) + val transactionsAdapter = TransactionsAdapter(context!!) rvTransactions.adapter = transactionsAdapter rvTransactions.layoutManager = LinearLayoutManager(context) diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/viewmodels/BalanceViewModel.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/viewmodels/BalanceViewModel.kt new file mode 100644 index 0000000..5949a78 --- /dev/null +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/viewmodels/BalanceViewModel.kt @@ -0,0 +1,16 @@ +package cy.agorise.bitsybitshareswallet.viewmodels + +import android.app.Application +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.LiveData +import cy.agorise.bitsybitshareswallet.entities.Balance +import cy.agorise.bitsybitshareswallet.repositories.BalanceRepository + + +class BalanceViewModel(application: Application) : AndroidViewModel(application) { + private var mRepository = BalanceRepository(application) + + internal fun getAll(): LiveData> { + return mRepository.getAll() + } +} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/viewmodels/BalancesViewModel.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/viewmodels/BalancesViewModel.kt deleted file mode 100644 index 2b660b0..0000000 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/viewmodels/BalancesViewModel.kt +++ /dev/null @@ -1,8 +0,0 @@ -package cy.agorise.bitsybitshareswallet.viewmodels - -import android.app.Application -import androidx.lifecycle.AndroidViewModel - - -class BalancesViewModel(application: Application) : AndroidViewModel(application) { -} \ No newline at end of file