Skip to content

Commit d59519a

Browse files
authored
Merge pull request #18461 from wordpress-mobile/Plans-on-JP-Domain-and-Plan-Selection
Plans on JP: Free domain selection and plan selection
2 parents bb5ac78 + 99dc0d8 commit d59519a

16 files changed

+100
-168
lines changed

WordPress/src/main/java/org/wordpress/android/ui/domains/DomainRegistrationActivity.kt

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@ import org.wordpress.android.fluxc.model.SiteModel
1313
import org.wordpress.android.ui.LocaleAwareActivity
1414
import org.wordpress.android.ui.ScrollableViewInitializedListener
1515
import org.wordpress.android.ui.domains.DomainRegistrationCheckoutWebViewActivity.OpenCheckout.CheckoutDetails
16+
import org.wordpress.android.ui.domains.DomainRegistrationCheckoutWebViewActivity.OpenPlans.PlanDetails
1617
import org.wordpress.android.ui.domains.DomainRegistrationNavigationAction.FinishDomainRegistration
1718
import org.wordpress.android.ui.domains.DomainRegistrationNavigationAction.OpenDomainRegistrationCheckout
1819
import org.wordpress.android.ui.domains.DomainRegistrationNavigationAction.OpenDomainRegistrationDetails
1920
import org.wordpress.android.ui.domains.DomainRegistrationNavigationAction.OpenDomainRegistrationResult
2021
import org.wordpress.android.ui.domains.DomainRegistrationNavigationAction.OpenDomainSuggestions
22+
import org.wordpress.android.ui.domains.DomainRegistrationNavigationAction.OpenFreeDomainWithAnnualPlan
2123
import org.wordpress.android.util.extensions.getSerializableExtraCompat
2224
import org.wordpress.android.viewmodel.observeEvent
2325
import javax.inject.Inject
@@ -27,7 +29,8 @@ class DomainRegistrationActivity : LocaleAwareActivity(), ScrollableViewInitiali
2729
enum class DomainRegistrationPurpose {
2830
AUTOMATED_TRANSFER,
2931
CTA_DOMAIN_CREDIT_REDEMPTION,
30-
DOMAIN_PURCHASE
32+
DOMAIN_PURCHASE,
33+
FREE_DOMAIN_WITH_ANNUAL_PLAN
3134
}
3235

3336
companion object {
@@ -46,6 +49,12 @@ class DomainRegistrationActivity : LocaleAwareActivity(), ScrollableViewInitiali
4649
}
4750
}
4851

