From 2f0045ba351a36b26ef6c25a9973b600f47d427b Mon Sep 17 00:00:00 2001 From: Dmitry Bespalov Date: Tue, 2 Jul 2024 14:33:24 +0200 Subject: [PATCH] GH-2049 changed the display strings based on order types --- .../TransactionListViewHolderFactory.kt | 10 +-- .../transactions/TransactionListViewModel.kt | 21 ++++-- .../safe/ui/transactions/TransactionView.kt | 14 ++-- .../details/TransactionDetailsFragment.kt | 12 ++-- .../viewdata/TransactionDetailsViewData.kt | 71 ++++++++++++++++--- .../execution/TxReviewFragment.kt | 6 +- .../models/transaction/TransactionInfo.kt | 24 ++++++- 7 files changed, 123 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/io/gnosis/safe/ui/transactions/TransactionListViewHolderFactory.kt b/app/src/main/java/io/gnosis/safe/ui/transactions/TransactionListViewHolderFactory.kt index 42ca97bc6..15ddfada2 100644 --- a/app/src/main/java/io/gnosis/safe/ui/transactions/TransactionListViewHolderFactory.kt +++ b/app/src/main/java/io/gnosis/safe/ui/transactions/TransactionListViewHolderFactory.kt @@ -384,7 +384,7 @@ class SwapOrderViewHolder(private val viewBinding: ItemTxSwapOrderBinding) : dateTime.text = viewTransfer.dateTimeText nonce.text = viewTransfer.nonce - addressName.text = resources.getString(R.string.tx_list_swap_order) + addressName.text = viewTransfer.displayName addressLogo.alpha = viewTransfer.alpha addressName.alpha = viewTransfer.alpha @@ -412,7 +412,7 @@ class SwapTransferQueuedViewHolder(private val viewBinding: ItemTxQueuedSwapOrde status.setTextColor(ResourcesCompat.getColor(resources, viewTransfer.statusColorRes, theme)) dateTime.text = viewTransfer.dateTime.elapsedIntervalTo(Date.from(Instant.now())).format(resources) - addressName.text = resources.getString(R.string.tx_list_swap_transfer) + addressName.text = viewTransfer.displayName confirmationsIcon.setImageDrawable(ResourcesCompat.getDrawable(resources, viewTransfer.confirmationsIcon, theme)) confirmations.setTextColor(ResourcesCompat.getColor(resources, viewTransfer.confirmationsTextColor, theme)) @@ -440,7 +440,7 @@ class SwapTransferViewHolder(private val viewBinding: ItemTxSwapOrderBinding) : dateTime.text = viewTransfer.dateTimeText nonce.text = viewTransfer.nonce - addressName.text = resources.getString(R.string.tx_list_swap_transfer) + addressName.text = viewTransfer.displayName addressLogo.alpha = viewTransfer.alpha addressName.alpha = viewTransfer.alpha @@ -468,7 +468,7 @@ class TwapOrderQueuedViewHolder(private val viewBinding: ItemTxQueuedSwapOrderBi status.setTextColor(ResourcesCompat.getColor(resources, viewTransfer.statusColorRes, theme)) dateTime.text = viewTransfer.dateTime.elapsedIntervalTo(Date.from(Instant.now())).format(resources) - addressName.text = resources.getString(R.string.tx_list_twap_order) + addressName.text = viewTransfer.displayName confirmationsIcon.setImageDrawable(ResourcesCompat.getDrawable(resources, viewTransfer.confirmationsIcon, theme)) confirmations.setTextColor(ResourcesCompat.getColor(resources, viewTransfer.confirmationsTextColor, theme)) @@ -496,7 +496,7 @@ class TwapOrderViewHolder(private val viewBinding: ItemTxSwapOrderBinding) : dateTime.text = viewTransfer.dateTimeText nonce.text = viewTransfer.nonce - addressName.text = resources.getString(R.string.tx_list_twap_order) + addressName.text = viewTransfer.displayName addressLogo.alpha = viewTransfer.alpha addressName.alpha = viewTransfer.alpha diff --git a/app/src/main/java/io/gnosis/safe/ui/transactions/TransactionListViewModel.kt b/app/src/main/java/io/gnosis/safe/ui/transactions/TransactionListViewModel.kt index f6193ba95..84af43084 100644 --- a/app/src/main/java/io/gnosis/safe/ui/transactions/TransactionListViewModel.kt +++ b/app/src/main/java/io/gnosis/safe/ui/transactions/TransactionListViewModel.kt @@ -30,6 +30,9 @@ import io.gnosis.data.repositories.TransactionLocalRepository import io.gnosis.safe.R import io.gnosis.safe.ui.base.AppDispatchers import io.gnosis.safe.ui.base.BaseStateViewModel +import io.gnosis.safe.ui.transactions.details.viewdata.swapOrderDisplayname +import io.gnosis.safe.ui.transactions.details.viewdata.swapTransferDisplayName +import io.gnosis.safe.ui.transactions.details.viewdata.twapOrderDisplayName import io.gnosis.safe.ui.transactions.paging.TransactionPagingProvider import io.gnosis.safe.ui.transactions.paging.TransactionPagingSource import io.gnosis.safe.utils.BalanceFormatter @@ -392,7 +395,8 @@ class TransactionListViewModel dateTimeText = timestamp.formatBackendTimeOfDay(), alpha = alpha(txStatus), nonce = executionInfo?.nonce?.toString() ?: "", - explorerUrl = txInfo.explorerUrl + explorerUrl = txInfo.explorerUrl, + displayName = swapOrderDisplayname(txInfo) ) } @@ -419,7 +423,8 @@ class TransactionListViewModel confirmationsTextColor = if (thresholdMet) R.color.success else R.color.icon, confirmationsIcon = if (thresholdMet) R.drawable.ic_confirmations_green_16dp else R.drawable.ic_confirmations_grey_16dp, nonce = if (isConflict) "" else executionInfo?.nonce?.toString() ?: "", - explorerUrl = txInfo.explorerUrl + explorerUrl = txInfo.explorerUrl, + displayName = swapOrderDisplayname(txInfo) ) } @@ -446,7 +451,8 @@ class TransactionListViewModel dateTimeText = timestamp.formatBackendTimeOfDay(), alpha = alpha(txStatus), nonce = executionInfo?.nonce?.toString() ?: "", - explorerUrl = txInfo.explorerUrl + explorerUrl = txInfo.explorerUrl, + displayName = swapTransferDisplayName(txInfo) ) } @@ -473,7 +479,8 @@ class TransactionListViewModel confirmationsTextColor = if (thresholdMet) R.color.success else R.color.icon, confirmationsIcon = if (thresholdMet) R.drawable.ic_confirmations_green_16dp else R.drawable.ic_confirmations_grey_16dp, nonce = if (isConflict) "" else executionInfo?.nonce?.toString() ?: "", - explorerUrl = txInfo.explorerUrl + explorerUrl = txInfo.explorerUrl, + displayName = swapTransferDisplayName(txInfo) ) } @@ -499,7 +506,8 @@ class TransactionListViewModel statusColorRes = statusTextColor(txStatus), dateTimeText = timestamp.formatBackendTimeOfDay(), alpha = alpha(txStatus), - nonce = executionInfo?.nonce?.toString() ?: "" + nonce = executionInfo?.nonce?.toString() ?: "", + displayName = twapOrderDisplayName() ) } @@ -525,7 +533,8 @@ class TransactionListViewModel threshold = threshold, confirmationsTextColor = if (thresholdMet) R.color.success else R.color.icon, confirmationsIcon = if (thresholdMet) R.drawable.ic_confirmations_green_16dp else R.drawable.ic_confirmations_grey_16dp, - nonce = if (isConflict) "" else executionInfo?.nonce?.toString() ?: "" + nonce = if (isConflict) "" else executionInfo?.nonce?.toString() ?: "", + displayName = twapOrderDisplayName() ) } diff --git a/app/src/main/java/io/gnosis/safe/ui/transactions/TransactionView.kt b/app/src/main/java/io/gnosis/safe/ui/transactions/TransactionView.kt index fb90a69f3..c0719ada8 100644 --- a/app/src/main/java/io/gnosis/safe/ui/transactions/TransactionView.kt +++ b/app/src/main/java/io/gnosis/safe/ui/transactions/TransactionView.kt @@ -124,7 +124,8 @@ sealed class TransactionView( val dateTimeText: String, val alpha: Float, val nonce: String, - val explorerUrl: String + val explorerUrl: String, + val displayName: String ) : TransactionView(status, id, chain) data class SwapOrderTransactionQueued( @@ -139,7 +140,8 @@ sealed class TransactionView( @ColorRes val confirmationsTextColor: Int, @DrawableRes val confirmationsIcon: Int, val nonce: String, - val explorerUrl: String + val explorerUrl: String, + val displayName: String ) : TransactionView(status, id, chain) data class SwapTransferTransaction( @@ -151,7 +153,8 @@ sealed class TransactionView( val dateTimeText: String, val alpha: Float, val nonce: String, - val explorerUrl: String + val explorerUrl: String, + val displayName: String ) : TransactionView(status, id, chain) data class SwapTransferTransactionQueued( @@ -166,7 +169,8 @@ sealed class TransactionView( @ColorRes val confirmationsTextColor: Int, @DrawableRes val confirmationsIcon: Int, val nonce: String, - val explorerUrl: String + val explorerUrl: String, + val displayName: String ) : TransactionView(status, id, chain) data class TwapOrderTransaction( @@ -178,6 +182,7 @@ sealed class TransactionView( val dateTimeText: String, val alpha: Float, val nonce: String, + val displayName: String ) : TransactionView(status, id, chain) data class TwapOrderTransactionQueued( @@ -192,6 +197,7 @@ sealed class TransactionView( @ColorRes val confirmationsTextColor: Int, @DrawableRes val confirmationsIcon: Int, val nonce: String, + val displayName: String ) : TransactionView(status, id, chain) data class Creation( diff --git a/app/src/main/java/io/gnosis/safe/ui/transactions/details/TransactionDetailsFragment.kt b/app/src/main/java/io/gnosis/safe/ui/transactions/details/TransactionDetailsFragment.kt index 94186d825..896930ce9 100644 --- a/app/src/main/java/io/gnosis/safe/ui/transactions/details/TransactionDetailsFragment.kt +++ b/app/src/main/java/io/gnosis/safe/ui/transactions/details/TransactionDetailsFragment.kt @@ -464,11 +464,11 @@ class TransactionDetailsFragment : BaseViewBindingFragment(ActionInfoItem.Value( itemLabel = R.string.tx_status_type_custom , - value = "Swap order")) + value = txInfo.displayDescription)) ) txStatus.setStatus( - title = resources.getString(TxType.SWAP_ORDER.titleRes), + title = txInfo.displayDescription, defaultIconRes = TxType.SWAP_ORDER.iconRes, statusTextRes = getStringResForStatus(txDetails.txStatus, txDetails.canSign && awaitingConfirmations), statusColorRes = getColorForStatus(txDetails.txStatus) @@ -494,11 +494,11 @@ class TransactionDetailsFragment : BaseViewBindingFragment(ActionInfoItem.Value( itemLabel = R.string.tx_status_type_custom , - value = "Swap transfer")) + value = txInfo.displayDescription)) ) txStatus.setStatus( - title = resources.getString(TxType.SWAP_TRANSFER.titleRes), + title = txInfo.displayDescription, defaultIconRes = TxType.SWAP_TRANSFER.iconRes, statusTextRes = getStringResForStatus(txDetails.txStatus, txDetails.canSign && awaitingConfirmations), statusColorRes = getColorForStatus(txDetails.txStatus) @@ -524,11 +524,11 @@ class TransactionDetailsFragment : BaseViewBindingFragment(ActionInfoItem.Value( itemLabel = R.string.tx_status_type_custom , - value = "Twap order")) + value = txInfo.displayDescription)) ) txStatus.setStatus( - title = resources.getString(TxType.TWAP_ORDER.titleRes), + title = txInfo.displayDescription, defaultIconRes = TxType.TWAP_ORDER.iconRes, statusTextRes = getStringResForStatus(txDetails.txStatus, txDetails.canSign && awaitingConfirmations), statusColorRes = getColorForStatus(txDetails.txStatus) diff --git a/app/src/main/java/io/gnosis/safe/ui/transactions/details/viewdata/TransactionDetailsViewData.kt b/app/src/main/java/io/gnosis/safe/ui/transactions/details/viewdata/TransactionDetailsViewData.kt index 982b428cd..06145d4de 100644 --- a/app/src/main/java/io/gnosis/safe/ui/transactions/details/viewdata/TransactionDetailsViewData.kt +++ b/app/src/main/java/io/gnosis/safe/ui/transactions/details/viewdata/TransactionDetailsViewData.kt @@ -104,18 +104,21 @@ sealed class TransactionInfoViewData( @Parcelize data class SwapOrder( val uid: String, - val explorerUrl: String + val explorerUrl: String, + val displayDescription: String ) : TransactionInfoViewData(TransactionType.SwapOrder) @Parcelize data class SwapTransfer( val uid: String, - val explorerUrl: String + val explorerUrl: String, + val displayDescription: String ) : TransactionInfoViewData(TransactionType.SwapTransfer) @Parcelize data class TwapOrder( - val status: String + val status: String, + val displayDescription: String ) : TransactionInfoViewData(TransactionType.TwapOrder) @Parcelize @@ -248,22 +251,49 @@ internal fun TransactionInfo.toTransactionInfoViewData( ) } } + is TransactionInfo.Creation -> TransactionInfoViewData.Creation( creator.value, - AddressInfoData.Remote(creator.name, creator.logoUri, creator.value.asEthereumAddressString()), + AddressInfoData.Remote( + creator.name, + creator.logoUri, + creator.value.asEthereumAddressString() + ), transactionHash, implementation?.value, - AddressInfoData.Remote(implementation?.name, implementation?.logoUri, implementation?.value?.asEthereumAddressString()), + AddressInfoData.Remote( + implementation?.name, + implementation?.logoUri, + implementation?.value?.asEthereumAddressString() + ), factory?.value, - AddressInfoData.Remote(factory?.name, factory?.logoUri, factory?.value?.asEthereumAddressString()) + AddressInfoData.Remote( + factory?.name, + factory?.logoUri, + factory?.value?.asEthereumAddressString() + ) ) + is TransactionInfo.SettingsChange -> TransactionInfoViewData.SettingsChange( dataDecoded, settingsInfo.toSettingsInfoViewData(safes, owners = owners) ) - is TransactionInfo.SwapOrder -> TransactionInfoViewData.SwapOrder(uid, explorerUrl) - is TransactionInfo.SwapTransfer -> TransactionInfoViewData.SwapTransfer(uid, explorerUrl) - is TransactionInfo.TwapOrder -> TransactionInfoViewData.TwapOrder(status) + + is TransactionInfo.SwapOrder -> { + val name = swapOrderDisplayname(this) + TransactionInfoViewData.SwapOrder(uid, explorerUrl, name) + } + + is TransactionInfo.SwapTransfer -> { + val name = swapTransferDisplayName(this) + TransactionInfoViewData.SwapTransfer(uid, explorerUrl, name) + } + + is TransactionInfo.TwapOrder -> { + val name = twapOrderDisplayName() + TransactionInfoViewData.TwapOrder(status, name) + } + is TransactionInfo.Transfer -> { val addressInfoData = if (direction == TransactionDirection.OUTGOING) { @@ -289,9 +319,32 @@ internal fun TransactionInfo.toTransactionInfoViewData( direction = direction ) } + is TransactionInfo.Unknown -> TransactionInfoViewData.Unknown } +internal fun twapOrderDisplayName(): String { + return "Twap order" +} + +internal fun swapOrderDisplayname(info: TransactionInfo.SwapOrder): String { + val orderClass = info.fullAppData?.metadata?.orderClass?.orderClass ?: "market" + val name = if (orderClass == "limit") "Limit order" else "Swap order" + return name +} + +internal fun swapTransferDisplayName(info: TransactionInfo.SwapTransfer): String { + val orderClass = info.fullAppData?.metadata?.orderClass?.orderClass ?: "market" + val name = when (orderClass) { + "limit" -> "Limit order settlement" + "twap" -> "TWAP order settlement" + "liquidity" -> "Liquidity order settlement" + "market" -> "Swap order settlement" + else -> "Swap order settlement" + } + return name +} + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) internal fun SettingsInfo?.toSettingsInfoViewData( safes: List, diff --git a/app/src/main/java/io/gnosis/safe/ui/transactions/execution/TxReviewFragment.kt b/app/src/main/java/io/gnosis/safe/ui/transactions/execution/TxReviewFragment.kt index ee8725a22..585d72505 100644 --- a/app/src/main/java/io/gnosis/safe/ui/transactions/execution/TxReviewFragment.kt +++ b/app/src/main/java/io/gnosis/safe/ui/transactions/execution/TxReviewFragment.kt @@ -388,7 +388,7 @@ class TxReviewFragment : BaseViewBindingFragment() { actionInfoItems = listOf( ActionInfoItem.Value( itemLabel = R.string.tx_status_type_custom, - value = "Swap order")) + value = txInfo.displayDescription)) ) orderLink.visible(true) actionDivider.visible(true) @@ -414,7 +414,7 @@ class TxReviewFragment : BaseViewBindingFragment() { actionInfoItems = listOf( ActionInfoItem.Value( itemLabel = R.string.tx_status_type_custom, - value = "Swap transfer")) + value = txInfo.displayDescription)) ) orderLink.visible(true) actionDivider.visible(true) @@ -440,7 +440,7 @@ class TxReviewFragment : BaseViewBindingFragment() { actionInfoItems = listOf( ActionInfoItem.Value( itemLabel = R.string.tx_status_type_custom, - value = "Twap order")) + value = txInfo.displayDescription)) ) orderLink.visible(false) actionDivider.visible(false) diff --git a/data/src/main/java/io/gnosis/data/models/transaction/TransactionInfo.kt b/data/src/main/java/io/gnosis/data/models/transaction/TransactionInfo.kt index ecf364315..c056aab24 100644 --- a/data/src/main/java/io/gnosis/data/models/transaction/TransactionInfo.kt +++ b/data/src/main/java/io/gnosis/data/models/transaction/TransactionInfo.kt @@ -43,13 +43,15 @@ sealed class TransactionInfo( @JsonClass(generateAdapter = true) data class SwapOrder( @Json(name = "uid") val uid: String, - @Json(name = "explorerUrl") val explorerUrl: String + @Json(name = "explorerUrl") val explorerUrl: String, + @Json(name = "fullAppData") val fullAppData: AppData? = null ) : TransactionInfo(TransactionType.SwapOrder) @JsonClass(generateAdapter = true) data class SwapTransfer( @Json(name = "uid") val uid: String, - @Json(name = "explorerUrl") val explorerUrl: String + @Json(name = "explorerUrl") val explorerUrl: String, + @Json(name = "fullAppData") val fullAppData: AppData? = null ) : TransactionInfo(TransactionType.SwapTransfer) @JsonClass(generateAdapter = true) @@ -71,3 +73,21 @@ enum class TransactionDirection { @Json(name = "UNKNOWN") UNKNOWN } + +@JsonClass(generateAdapter = true) +data class AppData ( + @Json(name = "metadata") + val metadata: Metadata? = null +) + +@JsonClass(generateAdapter = true) +data class Metadata ( + @Json(name = "orderClass") + val orderClass: OrderClass? = null +) + +@JsonClass(generateAdapter = true) +data class OrderClass ( + @Json(name = "orderClass") + val orderClass: String? = "market" +)