Skip to content
Merged
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 @@ -2,7 +2,8 @@ package com.woocommerce.android.wear.di

import android.content.Context
import com.woocommerce.android.BuildConfig
import com.woocommerce.android.wear.system.NetworkStatus
import com.woocommerce.android.wear.system.ConnectionStatus
import com.woocommerce.android.wear.ui.login.LoginRepository
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
Expand All @@ -27,7 +28,10 @@ class AppConfigModule {

@Provides
@Singleton
fun provideNetworkStatus(appContext: Context) = NetworkStatus(appContext)
fun provideConnectionStatus(
appContext: Context,
loginRepository: LoginRepository
) = ConnectionStatus(appContext, loginRepository)

@Provides
fun provideDefaultLocale(): Locale = Locale.getDefault()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.woocommerce.android.wear.system

import android.content.Context
import com.woocommerce.android.wear.ui.login.LoginRepository
import dagger.Reusable
import org.wordpress.android.util.NetworkUtils

@Reusable
class ConnectionStatus(
private val context: Context,
private val loginRepository: LoginRepository
) {
fun isStoreConnected() = NetworkUtils.isNetworkAvailable(context) && loginRepository.isWPCOMSite
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,11 @@ class LoginRepository @Inject constructor(
private val siteFlow: MutableStateFlow<SiteModel?> = MutableStateFlow(null)
val selectedSiteFlow: StateFlow<SiteModel?> = siteFlow
val selectedSite get() = selectedSiteFlow.value
val isSiteAvailable = siteFlow.map { it != null && it.siteId > 0 }
val isSiteAvailable = siteFlow.map { it != null }
val isWPCOMSite
get() = siteFlow.value
?.let { it.origin == SiteModel.ORIGIN_WPCOM_REST }
?: false

init {
loginDataStore.data
Expand All @@ -49,15 +53,20 @@ class LoginRepository @Inject constructor(
?.let { gson.fromJson(it, SiteModel::class.java) }
?: return

coroutineScope.async {
wooCommerceStore.fetchSiteGeneralSettings(site)
}.await()

loginDataStore.edit { prefs ->
prefs[stringPreferencesKey(CURRENT_SITE_KEY)] = siteJSON
data.getString(TOKEN.value)?.let { token ->
wearableStore.updateToken(token)
prefs[stringPreferencesKey(generateTokenKey(site.siteId))] = token
if (site.origin == SiteModel.ORIGIN_WPCOM_REST) {
coroutineScope.async {
wooCommerceStore.fetchSiteGeneralSettings(site)
}.await()
loginDataStore.edit { prefs ->
prefs[stringPreferencesKey(CURRENT_SITE_KEY)] = siteJSON
data.getString(TOKEN.value)?.let { token ->
wearableStore.updateToken(token)
prefs[stringPreferencesKey(generateTokenKey(site.siteId))] = token
}
}
} else {
loginDataStore.edit { prefs ->
prefs[stringPreferencesKey(CURRENT_SITE_KEY)] = siteJSON
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import com.woocommerce.android.wear.model.Refund
import com.woocommerce.android.wear.model.getNonRefundedProducts
import com.woocommerce.android.wear.model.toAppModel
import com.woocommerce.android.wear.phone.PhoneConnectionRepository
import com.woocommerce.android.wear.system.NetworkStatus
import com.woocommerce.android.wear.system.ConnectionStatus
import com.woocommerce.android.wear.ui.orders.OrdersRepository
import com.woocommerce.android.wear.ui.orders.details.FetchOrderProducts.OrderProductsRequest.Error
import com.woocommerce.android.wear.ui.orders.details.FetchOrderProducts.OrderProductsRequest.Finished
Expand All @@ -22,7 +22,7 @@ import javax.inject.Inject
class FetchOrderProducts @Inject constructor(
private val phoneRepository: PhoneConnectionRepository,
private val ordersRepository: OrdersRepository,
private val networkStatus: NetworkStatus
private val connectionStatus: ConnectionStatus
) {
suspend operator fun invoke(
selectedSite: SiteModel,
Expand All @@ -43,7 +43,7 @@ class FetchOrderProducts @Inject constructor(
orderId: Long
): Flow<List<WearOrderedProduct>> {
return when {
networkStatus.isConnected() -> flow {
connectionStatus.isStoreConnected() -> flow {
ordersRepository.fetchOrderRefunds(selectedSite, orderId)
.asWearOrderedProducts(retrieveOrderLineItems(selectedSite, orderId))
.let { emit(it) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import com.woocommerce.android.wear.analytics.AnalyticsTracker
import com.woocommerce.android.wear.extensions.combineWithTimeout
import com.woocommerce.android.wear.extensions.toWearOrder
import com.woocommerce.android.wear.phone.PhoneConnectionRepository
import com.woocommerce.android.wear.system.NetworkStatus
import com.woocommerce.android.wear.system.ConnectionStatus
import com.woocommerce.android.wear.ui.orders.OrdersRepository
import com.woocommerce.android.wear.ui.orders.list.FetchOrders.OrdersRequest.Error
import com.woocommerce.android.wear.ui.orders.list.FetchOrders.OrdersRequest.Finished
Expand All @@ -24,7 +24,7 @@ import javax.inject.Inject
class FetchOrders @Inject constructor(
private val phoneRepository: PhoneConnectionRepository,
private val ordersRepository: OrdersRepository,
private val networkStatus: NetworkStatus,
private val connectionStatus: ConnectionStatus,
private val analyticsTracker: AnalyticsTracker
) {
suspend operator fun invoke(
Expand All @@ -43,7 +43,7 @@ class FetchOrders @Inject constructor(
selectedSite: SiteModel
): Flow<List<WearOrder>> {
return when {
networkStatus.isConnected() -> flow {
connectionStatus.isStoreConnected() -> flow {
analyticsTracker.track(WATCH_DATA_REQUESTED_FROM_STORE)
when (val result = ordersRepository.fetchOrders(selectedSite)) {
is Success -> result.orders
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.woocommerce.android.wear.ui.stats.datasource
import com.woocommerce.android.wear.analytics.AnalyticsTracker
import com.woocommerce.android.wear.extensions.combineWithTimeout
import com.woocommerce.android.wear.phone.PhoneConnectionRepository
import com.woocommerce.android.wear.system.NetworkStatus
import com.woocommerce.android.wear.system.ConnectionStatus
import com.woocommerce.android.wear.ui.stats.datasource.FetchStats.StoreStatsRequest.Error
import com.woocommerce.android.wear.ui.stats.datasource.FetchStats.StoreStatsRequest.Finished
import com.woocommerce.android.wear.ui.stats.datasource.FetchStats.StoreStatsRequest.Waiting
Expand All @@ -25,7 +25,7 @@ class FetchStats @Inject constructor(
private val statsRepository: StatsRepository,
private val phoneRepository: PhoneConnectionRepository,
private val wooCommerceStore: WooCommerceStore,
private val networkStatus: NetworkStatus,
private val connectionStatus: ConnectionStatus,
private val analyticsTracker: AnalyticsTracker
) {
private val revenueStats = MutableStateFlow<RevenueData?>(null)
Expand All @@ -34,7 +34,7 @@ class FetchStats @Inject constructor(
suspend operator fun invoke(
selectedSite: SiteModel
) = when {
networkStatus.isConnected() -> fetchStatsFromStore(selectedSite)
connectionStatus.isStoreConnected() -> fetchStatsFromStore(selectedSite)
phoneRepository.isPhoneConnectionAvailable() -> fetchStatsFromPhone(selectedSite)
else -> flowOf(Error)
}.distinctUntilChanged()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package com.woocommerce.android.wear.ui.orders.details

import com.woocommerce.android.BaseUnitTest
import com.woocommerce.android.wear.phone.PhoneConnectionRepository
import com.woocommerce.android.wear.system.NetworkStatus
import com.woocommerce.android.wear.system.ConnectionStatus
import com.woocommerce.android.wear.ui.orders.OrdersRepository
import com.woocommerce.android.wear.ui.orders.details.FetchOrderProducts.OrderProductsRequest
import com.woocommerce.android.wear.ui.orders.details.FetchOrderProducts.OrderProductsRequest.Finished
Expand All @@ -27,14 +27,14 @@ class FetchOrderProductsTest : BaseUnitTest() {
private val phoneRepository: PhoneConnectionRepository = mock()
private val ordersRepository: OrdersRepository = mock()
private val selectedSite: SiteModel = mock()
private val networkStatus: NetworkStatus = mock()
private val connectionStatus: ConnectionStatus = mock()

private lateinit var sut: FetchOrderProducts

@Before
fun setup() {
whenever(networkStatus.isConnected()).thenReturn(false)
sut = FetchOrderProducts(phoneRepository, ordersRepository, networkStatus)
whenever(connectionStatus.isStoreConnected()).thenReturn(false)
sut = FetchOrderProducts(phoneRepository, ordersRepository, connectionStatus)
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.woocommerce.android.wear.ui.orders.list
import com.woocommerce.android.BaseUnitTest
import com.woocommerce.android.wear.extensions.toWearOrder
import com.woocommerce.android.wear.phone.PhoneConnectionRepository
import com.woocommerce.android.wear.system.NetworkStatus
import com.woocommerce.android.wear.system.ConnectionStatus
import com.woocommerce.android.wear.ui.orders.OrdersRepository
import com.woocommerce.android.wear.ui.orders.list.FetchOrders.OrdersRequest
import com.woocommerce.android.wear.ui.orders.list.FetchOrders.OrdersRequest.Error
Expand All @@ -29,15 +29,15 @@ class FetchOrdersTest : BaseUnitTest() {

private val phoneRepository: PhoneConnectionRepository = mock()
private val ordersRepository: OrdersRepository = mock()
private val networkStatus: NetworkStatus = mock()
private val connectionStatus: ConnectionStatus = mock()
private val selectedSite: SiteModel = mock()

@Test
fun `returns Finished when orders are available`() = testBlocking {
val fetchedOrders = mockedOrders()
val expectedOrders = fetchedOrders.map { it.toWearOrder() }
whenever(ordersRepository.fetchOrders(selectedSite)).thenReturn(Success(fetchedOrders))
whenever(networkStatus.isConnected()).thenReturn(true)
whenever(connectionStatus.isStoreConnected()).thenReturn(true)
val events = mutableListOf<OrdersRequest>()

createSut()
Expand All @@ -53,7 +53,7 @@ class FetchOrdersTest : BaseUnitTest() {
@Test
fun `returns Waiting when no orders and not timeout`() = testBlocking {
whenever(ordersRepository.fetchOrders(selectedSite)).thenReturn(Success(emptyList()))
whenever(networkStatus.isConnected()).thenReturn(true)
whenever(connectionStatus.isStoreConnected()).thenReturn(true)
val events = mutableListOf<OrdersRequest>()

createSut()
Expand All @@ -69,7 +69,7 @@ class FetchOrdersTest : BaseUnitTest() {
@Test
fun `returns Error when no orders and timeout`() = testBlocking {
whenever(ordersRepository.fetchOrders(selectedSite)).thenReturn(Success(emptyList()))
whenever(networkStatus.isConnected()).thenReturn(true)
whenever(connectionStatus.isStoreConnected()).thenReturn(true)
val events = mutableListOf<OrdersRequest>()

createSut()
Expand All @@ -86,7 +86,7 @@ class FetchOrdersTest : BaseUnitTest() {
fun `returns orders from phone when no network connection`() = testBlocking {
val expectedOrders = listOf<WearOrder>(mock())
whenever(phoneRepository.isPhoneConnectionAvailable()).thenReturn(true)
whenever(networkStatus.isConnected()).thenReturn(false)
whenever(connectionStatus.isStoreConnected()).thenReturn(false)
whenever(ordersRepository.observeOrdersDataChanges(selectedSite))
.thenReturn(flowOf(expectedOrders))
val events = mutableListOf<OrdersRequest>()
Expand All @@ -106,7 +106,7 @@ class FetchOrdersTest : BaseUnitTest() {
val fetchedOrders = mockedOrders()
val expectedOrders = fetchedOrders.map { it.toWearOrder() }
whenever(phoneRepository.isPhoneConnectionAvailable()).thenReturn(false)
whenever(networkStatus.isConnected()).thenReturn(false)
whenever(connectionStatus.isStoreConnected()).thenReturn(false)
whenever(ordersRepository.getStoredOrders(selectedSite)).thenReturn(fetchedOrders)
val events = mutableListOf<OrdersRequest>()

Expand All @@ -120,7 +120,7 @@ class FetchOrdersTest : BaseUnitTest() {
assertThat(events).containsExactly(Finished(expectedOrders))
}

private fun createSut() = FetchOrders(phoneRepository, ordersRepository, networkStatus, mock())
private fun createSut() = FetchOrders(phoneRepository, ordersRepository, connectionStatus, mock())

private fun mockedOrders() = listOf(
OrderEntity(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.woocommerce.android.wear.ui.stats.datasource
import com.woocommerce.android.BaseUnitTest
import com.woocommerce.android.wear.analytics.AnalyticsTracker
import com.woocommerce.android.wear.phone.PhoneConnectionRepository
import com.woocommerce.android.wear.system.NetworkStatus
import com.woocommerce.android.wear.system.ConnectionStatus
import com.woocommerce.android.wear.ui.stats.datasource.FetchStats.StoreStatsRequest
import com.woocommerce.android.wear.ui.stats.datasource.FetchStats.StoreStatsRequest.Finished
import com.woocommerce.android.wear.ui.stats.datasource.FetchStats.StoreStatsRequest.Waiting
Expand Down Expand Up @@ -31,7 +31,7 @@ class FetchStatsTest : BaseUnitTest() {
private val statsRepository: StatsRepository = mock()
private val phoneRepository: PhoneConnectionRepository = mock()
private val wooCommerceStore: WooCommerceStore = mock()
private val networkStatus: NetworkStatus = mock()
private val connectionStatus: ConnectionStatus = mock()
private val analyticsTracker: AnalyticsTracker = mock()
private val selectedSite: SiteModel = mock()

Expand All @@ -50,7 +50,7 @@ class FetchStatsTest : BaseUnitTest() {
fun `returns Waiting when no stats and not timeout`() = testBlocking {
whenever(statsRepository.fetchRevenueStats(selectedSite)).thenReturn(Result.failure(Throwable()))
whenever(statsRepository.fetchVisitorStats(selectedSite)).thenReturn(Result.failure(Throwable()))
whenever(networkStatus.isConnected()).thenReturn(true)
whenever(connectionStatus.isStoreConnected()).thenReturn(true)

val event = createSut()
.invoke(selectedSite)
Expand All @@ -63,7 +63,7 @@ class FetchStatsTest : BaseUnitTest() {
fun `returns Error when no stats and timeout`() = testBlocking {
whenever(statsRepository.fetchRevenueStats(selectedSite)).thenReturn(Result.failure(Throwable()))
whenever(statsRepository.fetchVisitorStats(selectedSite)).thenReturn(Result.failure(Throwable()))
whenever(networkStatus.isConnected()).thenReturn(true)
whenever(connectionStatus.isStoreConnected()).thenReturn(true)

val event = createSut()
.invoke(selectedSite)
Expand All @@ -77,7 +77,7 @@ class FetchStatsTest : BaseUnitTest() {
fun `returns stats from phone when no network connection`() = testBlocking {
val expectedData = StoreStatsData(StoreStatsData.RevenueData("100.0", 5), 1)
whenever(phoneRepository.isPhoneConnectionAvailable()).thenReturn(true)
whenever(networkStatus.isConnected()).thenReturn(false)
whenever(connectionStatus.isStoreConnected()).thenReturn(false)
whenever(statsRepository.observeStatsDataChanges(selectedSite)).thenReturn(flowOf(expectedData))
val events = mutableListOf<StoreStatsRequest>()

Expand All @@ -95,7 +95,7 @@ class FetchStatsTest : BaseUnitTest() {
@Test
fun `returns Error when no network and phone connection`() = testBlocking {
whenever(phoneRepository.isPhoneConnectionAvailable()).thenReturn(false)
whenever(networkStatus.isConnected()).thenReturn(false)
whenever(connectionStatus.isStoreConnected()).thenReturn(false)
val events = mutableListOf<StoreStatsRequest>()

createSut()
Expand All @@ -108,7 +108,7 @@ class FetchStatsTest : BaseUnitTest() {
}

private fun createSut() =
FetchStats(statsRepository, phoneRepository, wooCommerceStore, networkStatus, analyticsTracker)
FetchStats(statsRepository, phoneRepository, wooCommerceStore, connectionStatus, analyticsTracker)

private suspend fun generateStatsDataWithExpectedMocks(): StoreStatsData {
val expectedData = StoreStatsData(StoreStatsData.RevenueData("100.0", 5), 1)
Expand All @@ -121,7 +121,7 @@ class FetchStatsTest : BaseUnitTest() {
}
whenever(statsRepository.fetchRevenueStats(selectedSite)).thenReturn(Result.success(revenueResponse))
whenever(statsRepository.fetchVisitorStats(selectedSite)).thenReturn(Result.success(1))
whenever(networkStatus.isConnected()).thenReturn(true)
whenever(connectionStatus.isStoreConnected()).thenReturn(true)
whenever(wooCommerceStore.formatCurrencyForDisplay(100.0, selectedSite, null, true)).thenReturn("100.0")
return expectedData
}
Expand Down