From 71f7d105f92901cd6a92af3636bc610ebf45323b Mon Sep 17 00:00:00 2001 From: David Tverdota <76949181+dtverdota-bc@users.noreply.github.com> Date: Fri, 4 Nov 2022 14:05:34 +0000 Subject: [PATCH] feat(unified_activity): AND-6643 Unified Activity (#4024) --- .../src/main/java/com/blockchain/api/koin.kt | 14 ++++- .../api/selfcustody/ActivityRequest.kt | 39 ++++++++++++ .../blockchain/api/selfcustody/PubKeyInfo.kt | 15 +++++ .../api/selfcustody/SelfCustodyApi.kt | 5 +- .../api/selfcustody/SubscriptionRequests.kt | 10 --- .../activity/ActivityDetailGroupsDto.kt | 45 ++++++++++++++ .../selfcustody/activity/ActivityIconDto.kt | 43 +++++++++++++ .../selfcustody/activity/ActivityResponse.kt | 28 +++++++++ .../activity/ActivityViewItemDto.kt | 46 ++++++++++++++ .../selfcustody/activity/StackComponentDto.kt | 50 +++++++++++++++ .../api/services/DynamicSelfCustodyService.kt | 31 +++++++++- .../coincore/bch/BchCryptoWalletAccount.kt | 6 +- .../coincore/btc/BtcCryptoWalletAccount.kt | 6 +- .../blockchain/domain/wallet/PubKeyStyle.kt | 6 ++ unifiedcryptowallet/data/build.gradle | 1 + .../datasource/UnifiedActivityStore.kt | 58 ++++++++++++++++++ .../repository/UnifiedActivityRepository.kt | 61 +++++++++++++++++++ .../mapper/ActivityViewItemMapper.kt | 25 ++++++++ .../repository/mapper/ButtonMappers.kt | 37 +++++++++++ .../repository/mapper/DetailMappers.kt | 25 ++++++++ .../activity/repository/mapper/IconMappers.kt | 11 ++++ .../repository/mapper/StackComponentMapper.kt | 16 +++++ .../activity/repository/mapper/TagMappers.kt | 14 +++++ .../activity/repository/mapper/TextMappers.kt | 40 ++++++++++++ .../unifiedcryptowallet/data/koin/koin.kt | 17 ++++++ unifiedcryptowallet/domain/build.gradle | 1 + .../domain/activity/model/ActivityButton.kt | 17 ++++++ .../domain/activity/model/ActivityDataItem.kt | 15 +++++ .../domain/activity/model/ActivityIcon.kt | 17 ++++++ .../domain/activity/model/StackComponent.kt | 34 +++++++++++ .../activity/model/UnifiedActivityPage.kt | 30 +++++++++ .../service/UnifiedActivityService.kt | 17 ++++++ .../domain/wallet/NetworkWallet.kt | 11 ++-- 33 files changed, 766 insertions(+), 25 deletions(-) create mode 100644 blockchainApi/src/main/java/com/blockchain/api/selfcustody/ActivityRequest.kt create mode 100644 blockchainApi/src/main/java/com/blockchain/api/selfcustody/PubKeyInfo.kt create mode 100644 blockchainApi/src/main/java/com/blockchain/api/selfcustody/activity/ActivityDetailGroupsDto.kt create mode 100644 blockchainApi/src/main/java/com/blockchain/api/selfcustody/activity/ActivityIconDto.kt create mode 100644 blockchainApi/src/main/java/com/blockchain/api/selfcustody/activity/ActivityResponse.kt create mode 100644 blockchainApi/src/main/java/com/blockchain/api/selfcustody/activity/ActivityViewItemDto.kt create mode 100644 blockchainApi/src/main/java/com/blockchain/api/selfcustody/activity/StackComponentDto.kt create mode 100644 common/domain/src/main/java/com/blockchain/domain/wallet/PubKeyStyle.kt create mode 100644 unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/datasource/UnifiedActivityStore.kt create mode 100644 unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/UnifiedActivityRepository.kt create mode 100644 unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/mapper/ActivityViewItemMapper.kt create mode 100644 unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/mapper/ButtonMappers.kt create mode 100644 unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/mapper/DetailMappers.kt create mode 100644 unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/mapper/IconMappers.kt create mode 100644 unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/mapper/StackComponentMapper.kt create mode 100644 unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/mapper/TagMappers.kt create mode 100644 unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/mapper/TextMappers.kt create mode 100644 unifiedcryptowallet/domain/src/main/java/com/blockchain/unifiedcryptowallet/domain/activity/model/ActivityButton.kt create mode 100644 unifiedcryptowallet/domain/src/main/java/com/blockchain/unifiedcryptowallet/domain/activity/model/ActivityDataItem.kt create mode 100644 unifiedcryptowallet/domain/src/main/java/com/blockchain/unifiedcryptowallet/domain/activity/model/ActivityIcon.kt create mode 100644 unifiedcryptowallet/domain/src/main/java/com/blockchain/unifiedcryptowallet/domain/activity/model/StackComponent.kt create mode 100644 unifiedcryptowallet/domain/src/main/java/com/blockchain/unifiedcryptowallet/domain/activity/model/UnifiedActivityPage.kt create mode 100644 unifiedcryptowallet/domain/src/main/java/com/blockchain/unifiedcryptowallet/domain/activity/service/UnifiedActivityService.kt diff --git a/blockchainApi/src/main/java/com/blockchain/api/koin.kt b/blockchainApi/src/main/java/com/blockchain/api/koin.kt index 04010fbde5..2cca2ed97e 100644 --- a/blockchainApi/src/main/java/com/blockchain/api/koin.kt +++ b/blockchainApi/src/main/java/com/blockchain/api/koin.kt @@ -40,6 +40,10 @@ import com.blockchain.api.paymentmethods.PaymentMethodsApi import com.blockchain.api.payments.PaymentsApi import com.blockchain.api.referral.ReferralApi import com.blockchain.api.selfcustody.SelfCustodyApi +import com.blockchain.api.selfcustody.activity.activityDetailSerializer +import com.blockchain.api.selfcustody.activity.activityIconSerializer +import com.blockchain.api.selfcustody.activity.activityViewItemSerializer +import com.blockchain.api.selfcustody.activity.stackComponentSerializer import com.blockchain.api.services.AddressMappingService import com.blockchain.api.services.AddressVerificationApiService import com.blockchain.api.services.AnalyticsService @@ -125,11 +129,15 @@ val blockchainApiModule = module { } single(walletPubkeyApi) { + val json = Json { + ignoreUnknownKeys = true + coerceInputValues = true + } Retrofit.Builder() .baseUrl(getBaseUrl("wallet-pubkey-api")) .client(get()) .addCallAdapterFactory(get()) - .addConverterFactory(get(kotlinJsonConverterFactory)) + .addConverterFactory(json.asConverterFactory("application/json".toMediaType())) .build() } @@ -202,6 +210,10 @@ val blockchainApiModule = module { subclass(AssetInformationDto::class) default { UnsupportedAsset.serializer() } } + stackComponentSerializer() + activityViewItemSerializer() + activityIconSerializer() + activityDetailSerializer() } } } diff --git a/blockchainApi/src/main/java/com/blockchain/api/selfcustody/ActivityRequest.kt b/blockchainApi/src/main/java/com/blockchain/api/selfcustody/ActivityRequest.kt new file mode 100644 index 0000000000..d5a11b111c --- /dev/null +++ b/blockchainApi/src/main/java/com/blockchain/api/selfcustody/ActivityRequest.kt @@ -0,0 +1,39 @@ +package com.blockchain.api.selfcustody + +import com.blockchain.domain.wallet.PubKeyStyle +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class ActivityRequest( + @SerialName("auth") + val auth: AuthInfo, + @SerialName("params") + val params: ActivityRequestParams, + @SerialName("nextPage") + val nextPage: String? +) + +@Serializable +data class ActivityRequestParams( + @SerialName("timezoneIana") + val timezone: String, + @SerialName("fiatCurrency") + val fiatCurrency: String, + @SerialName("acceptLanguage") + val acceptLanguage: String, + @SerialName("network") + val networkTicker: String, + @SerialName("pubKeyInfo") + val pubKeyInfo: ActivityPubKeyInfo +) + +@Serializable +data class ActivityPubKeyInfo( + @SerialName("pubKey") + val pubKey: String, + @SerialName("style") + val style: PubKeyStyle, + @SerialName("descriptor") + val descriptor: String +) diff --git a/blockchainApi/src/main/java/com/blockchain/api/selfcustody/PubKeyInfo.kt b/blockchainApi/src/main/java/com/blockchain/api/selfcustody/PubKeyInfo.kt new file mode 100644 index 0000000000..48914bead1 --- /dev/null +++ b/blockchainApi/src/main/java/com/blockchain/api/selfcustody/PubKeyInfo.kt @@ -0,0 +1,15 @@ +package com.blockchain.api.selfcustody + +import com.blockchain.domain.wallet.PubKeyStyle +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class PubKeyInfo( + @SerialName("pubKey") + val pubKey: String, + @SerialName("style") + val style: PubKeyStyle, + @SerialName("descriptor") + val descriptor: Int = 0 +) diff --git a/blockchainApi/src/main/java/com/blockchain/api/selfcustody/SelfCustodyApi.kt b/blockchainApi/src/main/java/com/blockchain/api/selfcustody/SelfCustodyApi.kt index 3df89895b5..6ab6f2a899 100644 --- a/blockchainApi/src/main/java/com/blockchain/api/selfcustody/SelfCustodyApi.kt +++ b/blockchainApi/src/main/java/com/blockchain/api/selfcustody/SelfCustodyApi.kt @@ -1,5 +1,6 @@ package com.blockchain.api.selfcustody +import com.blockchain.api.selfcustody.activity.ActivityResponse import com.blockchain.outcome.Outcome import retrofit2.http.Body import retrofit2.http.POST @@ -29,9 +30,11 @@ interface SelfCustodyApi { @POST("tx-history") suspend fun getTransactionHistory( @Body request: TransactionHistoryRequest - ): Outcome + @POST("activity") + suspend fun getActivity(@Body request: ActivityRequest): Outcome + @POST("buildTx") suspend fun buildTransaction(@Body request: BuildTxRequest): Outcome diff --git a/blockchainApi/src/main/java/com/blockchain/api/selfcustody/SubscriptionRequests.kt b/blockchainApi/src/main/java/com/blockchain/api/selfcustody/SubscriptionRequests.kt index 67d4a19588..32dba43a46 100644 --- a/blockchainApi/src/main/java/com/blockchain/api/selfcustody/SubscriptionRequests.kt +++ b/blockchainApi/src/main/java/com/blockchain/api/selfcustody/SubscriptionRequests.kt @@ -50,13 +50,3 @@ data class AccountInfo( @SerialName("name") val name: String ) - -@Serializable -data class PubKeyInfo( - @SerialName("pubKey") - val pubKey: String, - @SerialName("style") - val style: String, - @SerialName("descriptor") - val descriptor: Int = 0 -) diff --git a/blockchainApi/src/main/java/com/blockchain/api/selfcustody/activity/ActivityDetailGroupsDto.kt b/blockchainApi/src/main/java/com/blockchain/api/selfcustody/activity/ActivityDetailGroupsDto.kt new file mode 100644 index 0000000000..1a034d2454 --- /dev/null +++ b/blockchainApi/src/main/java/com/blockchain/api/selfcustody/activity/ActivityDetailGroupsDto.kt @@ -0,0 +1,45 @@ +package com.blockchain.api.selfcustody.activity + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.modules.SerializersModuleBuilder +import kotlinx.serialization.modules.polymorphic +import kotlinx.serialization.modules.subclass + +@Serializable +sealed interface ActivityDetailGroupsDto { + @Serializable + @SerialName("GROUPED_ITEMS") + data class GroupedItems( + @SerialName("title") + val title: String, + @SerialName("subtitle") + val subtitle: String, + @SerialName("icon") + val icon: ActivityIconDto, + @SerialName("itemGroups") + val items: List, + @SerialName("floatingActions") + val floatingActions: List + ) : ActivityDetailGroupsDto { + + @Serializable + data class DetailGroup( + @SerialName("title") + val title: String?, + @SerialName("itemGroup") + val itemGroup: List + ) + } + + @Serializable + @SerialName("UNKNOWN") + object Unknown : ActivityDetailGroupsDto +} + +fun SerializersModuleBuilder.activityDetailSerializer() { + polymorphic(ActivityDetailGroupsDto::class) { + subclass(ActivityDetailGroupsDto.GroupedItems::class) + default { ActivityDetailGroupsDto.Unknown.serializer() } + } +} diff --git a/blockchainApi/src/main/java/com/blockchain/api/selfcustody/activity/ActivityIconDto.kt b/blockchainApi/src/main/java/com/blockchain/api/selfcustody/activity/ActivityIconDto.kt new file mode 100644 index 0000000000..a1c612f865 --- /dev/null +++ b/blockchainApi/src/main/java/com/blockchain/api/selfcustody/activity/ActivityIconDto.kt @@ -0,0 +1,43 @@ +package com.blockchain.api.selfcustody.activity + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.modules.SerializersModuleBuilder +import kotlinx.serialization.modules.polymorphic +import kotlinx.serialization.modules.subclass + +@Serializable +sealed interface ActivityIconDto { + @Serializable + @SerialName("SMALL_TAG") + data class SmallTag( + val main: String, + val tag: String + ) : ActivityIconDto + + @Serializable + @SerialName("OVERLAPPING_PAIR") + data class OverlappingPair( + val front: String, + val back: String + ) : ActivityIconDto + + @Serializable + @SerialName("SINGLE_ICON") + data class SingleIcon( + val url: String + ) : ActivityIconDto + + @Serializable + @SerialName("UNKNOWN") + object Unknown : ActivityIconDto +} + +fun SerializersModuleBuilder.activityIconSerializer() { + polymorphic(ActivityIconDto::class) { + subclass(ActivityIconDto.SmallTag::class) + subclass(ActivityIconDto.OverlappingPair::class) + subclass(ActivityIconDto.SingleIcon::class) + default { ActivityIconDto.Unknown.serializer() } + } +} diff --git a/blockchainApi/src/main/java/com/blockchain/api/selfcustody/activity/ActivityResponse.kt b/blockchainApi/src/main/java/com/blockchain/api/selfcustody/activity/ActivityResponse.kt new file mode 100644 index 0000000000..53ff6730ef --- /dev/null +++ b/blockchainApi/src/main/java/com/blockchain/api/selfcustody/activity/ActivityResponse.kt @@ -0,0 +1,28 @@ +package com.blockchain.api.selfcustody.activity + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class ActivityResponse( + @SerialName("activity") + val activity: List, + @SerialName("nextPage") + val nextPage: String? +) + +@Serializable +data class ActivityItemDto( + @SerialName("id") + val id: String, + @SerialName("externalUrl") + val externalUrl: String, + @SerialName("item") + val summary: ActivityViewItemDto, + @SerialName("detail") + val detail: ActivityDetailGroupsDto, + @SerialName("state") + val status: String, + @SerialName("timestamp") + val timestamp: Long +) diff --git a/blockchainApi/src/main/java/com/blockchain/api/selfcustody/activity/ActivityViewItemDto.kt b/blockchainApi/src/main/java/com/blockchain/api/selfcustody/activity/ActivityViewItemDto.kt new file mode 100644 index 0000000000..82b8b0bfd8 --- /dev/null +++ b/blockchainApi/src/main/java/com/blockchain/api/selfcustody/activity/ActivityViewItemDto.kt @@ -0,0 +1,46 @@ +package com.blockchain.api.selfcustody.activity + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.modules.SerializersModuleBuilder +import kotlinx.serialization.modules.polymorphic +import kotlinx.serialization.modules.subclass + +@Serializable +sealed interface ActivityViewItemDto { + @Serializable + @SerialName("STACK_VIEW") + data class Stack( + @SerialName("leadingImage") + val leadingImage: ActivityIconDto?, + @SerialName("leading") + val leading: List, + @SerialName("trailing") + val trailing: List, + ) : ActivityViewItemDto + + @Serializable + @SerialName("BUTTON") + data class Button( + @SerialName("text") + val value: String, + @SerialName("buttonStyle") + val style: String, + @SerialName("actionType") + val actionType: String, + @SerialName("actionData") + val actionData: String + ) : ActivityViewItemDto + + @Serializable + @SerialName("UNKNOWN") + object Unknown : ActivityViewItemDto +} + +fun SerializersModuleBuilder.activityViewItemSerializer() { + polymorphic(ActivityViewItemDto::class) { + subclass(ActivityViewItemDto.Stack::class) + subclass(ActivityViewItemDto.Button::class) + default { ActivityViewItemDto.Unknown.serializer() } + } +} diff --git a/blockchainApi/src/main/java/com/blockchain/api/selfcustody/activity/StackComponentDto.kt b/blockchainApi/src/main/java/com/blockchain/api/selfcustody/activity/StackComponentDto.kt new file mode 100644 index 0000000000..7052b90f8e --- /dev/null +++ b/blockchainApi/src/main/java/com/blockchain/api/selfcustody/activity/StackComponentDto.kt @@ -0,0 +1,50 @@ +package com.blockchain.api.selfcustody.activity + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.modules.SerializersModuleBuilder +import kotlinx.serialization.modules.polymorphic +import kotlinx.serialization.modules.subclass + +@Serializable +data class ActivityTextStyleDto( + @SerialName("style") + val style: String, + @SerialName("color") + val color: String, + @SerialName("strikethrough") + val strikethrough: Boolean +) + +@Serializable +sealed interface StackComponentDto { + @Serializable + @SerialName("TEXT") + data class Text( + @SerialName("value") + val value: String, + @SerialName("style") + val style: ActivityTextStyleDto + ) : StackComponentDto + + @Serializable + @SerialName("BADGE") + data class Tag( + @SerialName("value") + val value: String, + @SerialName("style") + val style: String + ) : StackComponentDto + + @Serializable + @SerialName("UNKNOWN") + object Unknown : StackComponentDto +} + +fun SerializersModuleBuilder.stackComponentSerializer() { + polymorphic(StackComponentDto::class) { + subclass(StackComponentDto.Text::class) + subclass(StackComponentDto.Tag::class) + default { StackComponentDto.Unknown.serializer() } + } +} diff --git a/blockchainApi/src/main/java/com/blockchain/api/services/DynamicSelfCustodyService.kt b/blockchainApi/src/main/java/com/blockchain/api/services/DynamicSelfCustodyService.kt index 0cadbe15e4..d894d44339 100644 --- a/blockchainApi/src/main/java/com/blockchain/api/services/DynamicSelfCustodyService.kt +++ b/blockchainApi/src/main/java/com/blockchain/api/services/DynamicSelfCustodyService.kt @@ -1,6 +1,9 @@ package com.blockchain.api.services import com.blockchain.api.selfcustody.AccountInfo +import com.blockchain.api.selfcustody.ActivityPubKeyInfo +import com.blockchain.api.selfcustody.ActivityRequest +import com.blockchain.api.selfcustody.ActivityRequestParams import com.blockchain.api.selfcustody.AddSubscriptionRequest import com.blockchain.api.selfcustody.AddressesRequest import com.blockchain.api.selfcustody.AuthInfo @@ -20,6 +23,7 @@ import com.blockchain.api.selfcustody.SelfCustodyApi import com.blockchain.api.selfcustody.Signature import com.blockchain.api.selfcustody.SubscriptionInfo import com.blockchain.api.selfcustody.TransactionHistoryRequest +import com.blockchain.domain.wallet.PubKeyStyle import com.blockchain.outcome.Outcome import com.blockchain.outcome.flatMap import kotlinx.serialization.json.JsonObject @@ -56,7 +60,7 @@ class DynamicSelfCustodyService( index = 0, name = accountName ), - pubKeys = addresses.map { address -> PubKeyInfo(address, "SINGLE") } + pubKeys = addresses.map { address -> PubKeyInfo(address, PubKeyStyle.SINGLE) } ) ) ) @@ -131,6 +135,31 @@ class DynamicSelfCustodyService( ) ) + suspend fun getActivity( + fiatCurrency: String, + currency: String, + pubKey: String, + acceptLanguage: String, + timeZone: String, + nextPage: String? + ) = selfCustodyApi.getActivity( + request = ActivityRequest( + auth = authInfo, + params = ActivityRequestParams( + timezone = timeZone, + fiatCurrency = fiatCurrency, + acceptLanguage = acceptLanguage, // "en-GB;q=1.0, en" + networkTicker = currency, + pubKeyInfo = ActivityPubKeyInfo( + pubKey = pubKey, + style = PubKeyStyle.SINGLE, + descriptor = "legacy" // TODO(dtverdota): what values are acceptable here? + ) + ), + nextPage = nextPage + ) + ) + suspend fun buildTransaction( currency: String, accountIndex: Int = 0, diff --git a/coincore/src/main/java/com/blockchain/coincore/bch/BchCryptoWalletAccount.kt b/coincore/src/main/java/com/blockchain/coincore/bch/BchCryptoWalletAccount.kt index b0d513819c..37b26f949b 100644 --- a/coincore/src/main/java/com/blockchain/coincore/bch/BchCryptoWalletAccount.kt +++ b/coincore/src/main/java/com/blockchain/coincore/bch/BchCryptoWalletAccount.kt @@ -17,9 +17,9 @@ import com.blockchain.core.chains.bitcoincash.BchDataManager import com.blockchain.core.fees.FeeDataManager import com.blockchain.core.payload.PayloadDataManager import com.blockchain.core.price.ExchangeRatesDataManager +import com.blockchain.domain.wallet.PubKeyStyle import com.blockchain.nabu.datamanagers.CustodialWalletManager import com.blockchain.preferences.WalletStatusPrefs -import com.blockchain.unifiedcryptowallet.domain.wallet.NetworkWallet import com.blockchain.utils.mapList import info.blockchain.balance.CryptoCurrency import info.blockchain.balance.Money @@ -83,8 +83,8 @@ import org.bitcoinj.core.LegacyAddress override val index: Int get() = addressIndex - override val style: String - get() = NetworkWallet.EXTENDED_PUB_KEY_STYLE + override val style: PubKeyStyle + get() = PubKeyStyle.EXTENDED override val activity: Single get() = bchManager.getAddressTransactions( diff --git a/coincore/src/main/java/com/blockchain/coincore/btc/BtcCryptoWalletAccount.kt b/coincore/src/main/java/com/blockchain/coincore/btc/BtcCryptoWalletAccount.kt index a691ef4502..2e0b28b814 100644 --- a/coincore/src/main/java/com/blockchain/coincore/btc/BtcCryptoWalletAccount.kt +++ b/coincore/src/main/java/com/blockchain/coincore/btc/BtcCryptoWalletAccount.kt @@ -16,10 +16,10 @@ import com.blockchain.core.chains.bitcoin.SendDataManager import com.blockchain.core.fees.FeeDataManager import com.blockchain.core.payload.PayloadDataManager import com.blockchain.core.price.ExchangeRatesDataManager +import com.blockchain.domain.wallet.PubKeyStyle import com.blockchain.nabu.datamanagers.CustodialWalletManager import com.blockchain.preferences.WalletStatusPrefs import com.blockchain.serialization.JsonSerializableAccount -import com.blockchain.unifiedcryptowallet.domain.wallet.NetworkWallet import com.blockchain.unifiedcryptowallet.domain.wallet.NetworkWallet.Companion.MULTIPLE_ADDRESSES_DESCRIPTOR import com.blockchain.utils.mapList import com.blockchain.utils.then @@ -91,8 +91,8 @@ import io.reactivex.rxjava3.core.Single override val descriptor: Int get() = MULTIPLE_ADDRESSES_DESCRIPTOR - override val style: String - get() = NetworkWallet.EXTENDED_PUB_KEY_STYLE + override val style: PubKeyStyle + get() = PubKeyStyle.EXTENDED override val activity: Single get() = payloadDataManager.getAccountTransactions( diff --git a/common/domain/src/main/java/com/blockchain/domain/wallet/PubKeyStyle.kt b/common/domain/src/main/java/com/blockchain/domain/wallet/PubKeyStyle.kt new file mode 100644 index 0000000000..cd2befafe2 --- /dev/null +++ b/common/domain/src/main/java/com/blockchain/domain/wallet/PubKeyStyle.kt @@ -0,0 +1,6 @@ +package com.blockchain.domain.wallet + +enum class PubKeyStyle { + SINGLE, + EXTENDED +} diff --git a/unifiedcryptowallet/data/build.gradle b/unifiedcryptowallet/data/build.gradle index a44f37a1b2..6f02dfce42 100644 --- a/unifiedcryptowallet/data/build.gradle +++ b/unifiedcryptowallet/data/build.gradle @@ -2,6 +2,7 @@ apply from: rootProject.file('gradle/local/common-feature-domain.gradle') apply plugin: 'kotlinx-serialization' dependencies { + implementation project(':common:domain') implementation project(":common:interface") implementation project(":blockchainApi") implementation project(":wallet") diff --git a/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/datasource/UnifiedActivityStore.kt b/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/datasource/UnifiedActivityStore.kt new file mode 100644 index 0000000000..01f14a860f --- /dev/null +++ b/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/datasource/UnifiedActivityStore.kt @@ -0,0 +1,58 @@ +package com.blockchain.unifiedcryptowallet.data.activity.datasource + +import com.blockchain.api.selfcustody.activity.ActivityResponse +import com.blockchain.api.services.DynamicSelfCustodyService +import com.blockchain.preferences.CurrencyPrefs +import com.blockchain.store.Fetcher +import com.blockchain.store.KeyedStore +import com.blockchain.store.impl.Freshness +import com.blockchain.store.impl.FreshnessMediator +import com.blockchain.store_caches_persistedjsonsqldelight.PersistedJsonSqlDelightStoreBuilder +import com.blockchain.storedatasource.KeyedFlushableDataSource +import kotlinx.serialization.Serializable + +class UnifiedActivityStore( + private val selfCustodyService: DynamicSelfCustodyService, + private val currencyPrefs: CurrencyPrefs +) : KeyedStore by PersistedJsonSqlDelightStoreBuilder() + .buildKeyed( + storeId = STORE_ID, + fetcher = Fetcher.Keyed.ofOutcome( + mapper = { key -> + selfCustodyService.getActivity( + fiatCurrency = currencyPrefs.selectedFiatCurrency.networkTicker, + currency = key.currency, + pubKey = key.pubKey, + acceptLanguage = key.acceptLanguage, + timeZone = key.timeZone, + nextPage = key.nextPage + ) + } + ), + keySerializer = Key.serializer(), + dataSerializer = ActivityResponse.serializer(), + mediator = FreshnessMediator(Freshness.DURATION_1_HOUR) + ), + KeyedFlushableDataSource { + + @Serializable + data class Key( + val currency: String, + val pubKey: String, + val acceptLanguage: String, + val timeZone: String, + val nextPage: String? + ) + + override fun invalidate(param: Key) { + markAsStale(param) + } + + override fun invalidate() { + markStoreAsStale() + } + + companion object { + private const val STORE_ID = "UnifiedActivityStore" + } +} diff --git a/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/UnifiedActivityRepository.kt b/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/UnifiedActivityRepository.kt new file mode 100644 index 0000000000..1c1c4daba2 --- /dev/null +++ b/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/UnifiedActivityRepository.kt @@ -0,0 +1,61 @@ +package com.blockchain.unifiedcryptowallet.data.activity.repository + +import com.blockchain.data.DataResource +import com.blockchain.data.FreshnessStrategy +import com.blockchain.data.FreshnessStrategy.Companion.withKey +import com.blockchain.store.mapData +import com.blockchain.unifiedcryptowallet.data.activity.datasource.UnifiedActivityStore +import com.blockchain.unifiedcryptowallet.data.activity.repository.mapper.toActivityDetailGroups +import com.blockchain.unifiedcryptowallet.data.activity.repository.mapper.toActivityViewItem +import com.blockchain.unifiedcryptowallet.domain.activity.model.UnifiedActivityItem +import com.blockchain.unifiedcryptowallet.domain.activity.model.UnifiedActivityPage +import com.blockchain.unifiedcryptowallet.domain.activity.service.UnifiedActivityService +import kotlinx.coroutines.flow.Flow + +class UnifiedActivityRepository( + private val unifiedActivityStore: UnifiedActivityStore +) : UnifiedActivityService { + + override suspend fun activityForAccount( + pubKey: String, + currency: String, + acceptLanguage: String, + timeZone: String, + nextPage: String?, + freshnessStrategy: FreshnessStrategy + ): Flow> { + + return unifiedActivityStore.stream( + freshnessStrategy.withKey( + UnifiedActivityStore.Key( + currency, + pubKey, + acceptLanguage, + timeZone, + nextPage + ) + ) + ).mapData { activityResponse -> + UnifiedActivityPage( + activity = activityResponse.activity.mapNotNull { activityItem -> + val summary = activityItem.summary.toActivityViewItem() + val detail = activityItem.detail.toActivityDetailGroups() + + if (summary == null || detail == null) { + null + } else { + UnifiedActivityItem( + txId = activityItem.id, + blockExplorerUrl = activityItem.externalUrl, + summary = summary, + detail = detail, + status = activityItem.status, + timestamp = activityItem.timestamp + ) + } + }, + nextPage = activityResponse.nextPage + ) + } + } +} diff --git a/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/mapper/ActivityViewItemMapper.kt b/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/mapper/ActivityViewItemMapper.kt new file mode 100644 index 0000000000..581d9fbe52 --- /dev/null +++ b/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/mapper/ActivityViewItemMapper.kt @@ -0,0 +1,25 @@ +package com.blockchain.unifiedcryptowallet.data.activity.repository.mapper + +import com.blockchain.api.selfcustody.activity.ActivityViewItemDto +import com.blockchain.unifiedcryptowallet.domain.activity.model.ActivityDataItem + +internal fun ActivityViewItemDto.toActivityViewItem(): ActivityDataItem? = when (this) { + is ActivityViewItemDto.Stack -> { + ActivityDataItem.Stack( + leadingImage = leadingImage?.toActivityIcon(), + leading = leading.mapNotNull { it.toStackComponent() }, + trailing = trailing.mapNotNull { it.toStackComponent() } + ) + } + is ActivityViewItemDto.Button -> { + // ignore if the action is not defined + toButtonAction()?.let { action -> + ActivityDataItem.Button( + value = value, + style = style.toButtonStyle(), + action = action, + ) + } + } + ActivityViewItemDto.Unknown -> null +} diff --git a/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/mapper/ButtonMappers.kt b/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/mapper/ButtonMappers.kt new file mode 100644 index 0000000000..1c89693498 --- /dev/null +++ b/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/mapper/ButtonMappers.kt @@ -0,0 +1,37 @@ +package com.blockchain.unifiedcryptowallet.data.activity.repository.mapper + +import com.blockchain.api.selfcustody.activity.ActivityViewItemDto +import com.blockchain.unifiedcryptowallet.domain.activity.model.ActivityButtonAction +import com.blockchain.unifiedcryptowallet.domain.activity.model.ActivityButtonAction.ActivityButtonActionType +import com.blockchain.unifiedcryptowallet.domain.activity.model.ActivityButtonStyle + +internal fun String.toButtonStyle(): ActivityButtonStyle { + val primary = "Primary" + val secondary = "Secondary" + val tertiary = "Tertiary" + + return when (this) { + primary -> ActivityButtonStyle.Primary + secondary -> ActivityButtonStyle.Secondary + tertiary -> ActivityButtonStyle.Tertiary + else -> ActivityButtonStyle.Primary // todo what's the default here + } +} + +internal fun ActivityViewItemDto.Button.toButtonAction(): ActivityButtonAction? { + val copy = "Copy" + val openUrl = "OpenUrl" + + val type = when (actionType) { + copy -> ActivityButtonActionType.Copy + openUrl -> ActivityButtonActionType.OpenUrl + else -> null + } + + return type?.let { + ActivityButtonAction( + type = type, + data = actionData + ) + } +} diff --git a/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/mapper/DetailMappers.kt b/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/mapper/DetailMappers.kt new file mode 100644 index 0000000000..d3262f564b --- /dev/null +++ b/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/mapper/DetailMappers.kt @@ -0,0 +1,25 @@ +package com.blockchain.unifiedcryptowallet.data.activity.repository.mapper + +import com.blockchain.api.selfcustody.activity.ActivityDetailGroupsDto +import com.blockchain.api.selfcustody.activity.ActivityDetailGroupsDto.GroupedItems.DetailGroup +import com.blockchain.unifiedcryptowallet.domain.activity.model.ActivityDetailGroup +import com.blockchain.unifiedcryptowallet.domain.activity.model.ActivityDetailGroups + +internal fun ActivityDetailGroupsDto.toActivityDetailGroups(): ActivityDetailGroups? = when (this) { + is ActivityDetailGroupsDto.GroupedItems -> { + ActivityDetailGroups.GroupedItems( + title = title, + subtitle = subtitle, + icon = icon.toActivityIcon(), + detailItems = items.map { it.toDetailGroup() }, + actionItems = floatingActions.mapNotNull { it.toActivityViewItem() } + + ) + } + ActivityDetailGroupsDto.Unknown -> null +} + +internal fun DetailGroup.toDetailGroup() = ActivityDetailGroup( + title = title, + itemGroup = itemGroup.mapNotNull { it.toActivityViewItem() } +) diff --git a/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/mapper/IconMappers.kt b/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/mapper/IconMappers.kt new file mode 100644 index 0000000000..fa289ddb15 --- /dev/null +++ b/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/mapper/IconMappers.kt @@ -0,0 +1,11 @@ +package com.blockchain.unifiedcryptowallet.data.activity.repository.mapper + +import com.blockchain.api.selfcustody.activity.ActivityIconDto +import com.blockchain.unifiedcryptowallet.domain.activity.model.ActivityIcon + +internal fun ActivityIconDto.toActivityIcon(): ActivityIcon? = when (this) { + is ActivityIconDto.OverlappingPair -> ActivityIcon.OverlappingPair(front = front, back = back) + is ActivityIconDto.SmallTag -> ActivityIcon.SmallTag(main = main, tag = tag) + is ActivityIconDto.SingleIcon -> ActivityIcon.SingleIcon(url = url) + ActivityIconDto.Unknown -> null +} diff --git a/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/mapper/StackComponentMapper.kt b/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/mapper/StackComponentMapper.kt new file mode 100644 index 0000000000..85ea2a44d8 --- /dev/null +++ b/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/mapper/StackComponentMapper.kt @@ -0,0 +1,16 @@ +package com.blockchain.unifiedcryptowallet.data.activity.repository.mapper + +import com.blockchain.api.selfcustody.activity.StackComponentDto +import com.blockchain.unifiedcryptowallet.domain.activity.model.StackComponent + +internal fun StackComponentDto.toStackComponent(): StackComponent? = when (this) { + is StackComponentDto.Text -> StackComponent.Text( + value = value, + style = style.toTextStyle() + ) + is StackComponentDto.Tag -> StackComponent.Tag( + value = value, + style = style.toTagStyle(), + ) + StackComponentDto.Unknown -> null +} diff --git a/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/mapper/TagMappers.kt b/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/mapper/TagMappers.kt new file mode 100644 index 0000000000..c4725ab543 --- /dev/null +++ b/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/mapper/TagMappers.kt @@ -0,0 +1,14 @@ +package com.blockchain.unifiedcryptowallet.data.activity.repository.mapper + +import com.blockchain.unifiedcryptowallet.domain.activity.model.ActivityTagStyle + +internal fun String.toTagStyle(): ActivityTagStyle { + val success = "Success" + val warning = "Warning" + + return when (this) { + success -> ActivityTagStyle.Success + warning -> ActivityTagStyle.Warning + else -> ActivityTagStyle.Success // todo what's the default here + } +} diff --git a/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/mapper/TextMappers.kt b/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/mapper/TextMappers.kt new file mode 100644 index 0000000000..16fce0f955 --- /dev/null +++ b/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/activity/repository/mapper/TextMappers.kt @@ -0,0 +1,40 @@ +package com.blockchain.unifiedcryptowallet.data.activity.repository.mapper + +import com.blockchain.api.selfcustody.activity.ActivityTextStyleDto +import com.blockchain.unifiedcryptowallet.domain.activity.model.ActivityTextColor +import com.blockchain.unifiedcryptowallet.domain.activity.model.ActivityTextStyle +import com.blockchain.unifiedcryptowallet.domain.activity.model.ActivityTextTypography + +internal fun String.toTextTypography(): ActivityTextTypography { + val paragraph2 = "Paragraph2" + val caption1 = "Caption1" + + return when (this) { + paragraph2 -> ActivityTextTypography.Paragraph2 + caption1 -> ActivityTextTypography.Caption1 + else -> ActivityTextTypography.Paragraph2 // todo what's the default here + } +} + +internal fun String.toTextColor(): ActivityTextColor { + val title = "Title" + val muted = "Muted" + val success = "Success" + val error = "Error" + val warning = "Warning" + + return when (this) { + title -> ActivityTextColor.Title + muted -> ActivityTextColor.Muted + success -> ActivityTextColor.Success + error -> ActivityTextColor.Error + warning -> ActivityTextColor.Warning + else -> ActivityTextColor.Title // todo what's the default here + } +} + +internal fun ActivityTextStyleDto.toTextStyle() = ActivityTextStyle( + typography = style.toTextTypography(), + color = color.toTextColor(), + strikethrough = strikethrough +) diff --git a/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/koin/koin.kt b/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/koin/koin.kt index 23dcd634a0..1e7ed71883 100644 --- a/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/koin/koin.kt +++ b/unifiedcryptowallet/data/src/main/java/com/blockchain/unifiedcryptowallet/data/koin/koin.kt @@ -1,10 +1,14 @@ package com.blockchain.unifiedcryptowallet.data.koin import com.blockchain.koin.payloadScopeQualifier +import com.blockchain.store.KeyedStore import com.blockchain.store.Store +import com.blockchain.unifiedcryptowallet.data.activity.datasource.UnifiedActivityStore +import com.blockchain.unifiedcryptowallet.data.activity.repository.UnifiedActivityRepository import com.blockchain.unifiedcryptowallet.data.balances.UnifiedBalancesRepository import com.blockchain.unifiedcryptowallet.data.balances.UnifiedBalancesStore import com.blockchain.unifiedcryptowallet.data.balances.UnifiedBalancesSubscribeStore +import com.blockchain.unifiedcryptowallet.domain.activity.service.UnifiedActivityService import com.blockchain.unifiedcryptowallet.domain.balances.UnifiedBalancesService import org.koin.dsl.bind import org.koin.dsl.module @@ -34,5 +38,18 @@ val unifiedCryptoWalletModule = module { currencyPrefs = get() ) }.bind(Store::class) + + scoped { + UnifiedActivityStore( + selfCustodyService = get(), + currencyPrefs = get() + ) + }.bind(KeyedStore::class) + + scoped { + UnifiedActivityRepository( + unifiedActivityStore = get() + ) + }.bind(UnifiedActivityService::class) } } diff --git a/unifiedcryptowallet/domain/build.gradle b/unifiedcryptowallet/domain/build.gradle index 062609a5fa..3811b73597 100644 --- a/unifiedcryptowallet/domain/build.gradle +++ b/unifiedcryptowallet/domain/build.gradle @@ -2,6 +2,7 @@ apply from: rootProject.file('gradle/local/common-feature-domain.gradle') apply plugin: 'kotlinx-serialization' dependencies { + implementation project(':common:domain') implementation project(':common:interface') api project(':balance') } \ No newline at end of file diff --git a/unifiedcryptowallet/domain/src/main/java/com/blockchain/unifiedcryptowallet/domain/activity/model/ActivityButton.kt b/unifiedcryptowallet/domain/src/main/java/com/blockchain/unifiedcryptowallet/domain/activity/model/ActivityButton.kt new file mode 100644 index 0000000000..1796084d8c --- /dev/null +++ b/unifiedcryptowallet/domain/src/main/java/com/blockchain/unifiedcryptowallet/domain/activity/model/ActivityButton.kt @@ -0,0 +1,17 @@ +package com.blockchain.unifiedcryptowallet.domain.activity.model + +// button +enum class ActivityButtonStyle { + Primary, + Secondary, + Tertiary +} + +data class ActivityButtonAction( + val type: ActivityButtonActionType, + val data: String +) { + enum class ActivityButtonActionType { + Copy, OpenUrl + } +} diff --git a/unifiedcryptowallet/domain/src/main/java/com/blockchain/unifiedcryptowallet/domain/activity/model/ActivityDataItem.kt b/unifiedcryptowallet/domain/src/main/java/com/blockchain/unifiedcryptowallet/domain/activity/model/ActivityDataItem.kt new file mode 100644 index 0000000000..d2adb4171b --- /dev/null +++ b/unifiedcryptowallet/domain/src/main/java/com/blockchain/unifiedcryptowallet/domain/activity/model/ActivityDataItem.kt @@ -0,0 +1,15 @@ +package com.blockchain.unifiedcryptowallet.domain.activity.model + +sealed interface ActivityDataItem { + data class Stack( + val leadingImage: ActivityIcon?, + val leading: List, + val trailing: List, + ) : ActivityDataItem + + data class Button( + val value: String, + val style: ActivityButtonStyle, + val action: ActivityButtonAction + ) : ActivityDataItem +} diff --git a/unifiedcryptowallet/domain/src/main/java/com/blockchain/unifiedcryptowallet/domain/activity/model/ActivityIcon.kt b/unifiedcryptowallet/domain/src/main/java/com/blockchain/unifiedcryptowallet/domain/activity/model/ActivityIcon.kt new file mode 100644 index 0000000000..5d51d10391 --- /dev/null +++ b/unifiedcryptowallet/domain/src/main/java/com/blockchain/unifiedcryptowallet/domain/activity/model/ActivityIcon.kt @@ -0,0 +1,17 @@ +package com.blockchain.unifiedcryptowallet.domain.activity.model + +sealed interface ActivityIcon { + data class SmallTag( + val main: String, + val tag: String + ) : ActivityIcon + + data class OverlappingPair( + val front: String, + val back: String + ) : ActivityIcon + + data class SingleIcon( + val url: String + ) : ActivityIcon +} diff --git a/unifiedcryptowallet/domain/src/main/java/com/blockchain/unifiedcryptowallet/domain/activity/model/StackComponent.kt b/unifiedcryptowallet/domain/src/main/java/com/blockchain/unifiedcryptowallet/domain/activity/model/StackComponent.kt new file mode 100644 index 0000000000..25a71a9455 --- /dev/null +++ b/unifiedcryptowallet/domain/src/main/java/com/blockchain/unifiedcryptowallet/domain/activity/model/StackComponent.kt @@ -0,0 +1,34 @@ +package com.blockchain.unifiedcryptowallet.domain.activity.model + +// text +enum class ActivityTextTypography { + Paragraph2, Caption1 +} + +enum class ActivityTextColor { + Title, Muted, Success, Error, Warning +} + +data class ActivityTextStyle( + val typography: ActivityTextTypography, + val color: ActivityTextColor, + val strikethrough: Boolean +) + +// tag +enum class ActivityTagStyle { + Success, Warning +} + +// component +sealed interface StackComponent { + data class Text( + val value: String, + val style: ActivityTextStyle + ) : StackComponent + + data class Tag( + val value: String, + val style: ActivityTagStyle + ) : StackComponent +} diff --git a/unifiedcryptowallet/domain/src/main/java/com/blockchain/unifiedcryptowallet/domain/activity/model/UnifiedActivityPage.kt b/unifiedcryptowallet/domain/src/main/java/com/blockchain/unifiedcryptowallet/domain/activity/model/UnifiedActivityPage.kt new file mode 100644 index 0000000000..33f0e07015 --- /dev/null +++ b/unifiedcryptowallet/domain/src/main/java/com/blockchain/unifiedcryptowallet/domain/activity/model/UnifiedActivityPage.kt @@ -0,0 +1,30 @@ +package com.blockchain.unifiedcryptowallet.domain.activity.model + +data class UnifiedActivityPage( + val activity: List, + val nextPage: String? +) + +data class UnifiedActivityItem( + val txId: String, + val blockExplorerUrl: String, + val summary: ActivityDataItem, + val detail: ActivityDetailGroups, + val status: String, + val timestamp: Long +) + +sealed interface ActivityDetailGroups { + data class GroupedItems( + val title: String, + val subtitle: String, + val icon: ActivityIcon?, + val detailItems: List, + val actionItems: List + ) : ActivityDetailGroups +} + +data class ActivityDetailGroup( + val title: String?, + val itemGroup: List +) diff --git a/unifiedcryptowallet/domain/src/main/java/com/blockchain/unifiedcryptowallet/domain/activity/service/UnifiedActivityService.kt b/unifiedcryptowallet/domain/src/main/java/com/blockchain/unifiedcryptowallet/domain/activity/service/UnifiedActivityService.kt new file mode 100644 index 0000000000..d40fd21cf2 --- /dev/null +++ b/unifiedcryptowallet/domain/src/main/java/com/blockchain/unifiedcryptowallet/domain/activity/service/UnifiedActivityService.kt @@ -0,0 +1,17 @@ +package com.blockchain.unifiedcryptowallet.domain.activity.service + +import com.blockchain.data.DataResource +import com.blockchain.data.FreshnessStrategy +import com.blockchain.unifiedcryptowallet.domain.activity.model.UnifiedActivityPage +import kotlinx.coroutines.flow.Flow + +interface UnifiedActivityService { + suspend fun activityForAccount( + pubKey: String, + currency: String, + acceptLanguage: String, + timeZone: String, + nextPage: String? = null, + freshnessStrategy: FreshnessStrategy = FreshnessStrategy.Cached(forceRefresh = true) + ): Flow> +} diff --git a/unifiedcryptowallet/domain/src/main/java/com/blockchain/unifiedcryptowallet/domain/wallet/NetworkWallet.kt b/unifiedcryptowallet/domain/src/main/java/com/blockchain/unifiedcryptowallet/domain/wallet/NetworkWallet.kt index 39f64f7085..d39f3c71d3 100644 --- a/unifiedcryptowallet/domain/src/main/java/com/blockchain/unifiedcryptowallet/domain/wallet/NetworkWallet.kt +++ b/unifiedcryptowallet/domain/src/main/java/com/blockchain/unifiedcryptowallet/domain/wallet/NetworkWallet.kt @@ -1,6 +1,7 @@ package com.blockchain.unifiedcryptowallet.domain.wallet import com.blockchain.data.DataResource +import com.blockchain.domain.wallet.PubKeyStyle import com.blockchain.koin.payloadScope import com.blockchain.unifiedcryptowallet.domain.balances.NetworkBalance import com.blockchain.unifiedcryptowallet.domain.balances.UnifiedBalancesService @@ -29,14 +30,12 @@ interface NetworkWallet { val descriptor: Int get() = DEFAULT_ADDRESS_DESCRIPTOR - val style: String - get() = SINGLE_PUB_KEY_STYLE + val style: PubKeyStyle + get() = PubKeyStyle.SINGLE suspend fun publicKey(): String companion object { - const val SINGLE_PUB_KEY_STYLE = "SINGLE" - const val EXTENDED_PUB_KEY_STYLE = "EXTENDED" const val DEFAULT_SINGLE_ACCOUNT_INDEX = 0 const val DEFAULT_ADDRESS_DESCRIPTOR = 0 const val MULTIPLE_ADDRESSES_DESCRIPTOR = 1 @@ -63,7 +62,7 @@ class CryptoNetworkWallet( override val descriptor: Int get() = config.descriptor - override val style: String + override val style: PubKeyStyle get() = config.style override suspend fun publicKey(): String = pubKeyService.publicKey() @@ -90,7 +89,7 @@ class NetworkWalletGroup( } } -data class NetworkConfig(val descriptor: Int, val style: String) +data class NetworkConfig(val descriptor: Int, val style: PubKeyStyle) interface PublicKeyService { suspend fun publicKey(): String