52+
private val openPlans = registerForActivityResult(DomainRegistrationCheckoutWebViewActivity.OpenPlans()) {
53+
it?.let {
54+
viewModel.completeDomainRegistration(it)
55+
}
56+
}
57+
4958
override fun onCreate(savedInstanceState: Bundle?) {
5059
super.onCreate(savedInstanceState)
5160
with(DomainRegistrationActivityBinding.inflate(layoutInflater)) {
@@ -80,6 +89,7 @@ class DomainRegistrationActivity : LocaleAwareActivity(), ScrollableViewInitiali
8089
viewModel.onNavigation.observeEvent(this) {
8190
when (it) {
8291
is OpenDomainSuggestions -> showDomainSuggestions()
92+
is OpenFreeDomainWithAnnualPlan -> openFreeDomainWithAnnualPlanWebView(it.site, it.details)
8393
is OpenDomainRegistrationCheckout -> openDomainRegistrationCheckoutWebView(it.site, it.details)
8494
is OpenDomainRegistrationDetails -> showDomainRegistrationDetails(it.details)
8595
is OpenDomainRegistrationResult -> showDomainRegistrationResult(it.event)
@@ -94,6 +104,10 @@ class DomainRegistrationActivity : LocaleAwareActivity(), ScrollableViewInitiali
94104
}
95105
}
96106

107+
private fun openFreeDomainWithAnnualPlanWebView(site: SiteModel, details: DomainProductDetails) {
108+
openPlans.launch(PlanDetails(site, details.domainName))
109+
}
110+
97111
private fun openDomainRegistrationCheckoutWebView(site: SiteModel, details: DomainProductDetails) {
98112
openCheckout.launch(CheckoutDetails(site, details.domainName))
99113
}

WordPress/src/main/java/org/wordpress/android/ui/domains/DomainRegistrationCheckoutWebViewActivity.kt

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import androidx.activity.result.contract.ActivityResultContract
88
import org.wordpress.android.fluxc.model.SiteModel
99
import org.wordpress.android.ui.WPWebViewActivity
1010
import org.wordpress.android.ui.domains.DomainRegistrationCheckoutWebViewActivity.OpenCheckout.CheckoutDetails
11+
import org.wordpress.android.ui.domains.DomainRegistrationCheckoutWebViewActivity.OpenPlans.PlanDetails
1112
import org.wordpress.android.ui.domains.DomainRegistrationCheckoutWebViewClient.DomainRegistrationCheckoutWebViewClientListener
1213
import org.wordpress.android.util.SiteUtils
1314

@@ -29,6 +30,40 @@ class DomainRegistrationCheckoutWebViewActivity : WPWebViewActivity(), DomainReg
2930
finish()
3031
}
3132

33+
class OpenPlans : ActivityResultContract<PlanDetails, DomainRegistrationCompletedEvent?>() {
34+
override fun createIntent(context: Context, input: PlanDetails) =
35+
Intent(context, DomainRegistrationCheckoutWebViewActivity::class.java).apply {
36+
putExtra(USE_GLOBAL_WPCOM_USER, true)
37+
putExtra(URL_TO_LOAD, getPlansUrl(input.site))
38+
putExtra(AUTHENTICATION_URL, WPCOM_LOGIN_URL)
39+
putExtra(REGISTRATION_DOMAIN_NAME, input.domainName)
40+
putExtra(REGISTRATION_EMAIL, input.site.email)
41+
}
42+
43+
override fun parseResult(resultCode: Int, intent: Intent?): DomainRegistrationCompletedEvent? {
44+
val data = intent?.takeIf { it.hasExtra(REGISTRATION_DOMAIN_NAME) && it.hasExtra(REGISTRATION_EMAIL) }
45+
if (resultCode == RESULT_OK && data != null) {
46+
val domainName = data.getStringExtra(REGISTRATION_DOMAIN_NAME).orEmpty()
47+
val email = data.getStringExtra(REGISTRATION_EMAIL).orEmpty()
48+
return DomainRegistrationCompletedEvent(domainName, email)
49+
}
50+
return null
51+
}
52+
53+
data class PlanDetails(val site: SiteModel, val domainName: String)
54+
55+
private fun getPlansUrl(site: SiteModel) =
56+
"https://wordpress.com/plans/yearly/" +
57+
SiteUtils.getHomeURLOrHostName(site) +
58+
"?domainAndPlanPackage=true" +
59+
"&jetpackAppPlans=true"
60+
61+
companion object {
62+
const val REGISTRATION_DOMAIN_NAME = "REGISTRATION_DOMAIN_NAME"
63+
const val REGISTRATION_EMAIL = "REGISTRATION_EMAIL"
64+
}
65+
}
66+
3267
class OpenCheckout : ActivityResultContract<CheckoutDetails, DomainRegistrationCompletedEvent?>() {
3368
override fun createIntent(context: Context, input: CheckoutDetails) =
3469
Intent(context, DomainRegistrationCheckoutWebViewActivity::class.java).apply {

WordPress/src/main/java/org/wordpress/android/ui/domains/DomainRegistrationCheckoutWebViewNavigationDelegate.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ object DomainRegistrationCheckoutWebViewNavigationDelegate {
88
UrlMatcher(
99
".*wordpress.com".toRegex(),
1010
listOf(
11+
"/plans.*?.*".toRegex(),
1112
"/automattic-domain-name-registration-agreement.*".toRegex(),
1213
"/checkout.*".toRegex(),
1314
"$optionalLanguagePath/tos.*".toRegex(),

WordPress/src/main/java/org/wordpress/android/ui/domains/DomainRegistrationMainViewModel.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@ import org.wordpress.android.fluxc.model.SiteModel
77
import org.wordpress.android.ui.domains.DomainRegistrationActivity.DomainRegistrationPurpose
88
import org.wordpress.android.ui.domains.DomainRegistrationActivity.DomainRegistrationPurpose.CTA_DOMAIN_CREDIT_REDEMPTION
99
import org.wordpress.android.ui.domains.DomainRegistrationActivity.DomainRegistrationPurpose.DOMAIN_PURCHASE
10+
import org.wordpress.android.ui.domains.DomainRegistrationActivity.DomainRegistrationPurpose.FREE_DOMAIN_WITH_ANNUAL_PLAN
1011
import org.wordpress.android.ui.domains.DomainRegistrationNavigationAction.FinishDomainRegistration
1112
import org.wordpress.android.ui.domains.DomainRegistrationNavigationAction.OpenDomainRegistrationCheckout
1213
import org.wordpress.android.ui.domains.DomainRegistrationNavigationAction.OpenDomainRegistrationDetails
1314
import org.wordpress.android.ui.domains.DomainRegistrationNavigationAction.OpenDomainRegistrationResult
1415
import org.wordpress.android.ui.domains.DomainRegistrationNavigationAction.OpenDomainSuggestions
16+
import org.wordpress.android.ui.domains.DomainRegistrationNavigationAction.OpenFreeDomainWithAnnualPlan
1517
import org.wordpress.android.viewmodel.Event
1618
import javax.inject.Inject
1719

@@ -45,6 +47,10 @@ class DomainRegistrationMainViewModel @Inject constructor(
4547
analyticsTracker.trackDomainsRegistrationFormViewed()
4648
Event(OpenDomainRegistrationCheckout(site, domainProductDetails))
4749
}
50+
FREE_DOMAIN_WITH_ANNUAL_PLAN -> {
51+
analyticsTracker.trackDomainsRegistrationFormViewed()
52+
Event(OpenFreeDomainWithAnnualPlan(site, domainProductDetails))
53+
}
4854
else -> {
4955
analyticsTracker.trackDomainCreditNameSelected()
5056
Event(OpenDomainRegistrationDetails(domainProductDetails))
@@ -55,7 +61,7 @@ class DomainRegistrationMainViewModel @Inject constructor(
5561
fun completeDomainRegistration(event: DomainRegistrationCompletedEvent) {
5662
// Called on checkout result
5763
_onNavigation.value = when (domainRegistrationPurpose) {
58-
CTA_DOMAIN_CREDIT_REDEMPTION, DOMAIN_PURCHASE -> {
64+
CTA_DOMAIN_CREDIT_REDEMPTION, DOMAIN_PURCHASE, FREE_DOMAIN_WITH_ANNUAL_PLAN -> {
5965
analyticsTracker.trackDomainsRegistrationFormSubmitted()
6066
Event(OpenDomainRegistrationResult(event))
6167
}

WordPress/src/main/java/org/wordpress/android/ui/domains/DomainRegistrationNavigationAction.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import org.wordpress.android.fluxc.model.SiteModel
55
sealed class DomainRegistrationNavigationAction {
66
object OpenDomainSuggestions : DomainRegistrationNavigationAction()
77

8+
data class OpenFreeDomainWithAnnualPlan(val site: SiteModel, val details: DomainProductDetails) :
9+
DomainRegistrationNavigationAction()
810
data class OpenDomainRegistrationCheckout(val site: SiteModel, val details: DomainProductDetails) :
911
DomainRegistrationNavigationAction()
1012

WordPress/src/main/java/org/wordpress/android/ui/domains/DomainSuggestionsFragment.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ class DomainSuggestionsFragment : Fragment(R.layout.domain_suggestions_fragment)
105105
}
106106
viewModel.selectDomainButtonEnabledState.observe(viewLifecycleOwner) { selectDomainButton.isEnabled = it }
107107
viewModel.onDomainSelected.observeEvent(viewLifecycleOwner, mainViewModel::selectDomain)
108+
viewModel.onFreeDomainSelected.observeEvent(viewLifecycleOwner, mainViewModel::selectDomain)
108109
}
109110

110111
override fun onResume() {

WordPress/src/main/java/org/wordpress/android/ui/domains/DomainSuggestionsViewModel.kt

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import org.wordpress.android.modules.BG_THREAD
1919
import org.wordpress.android.ui.domains.DomainRegistrationActivity.DomainRegistrationPurpose
2020
import org.wordpress.android.ui.domains.DomainRegistrationActivity.DomainRegistrationPurpose.CTA_DOMAIN_CREDIT_REDEMPTION
2121
import org.wordpress.android.ui.domains.DomainRegistrationActivity.DomainRegistrationPurpose.DOMAIN_PURCHASE
22+
import org.wordpress.android.ui.domains.DomainRegistrationActivity.DomainRegistrationPurpose.FREE_DOMAIN_WITH_ANNUAL_PLAN
2223
import org.wordpress.android.ui.domains.usecases.CreateCartUseCase
2324
import org.wordpress.android.util.AppLog
2425
import org.wordpress.android.util.AppLog.T
@@ -73,6 +74,9 @@ class DomainSuggestionsViewModel @Inject constructor(
7374
private val _onDomainSelected = MutableLiveData<Event<DomainProductDetails>>()
7475
val onDomainSelected: LiveData<Event<DomainProductDetails>> = _onDomainSelected
7576

77+
private val _onFreeDomainSelected = MutableLiveData<Event<DomainProductDetails>>()
78+
val onFreeDomainSelected: LiveData<Event<DomainProductDetails>> = _onFreeDomainSelected
79+
7680
private var searchQuery: String by Delegates.observable("") { _, oldValue, newValue ->
7781
if (newValue != oldValue) {
7882
if (isStarted && !isQueryTrackingCompleted) {
@@ -194,7 +198,7 @@ class DomainSuggestionsViewModel @Inject constructor(
194198
relevance = it.relevance,
195199
isSelected = _selectedSuggestion.value?.domainName == it.domain_name,
196200
isCostVisible = siteDomainsFeatureConfig.isEnabled(),
197-
isFreeWithCredits = domainRegistrationPurpose == CTA_DOMAIN_CREDIT_REDEMPTION,
201+
isFreeWithCredits = domainRegistrationPurpose(),
198202
isEnabled = true
199203
)
200204
}
@@ -205,6 +209,9 @@ class DomainSuggestionsViewModel @Inject constructor(
205209
}
206210
}
207211

212+
private fun domainRegistrationPurpose() = domainRegistrationPurpose == CTA_DOMAIN_CREDIT_REDEMPTION ||
213+
domainRegistrationPurpose == FREE_DOMAIN_WITH_ANNUAL_PLAN
214+
208215
fun onDomainSuggestionSelected(selectedSuggestion: DomainSuggestionItem?) {
209216
_selectedSuggestion.postValue(selectedSuggestion)
210217
suggestions = suggestions.transform { list ->
@@ -216,7 +223,7 @@ class DomainSuggestionsViewModel @Inject constructor(
216223
fun onSelectDomainButtonClicked() {
217224
val selectedSuggestion = _selectedSuggestion.value ?: throw IllegalStateException("Selected suggestion is null")
218225
when (domainRegistrationPurpose) {
219-
DOMAIN_PURCHASE -> createCart(selectedSuggestion)
226+
DOMAIN_PURCHASE, FREE_DOMAIN_WITH_ANNUAL_PLAN -> createCart(selectedSuggestion)
220227
else -> selectDomain(selectedSuggestion)
221228
}
222229

@@ -254,10 +261,20 @@ class DomainSuggestionsViewModel @Inject constructor(
254261
// TODO Handle failed cart creation
255262
} else {
256263
AppLog.d(T.DOMAIN_REGISTRATION, "Successful cart creation: ${event.cartDetails}")
257-
selectDomain(selectedSuggestion)
264+
if (domainRegistrationPurpose == FREE_DOMAIN_WITH_ANNUAL_PLAN) {
265+
openPlans(selectedSuggestion)
266+
} else {
267+
selectDomain(selectedSuggestion)
268+
}
258269
}
259270
}
260271

272+
private fun openPlans(selectedSuggestion: DomainSuggestionItem) {
273+
val domainProductDetails = DomainProductDetails(selectedSuggestion.productId, selectedSuggestion.domainName)
274+
_onFreeDomainSelected.postValue(Event(domainProductDetails))
275+
// add tracking here
276+
}
277+
261278
private fun selectDomain(selectedSuggestion: DomainSuggestionItem) {
262279
val domainProductDetails = DomainProductDetails(selectedSuggestion.productId, selectedSuggestion.domainName)
263280
_onDomainSelected.postValue(Event(domainProductDetails))

WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteSourceManager.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import org.wordpress.android.ui.mysite.cards.blaze.PromoteWithBlazeCardSource
1111
import org.wordpress.android.ui.mysite.cards.dashboard.CardsSource
1212
import org.wordpress.android.ui.mysite.cards.dashboard.bloggingprompts.BloggingPromptCardSource
1313
import org.wordpress.android.ui.mysite.cards.dashboard.domain.DashboardCardDomainSource
14-
import org.wordpress.android.ui.mysite.cards.dashboard.plans.PlansCardDomainSource
1514
import org.wordpress.android.ui.mysite.cards.domainregistration.DomainRegistrationSource
1615
import org.wordpress.android.ui.mysite.cards.quickstart.QuickStartCardSource
1716
import org.wordpress.android.ui.mysite.dynamiccards.DynamicCardMenuViewModel.DynamicCardMenuInteraction
@@ -36,7 +35,6 @@ class MySiteSourceManager @Inject constructor(
3635
promoteWithBlazeCardSource: PromoteWithBlazeCardSource,
3736
private val selectedSiteRepository: SelectedSiteRepository,
3837
dashboardCardDomainSource: DashboardCardDomainSource,
39-
plansCardDomainSource: PlansCardDomainSource,
4038
private val jetpackFeatureRemovalPhaseHelper: JetpackFeatureRemovalPhaseHelper
4139
) {
4240
private val mySiteSources: List<MySiteSource<*>> = listOf(
@@ -51,7 +49,6 @@ class MySiteSourceManager @Inject constructor(
5149
bloggingPromptCardSource,
5250
promoteWithBlazeCardSource,
5351
dashboardCardDomainSource,
54-
plansCardDomainSource
5552
)
5653

5754
private val showDashboardCards: Boolean

WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteViewModel.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -618,9 +618,7 @@ class MySiteViewModel @Inject constructor(
618618
onMoreMenuClick = this::onDashboardCardDomainMoreMenuClick
619619
),
620620
dashboardCardPlansBuilderParams = DashboardCardPlansBuilderParams(
621-
isEligible = dashboardCardPlansUtils.shouldShowCard(
622-
site, isDomainCreditAvailable, hasSiteCustomDomains
623-
),
621+
isEligible = dashboardCardPlansUtils.shouldShowCard(site),
624622
onClick = this::onDashboardCardPlansClick,
625623
onHideMenuItemClick = this::onDashboardCardPlansHideMenuItemClick,
626624
onMoreMenuClick = this::onDashboardCardPlansMoreMenuClick
@@ -1692,7 +1690,7 @@ class MySiteViewModel @Inject constructor(
16921690
private fun onDashboardCardPlansClick() {
16931691
val selectedSite = requireNotNull(selectedSiteRepository.getSelectedSite())
16941692
dashboardCardPlansUtils.trackCardTapped(uiModel.value?.state as? SiteSelected)
1695-
_onNavigation.value = Event(SiteNavigationAction.OpenPaidDomainSearch(selectedSite))
1693+
_onNavigation.value = Event(SiteNavigationAction.OpenFreeDomainSearch(selectedSite))
16961694
}
16971695

16981696
private fun onDashboardCardPlansMoreMenuClick() {

WordPress/src/main/java/org/wordpress/android/ui/mysite/SiteNavigationAction.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ sealed class SiteNavigationAction {
6161

6262
data class OpenDomainRegistration(val site: SiteModel) : SiteNavigationAction()
6363
data class OpenPaidDomainSearch(val site: SiteModel) : SiteNavigationAction()
64+
data class OpenFreeDomainSearch(val site: SiteModel) : SiteNavigationAction()
6465
data class AddNewSite(val hasAccessToken: Boolean, val source: SiteCreationSource) : SiteNavigationAction()
6566
data class ShowQuickStartDialog(
6667
@StringRes val title: Int,

0 commit comments

Comments
 (0)