Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -408,9 +408,12 @@ class AnalyticsTracker private constructor(
const val KEY_DOWNLOADABLE_FILE_ACTION = "action"

// -- Connectivity Tool
const val VALUE_INTERNET = "internet"
const val VALUE_SITE = "site"
const val VALUE_JETPACK_TUNNEL = "jetpack_tunnel"
const val KEY_CONNECTIVITY_TEST = "test"
const val VALUE_CONNECTIVITY_INTERNET = "internet"
const val VALUE_CONNECTIVITY_WP_COM = "wpCom"
const val VALUE_CONNECTIVITY_SITE = "site"
const val VALUE_CONNECTIVITY_ORDERS = "orders"
const val VALUE_CONNECTIVITY_PRODUCTS = "products"

enum class DownloadableFileAction(val value: String) {
ADDED("added"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,20 @@ sealed class ConnectivityCheckCardData(
retryConnectionAction = retryConnectionAction,
readMoreAction = readMoreAction
)

@Parcelize
data class StoreProductsConnectivityCheckData(
override val connectivityCheckStatus: ConnectivityCheckStatus = NotStarted,
@IgnoredOnParcel override val retryConnectionAction: OnRetryConnection? = null,
@IgnoredOnParcel override val readMoreAction: OnReadMoreClicked? = null
) : Parcelable, ConnectivityCheckCardData(
title = R.string.orderlist_connectivity_tool_store_products_check_title,
suggestion = R.string.orderlist_connectivity_tool_generic_error_suggestion,
icon = R.drawable.ic_product,
connectivityCheckStatus = connectivityCheckStatus,
retryConnectionAction = retryConnectionAction,
readMoreAction = readMoreAction
)
}

@Parcelize
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ import com.woocommerce.android.ui.compose.theme.WooThemeWithBackground
import com.woocommerce.android.ui.connectivitytool.ConnectivityCheckCardData.InternetConnectivityCheckData
import com.woocommerce.android.ui.connectivitytool.ConnectivityCheckCardData.StoreConnectivityCheckData
import com.woocommerce.android.ui.connectivitytool.ConnectivityCheckCardData.StoreOrdersConnectivityCheckData
import com.woocommerce.android.ui.connectivitytool.ConnectivityCheckCardData.StoreProductsConnectivityCheckData
import com.woocommerce.android.ui.connectivitytool.ConnectivityCheckCardData.WordPressConnectivityCheckData
import com.woocommerce.android.ui.connectivitytool.ConnectivityCheckStatus.Failure
import com.woocommerce.android.ui.connectivitytool.ConnectivityCheckStatus.InProgress
Expand All @@ -60,6 +61,7 @@ fun ConnectivityToolScreen(viewModel: ConnectivityToolViewModel) {
wordpressConnectionCheckData = viewState?.wordPressCheckData,
storeConnectionCheckData = viewState?.storeCheckData,
storeOrdersCheckData = viewState?.ordersCheckData,
storeProductsCheckData = viewState?.productsCheckData,
isWordPressCheckVisible = viewState?.isWordPressCheckVisible ?: true,
onContactSupportClicked = viewModel::onContactSupportClicked,
onReturnClick = viewModel::onReturnClicked
Expand All @@ -74,6 +76,7 @@ fun ConnectivityToolScreen(
wordpressConnectionCheckData: WordPressConnectivityCheckData?,
storeConnectionCheckData: StoreConnectivityCheckData?,
storeOrdersCheckData: StoreOrdersConnectivityCheckData?,
storeProductsCheckData: StoreProductsConnectivityCheckData?,
isWordPressCheckVisible: Boolean,
onContactSupportClicked: () -> Unit,
onReturnClick: () -> Unit,
Expand Down Expand Up @@ -105,6 +108,7 @@ fun ConnectivityToolScreen(
}
ConnectivityCheckCard(storeConnectionCheckData)
ConnectivityCheckCard(storeOrdersCheckData)
ConnectivityCheckCard(storeProductsCheckData)

ConnectivitySummary(
shouldDisplaySummarySection = shouldDisplaySummarySection,
Expand Down Expand Up @@ -324,6 +328,9 @@ fun ConnectivityToolScreenPreview() {
storeOrdersCheckData = StoreOrdersConnectivityCheckData(
connectivityCheckStatus = InProgress
),
storeProductsCheckData = StoreProductsConnectivityCheckData(
connectivityCheckStatus = NotStarted
),
isWordPressCheckVisible = true,
onContactSupportClicked = {},
onReturnClick = {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,19 @@ import androidx.lifecycle.asLiveData
import androidx.lifecycle.viewModelScope
import com.woocommerce.android.analytics.AnalyticsEvent
import com.woocommerce.android.analytics.AnalyticsTracker
import com.woocommerce.android.analytics.AnalyticsTracker.Companion.VALUE_INTERNET
import com.woocommerce.android.analytics.AnalyticsTracker.Companion.VALUE_JETPACK_TUNNEL
import com.woocommerce.android.analytics.AnalyticsTracker.Companion.VALUE_SITE
import com.woocommerce.android.analytics.AnalyticsTracker.Companion.VALUE_WP_COM
import com.woocommerce.android.analytics.AnalyticsTracker.Companion.KEY_CONNECTIVITY_TEST
import com.woocommerce.android.analytics.AnalyticsTracker.Companion.VALUE_CONNECTIVITY_INTERNET
import com.woocommerce.android.analytics.AnalyticsTracker.Companion.VALUE_CONNECTIVITY_ORDERS
import com.woocommerce.android.analytics.AnalyticsTracker.Companion.VALUE_CONNECTIVITY_PRODUCTS
import com.woocommerce.android.analytics.AnalyticsTracker.Companion.VALUE_CONNECTIVITY_SITE
import com.woocommerce.android.analytics.AnalyticsTracker.Companion.VALUE_CONNECTIVITY_WP_COM
import com.woocommerce.android.analytics.AnalyticsTrackerWrapper
import com.woocommerce.android.tools.SelectedSite
import com.woocommerce.android.tools.SiteConnectionType
import com.woocommerce.android.ui.connectivitytool.ConnectivityCheckCardData.InternetConnectivityCheckData
import com.woocommerce.android.ui.connectivitytool.ConnectivityCheckCardData.StoreConnectivityCheckData
import com.woocommerce.android.ui.connectivitytool.ConnectivityCheckCardData.StoreOrdersConnectivityCheckData
import com.woocommerce.android.ui.connectivitytool.ConnectivityCheckCardData.StoreProductsConnectivityCheckData
import com.woocommerce.android.ui.connectivitytool.ConnectivityCheckCardData.WordPressConnectivityCheckData
import com.woocommerce.android.ui.connectivitytool.ConnectivityCheckStatus.Failure
import com.woocommerce.android.ui.connectivitytool.ConnectivityCheckStatus.InProgress
Expand All @@ -24,10 +27,12 @@ import com.woocommerce.android.ui.connectivitytool.ConnectivityToolViewModel.Con
import com.woocommerce.android.ui.connectivitytool.ConnectivityToolViewModel.ConnectivityCheckStep.InternetCheck
import com.woocommerce.android.ui.connectivitytool.ConnectivityToolViewModel.ConnectivityCheckStep.StoreCheck
import com.woocommerce.android.ui.connectivitytool.ConnectivityToolViewModel.ConnectivityCheckStep.StoreOrdersCheck
import com.woocommerce.android.ui.connectivitytool.ConnectivityToolViewModel.ConnectivityCheckStep.StoreProductsCheck
import com.woocommerce.android.ui.connectivitytool.ConnectivityToolViewModel.ConnectivityCheckStep.WordPressCheck
import com.woocommerce.android.ui.connectivitytool.useCases.InternetConnectionCheckUseCase
import com.woocommerce.android.ui.connectivitytool.useCases.StoreConnectionCheckUseCase
import com.woocommerce.android.ui.connectivitytool.useCases.StoreOrdersCheckUseCase
import com.woocommerce.android.ui.connectivitytool.useCases.StoreProductsCheckUseCase
import com.woocommerce.android.ui.connectivitytool.useCases.WordPressConnectionCheckUseCase
import com.woocommerce.android.viewmodel.MultiLiveEvent
import com.woocommerce.android.viewmodel.MultiLiveEvent.Event.Exit
Expand All @@ -49,6 +54,7 @@ class ConnectivityToolViewModel @Inject constructor(
private val wordPressConnectionCheck: WordPressConnectionCheckUseCase,
private val storeConnectionCheck: StoreConnectionCheckUseCase,
private val storeOrdersCheck: StoreOrdersCheckUseCase,
private val storeProductsCheck: StoreProductsCheckUseCase,
private val analyticsTrackerWrapper: AnalyticsTrackerWrapper,
private val selectedSite: SelectedSite,
savedState: SavedStateHandle
Expand Down Expand Up @@ -88,17 +94,26 @@ class ConnectivityToolViewModel @Inject constructor(
)
)

private val productsCheckFlow = savedState.getStateFlow(
scope = viewModelScope,
initialValue = StoreProductsConnectivityCheckData(
retryConnectionAction = { handleRetryConnectionClick(StoreProductsCheck) }
)
)

val viewState = combine(
internetCheckFlow,
wordpressCheckFlow,
storeCheckFlow,
ordersCheckFlow
) { internet, wordpress, store, orders ->
ordersCheckFlow,
productsCheckFlow
) { internet, wordpress, store, orders, products ->
ViewState(
internetCheckData = internet,
wordPressCheckData = wordpress,
storeCheckData = store,
ordersCheckData = orders,
productsCheckData = products,
isWordPressCheckVisible = !isAppPasswordSite
)
}.distinctUntilChanged().asLiveData()
Expand All @@ -110,7 +125,8 @@ class ConnectivityToolViewModel @Inject constructor(
InternetCheck -> if (isAppPasswordSite) StoreCheck else WordPressCheck
WordPressCheck -> StoreCheck
StoreCheck -> StoreOrdersCheck
StoreOrdersCheck -> Finished
StoreOrdersCheck -> StoreProductsCheck
StoreProductsCheck -> Finished
Finished -> error("Cannot move to next state from Finished")
}

Expand All @@ -122,6 +138,7 @@ class ConnectivityToolViewModel @Inject constructor(
WordPressCheck -> startWordPressCheck()
StoreCheck -> startStoreCheck()
StoreOrdersCheck -> startStoreOrdersCheck()
StoreProductsCheck -> startProductsCheck()
Finished -> { /* No-op */ }
}
}
Expand All @@ -143,6 +160,7 @@ class ConnectivityToolViewModel @Inject constructor(
WordPressCheck -> wordpressCheckFlow.update { it.copy(connectivityCheckStatus = NotStarted) }
StoreCheck -> storeCheckFlow.update { it.copy(connectivityCheckStatus = NotStarted) }
StoreOrdersCheck -> ordersCheckFlow.update { it.copy(connectivityCheckStatus = NotStarted) }
StoreProductsCheck -> productsCheckFlow.update { it.copy(connectivityCheckStatus = NotStarted) }
Finished -> { /* No-op */ }
}
stateMachine.update { step }
Expand All @@ -159,7 +177,7 @@ class ConnectivityToolViewModel @Inject constructor(
private fun startInternetCheck() {
val startTime = System.currentTimeMillis()
internetConnectionCheck().onEach { status ->
trackChanges(status, VALUE_INTERNET, startTime)
trackChanges(status, VALUE_CONNECTIVITY_INTERNET, startTime)
status.startNextCheck()
internetCheckFlow.update { it.copy(connectivityCheckStatus = status) }
}.launchIn(viewModelScope)
Expand All @@ -168,7 +186,7 @@ class ConnectivityToolViewModel @Inject constructor(
private fun startWordPressCheck() {
val startTime = System.currentTimeMillis()
wordPressConnectionCheck().onEach { status ->
trackChanges(status, VALUE_WP_COM, startTime)
trackChanges(status, VALUE_CONNECTIVITY_WP_COM, startTime)
status.startNextCheck()
wordpressCheckFlow.update { it.copy(connectivityCheckStatus = status) }
}.launchIn(viewModelScope)
Expand All @@ -177,7 +195,7 @@ class ConnectivityToolViewModel @Inject constructor(
private fun startStoreCheck() {
val startTime = System.currentTimeMillis()
storeConnectionCheck().onEach { status ->
trackChanges(status, VALUE_SITE, startTime)
trackChanges(status, VALUE_CONNECTIVITY_SITE, startTime)
status.startNextCheck()
storeCheckFlow.update {
if (status is Failure) {
Expand All @@ -195,7 +213,7 @@ class ConnectivityToolViewModel @Inject constructor(
private fun startStoreOrdersCheck() {
val startTime = System.currentTimeMillis()
storeOrdersCheck().onEach { status ->
trackChanges(status, VALUE_JETPACK_TUNNEL, startTime)
trackChanges(status, VALUE_CONNECTIVITY_ORDERS, startTime)
status.startNextCheck()
ordersCheckFlow.update {
if (status is Failure) {
Expand All @@ -210,6 +228,24 @@ class ConnectivityToolViewModel @Inject constructor(
}.launchIn(viewModelScope)
}

private fun startProductsCheck() {
val startTime = System.currentTimeMillis()
storeProductsCheck().onEach { status ->
trackChanges(status, VALUE_CONNECTIVITY_PRODUCTS, startTime)
status.startNextCheck()
productsCheckFlow.update {
if (status is Failure) {
it.copy(
connectivityCheckStatus = status,
readMoreAction = { handleReadMoreClick(status.error ?: FailureType.GENERIC) }
)
} else {
it.copy(connectivityCheckStatus = status)
}
}
}.launchIn(viewModelScope)
}

private fun ConnectivityCheckStatus.startNextCheck() {
if (stateMachine.value == Finished) return

Expand All @@ -233,7 +269,7 @@ class ConnectivityToolViewModel @Inject constructor(
AnalyticsEvent.CONNECTIVITY_TOOL_REQUEST_RESPONSE,
mapOf(
AnalyticsTracker.KEY_SUCCESS to (status is Success),
AnalyticsTracker.KEY_TYPE to type,
KEY_CONNECTIVITY_TEST to type,
AnalyticsTracker.KEY_TIME_TAKEN to (System.currentTimeMillis() - startTime)
)
)
Expand All @@ -247,20 +283,23 @@ class ConnectivityToolViewModel @Inject constructor(
val wordPressCheckData: WordPressConnectivityCheckData,
val storeCheckData: StoreConnectivityCheckData,
val ordersCheckData: StoreOrdersConnectivityCheckData,
val productsCheckData: StoreProductsConnectivityCheckData,
val isWordPressCheckVisible: Boolean = true
) {
val shouldDisplaySummary: Boolean
get() = internetCheckData.connectivityCheckStatus is Success &&
(wordPressCheckData.connectivityCheckStatus is Success || !isWordPressCheckVisible) &&
storeCheckData.connectivityCheckStatus is Success &&
ordersCheckData.connectivityCheckStatus is Success
ordersCheckData.connectivityCheckStatus is Success &&
productsCheckData.connectivityCheckStatus is Success
}

enum class ConnectivityCheckStep {
InternetCheck,
WordPressCheck,
StoreCheck,
StoreOrdersCheck,
StoreProductsCheck,
Finished
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.woocommerce.android.ui.connectivitytool.useCases

import com.woocommerce.android.tools.SelectedSite
import com.woocommerce.android.ui.connectivitytool.ConnectivityCheckStatus
import com.woocommerce.android.ui.connectivitytool.ConnectivityCheckStatus.Failure
import com.woocommerce.android.ui.connectivitytool.ConnectivityCheckStatus.InProgress
import com.woocommerce.android.ui.connectivitytool.ConnectivityCheckStatus.Success
import com.woocommerce.android.ui.connectivitytool.FailureType
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import org.wordpress.android.fluxc.network.rest.wpcom.wc.WooErrorType
import org.wordpress.android.fluxc.network.rest.wpcom.wc.WooResult
import org.wordpress.android.fluxc.store.WCProductStore
import javax.inject.Inject

class StoreProductsCheckUseCase @Inject constructor(
private val productStore: WCProductStore,
private val selectedSite: SelectedSite
) {
operator fun invoke(): Flow<ConnectivityCheckStatus> = flow {
emit(InProgress)
productStore.fetchProducts(site = selectedSite.get(), forceRefresh = true)
.takeIf { it.isError }
?.parseError()
?.let { emit(it) }
?: emit(Success)
}

private fun WooResult<Boolean>.parseError() =
when (error.type) {
WooErrorType.TIMEOUT -> Failure(FailureType.TIMEOUT)
WooErrorType.API_NOT_FOUND -> Failure(FailureType.JETPACK)
WooErrorType.INVALID_RESPONSE -> Failure(FailureType.PARSE)
else -> Failure(FailureType.GENERIC)
}
}
1 change: 1 addition & 0 deletions WooCommerce/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -526,6 +526,7 @@
<string name="orderlist_connectivity_tool_wordpress_check_suggestion">We can\'t connect to WordPress.com right now.\n\nTry again in a few minutes, or contact our support team and we will happily assist you.</string>
<string name="orderlist_connectivity_tool_store_check_title">Connecting to your site</string>
<string name="orderlist_connectivity_tool_store_orders_check_title">Fetching your site orders</string>
<string name="orderlist_connectivity_tool_store_products_check_title">Fetching products in your store</string>
<string name="orderlist_connectivity_tool_contact_support_action">Contact Support</string>
<string name="orderlist_connectivity_tool_read_more_action">Read More</string>
<string name="orderlist_connectivity_tool_retry_action">Retry connection</string>
Expand Down
Loading
Loading