diff --git a/app/src/main/java/piuk/blockchain/android/ui/dashboard/announcements/AnnouncementQueries.kt b/app/src/main/java/piuk/blockchain/android/ui/dashboard/announcements/AnnouncementQueries.kt index 064fbcd0e6..4dff7eaa39 100644 --- a/app/src/main/java/piuk/blockchain/android/ui/dashboard/announcements/AnnouncementQueries.kt +++ b/app/src/main/java/piuk/blockchain/android/ui/dashboard/announcements/AnnouncementQueries.kt @@ -186,11 +186,21 @@ class AnnouncementQueries( } } + fun isBlockchainCardAvailable(): Single = + remoteConfigService.getRawJson(BLOCKCHAIN_CARD_ELIGIBLE_COUNTRIES).flatMap { json -> + val eligibleCountries = Json.decodeFromString>(json) + getCountryCode().map { countryCode -> + eligibleCountries.contains(countryCode) + } + } + companion object { @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) const val NEW_ASSET_TICKER = "new_asset_announcement_ticker" private const val RENAME_ASSET_TICKER = "rename_asset_announcement_ticker" + + private const val BLOCKCHAIN_CARD_ELIGIBLE_COUNTRIES = "blockchain_card_eligible_countries" } } diff --git a/app/src/main/java/piuk/blockchain/android/ui/dashboard/announcements/koin.kt b/app/src/main/java/piuk/blockchain/android/ui/dashboard/announcements/koin.kt index 02c5d07263..50ede6e89d 100644 --- a/app/src/main/java/piuk/blockchain/android/ui/dashboard/announcements/koin.kt +++ b/app/src/main/java/piuk/blockchain/android/ui/dashboard/announcements/koin.kt @@ -9,6 +9,7 @@ import org.koin.dsl.bind import org.koin.dsl.module import piuk.blockchain.android.ui.dashboard.announcements.rule.BackupPhraseAnnouncement import piuk.blockchain.android.ui.dashboard.announcements.rule.BitpayAnnouncement +import piuk.blockchain.android.ui.dashboard.announcements.rule.BlockchainCardWaitlistAnnouncement import piuk.blockchain.android.ui.dashboard.announcements.rule.CloudBackupAnnouncement import piuk.blockchain.android.ui.dashboard.announcements.rule.FiatFundsKycAnnouncement import piuk.blockchain.android.ui.dashboard.announcements.rule.FiatFundsNoKycAnnouncement @@ -272,6 +273,13 @@ val dashboardAnnouncementsModule = module { announcementQueries = get() ) }.bind(AnnouncementRule::class) + + factory { + BlockchainCardWaitlistAnnouncement( + announcementQueries = get(), + dismissRecorder = get() + ) + }.bind(AnnouncementRule::class) } single { diff --git a/app/src/main/java/piuk/blockchain/android/ui/dashboard/announcements/rule/BlockchainCardWaitlistAnnouncement.kt b/app/src/main/java/piuk/blockchain/android/ui/dashboard/announcements/rule/BlockchainCardWaitlistAnnouncement.kt new file mode 100644 index 0000000000..4d38d850b6 --- /dev/null +++ b/app/src/main/java/piuk/blockchain/android/ui/dashboard/announcements/rule/BlockchainCardWaitlistAnnouncement.kt @@ -0,0 +1,58 @@ +package piuk.blockchain.android.ui.dashboard.announcements.rule + +import androidx.annotation.VisibleForTesting +import com.blockchain.walletmode.WalletMode +import io.reactivex.rxjava3.core.Single +import piuk.blockchain.android.R +import piuk.blockchain.android.ui.dashboard.announcements.AnnouncementHost +import piuk.blockchain.android.ui.dashboard.announcements.AnnouncementQueries +import piuk.blockchain.android.ui.dashboard.announcements.AnnouncementRule +import piuk.blockchain.android.ui.dashboard.announcements.DismissRecorder +import piuk.blockchain.android.ui.dashboard.announcements.DismissRule +import piuk.blockchain.android.ui.dashboard.announcements.StandardAnnouncementCard +import piuk.blockchain.android.urllinks.URL_JOIN_BLOCKCHAIN_CARD_WAITLIST + +class BlockchainCardWaitlistAnnouncement( + private val announcementQueries: AnnouncementQueries, + dismissRecorder: DismissRecorder +) : AnnouncementRule(dismissRecorder) { + + override val dismissKey = DISMISS_KEY + + override val name = "card_issuing_waitlist" + override val associatedWalletModes: List + get() = listOf(WalletMode.CUSTODIAL_ONLY) + + override fun shouldShow(): Single = + if (dismissEntry.isDismissed) { + Single.just(false) + } else { + announcementQueries.isBlockchainCardAvailable() + } + + companion object { + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + const val DISMISS_KEY = "BlockchainCardWaitlistAnnouncement_DISMISSED" + } + + override fun show(host: AnnouncementHost) { + host.showAnnouncementCard( + card = StandardAnnouncementCard( + name = name, + dismissRule = DismissRule.CardOneTime, + dismissEntry = dismissEntry, + titleText = R.string.blockchain_card_waitlist_announcement_title, + bodyText = R.string.blockchain_card_waitlist_announcement_description, + ctaText = R.string.blockchain_card_waitlist_announcement_action, + iconImage = R.drawable.card_filled_with_background, + dismissFunction = { + host.dismissAnnouncementCard() + }, + ctaFunction = { + host.dismissAnnouncementCard() + host.openBrowserLink(URL_JOIN_BLOCKCHAIN_CARD_WAITLIST) + } + ) + ) + } +} diff --git a/app/src/main/java/piuk/blockchain/android/urllinks/Links.kt b/app/src/main/java/piuk/blockchain/android/urllinks/Links.kt index a820fbea7e..b67dbf00f8 100644 --- a/app/src/main/java/piuk/blockchain/android/urllinks/Links.kt +++ b/app/src/main/java/piuk/blockchain/android/urllinks/Links.kt @@ -81,3 +81,5 @@ const val STAKING_LEARN_MORE = "https://support.blockchain.com/hc/en-us/sections const val STAKING_WEB_APP = "https://login.blockchain.com/en/#/open/earn" const val MULTICHAIN_LEARN_MORE = "https://support.blockchain.com/hc/en-us/articles/6416326056092" + +const val URL_JOIN_BLOCKCHAIN_CARD_WAITLIST = "https://www.blockchain.com/card" diff --git a/componentlib/src/main/res/drawable/card.xml b/componentlib/src/main/res/drawable/card.xml new file mode 100644 index 0000000000..9016fe8e92 --- /dev/null +++ b/componentlib/src/main/res/drawable/card.xml @@ -0,0 +1,10 @@ + + + diff --git a/componentlib/src/main/res/drawable/card_filled.xml b/componentlib/src/main/res/drawable/card_filled.xml new file mode 100644 index 0000000000..337506f26b --- /dev/null +++ b/componentlib/src/main/res/drawable/card_filled.xml @@ -0,0 +1,10 @@ + + + diff --git a/componentlib/src/main/res/drawable/card_filled_with_background.xml b/componentlib/src/main/res/drawable/card_filled_with_background.xml new file mode 100644 index 0000000000..f2e09d12e1 --- /dev/null +++ b/componentlib/src/main/res/drawable/card_filled_with_background.xml @@ -0,0 +1,13 @@ + + + + diff --git a/string-resources/src/main/res/values/strings.xml b/string-resources/src/main/res/values/strings.xml index b62edd8f39..3cd0baf4f0 100644 --- a/string-resources/src/main/res/values/strings.xml +++ b/string-resources/src/main/res/values/strings.xml @@ -3068,7 +3068,7 @@ If you want to know more about our verification process visit our Your DeFi Wallet was successfully created. You DeFi wallet supports Bitcoin, Bitcoin Cash, Ethereum, |etc| and 1500 tokens. Order My Card - Spend your crypto or cash without fees.¹ Earn 0.5\u0025 back in crypto.² + Spend your crypto or cash without fees.¹ Earn 1\u0025 back in crypto.² Already Have A Card? Link It Here" Virtual Physical @@ -3116,7 +3116,7 @@ If you want to know more about our verification process visit our Feature is not available. I agree to Blockchain.com’s Terms of Service Crypto Back - Earn 0.5\u0025 back in crypto rewards on all your purchases.² + Earn 1\u0025 back in crypto rewards on all your purchases.² The Legal Stuff Continue to view your card dashboard. Go To Dashboard @@ -3384,6 +3384,9 @@ If you want to know more about our verification process visit our We are processing the provided information and there seems to be an issue with the following below. SSN Does Not Match Our Records Residential Address Invalid + Introducing the Blockchain.com Visa® Card + Spend your crypto or cash without fees. Earn 1%% back in crypto. + Join The Waitlist Show trading accounts Secured by Blockchain.com