Add functionality to eReceipts to fetch the Transaction information from the database and correctly format and display it on the screen.
This commit is contained in:
parent
49b8ce1cb5
commit
032c5bcb5f
8 changed files with 104 additions and 6 deletions
|
@ -7,6 +7,9 @@ import androidx.room.Query
|
||||||
@Dao
|
@Dao
|
||||||
interface TransferDetailDao {
|
interface TransferDetailDao {
|
||||||
|
|
||||||
|
@Query("SELECT transfers.id, (SELECT name FROM user_accounts WHERE user_accounts.id=transfers.source) AS `from`, (SELECT name FROM user_accounts WHERE user_accounts.id=transfers.destination) AS `to`, (CASE WHEN destination=:userId THEN 1 ELSE 0 END) AS `direction`, transfers.memo AS `memo`, transfers.timestamp AS `date`, transfers.transfer_amount AS `assetAmount`, assets.precision AS `assetPrecision`, assets.symbol AS `assetSymbol`, assets.issuer as `assetIssuer` FROM transfers INNER JOIN assets WHERE transfers.id=:transferId AND transfers.transfer_asset_id = assets.id")
|
||||||
|
fun get(userId: String, transferId: String): LiveData<TransferDetail>
|
||||||
|
|
||||||
@Query("SELECT transfers.id, (SELECT name FROM user_accounts WHERE user_accounts.id=transfers.source) AS `from`, (SELECT name FROM user_accounts WHERE user_accounts.id=transfers.destination) AS `to`, (CASE WHEN destination=:userId THEN 1 ELSE 0 END) AS `direction`, transfers.memo AS `memo`, transfers.timestamp AS `date`, transfers.transfer_amount AS `assetAmount`, assets.precision AS `assetPrecision`, assets.symbol AS `assetSymbol`, assets.issuer as `assetIssuer` FROM transfers INNER JOIN assets WHERE transfers.transfer_asset_id = assets.id")
|
@Query("SELECT transfers.id, (SELECT name FROM user_accounts WHERE user_accounts.id=transfers.source) AS `from`, (SELECT name FROM user_accounts WHERE user_accounts.id=transfers.destination) AS `to`, (CASE WHEN destination=:userId THEN 1 ELSE 0 END) AS `direction`, transfers.memo AS `memo`, transfers.timestamp AS `date`, transfers.transfer_amount AS `assetAmount`, assets.precision AS `assetPrecision`, assets.symbol AS `assetSymbol`, assets.issuer as `assetIssuer` FROM transfers INNER JOIN assets WHERE transfers.transfer_asset_id = assets.id")
|
||||||
fun getAll(userId: String): LiveData<List<TransferDetail>>
|
fun getAll(userId: String): LiveData<List<TransferDetail>>
|
||||||
}
|
}
|
|
@ -1,19 +1,35 @@
|
||||||
package cy.agorise.bitsybitshareswallet.fragments
|
package cy.agorise.bitsybitshareswallet.fragments
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import android.preference.PreferenceManager
|
||||||
|
import android.text.Html
|
||||||
|
import android.text.method.LinkMovementMethod
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
|
import androidx.lifecycle.Observer
|
||||||
|
import androidx.lifecycle.ViewModelProviders
|
||||||
import androidx.navigation.fragment.navArgs
|
import androidx.navigation.fragment.navArgs
|
||||||
|
|
||||||
import cy.agorise.bitsybitshareswallet.R
|
import cy.agorise.bitsybitshareswallet.R
|
||||||
import cy.agorise.bitsybitshareswallet.utils.toast
|
import cy.agorise.bitsybitshareswallet.database.joins.TransferDetail
|
||||||
|
import cy.agorise.bitsybitshareswallet.utils.Constants
|
||||||
|
import cy.agorise.bitsybitshareswallet.viewmodels.EReceiptViewModel
|
||||||
|
import kotlinx.android.synthetic.main.fragment_e_receipt.*
|
||||||
|
import java.math.RoundingMode
|
||||||
|
import java.text.DecimalFormat
|
||||||
|
import java.text.DecimalFormatSymbols
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
class EReceiptFragment : Fragment() {
|
class EReceiptFragment : Fragment() {
|
||||||
|
|
||||||
private val args: EReceiptFragmentArgs by navArgs()
|
private val args: EReceiptFragmentArgs by navArgs()
|
||||||
|
|
||||||
|
private lateinit var mEReceiptViewModel: EReceiptViewModel
|
||||||
|
private lateinit var mLocale: Locale
|
||||||
|
|
||||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
||||||
setHasOptionsMenu(true)
|
setHasOptionsMenu(true)
|
||||||
|
|
||||||
|
@ -23,7 +39,62 @@ class EReceiptFragment : Fragment() {
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
|
||||||
|
mLocale = resources.configuration.locale
|
||||||
|
|
||||||
|
val userId = PreferenceManager.getDefaultSharedPreferences(context)
|
||||||
|
.getString(Constants.KEY_CURRENT_ACCOUNT_ID, "") ?: ""
|
||||||
|
|
||||||
val transferId = args.transferId
|
val transferId = args.transferId
|
||||||
context?.toast("Transfer ID: $transferId")
|
|
||||||
|
mEReceiptViewModel = ViewModelProviders.of(this).get(EReceiptViewModel::class.java)
|
||||||
|
|
||||||
|
mEReceiptViewModel.get(userId, transferId).observe(this, Observer<TransferDetail> { transferDetail ->
|
||||||
|
bindTransferDetail(transferDetail)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun bindTransferDetail(transferDetail: TransferDetail) {
|
||||||
|
vPaymentDirection.setBackgroundColor(resources.getColor(
|
||||||
|
if(transferDetail.direction) R.color.colorReceive else R.color.colorSend
|
||||||
|
))
|
||||||
|
|
||||||
|
tvFrom.text = transferDetail.from ?: ""
|
||||||
|
tvTo.text = transferDetail.to ?: ""
|
||||||
|
|
||||||
|
// Show the crypto amount correctly formatted
|
||||||
|
val df = DecimalFormat("####."+("#".repeat(transferDetail.assetPrecision)))
|
||||||
|
df.roundingMode = RoundingMode.CEILING
|
||||||
|
df.decimalFormatSymbols = DecimalFormatSymbols(Locale.getDefault())
|
||||||
|
|
||||||
|
val amount = transferDetail.assetAmount.toDouble() /
|
||||||
|
Math.pow(10.toDouble(), transferDetail.assetPrecision.toDouble())
|
||||||
|
val assetAmount = "${df.format(amount)} ${transferDetail.getUIAssetSymbol()}"
|
||||||
|
tvAmount.text = assetAmount
|
||||||
|
|
||||||
|
// TODO show the equivalent value
|
||||||
|
tvEquivalentValue.text = "-"
|
||||||
|
|
||||||
|
// Memo
|
||||||
|
if (transferDetail.memo != "")
|
||||||
|
tvMemo.text = getString(R.string.template__memo, transferDetail.memo)
|
||||||
|
else
|
||||||
|
tvMemo.visibility = View.GONE
|
||||||
|
|
||||||
|
// Date
|
||||||
|
val dateFormat = SimpleDateFormat("dd MMM HH:mm:ss z", mLocale)
|
||||||
|
tvDate.text = getString(R.string.template__date, dateFormat.format(transferDetail.date * 1000))
|
||||||
|
|
||||||
|
// Transaction #
|
||||||
|
formatTransferTextView(transferDetail.id)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Formats the transfer TextView to show a link to explore the given transfer
|
||||||
|
* in a BitShares explorer */
|
||||||
|
private fun formatTransferTextView(transferId: String) {
|
||||||
|
val tx = Html.fromHtml(getString(R.string.template__tx,
|
||||||
|
"<a href=\"http://bitshares-explorer.io/#/operations/$transferId\">$transferId</a>"
|
||||||
|
))
|
||||||
|
tvTransferID.text = tx
|
||||||
|
tvTransferID.movementMethod = LinkMovementMethod.getInstance()
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -29,7 +29,6 @@ import java.io.File
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
import kotlin.collections.ArrayList
|
import kotlin.collections.ArrayList
|
||||||
import kotlin.math.exp
|
|
||||||
|
|
||||||
class TransactionsFragment : Fragment(), FilterOptionsDialog.OnFilterOptionsSelectedListener {
|
class TransactionsFragment : Fragment(), FilterOptionsDialog.OnFilterOptionsSelectedListener {
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,10 @@ class TransferDetailRepository internal constructor(context: Context) {
|
||||||
mTransferDetailDao = db!!.transferDetailDao()
|
mTransferDetailDao = db!!.transferDetailDao()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun get(userId: String, transferId: String): LiveData<TransferDetail> {
|
||||||
|
return mTransferDetailDao.get(userId, transferId)
|
||||||
|
}
|
||||||
|
|
||||||
fun getAll(userId: String): LiveData<List<TransferDetail>> {
|
fun getAll(userId: String): LiveData<List<TransferDetail>> {
|
||||||
return mTransferDetailDao.getAll(userId)
|
return mTransferDetailDao.getAll(userId)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.database.joins.TransferDetail
|
||||||
|
import cy.agorise.bitsybitshareswallet.repositories.TransferDetailRepository
|
||||||
|
|
||||||
|
class EReceiptViewModel(application: Application) : AndroidViewModel(application) {
|
||||||
|
private var mTransferDetailRepository = TransferDetailRepository(application)
|
||||||
|
|
||||||
|
internal fun get(userId: String, transferId: String): LiveData<TransferDetail> {
|
||||||
|
return mTransferDetailRepository.get(userId, transferId)
|
||||||
|
}
|
||||||
|
}
|
|
@ -23,6 +23,7 @@
|
||||||
android:background="@android:color/white">
|
android:background="@android:color/white">
|
||||||
|
|
||||||
<View
|
<View
|
||||||
|
android:id="@+id/vPaymentDirection"
|
||||||
android:layout_width="8dp"
|
android:layout_width="8dp"
|
||||||
android:layout_height="0dp"
|
android:layout_height="0dp"
|
||||||
android:background="@color/colorReceive"
|
android:background="@color/colorReceive"
|
||||||
|
@ -176,7 +177,7 @@
|
||||||
app:layout_constraintTop_toBottomOf="@id/tvMemo"/>
|
app:layout_constraintTop_toBottomOf="@id/tvMemo"/>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/tvTransactionID"
|
android:id="@+id/tvTransferID"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="16dp"
|
android:layout_marginTop="16dp"
|
||||||
|
|
|
@ -73,7 +73,9 @@
|
||||||
|
|
||||||
<!-- eReceipt -->
|
<!-- eReceipt -->
|
||||||
<string name="title_e_receipt">Recibo electrónico</string>
|
<string name="title_e_receipt">Recibo electrónico</string>
|
||||||
<string name="template__memo">Memo: %1$d</string>
|
<string name="template__memo">Memo: %1$s</string>
|
||||||
|
<string name="template__date">Fecha: %1$s</string>
|
||||||
|
<string name="template__tx">Tx: %1$s</string>
|
||||||
|
|
||||||
<!-- Merchants & Tellers -->
|
<!-- Merchants & Tellers -->
|
||||||
<string name="title_merchants">Comerciantes</string>
|
<string name="title_merchants">Comerciantes</string>
|
||||||
|
|
|
@ -73,7 +73,10 @@
|
||||||
|
|
||||||
<!-- eReceipt -->
|
<!-- eReceipt -->
|
||||||
<string name="title_e_receipt">eReceipt</string>
|
<string name="title_e_receipt">eReceipt</string>
|
||||||
<string name="template__memo">Memo: %1$d</string>
|
<string name="template__memo">Memo: %1$s</string>
|
||||||
|
<string name="template__date">Date: %1$s</string>
|
||||||
|
<string name="template__tx">Tx: %1$s</string>
|
||||||
|
|
||||||
|
|
||||||
<!-- Merchants & Tellers -->
|
<!-- Merchants & Tellers -->
|
||||||
<string name="title_merchants">Merchants</string>
|
<string name="title_merchants">Merchants</string>
|
||||||
|
|
Loading…
Reference in a new issue