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 6ba72d6..2824123 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/activities/MainActivity.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/activities/MainActivity.kt @@ -17,7 +17,7 @@ import cy.agorise.graphenej.models.JsonRpcResponse import kotlinx.android.synthetic.main.activity_main.* class MainActivity : ConnectedActivity() { - private val TAG = this.javaClass.name + private val TAG = this.javaClass.simpleName private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item -> when (item.itemId) { diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/adapters/TransactionsAdapter.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/adapters/TransactionsAdapter.kt new file mode 100644 index 0000000..e3d5db7 --- /dev/null +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/adapters/TransactionsAdapter.kt @@ -0,0 +1,118 @@ +package cy.agorise.bitsybitshareswallet.adapters + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.recyclerview.widget.RecyclerView +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) : + RecyclerView.Adapter() { + + private val mSortedList = + SortedList(Transfer::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: Transfer, b: Transfer): Int { + return mComparator.compare(a, b) + } + + override fun areContentsTheSame(oldItem: Transfer, newItem: Transfer): Boolean { + return oldItem == newItem + } + + override fun areItemsTheSame(item1: Transfer, item2: Transfer): Boolean { + return item1.id == item2.id + } + }) + + 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 { + + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TransactionsAdapter.ViewHolder { + val inflater = LayoutInflater.from(context) + + val transactionView = inflater.inflate(R.layout.item_transaction, parent, false) + + return ViewHolder(transactionView) + } + + override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) { + val transaction = mSortedList.get(position) + + viewHolder.tvFrom.text = transaction.source + viewHolder.tvTo.text = transaction.destination + } + + fun add(transaction: Transfer) { + mSortedList.add(transaction) + } + + fun remove(transaction: Transfer) { + mSortedList.remove(transaction) + } + + fun add(transactions: List) { + mSortedList.addAll(transactions) + } + + fun remove(transactions: List) { + mSortedList.beginBatchedUpdates() + for (transaction in transactions) { + mSortedList.remove(transaction) + } + mSortedList.endBatchedUpdates() + } + + fun replaceAll(transactions: List) { + mSortedList.beginBatchedUpdates() + for (i in mSortedList.size() - 1 downTo 0) { + val transaction = mSortedList.get(i) + if (!transactions.contains(transaction)) { + mSortedList.remove(transaction) + } + } + mSortedList.addAll(transactions) + mSortedList.endBatchedUpdates() + } + + override fun getItemCount(): Int { + return mSortedList.size() + } +} 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 77469c2..db4b1f3 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/BalancesFragment.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/fragments/BalancesFragment.kt @@ -8,18 +8,27 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager import cy.agorise.bitsybitshareswallet.R +import cy.agorise.bitsybitshareswallet.adapters.TransactionsAdapter +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.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 mTransactionViewModel: TransactionViewModel + + private val mComparator = + Comparator { a, b -> a.id.compareTo(b.id) } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -44,5 +53,14 @@ class BalancesFragment : Fragment() { mBalancesViewModel = ViewModelProviders.of(this).get(BalancesViewModel::class.java) // TODO: Use the ViewModel + mTransactionViewModel = ViewModelProviders.of(this).get(TransactionViewModel::class.java) + + val transactionsAdapter = TransactionsAdapter(context!!, mComparator) + rvTransactions.adapter = transactionsAdapter + rvTransactions.layoutManager = LinearLayoutManager(context) + + mTransactionViewModel.getAll().observe(this, Observer> { transfers -> + transactionsAdapter.replaceAll(transfers) + }) } } diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/processors/TransfersLoader.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/processors/TransfersLoader.kt index df93fad..11cf6f2 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/processors/TransfersLoader.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/processors/TransfersLoader.kt @@ -51,7 +51,7 @@ import javax.crypto.AEADBadTagException class TransfersLoader(private var mContext: Context?, private val mLifeCycle: Lifecycle) : LifecycleObserver, ServiceConnection { - private val TAG = this.javaClass.name + private val TAG = this.javaClass.simpleName /** Constant that specifies if we are on debug mode */ private val DEBUG = false diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/repositories/TransferRepository.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/repositories/TransferRepository.kt index 821d754..361a61e 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/repositories/TransferRepository.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/repositories/TransferRepository.kt @@ -2,6 +2,7 @@ package cy.agorise.bitsybitshareswallet.repositories import android.content.Context import android.os.AsyncTask +import androidx.lifecycle.LiveData import cy.agorise.bitsybitshareswallet.daos.BitsyDatabase import cy.agorise.bitsybitshareswallet.daos.TransferDao import cy.agorise.bitsybitshareswallet.entities.Transfer @@ -20,6 +21,10 @@ class TransferRepository internal constructor(context: Context) { insertAllAsyncTask(mTransferDao).execute(transfers) } + fun getAll(): LiveData> { + return mTransferDao.getAll() + } + fun getCount(): Single { return mTransferDao.getCount() } diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/viewmodels/TransactionViewModel.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/viewmodels/TransactionViewModel.kt new file mode 100644 index 0000000..f489b8e --- /dev/null +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/viewmodels/TransactionViewModel.kt @@ -0,0 +1,15 @@ +package cy.agorise.bitsybitshareswallet.viewmodels + +import android.app.Application +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.LiveData +import cy.agorise.bitsybitshareswallet.entities.Transfer +import cy.agorise.bitsybitshareswallet.repositories.TransferRepository + +class TransactionViewModel(application: Application) : AndroidViewModel(application) { + private var mRepository = TransferRepository(application) + + internal fun getAll(): LiveData> { + return mRepository.getAll() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_arrow_receive.xml b/app/src/main/res/drawable/ic_arrow_receive.xml new file mode 100644 index 0000000..4f68029 --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_receive.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_arrow_send.xml b/app/src/main/res/drawable/ic_arrow_send.xml new file mode 100644 index 0000000..5628630 --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_send.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_transaction.xml b/app/src/main/res/layout/item_transaction.xml index f818652..c042a15 100644 --- a/app/src/main/res/layout/item_transaction.xml +++ b/app/src/main/res/layout/item_transaction.xml @@ -1,14 +1,195 @@ - + android:layout_height="wrap_content" + android:layout_gravity="center" + card_view:cardElevation="4dp" + card_view:cardCornerRadius="4dp" + android:layout_margin="4dp"> - + android:clickable="true" + android:focusable="true" + android:foreground="?android:attr/selectableItemBackground"> - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index f0506dc..411afcc 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -6,4 +6,7 @@ #000 #888 + #e0e0e0 + #669900 + #DC473A