From 430f4e53c3160fb271173bcf46ba6d4ab632940c Mon Sep 17 00:00:00 2001 From: Ondrej Ruttkay Date: Tue, 18 Oct 2022 14:22:55 +0200 Subject: [PATCH 01/14] Add logic to extract a new store URL from a webview --- .../wpcomwebview/WPComWebViewFragment.kt | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/common/wpcomwebview/WPComWebViewFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/common/wpcomwebview/WPComWebViewFragment.kt index 2f6bf61b1f45..ab9201043e86 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/common/wpcomwebview/WPComWebViewFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/common/wpcomwebview/WPComWebViewFragment.kt @@ -10,6 +10,7 @@ import androidx.navigation.fragment.navArgs import com.woocommerce.android.R import com.woocommerce.android.databinding.FragmentWpcomWebviewBinding import com.woocommerce.android.extensions.navigateBackWithNotice +import com.woocommerce.android.extensions.navigateBackWithResult import com.woocommerce.android.ui.base.BaseFragment import com.woocommerce.android.ui.common.wpcomwebview.WPComWebViewFragment.UrlComparisonMode.EQUALITY import com.woocommerce.android.ui.common.wpcomwebview.WPComWebViewFragment.UrlComparisonMode.PARTIAL @@ -28,11 +29,15 @@ import javax.inject.Inject class WPComWebViewFragment : BaseFragment(R.layout.fragment_wpcom_webview), UrlInterceptor, BackPressListener { companion object { const val WEBVIEW_RESULT = "webview-result" + const val WEBVIEW_RESULT_WITH_URL = "webview-result-with-url" const val WEBVIEW_DISMISSED = "webview-dismissed" + const val WEBVIEW_STORE_CHECKOUT_STRING = "source=/checkout/thank-you/" + const val WEBVIEW_STORE_URL_KEY = "source=/checkout/thank-you/" } private val webViewClient by lazy { WPComWebViewClient(this) } private val navArgs: WPComWebViewFragmentArgs by navArgs() + private var siteUrl: String? = null @Inject lateinit var wpcomWebViewAuthenticator: WPComWebViewAuthenticator @@ -52,20 +57,42 @@ class WPComWebViewFragment : BaseFragment(R.layout.fragment_wpcom_webview), UrlI } } this.settings.javaScriptEnabled = true + this.settings.domStorageEnabled = true settings.userAgentString = userAgent.userAgent } + siteUrl = savedInstanceState?.getString(WEBVIEW_STORE_URL_KEY) + wpcomWebViewAuthenticator.authenticateAndLoadUrl(binding.webView, navArgs.urlToLoad) } + override fun onSaveInstanceState(outState: Bundle) { + outState.putString(WEBVIEW_STORE_URL_KEY, siteUrl) + super.onSaveInstanceState(outState) + } + override fun onLoadUrl(url: String) { fun String.matchesUrl(url: String) = when (navArgs.urlComparisonMode) { PARTIAL -> url.contains(this, ignoreCase = true) EQUALITY -> equals(url, ignoreCase = true) } + siteUrl = extractSiteUrl(url) + if (isAdded && navArgs.urlToTriggerExit?.matchesUrl(url) == true) { - navigateBackWithNotice(WEBVIEW_RESULT) + if (siteUrl == null) { + navigateBackWithNotice(WEBVIEW_RESULT) + } else { + navigateBackWithResult(WEBVIEW_RESULT_WITH_URL, siteUrl) + } + } + } + + private fun extractSiteUrl(url: String): String? { + return "$WEBVIEW_STORE_CHECKOUT_STRING.+/".toRegex().find(url)?.range?.let { range -> + val start = range.first + WEBVIEW_STORE_CHECKOUT_STRING.length + val end = range.last + url.substring(start, end) } } From fdcabaff65526609909c59552ceab358f6a59761 Mon Sep 17 00:00:00 2001 From: Ondrej Ruttkay Date: Tue, 18 Oct 2022 14:25:43 +0200 Subject: [PATCH 02/14] Add new store creation buttons --- .../layout-land/view_login_epilogue_button_bar.xml | 12 ++++++++++++ .../res/layout/view_login_epilogue_button_bar.xml | 9 +++++++++ WooCommerce/src/main/res/values/strings.xml | 3 +++ 3 files changed, 24 insertions(+) diff --git a/WooCommerce/src/main/res/layout-land/view_login_epilogue_button_bar.xml b/WooCommerce/src/main/res/layout-land/view_login_epilogue_button_bar.xml index 7b76e59ea254..99698653f968 100644 --- a/WooCommerce/src/main/res/layout-land/view_login_epilogue_button_bar.xml +++ b/WooCommerce/src/main/res/layout-land/view_login_epilogue_button_bar.xml @@ -32,4 +32,16 @@ android:text="@string/login_view_connected_stores" android:textAllCaps="false" tools:visibility="visible"/> + + diff --git a/WooCommerce/src/main/res/layout/view_login_epilogue_button_bar.xml b/WooCommerce/src/main/res/layout/view_login_epilogue_button_bar.xml index c9ab959fbf11..b96a20ab148b 100644 --- a/WooCommerce/src/main/res/layout/view_login_epilogue_button_bar.xml +++ b/WooCommerce/src/main/res/layout/view_login_epilogue_button_bar.xml @@ -29,4 +29,13 @@ android:text="@string/login_view_connected_stores" android:textAllCaps="false" tools:visibility="visible"/> + + diff --git a/WooCommerce/src/main/res/values/strings.xml b/WooCommerce/src/main/res/values/strings.xml index 9f57ceb3b3fa..5953e3348022 100644 --- a/WooCommerce/src/main/res/values/strings.xml +++ b/WooCommerce/src/main/res/values/strings.xml @@ -2641,4 +2641,7 @@ As of %1$s Hello blank fragment + + + Create a new store From a558a5b68112d539849f1b71c8de85ab702766a5 Mon Sep 17 00:00:00 2001 From: Ondrej Ruttkay Date: Wed, 19 Oct 2022 00:14:33 +0200 Subject: [PATCH 03/14] Select the newly created site and display the store --- .../android/analytics/AnalyticsEvent.kt | 2 ++ .../common/wpcomwebview/WPComWebViewFragment.kt | 11 ++++++----- .../android/ui/sitepicker/SitePickerFragment.kt | 11 +++++++++++ .../ui/sitepicker/SitePickerRepository.kt | 1 + .../ui/sitepicker/SitePickerViewModel.kt | 17 +++++++++++++++++ 5 files changed, 37 insertions(+), 5 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsEvent.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsEvent.kt index ca0cabccab8e..b61fdf423088 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsEvent.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsEvent.kt @@ -131,6 +131,8 @@ enum class AnalyticsEvent(val siteless: Boolean = false) { SITE_PICKER_SITE_DISCOVERY(siteless = true), SITE_PICKER_JETPACK_TIMEOUT_ERROR_SHOWN(siteless = true), SITE_PICKER_JETPACK_TIMEOUT_CONTACT_SUPPORT_CLICKED(siteless = true), + SITE_PICKER_CREATE_SITE_TAPPED(siteless = true), + LOGIN_WOOCOMMERCE_SITE_CREATED(siteless = true), // -- Dashboard DASHBOARD_PULLED_TO_REFRESH, diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/common/wpcomwebview/WPComWebViewFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/common/wpcomwebview/WPComWebViewFragment.kt index ab9201043e86..6c18442b250a 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/common/wpcomwebview/WPComWebViewFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/common/wpcomwebview/WPComWebViewFragment.kt @@ -2,6 +2,7 @@ package com.woocommerce.android.ui.common.wpcomwebview import android.annotation.SuppressLint import android.os.Bundle +import android.util.Log import android.view.View import android.webkit.WebChromeClient import android.webkit.WebView @@ -61,7 +62,7 @@ class WPComWebViewFragment : BaseFragment(R.layout.fragment_wpcom_webview), UrlI settings.userAgentString = userAgent.userAgent } - siteUrl = savedInstanceState?.getString(WEBVIEW_STORE_URL_KEY) + siteUrl = savedInstanceState?.getString(WEBVIEW_STORE_URL_KEY) ?: siteUrl wpcomWebViewAuthenticator.authenticateAndLoadUrl(binding.webView, navArgs.urlToLoad) } @@ -77,7 +78,7 @@ class WPComWebViewFragment : BaseFragment(R.layout.fragment_wpcom_webview), UrlI EQUALITY -> equals(url, ignoreCase = true) } - siteUrl = extractSiteUrl(url) + extractSiteUrl(url) if (isAdded && navArgs.urlToTriggerExit?.matchesUrl(url) == true) { if (siteUrl == null) { @@ -88,11 +89,11 @@ class WPComWebViewFragment : BaseFragment(R.layout.fragment_wpcom_webview), UrlI } } - private fun extractSiteUrl(url: String): String? { - return "$WEBVIEW_STORE_CHECKOUT_STRING.+/".toRegex().find(url)?.range?.let { range -> + private fun extractSiteUrl(url: String) { + "$WEBVIEW_STORE_CHECKOUT_STRING.+/".toRegex().find(url)?.range?.let { range -> val start = range.first + WEBVIEW_STORE_CHECKOUT_STRING.length val end = range.last - url.substring(start, end) + siteUrl = url.substring(start, end) } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerFragment.kt index 253b9de21a3e..f7f250cf7f1f 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerFragment.kt @@ -91,6 +91,10 @@ class SitePickerFragment : BaseFragment(R.layout.fragment_site_picker), LoginEma binding.loginEpilogueButtonBar.buttonSecondary.setOnClickListener { viewModel.onTryAnotherAccountButtonClick() } + + binding.loginEpilogueButtonBar.buttonTertiary.setOnClickListener { + viewModel.onCreateSiteButtonClick() + } } @Suppress("LongMethod", "ComplexMethod") @@ -175,6 +179,13 @@ class SitePickerFragment : BaseFragment(R.layout.fragment_site_picker), LoginEma AnalyticsTracker.track(AnalyticsEvent.LOGIN_WOOCOMMERCE_SETUP_COMPLETED) viewModel.onWooInstalled() } + handleResult(WPComWebViewFragment.WEBVIEW_RESULT_WITH_URL) { siteUrl -> + AnalyticsTracker.track( + AnalyticsEvent.LOGIN_WOOCOMMERCE_SITE_CREATED, + mapOf(AnalyticsTracker.KEY_URL to siteUrl) + ) + viewModel.onSiteCreated(siteUrl) + } handleNotice(WPComWebViewFragment.WEBVIEW_DISMISSED) { AnalyticsTracker.track(AnalyticsEvent.LOGIN_WOOCOMMERCE_SETUP_DISMISSED) } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerRepository.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerRepository.kt index 507b0594487a..450adf859b8a 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerRepository.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerRepository.kt @@ -12,6 +12,7 @@ import org.wordpress.android.fluxc.generated.SiteActionBuilder import org.wordpress.android.fluxc.model.SiteModel import org.wordpress.android.fluxc.store.SiteStore import org.wordpress.android.fluxc.store.SiteStore.ConnectSiteInfoPayload +import org.wordpress.android.fluxc.store.SiteStore.FetchSitesPayload import org.wordpress.android.fluxc.store.SiteStore.OnConnectSiteInfoChecked import org.wordpress.android.fluxc.store.SiteStore.SiteErrorType import org.wordpress.android.fluxc.store.WooCommerceStore diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerViewModel.kt index 48a1d65b816d..67e14f35e2bd 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerViewModel.kt @@ -67,6 +67,8 @@ class SitePickerViewModel @Inject constructor( companion object { private const val WOOCOMMERCE_INSTALLATION_URL = "https://wordpress.com/plugins/woocommerce/" private const val WOOCOMMERCE_INSTALLATION_DONE_URL = "marketplace/thank-you/woocommerce" + private const val WOOCOMMERCE_STORE_CREATION_URL = "https://woocommerce.com/start" + private const val WOOCOMMERCE_STORE_CREATION_DONE_URL = "calypso/images/wpcom-ecommerce" } private val navArgs: SitePickerFragmentArgs by savedState.navArgs() @@ -404,6 +406,11 @@ class SitePickerViewModel @Inject constructor( triggerEvent(SitePickerEvent.NavigateToSiteAddressEvent) } + fun onCreateSiteButtonClick() { + analyticsTrackerWrapper.track(AnalyticsEvent.SITE_PICKER_CREATE_SITE_TAPPED) + triggerEvent(NavigateToWPComWebView(WOOCOMMERCE_STORE_CREATION_URL, WOOCOMMERCE_STORE_CREATION_DONE_URL)) + } + fun onTryAnotherAccountButtonClick() { trackLoginEvent(clickEvent = UnifiedLoginTracker.Click.TRY_ANOTHER_ACCOUNT) launch { @@ -528,6 +535,16 @@ class SitePickerViewModel @Inject constructor( } } + fun onSiteCreated(url: String) { + launch { + fetchSitesFromApi(showSkeleton = true) + repository.getSiteBySiteUrl(url)?.let { site -> + onSiteSelected(site) + onContinueButtonClick(true) + } + } + } + fun onWooInstalled() { suspend fun fetchSite(site: SiteModel, retries: Int = 0): Result { delay(retries * TimeUnit.SECONDS.toMillis(2)) From 48cb8ea29d0a1d7c97de36d135a8f20d635ac38e Mon Sep 17 00:00:00 2001 From: Ondrej Ruttkay Date: Sat, 22 Oct 2022 10:21:51 +0200 Subject: [PATCH 04/14] Try multiple different URLs returned from a site creation flow --- .../wpcomwebview/WPComWebViewFragment.kt | 20 +++++---- .../ui/sitepicker/SitePickerFragment.kt | 7 +-- .../ui/sitepicker/SitePickerRepository.kt | 2 + .../ui/sitepicker/SitePickerViewModel.kt | 44 ++++++++++++++++--- 4 files changed, 55 insertions(+), 18 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/common/wpcomwebview/WPComWebViewFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/common/wpcomwebview/WPComWebViewFragment.kt index 6c18442b250a..56b70771a819 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/common/wpcomwebview/WPComWebViewFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/common/wpcomwebview/WPComWebViewFragment.kt @@ -32,13 +32,13 @@ class WPComWebViewFragment : BaseFragment(R.layout.fragment_wpcom_webview), UrlI const val WEBVIEW_RESULT = "webview-result" const val WEBVIEW_RESULT_WITH_URL = "webview-result-with-url" const val WEBVIEW_DISMISSED = "webview-dismissed" - const val WEBVIEW_STORE_CHECKOUT_STRING = "source=/checkout/thank-you/" - const val WEBVIEW_STORE_URL_KEY = "source=/checkout/thank-you/" + const val WEBVIEW_STORE_CHECKOUT_STRING = "checkout/thank-you/" + const val WEBVIEW_STORE_URL_KEY = "store-url-key" } private val webViewClient by lazy { WPComWebViewClient(this) } private val navArgs: WPComWebViewFragmentArgs by navArgs() - private var siteUrl: String? = null + private var siteUrls = ArrayList() @Inject lateinit var wpcomWebViewAuthenticator: WPComWebViewAuthenticator @@ -62,13 +62,13 @@ class WPComWebViewFragment : BaseFragment(R.layout.fragment_wpcom_webview), UrlI settings.userAgentString = userAgent.userAgent } - siteUrl = savedInstanceState?.getString(WEBVIEW_STORE_URL_KEY) ?: siteUrl + siteUrls = savedInstanceState?.getStringArrayList(WEBVIEW_STORE_URL_KEY) ?: siteUrls wpcomWebViewAuthenticator.authenticateAndLoadUrl(binding.webView, navArgs.urlToLoad) } override fun onSaveInstanceState(outState: Bundle) { - outState.putString(WEBVIEW_STORE_URL_KEY, siteUrl) + outState.putStringArrayList(WEBVIEW_STORE_URL_KEY, siteUrls) super.onSaveInstanceState(outState) } @@ -78,13 +78,14 @@ class WPComWebViewFragment : BaseFragment(R.layout.fragment_wpcom_webview), UrlI EQUALITY -> equals(url, ignoreCase = true) } + Log.d("Webview", url) extractSiteUrl(url) if (isAdded && navArgs.urlToTriggerExit?.matchesUrl(url) == true) { - if (siteUrl == null) { + if (siteUrls.isEmpty()) { navigateBackWithNotice(WEBVIEW_RESULT) } else { - navigateBackWithResult(WEBVIEW_RESULT_WITH_URL, siteUrl) + navigateBackWithResult(WEBVIEW_RESULT_WITH_URL, siteUrls) } } } @@ -93,7 +94,10 @@ class WPComWebViewFragment : BaseFragment(R.layout.fragment_wpcom_webview), UrlI "$WEBVIEW_STORE_CHECKOUT_STRING.+/".toRegex().find(url)?.range?.let { range -> val start = range.first + WEBVIEW_STORE_CHECKOUT_STRING.length val end = range.last - siteUrl = url.substring(start, end) + val siteUrl = url.substring(start, end) + if (!siteUrls.contains(siteUrl)) { + siteUrls.add(siteUrl) + } } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerFragment.kt index f7f250cf7f1f..c873f38f1171 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerFragment.kt @@ -16,6 +16,7 @@ import com.woocommerce.android.analytics.AnalyticsTracker import com.woocommerce.android.databinding.FragmentSitePickerBinding import com.woocommerce.android.extensions.handleNotice import com.woocommerce.android.extensions.handleResult +import com.woocommerce.android.extensions.joinToString import com.woocommerce.android.extensions.navigateSafely import com.woocommerce.android.extensions.takeIfNotEqualTo import com.woocommerce.android.support.HelpActivity @@ -179,12 +180,12 @@ class SitePickerFragment : BaseFragment(R.layout.fragment_site_picker), LoginEma AnalyticsTracker.track(AnalyticsEvent.LOGIN_WOOCOMMERCE_SETUP_COMPLETED) viewModel.onWooInstalled() } - handleResult(WPComWebViewFragment.WEBVIEW_RESULT_WITH_URL) { siteUrl -> + handleResult>(WPComWebViewFragment.WEBVIEW_RESULT_WITH_URL) { urls -> AnalyticsTracker.track( AnalyticsEvent.LOGIN_WOOCOMMERCE_SITE_CREATED, - mapOf(AnalyticsTracker.KEY_URL to siteUrl) + mapOf(AnalyticsTracker.KEY_URL to urls.joinToString()) ) - viewModel.onSiteCreated(siteUrl) + viewModel.onSiteCreated(urls) } handleNotice(WPComWebViewFragment.WEBVIEW_DISMISSED) { AnalyticsTracker.track(AnalyticsEvent.LOGIN_WOOCOMMERCE_SETUP_DISMISSED) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerRepository.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerRepository.kt index 450adf859b8a..7efca775f51e 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerRepository.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerRepository.kt @@ -41,6 +41,8 @@ class SitePickerRepository @Inject constructor( suspend fun fetchWooCommerceSites() = wooCommerceStore.fetchWooCommerceSites() + suspend fun fetchSites() = siteStore.fetchSites(FetchSitesPayload()) + suspend fun fetchWooCommerceSite(siteModel: SiteModel): Result { return wooCommerceStore.fetchWooCommerceSite(siteModel).let { when { diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerViewModel.kt index 67e14f35e2bd..763902304ef3 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerViewModel.kt @@ -38,8 +38,10 @@ import com.woocommerce.android.viewmodel.ResourceProvider import com.woocommerce.android.viewmodel.ScopedViewModel import com.woocommerce.android.viewmodel.navArgs import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import kotlinx.parcelize.Parcelize import org.wordpress.android.fluxc.model.SiteModel import org.wordpress.android.fluxc.network.rest.wpcom.wc.WooErrorType @@ -80,7 +82,7 @@ class SitePickerViewModel @Inject constructor( val sites: LiveData> = _sites private var loginSiteAddress: String? - get() = savedState.get("key") ?: appPrefsWrapper.getLoginSiteAddress() + get() = savedState["key"] ?: appPrefsWrapper.getLoginSiteAddress() set(value) = savedState.set("key", value) val shouldShowToolbar: Boolean @@ -93,6 +95,7 @@ class SitePickerViewModel @Inject constructor( } updateSiteViewDetails() loadAndDisplaySites() + onSiteCreated(listOf("www.cnn.com", "www.google.com")) } private fun updateSiteViewDetails() { @@ -114,11 +117,12 @@ class SitePickerViewModel @Inject constructor( } } - private suspend fun fetchSitesFromApi(showSkeleton: Boolean) { + private suspend fun fetchSitesFromApi(showSkeleton: Boolean, delayTime: Long = 0) { sitePickerViewState = sitePickerViewState.copy( isSkeletonViewVisible = showSkeleton ) + delay(delayTime) val startTime = System.currentTimeMillis() val result = repository.fetchWooCommerceSites() val duration = System.currentTimeMillis() - startTime @@ -535,14 +539,40 @@ class SitePickerViewModel @Inject constructor( } } - fun onSiteCreated(url: String) { + fun onSiteCreated(urls: List) { launch { - fetchSitesFromApi(showSkeleton = true) - repository.getSiteBySiteUrl(url)?.let { site -> - onSiteSelected(site) - onContinueButtonClick(true) + sitePickerViewState = sitePickerViewState.copy( + isSkeletonViewVisible = false, isProgressDiaLogVisible = true + ) + + var site: SiteModel? = null + while (site == null) { + site = urls.firstNotNullOfOrNull { url -> repository.getSiteBySiteUrl(url) } + if (site != null) { + onSiteSelected(site) + onContinueButtonClick(true) + } else { + val result = fetchSitesAfterCreation() + if (result.isFailure) { + triggerEvent(ShowSnackbar(string.site_picker_error)) + break + } + } } + + sitePickerViewState = sitePickerViewState.copy( + isSkeletonViewVisible = false, isProgressDiaLogVisible = false + ) + } + } + + + + private suspend fun fetchSitesAfterCreation(): Result { + val result = withContext(Dispatchers.IO) { + repository.fetchSites() } + return if (result.isError) Result.failure(Exception(result.error.message)) else Result.success(Unit) } fun onWooInstalled() { From 6040d21f83624ffaf768d971afa6e7094d66f9aa Mon Sep 17 00:00:00 2001 From: Ondrej Ruttkay Date: Sat, 22 Oct 2022 13:15:46 +0200 Subject: [PATCH 05/14] Fix the site reload logic to make sure the new site is ready to be loaded --- .../ui/sitepicker/SitePickerViewModel.kt | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerViewModel.kt index 763902304ef3..cebba6c55f83 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerViewModel.kt @@ -28,6 +28,7 @@ import com.woocommerce.android.ui.sitepicker.SitePickerViewModel.SitesListItem.N import com.woocommerce.android.ui.sitepicker.SitePickerViewModel.SitesListItem.WooSiteUiModel import com.woocommerce.android.util.FeatureFlag import com.woocommerce.android.util.WooLog +import com.woocommerce.android.util.WooLog.T import com.woocommerce.android.viewmodel.LiveDataDelegate import com.woocommerce.android.viewmodel.MultiLiveEvent import com.woocommerce.android.viewmodel.MultiLiveEvent.Event.Exit @@ -71,6 +72,7 @@ class SitePickerViewModel @Inject constructor( private const val WOOCOMMERCE_INSTALLATION_DONE_URL = "marketplace/thank-you/woocommerce" private const val WOOCOMMERCE_STORE_CREATION_URL = "https://woocommerce.com/start" private const val WOOCOMMERCE_STORE_CREATION_DONE_URL = "calypso/images/wpcom-ecommerce" + private const val WOOCOMMERCE_STORE_CREATION_RETRY_INTERVAL = 2000L } private val navArgs: SitePickerFragmentArgs by savedState.navArgs() @@ -95,7 +97,6 @@ class SitePickerViewModel @Inject constructor( } updateSiteViewDetails() loadAndDisplaySites() - onSiteCreated(listOf("www.cnn.com", "www.google.com")) } private fun updateSiteViewDetails() { @@ -545,34 +546,35 @@ class SitePickerViewModel @Inject constructor( isSkeletonViewVisible = false, isProgressDiaLogVisible = true ) - var site: SiteModel? = null - while (site == null) { - site = urls.firstNotNullOfOrNull { url -> repository.getSiteBySiteUrl(url) } - if (site != null) { - onSiteSelected(site) + var newSite: SiteModel? = null + while (newSite?.hasWooCommerce != true) { + newSite = urls.firstNotNullOfOrNull { url -> repository.getSiteBySiteUrl(url) } + if (newSite != null && newSite.hasWooCommerce) { + onSiteSelected(newSite) onContinueButtonClick(true) + WooLog.d(T.LOGIN, "Found new site: ${newSite.url}") } else { + WooLog.d(T.LOGIN, "New site not found, retrying...") val result = fetchSitesAfterCreation() if (result.isFailure) { triggerEvent(ShowSnackbar(string.site_picker_error)) break + } else { + displaySites(result.getOrDefault(emptyList())) } } } - - sitePickerViewState = sitePickerViewState.copy( - isSkeletonViewVisible = false, isProgressDiaLogVisible = false - ) } } - - private suspend fun fetchSitesAfterCreation(): Result { - val result = withContext(Dispatchers.IO) { - repository.fetchSites() + private suspend fun fetchSitesAfterCreation(): Result> { + val result = withContext(Dispatchers.Default) { + delay(WOOCOMMERCE_STORE_CREATION_RETRY_INTERVAL) + repository.fetchWooCommerceSites() } - return if (result.isError) Result.failure(Exception(result.error.message)) else Result.success(Unit) + return if (result.isError) Result.failure(Exception(result.error.message)) + else Result.success(result.model ?: emptyList()) } fun onWooInstalled() { From 43eb48c8407ef8b7f0b3560e786c2fc8976a84fd Mon Sep 17 00:00:00 2001 From: Ondrej Ruttkay Date: Sat, 22 Oct 2022 13:16:57 +0200 Subject: [PATCH 06/14] Prevent the navigation logic from being executed in a paused webview fragment --- .../wpcomwebview/WPComWebViewFragment.kt | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/common/wpcomwebview/WPComWebViewFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/common/wpcomwebview/WPComWebViewFragment.kt index 56b70771a819..6cc03c34673f 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/common/wpcomwebview/WPComWebViewFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/common/wpcomwebview/WPComWebViewFragment.kt @@ -7,6 +7,7 @@ import android.view.View import android.webkit.WebChromeClient import android.webkit.WebView import androidx.core.view.isVisible +import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.navArgs import com.woocommerce.android.R import com.woocommerce.android.databinding.FragmentWpcomWebviewBinding @@ -16,7 +17,10 @@ import com.woocommerce.android.ui.base.BaseFragment import com.woocommerce.android.ui.common.wpcomwebview.WPComWebViewFragment.UrlComparisonMode.EQUALITY import com.woocommerce.android.ui.common.wpcomwebview.WPComWebViewFragment.UrlComparisonMode.PARTIAL import com.woocommerce.android.ui.main.MainActivity.Companion.BackPressListener +import com.woocommerce.android.util.WooLog +import com.woocommerce.android.util.WooLog.T import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.delay import org.wordpress.android.fluxc.network.UserAgent import javax.inject.Inject @@ -78,14 +82,16 @@ class WPComWebViewFragment : BaseFragment(R.layout.fragment_wpcom_webview), UrlI EQUALITY -> equals(url, ignoreCase = true) } - Log.d("Webview", url) extractSiteUrl(url) - if (isAdded && navArgs.urlToTriggerExit?.matchesUrl(url) == true) { - if (siteUrls.isEmpty()) { - navigateBackWithNotice(WEBVIEW_RESULT) - } else { - navigateBackWithResult(WEBVIEW_RESULT_WITH_URL, siteUrls) + lifecycleScope.launchWhenResumed { + if (isAdded && navArgs.urlToTriggerExit?.matchesUrl(url) == true) { + if (siteUrls.isEmpty()) { + navigateBackWithNotice(WEBVIEW_RESULT) + } else { + navigateBackWithResult(WEBVIEW_RESULT_WITH_URL, siteUrls) + WooLog.d(T.LOGIN, "Site creation URLs: ${siteUrls.joinToString()}") + } } } } From 2f4a98bb66366847d2ebe61ddf37f8c2ec1c3ad8 Mon Sep 17 00:00:00 2001 From: Ondrej Ruttkay Date: Sat, 22 Oct 2022 13:17:06 +0200 Subject: [PATCH 07/14] Remove unused code --- .../woocommerce/android/ui/sitepicker/SitePickerRepository.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerRepository.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerRepository.kt index 7efca775f51e..450adf859b8a 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerRepository.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerRepository.kt @@ -41,8 +41,6 @@ class SitePickerRepository @Inject constructor( suspend fun fetchWooCommerceSites() = wooCommerceStore.fetchWooCommerceSites() - suspend fun fetchSites() = siteStore.fetchSites(FetchSitesPayload()) - suspend fun fetchWooCommerceSite(siteModel: SiteModel): Result { return wooCommerceStore.fetchWooCommerceSite(siteModel).let { when { From 1b6106244244d92952a16515fe37c810200c34a0 Mon Sep 17 00:00:00 2001 From: Ondrej Ruttkay Date: Sat, 22 Oct 2022 13:21:23 +0200 Subject: [PATCH 08/14] Fix ktlint issues --- .../android/ui/common/wpcomwebview/WPComWebViewFragment.kt | 2 -- .../woocommerce/android/ui/sitepicker/SitePickerRepository.kt | 1 - .../woocommerce/android/ui/sitepicker/SitePickerViewModel.kt | 3 +-- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/common/wpcomwebview/WPComWebViewFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/common/wpcomwebview/WPComWebViewFragment.kt index 6cc03c34673f..f5a8c3c5f09f 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/common/wpcomwebview/WPComWebViewFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/common/wpcomwebview/WPComWebViewFragment.kt @@ -2,7 +2,6 @@ package com.woocommerce.android.ui.common.wpcomwebview import android.annotation.SuppressLint import android.os.Bundle -import android.util.Log import android.view.View import android.webkit.WebChromeClient import android.webkit.WebView @@ -20,7 +19,6 @@ import com.woocommerce.android.ui.main.MainActivity.Companion.BackPressListener import com.woocommerce.android.util.WooLog import com.woocommerce.android.util.WooLog.T import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.delay import org.wordpress.android.fluxc.network.UserAgent import javax.inject.Inject diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerRepository.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerRepository.kt index 450adf859b8a..507b0594487a 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerRepository.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerRepository.kt @@ -12,7 +12,6 @@ import org.wordpress.android.fluxc.generated.SiteActionBuilder import org.wordpress.android.fluxc.model.SiteModel import org.wordpress.android.fluxc.store.SiteStore import org.wordpress.android.fluxc.store.SiteStore.ConnectSiteInfoPayload -import org.wordpress.android.fluxc.store.SiteStore.FetchSitesPayload import org.wordpress.android.fluxc.store.SiteStore.OnConnectSiteInfoChecked import org.wordpress.android.fluxc.store.SiteStore.SiteErrorType import org.wordpress.android.fluxc.store.WooCommerceStore diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerViewModel.kt index cebba6c55f83..7b3bce4710eb 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerViewModel.kt @@ -567,14 +567,13 @@ class SitePickerViewModel @Inject constructor( } } - private suspend fun fetchSitesAfterCreation(): Result> { val result = withContext(Dispatchers.Default) { delay(WOOCOMMERCE_STORE_CREATION_RETRY_INTERVAL) repository.fetchWooCommerceSites() } return if (result.isError) Result.failure(Exception(result.error.message)) - else Result.success(result.model ?: emptyList()) + else Result.success(result.model ?: emptyList()) } fun onWooInstalled() { From fd11b026064001e08c43614a590151af6133d4da Mon Sep 17 00:00:00 2001 From: Ondrej Ruttkay Date: Sat, 22 Oct 2022 15:08:57 +0200 Subject: [PATCH 09/14] Add a feature flag --- .../com/woocommerce/android/ui/sitepicker/SitePickerFragment.kt | 2 ++ .../src/main/kotlin/com/woocommerce/android/util/FeatureFlag.kt | 2 ++ 2 files changed, 4 insertions(+) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerFragment.kt index c873f38f1171..b8f459e4bf96 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerFragment.kt @@ -42,6 +42,7 @@ import com.woocommerce.android.ui.sitepicker.SitePickerViewModel.SitePickerState import com.woocommerce.android.ui.sitepicker.SitePickerViewModel.SitePickerState.WooNotFoundState import com.woocommerce.android.ui.sitepicker.sitediscovery.SitePickerSiteDiscoveryFragment import com.woocommerce.android.util.ChromeCustomTabUtils +import com.woocommerce.android.util.FeatureFlag import com.woocommerce.android.viewmodel.MultiLiveEvent.Event.Exit import com.woocommerce.android.viewmodel.MultiLiveEvent.Event.Logout import com.woocommerce.android.viewmodel.MultiLiveEvent.Event.ShowDialog @@ -93,6 +94,7 @@ class SitePickerFragment : BaseFragment(R.layout.fragment_site_picker), LoginEma viewModel.onTryAnotherAccountButtonClick() } + binding.loginEpilogueButtonBar.buttonTertiary.isVisible = FeatureFlag.STORE_CREATION_WEBVIEW_FLOW.isEnabled() binding.loginEpilogueButtonBar.buttonTertiary.setOnClickListener { viewModel.onCreateSiteButtonClick() } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/util/FeatureFlag.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/util/FeatureFlag.kt index 8abd743066aa..f171d07fa640 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/util/FeatureFlag.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/util/FeatureFlag.kt @@ -14,6 +14,7 @@ enum class FeatureFlag { WC_SHIPPING_BANNER, UNIFIED_ORDER_EDITING, ORDER_CREATION_CUSTOMER_SEARCH, + STORE_CREATION_WEBVIEW_FLOW, STORE_CREATION_FLOW; fun isEnabled(context: Context? = null): Boolean { @@ -29,6 +30,7 @@ enum class FeatureFlag { MORE_MENU_INBOX, WC_SHIPPING_BANNER, STORE_CREATION_FLOW -> PackageUtils.isDebugBuild() + STORE_CREATION_WEBVIEW_FLOW -> false //PackageUtils.isDebugBuild() } } } From 28d47e2e3a0ee167a7474875c42250e699b06063 Mon Sep 17 00:00:00 2001 From: Ondrej Ruttkay Date: Sun, 23 Oct 2022 21:29:43 +0200 Subject: [PATCH 10/14] Fix the feature flag --- .../src/main/kotlin/com/woocommerce/android/util/FeatureFlag.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/util/FeatureFlag.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/util/FeatureFlag.kt index f171d07fa640..fe84464cd5b8 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/util/FeatureFlag.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/util/FeatureFlag.kt @@ -30,7 +30,7 @@ enum class FeatureFlag { MORE_MENU_INBOX, WC_SHIPPING_BANNER, STORE_CREATION_FLOW -> PackageUtils.isDebugBuild() - STORE_CREATION_WEBVIEW_FLOW -> false //PackageUtils.isDebugBuild() + STORE_CREATION_WEBVIEW_FLOW -> PackageUtils.isDebugBuild() } } } From a1d5f6c2e8c21156c8d7cb62b69fa15b536b9878 Mon Sep 17 00:00:00 2001 From: Ondrej Ruttkay Date: Sun, 23 Oct 2022 21:56:13 +0200 Subject: [PATCH 11/14] Update the fragment title for store creation --- .../android/ui/sitepicker/SitePickerFragment.kt | 4 ++-- .../android/ui/sitepicker/SitePickerViewModel.kt | 12 ++++++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerFragment.kt index af6db9e903ed..1064401fb798 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerFragment.kt @@ -16,7 +16,6 @@ import com.woocommerce.android.analytics.AnalyticsTracker import com.woocommerce.android.databinding.FragmentSitePickerBinding import com.woocommerce.android.extensions.handleNotice import com.woocommerce.android.extensions.handleResult -import com.woocommerce.android.extensions.joinToString import com.woocommerce.android.extensions.navigateSafely import com.woocommerce.android.extensions.takeIfNotEqualTo import com.woocommerce.android.support.HelpActivity @@ -289,7 +288,8 @@ class SitePickerFragment : BaseFragment(R.layout.fragment_site_picker), LoginEma findNavController().navigate( NavGraphMainDirections.actionGlobalWPComWebViewFragment( urlToLoad = event.url, - urlToTriggerExit = event.validationUrl + urlToTriggerExit = event.validationUrl, + title = event.title ) ) } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerViewModel.kt index e8e28c880fb1..a347088a244f 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerViewModel.kt @@ -415,7 +415,11 @@ class SitePickerViewModel @Inject constructor( fun onCreateSiteButtonClick() { analyticsTrackerWrapper.track(AnalyticsEvent.SITE_PICKER_CREATE_SITE_TAPPED) - triggerEvent(NavigateToWPComWebView(WOOCOMMERCE_STORE_CREATION_URL, WOOCOMMERCE_STORE_CREATION_DONE_URL)) + triggerEvent(NavigateToWPComWebView( + url = WOOCOMMERCE_STORE_CREATION_URL, + validationUrl = WOOCOMMERCE_STORE_CREATION_DONE_URL, + title = resourceProvider.getString(string.create_new_store) + )) } fun onTryAnotherAccountButtonClick() { @@ -708,7 +712,11 @@ class SitePickerViewModel @Inject constructor( object NavigateToNewToWooEvent : SitePickerEvent() object NavigateToSiteAddressEvent : SitePickerEvent() data class NavigateToHelpFragmentEvent(val origin: HelpActivity.Origin) : SitePickerEvent() - data class NavigateToWPComWebView(val url: String, val validationUrl: String) : SitePickerEvent() + data class NavigateToWPComWebView( + val url: String, + val validationUrl: String, + val title: String? = null + ) : SitePickerEvent() data class NavigateToAccountMismatchScreen( val primaryButton: AccountMismatchPrimaryButton, val siteUrl: String, From 61f68954514fa493d52e85a2a8a5096d887fb120 Mon Sep 17 00:00:00 2001 From: Ondrej Ruttkay Date: Sun, 23 Oct 2022 22:19:29 +0200 Subject: [PATCH 12/14] Fix the lint issues --- .../android/ui/sitepicker/SitePickerViewModel.kt | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerViewModel.kt index a347088a244f..226f797b6760 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerViewModel.kt @@ -415,11 +415,13 @@ class SitePickerViewModel @Inject constructor( fun onCreateSiteButtonClick() { analyticsTrackerWrapper.track(AnalyticsEvent.SITE_PICKER_CREATE_SITE_TAPPED) - triggerEvent(NavigateToWPComWebView( - url = WOOCOMMERCE_STORE_CREATION_URL, - validationUrl = WOOCOMMERCE_STORE_CREATION_DONE_URL, - title = resourceProvider.getString(string.create_new_store) - )) + triggerEvent( + NavigateToWPComWebView( + url = WOOCOMMERCE_STORE_CREATION_URL, + validationUrl = WOOCOMMERCE_STORE_CREATION_DONE_URL, + title = resourceProvider.getString(string.create_new_store) + ) + ) } fun onTryAnotherAccountButtonClick() { From eda1ab14367d60f70dc76a2de02e3aa50f0a00d7 Mon Sep 17 00:00:00 2001 From: Ondrej Ruttkay Date: Mon, 24 Oct 2022 21:50:56 +0200 Subject: [PATCH 13/14] Fix the way a repeated result returning is handled --- .../common/wpcomwebview/WPComWebViewFragment.kt | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/common/wpcomwebview/WPComWebViewFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/common/wpcomwebview/WPComWebViewFragment.kt index f5a8c3c5f09f..067364c7b3d1 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/common/wpcomwebview/WPComWebViewFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/common/wpcomwebview/WPComWebViewFragment.kt @@ -6,7 +6,6 @@ import android.view.View import android.webkit.WebChromeClient import android.webkit.WebView import androidx.core.view.isVisible -import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.navArgs import com.woocommerce.android.R import com.woocommerce.android.databinding.FragmentWpcomWebviewBinding @@ -41,6 +40,7 @@ class WPComWebViewFragment : BaseFragment(R.layout.fragment_wpcom_webview), UrlI private val webViewClient by lazy { WPComWebViewClient(this) } private val navArgs: WPComWebViewFragmentArgs by navArgs() private var siteUrls = ArrayList() + private var canNavigate = true @Inject lateinit var wpcomWebViewAuthenticator: WPComWebViewAuthenticator @@ -82,14 +82,13 @@ class WPComWebViewFragment : BaseFragment(R.layout.fragment_wpcom_webview), UrlI extractSiteUrl(url) - lifecycleScope.launchWhenResumed { - if (isAdded && navArgs.urlToTriggerExit?.matchesUrl(url) == true) { - if (siteUrls.isEmpty()) { - navigateBackWithNotice(WEBVIEW_RESULT) - } else { - navigateBackWithResult(WEBVIEW_RESULT_WITH_URL, siteUrls) - WooLog.d(T.LOGIN, "Site creation URLs: ${siteUrls.joinToString()}") - } + if (isAdded && navArgs.urlToTriggerExit?.matchesUrl(url) == true && canNavigate) { + canNavigate = false + if (siteUrls.isEmpty()) { + navigateBackWithNotice(WEBVIEW_RESULT) + } else { + navigateBackWithResult(WEBVIEW_RESULT_WITH_URL, siteUrls) + WooLog.d(T.LOGIN, "Site creation URLs: ${siteUrls.joinToString()}") } } } From 71c6a952c129573037ee62f83c3ea31a5b839c6f Mon Sep 17 00:00:00 2001 From: Ondrej Ruttkay Date: Tue, 25 Oct 2022 15:10:17 +0200 Subject: [PATCH 14/14] Rename the STORE_CREATION_FLOW feature flag to ACCOUNT_CREATION_FLOW --- .../com/woocommerce/android/ui/login/LoginPrologueFragment.kt | 2 +- .../main/kotlin/com/woocommerce/android/util/FeatureFlag.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/LoginPrologueFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/LoginPrologueFragment.kt index 67b3b2bad01d..3b9b685eb653 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/LoginPrologueFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/login/LoginPrologueFragment.kt @@ -56,7 +56,7 @@ open class LoginPrologueFragment(@LayoutRes layout: Int) : Fragment(layout) { unifiedLoginTracker.track(Flow.PROLOGUE, Step.PROLOGUE) } - binding.buttonGetStarted.isVisible = FeatureFlag.STORE_CREATION_FLOW.isEnabled() + binding.buttonGetStarted.isVisible = FeatureFlag.ACCOUNT_CREATION_FLOW.isEnabled() binding.buttonGetStarted.setOnClickListener { findNavController().navigate(LoginPrologueFragmentDirections.actionLoginPrologueFragmentToSignupFragment()) } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/util/FeatureFlag.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/util/FeatureFlag.kt index fe84464cd5b8..62c89d0ecd95 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/util/FeatureFlag.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/util/FeatureFlag.kt @@ -15,7 +15,7 @@ enum class FeatureFlag { UNIFIED_ORDER_EDITING, ORDER_CREATION_CUSTOMER_SEARCH, STORE_CREATION_WEBVIEW_FLOW, - STORE_CREATION_FLOW; + ACCOUNT_CREATION_FLOW; fun isEnabled(context: Context? = null): Boolean { return when (this) { @@ -29,7 +29,7 @@ enum class FeatureFlag { ANALYTICS_HUB, MORE_MENU_INBOX, WC_SHIPPING_BANNER, - STORE_CREATION_FLOW -> PackageUtils.isDebugBuild() + ACCOUNT_CREATION_FLOW -> PackageUtils.isDebugBuild() STORE_CREATION_WEBVIEW_FLOW -> PackageUtils.isDebugBuild() } }