diff --git a/app/src/main/java/com/babylon/wallet/android/data/repository/cache/database/ProvidedConverters.kt b/app/src/main/java/com/babylon/wallet/android/data/repository/cache/database/ProvidedConverters.kt index bbb42eacae..bffd706390 100644 --- a/app/src/main/java/com/babylon/wallet/android/data/repository/cache/database/ProvidedConverters.kt +++ b/app/src/main/java/com/babylon/wallet/android/data/repository/cache/database/ProvidedConverters.kt @@ -57,7 +57,7 @@ data class MetadataColumn( */ @Serializable @SerialName("unknown") - data object Unknown: ImplicitMetadataState + data object Unknown : ImplicitMetadataState /** * We have received an answer from a details request and we know that the [MetadataColumn.metadata] @@ -65,7 +65,7 @@ data class MetadataColumn( */ @Serializable @SerialName("complete") - data object Complete: ImplicitMetadataState + data object Complete : ImplicitMetadataState /** * We have received an answer from a details request and we know that the [MetadataColumn.metadata] @@ -76,7 +76,7 @@ data class MetadataColumn( data class Incomplete( @SerialName("next_cursor") val nextCursor: String - ): ImplicitMetadataState + ) : ImplicitMetadataState } companion object { diff --git a/app/src/main/java/com/babylon/wallet/android/data/repository/cache/database/ResourceEntity.kt b/app/src/main/java/com/babylon/wallet/android/data/repository/cache/database/ResourceEntity.kt index 02d52ab3e3..214ce47aae 100644 --- a/app/src/main/java/com/babylon/wallet/android/data/repository/cache/database/ResourceEntity.kt +++ b/app/src/main/java/com/babylon/wallet/android/data/repository/cache/database/ResourceEntity.kt @@ -158,6 +158,7 @@ data class ResourceEntity( ) } + @Suppress("LongParameterList") private fun from( address: ResourceAddress, explicitMetadata: EntityMetadataCollection?, diff --git a/app/src/main/java/com/babylon/wallet/android/data/repository/cache/database/StateDao.kt b/app/src/main/java/com/babylon/wallet/android/data/repository/cache/database/StateDao.kt index a92453e6c1..04f596388d 100644 --- a/app/src/main/java/com/babylon/wallet/android/data/repository/cache/database/StateDao.kt +++ b/app/src/main/java/com/babylon/wallet/android/data/repository/cache/database/StateDao.kt @@ -324,7 +324,6 @@ interface StateDao { @Insert(onConflict = OnConflictStrategy.REPLACE) fun insertDApps(dApps: List) - @Query( """ UPDATE ResourceEntity SET diff --git a/app/src/main/java/com/babylon/wallet/android/data/repository/state/AccountsStateCache.kt b/app/src/main/java/com/babylon/wallet/android/data/repository/state/AccountsStateCache.kt index 270664d2ed..ff628ce264 100644 --- a/app/src/main/java/com/babylon/wallet/android/data/repository/state/AccountsStateCache.kt +++ b/app/src/main/java/com/babylon/wallet/android/data/repository/state/AccountsStateCache.kt @@ -233,62 +233,47 @@ class AccountsStateCache @Inject constructor( result } - private fun Flow>.compileAccountAddressAssets(): Flow> = - transform { cached -> - val stateVersion = cached.values.mapNotNull { it.stateVersion }.maxOrNull() ?: run { - emit(emptyList()) - return@transform + private fun Flow>.compileAccountAddressAssets() = transform { cached -> + val stateVersion = cached.values.mapNotNull { it.stateVersion }.maxOrNull() ?: run { + emit(emptyList()) + return@transform + } + + val allValidatorAddresses = cached.map { it.value.validatorAddresses() }.flatten().toSet() + val cachedValidators = dao.getCachedValidators(allValidatorAddresses, stateVersion).toMutableMap() + val newValidators = runCatching { + val validatorItems = api.fetchValidators( + allValidatorAddresses - cachedValidators.keys, + stateVersion + ).validators + + val syncInfo = SyncInfo(InstantGenerator(), stateVersion) + validatorItems.map { + it.asValidatorEntity(syncInfo) + }.onEach { entity -> + cachedValidators[entity.address] = entity.asValidatorDetail() } + }.onFailure { cacheErrors.value = it }.getOrNull() ?: return@transform - val allValidatorAddresses = cached.map { it.value.validatorAddresses() }.flatten().toSet() - val cachedValidators = dao.getCachedValidators(allValidatorAddresses, stateVersion).toMutableMap() - val newValidators = runCatching { - val validatorItems = api.fetchValidators( - allValidatorAddresses - cachedValidators.keys, - stateVersion - ).validators - - val syncInfo = SyncInfo(InstantGenerator(), stateVersion) - validatorItems.map { - it.asValidatorEntity(syncInfo) - }.onEach { entity -> - cachedValidators[entity.address] = entity.asValidatorDetail() - } + if (newValidators.isNotEmpty()) { + logger.d("\uD83D\uDCBD Inserting validators") + dao.insertValidators(newValidators) + } + + val allPoolAddresses = cached.map { it.value.poolAddresses() }.flatten().toSet() + val cachedPools = dao.getCachedPools(allPoolAddresses, stateVersion).toMutableMap() + val unknownPools = allPoolAddresses - cachedPools.keys + if (unknownPools.isNotEmpty()) { + logger.d("\uD83D\uDCBD Inserting pools") + val newPools = runCatching { + api.fetchPools(unknownPools.toSet(), stateVersion) }.onFailure { error -> cacheErrors.value = error }.getOrNull() ?: return@transform - if (newValidators.isNotEmpty()) { - logger.d("\uD83D\uDCBD Inserting validators") - dao.insertValidators(newValidators) - } - - val allPoolAddresses = cached.map { it.value.poolAddresses() }.flatten().toSet() - val cachedPools = dao.getCachedPools(allPoolAddresses, stateVersion).toMutableMap() - val unknownPools = allPoolAddresses - cachedPools.keys - if (unknownPools.isNotEmpty()) { - logger.d("\uD83D\uDCBD Inserting pools") - - val newPools = runCatching { - api.fetchPools(unknownPools.toSet(), stateVersion) - }.onFailure { error -> - cacheErrors.value = error - }.getOrNull() ?: return@transform - - if (newPools.poolItems.isNotEmpty()) { - val join = newPools.poolItems.asPoolsResourcesJoin(SyncInfo(InstantGenerator(), stateVersion)) - dao.updatePools(pools = join) - } else { - emit( - cached.mapNotNull { - it.value.toAccountAddressWithAssets( - accountAddress = it.key, - pools = cachedPools, - validators = cachedValidators - ) - } - ) - } + if (newPools.poolItems.isNotEmpty()) { + val join = newPools.poolItems.asPoolsResourcesJoin(SyncInfo(InstantGenerator(), stateVersion)) + dao.updatePools(pools = join) } else { emit( cached.mapNotNull { @@ -300,7 +285,18 @@ class AccountsStateCache @Inject constructor( } ) } + } else { + emit( + cached.mapNotNull { + it.value.toAccountAddressWithAssets( + accountAddress = it.key, + pools = cachedPools, + validators = cachedValidators + ) + } + ) } + } private data class AccountCachedData( val stateVersion: Long?, diff --git a/app/src/main/java/com/babylon/wallet/android/data/repository/state/StateRepository.kt b/app/src/main/java/com/babylon/wallet/android/data/repository/state/StateRepository.kt index d7c5e2dd7a..2a3d5989b4 100644 --- a/app/src/main/java/com/babylon/wallet/android/data/repository/state/StateRepository.kt +++ b/app/src/main/java/com/babylon/wallet/android/data/repository/state/StateRepository.kt @@ -438,7 +438,7 @@ class StateRepositoryImpl @Inject constructor( } else { cachedValidators } - }.mapCatching { entities -> + }.mapCatching { entities -> entities.map { it.asValidatorDetail() } } } diff --git a/app/src/main/java/com/babylon/wallet/android/presentation/account/composable/MetadataView.kt b/app/src/main/java/com/babylon/wallet/android/presentation/account/composable/MetadataView.kt index 8c14039ae2..54481260b8 100644 --- a/app/src/main/java/com/babylon/wallet/android/presentation/account/composable/MetadataView.kt +++ b/app/src/main/java/com/babylon/wallet/android/presentation/account/composable/MetadataView.kt @@ -276,19 +276,21 @@ fun MetadataValueView( }, style = RadixTheme.typography.body1StandaloneLink, color = RadixTheme.colors.blue1, - inlineContent = mapOf("link_icon" to InlineTextContent( - Placeholder( - RadixTheme.typography.body1StandaloneLink.fontSize, - RadixTheme.typography.body1StandaloneLink.fontSize, - PlaceholderVerticalAlign.TextCenter - ) - ) { - Icon( - painter = painterResource(id = R.drawable.ic_external_link), - contentDescription = null, - tint = color - ) - }) + inlineContent = mapOf( + "link_icon" to InlineTextContent( + Placeholder( + RadixTheme.typography.body1StandaloneLink.fontSize, + RadixTheme.typography.body1StandaloneLink.fontSize, + PlaceholderVerticalAlign.TextCenter + ) + ) { + Icon( + painter = painterResource(id = R.drawable.ic_external_link), + contentDescription = null, + tint = color + ) + } + ) ) } } @@ -297,6 +299,6 @@ fun MetadataValueView( private const val ASSET_METADATA_SHORT_STRING_THRESHOLD = 40 private val Metadata.isRenderedInNewLine: Boolean get() = this is Metadata.Primitive && ( - valueType is MetadataType.Url || - (valueType is MetadataType.String && value.length > ASSET_METADATA_SHORT_STRING_THRESHOLD) - ) + valueType is MetadataType.Url || + (valueType is MetadataType.String && value.length > ASSET_METADATA_SHORT_STRING_THRESHOLD) + ) diff --git a/app/src/main/java/com/babylon/wallet/android/presentation/status/assets/AssetDialog.kt b/app/src/main/java/com/babylon/wallet/android/presentation/status/assets/AssetDialog.kt index 2e6b58a7fb..4363dcf1ec 100644 --- a/app/src/main/java/com/babylon/wallet/android/presentation/status/assets/AssetDialog.kt +++ b/app/src/main/java/com/babylon/wallet/android/presentation/status/assets/AssetDialog.kt @@ -162,7 +162,6 @@ fun DescriptionSection( HorizontalDivider(Modifier.fillMaxWidth(), color = RadixTheme.colors.gray4) Spacer(modifier = Modifier.height(RadixTheme.dimensions.paddingDefault)) } - } @Composable diff --git a/app/src/main/java/com/babylon/wallet/android/presentation/status/assets/fungible/FungibleDialogContent.kt b/app/src/main/java/com/babylon/wallet/android/presentation/status/assets/fungible/FungibleDialogContent.kt index 373f9ff346..3ce8484694 100644 --- a/app/src/main/java/com/babylon/wallet/android/presentation/status/assets/fungible/FungibleDialogContent.kt +++ b/app/src/main/java/com/babylon/wallet/android/presentation/status/assets/fungible/FungibleDialogContent.kt @@ -63,22 +63,9 @@ fun FungibleDialogContent( ), horizontalAlignment = Alignment.CenterHorizontally ) { - if (token?.resource != null) { - Thumbnail.Fungible( - modifier = Modifier.size(104.dp), - token = token.resource - ) - } else { - Box( - modifier = Modifier - .size(104.dp) - .radixPlaceholder( - visible = true, - shape = CircleShape - ) - ) - } + FungibleIconSection(token = token) Spacer(modifier = Modifier.height(RadixTheme.dimensions.paddingDefault)) + if (amount != null) { TokenBalance( modifier = Modifier @@ -169,3 +156,25 @@ fun FungibleDialogContent( } } } + +@Composable +private fun FungibleIconSection( + modifier: Modifier = Modifier, + token: Token? +) { + if (token?.resource != null) { + Thumbnail.Fungible( + modifier = modifier.size(104.dp), + token = token.resource + ) + } else { + Box( + modifier = modifier + .size(104.dp) + .radixPlaceholder( + visible = true, + shape = CircleShape + ) + ) + } +} diff --git a/app/src/main/java/com/babylon/wallet/android/presentation/status/assets/lsu/LSUDialogContent.kt b/app/src/main/java/com/babylon/wallet/android/presentation/status/assets/lsu/LSUDialogContent.kt index 1f8e140518..3192a9c6bb 100644 --- a/app/src/main/java/com/babylon/wallet/android/presentation/status/assets/lsu/LSUDialogContent.kt +++ b/app/src/main/java/com/babylon/wallet/android/presentation/status/assets/lsu/LSUDialogContent.kt @@ -73,22 +73,9 @@ fun LSUDialogContent( ), horizontalAlignment = Alignment.CenterHorizontally ) { - if (lsu != null) { - Thumbnail.LSU( - modifier = Modifier.size(104.dp), - liquidStakeUnit = lsu - ) - } else { - Box( - modifier = Modifier - .size(104.dp) - .radixPlaceholder( - visible = true, - shape = CircleShape - ) - ) - } + LSUIconSection(lsu = lsu) Spacer(modifier = Modifier.height(RadixTheme.dimensions.paddingDefault)) + TokenBalance( modifier = Modifier .fillMaxWidth(fraction = if (lsu == null) 0.5f else 1f) @@ -238,6 +225,28 @@ fun LSUDialogContent( } } +@Composable +private fun LSUIconSection( + modifier: Modifier = Modifier, + lsu: LiquidStakeUnit? +) { + if (lsu != null) { + Thumbnail.LSU( + modifier = modifier.size(104.dp), + liquidStakeUnit = lsu + ) + } else { + Box( + modifier = modifier + .size(104.dp) + .radixPlaceholder( + visible = true, + shape = CircleShape + ) + ) + } +} + @Composable private fun LSUResourceValue( modifier: Modifier = Modifier, diff --git a/app/src/main/java/com/babylon/wallet/android/presentation/ui/composables/actionableaddress/ActionableAddressView.kt b/app/src/main/java/com/babylon/wallet/android/presentation/ui/composables/actionableaddress/ActionableAddressView.kt index a37ed05565..6449fb8061 100644 --- a/app/src/main/java/com/babylon/wallet/android/presentation/ui/composables/actionableaddress/ActionableAddressView.kt +++ b/app/src/main/java/com/babylon/wallet/android/presentation/ui/composables/actionableaddress/ActionableAddressView.kt @@ -2,10 +2,8 @@ package com.babylon.wallet.android.presentation.ui.composables.actionableaddress -import android.content.ClipData import android.content.Context import android.net.Uri -import android.os.Build import android.widget.Toast import androidx.annotation.DrawableRes import androidx.annotation.VisibleForTesting @@ -45,7 +43,6 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.constraintlayout.compose.ConstraintLayout import androidx.constraintlayout.compose.Dimension -import androidx.core.content.getSystemService import androidx.core.net.toUri import com.babylon.wallet.android.R import com.babylon.wallet.android.designsystem.theme.RadixTheme diff --git a/app/src/test/java/com/babylon/wallet/android/domain/usecases/SearchFeePayersUseCaseTest.kt b/app/src/test/java/com/babylon/wallet/android/domain/usecases/SearchFeePayersUseCaseTest.kt index 36c95090ec..12c32db309 100644 --- a/app/src/test/java/com/babylon/wallet/android/domain/usecases/SearchFeePayersUseCaseTest.kt +++ b/app/src/test/java/com/babylon/wallet/android/domain/usecases/SearchFeePayersUseCaseTest.kt @@ -148,7 +148,8 @@ class SearchFeePayersUseCaseTest { override suspend fun getResources( addresses: Set, underAccountAddress: AccountAddress?, - withDetails: Boolean + withDetails: Boolean, + withAllMetadata: Boolean ): Result> { TODO("Not yet implemented") } diff --git a/app/src/test/java/com/babylon/wallet/android/fakes/StateRepositoryFake.kt b/app/src/test/java/com/babylon/wallet/android/fakes/StateRepositoryFake.kt index 589e7a67f9..353085772f 100644 --- a/app/src/test/java/com/babylon/wallet/android/fakes/StateRepositoryFake.kt +++ b/app/src/test/java/com/babylon/wallet/android/fakes/StateRepositoryFake.kt @@ -37,7 +37,12 @@ open class StateRepositoryFake : StateRepository { override suspend fun updateStakeClaims(account: Account, claims: List): Result> = Result.success(claims) - override suspend fun getResources(addresses: Set, underAccountAddress: AccountAddress?, withDetails: Boolean): Result> = + override suspend fun getResources( + addresses: Set, + underAccountAddress: AccountAddress?, + withDetails: Boolean, + withAllMetadata: Boolean + ): Result> = Result.failure(RuntimeException("Not implemented")) override suspend fun getPools(poolAddresses: Set): Result> = Result.failure(RuntimeException("Not implemented")) @@ -45,7 +50,10 @@ open class StateRepositoryFake : StateRepository { override suspend fun getValidators(validatorAddresses: Set): Result> = Result.failure(RuntimeException("Not implemented")) - override suspend fun getNFTDetails(resourceAddress: ResourceAddress, localIds: Set): Result> = + override suspend fun getNFTDetails( + resourceAddress: ResourceAddress, + localIds: Set + ): Result> = Result.failure(RuntimeException("Not implemented")) override suspend fun getOwnedXRD(accounts: List): Result> = diff --git a/app/src/test/java/com/babylon/wallet/android/presentation/dapp/login/DAppAuthorizedLoginViewModelTest.kt b/app/src/test/java/com/babylon/wallet/android/presentation/dapp/login/DAppAuthorizedLoginViewModelTest.kt index 9eebcb1ac1..aaea55f621 100644 --- a/app/src/test/java/com/babylon/wallet/android/presentation/dapp/login/DAppAuthorizedLoginViewModelTest.kt +++ b/app/src/test/java/com/babylon/wallet/android/presentation/dapp/login/DAppAuthorizedLoginViewModelTest.kt @@ -328,7 +328,8 @@ class DAppAuthorizedLoginViewModelTest : StateViewModelTest, underAccountAddress: AccountAddress?, - withDetails: Boolean + withDetails: Boolean, + withAllMetadata: Boolean ): Result> { TODO("Not yet implemented") }