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
@@ -1,7 +1,10 @@
package org.wordpress.android.networking.restapi

import okhttp3.OkHttpClient
import org.wordpress.android.fluxc.network.TrackNetworkRequestsInterceptor
import org.wordpress.android.fluxc.network.rest.wpapi.rs.WpNetworkAvailabilityProvider
import org.wordpress.android.util.AppLog
import rs.wordpress.api.kotlin.RequestErrorLogger
import rs.wordpress.api.kotlin.WpComApiClient
import rs.wordpress.api.kotlin.WpHttpClient
import rs.wordpress.api.kotlin.WpRequestExecutor
Expand All @@ -15,12 +18,14 @@ private const val CONNECT_TIMEOUT = 30L

class WpComApiClientProvider @Inject constructor(
private val networkAvailabilityProvider: WpNetworkAvailabilityProvider,
private val trackNetworkRequestsInterceptor: TrackNetworkRequestsInterceptor,
) {
fun getWpComApiClient(accessToken: String): WpComApiClient {
val okHttpClient = OkHttpClient.Builder()
.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS)
.readTimeout(READ_WRITE_TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(READ_WRITE_TIMEOUT, TimeUnit.SECONDS)
.addInterceptor(trackNetworkRequestsInterceptor)
.build()

return WpComApiClient(
Expand All @@ -29,7 +34,8 @@ class WpComApiClientProvider @Inject constructor(
networkAvailabilityProvider = networkAvailabilityProvider
),
authProvider = WpAuthenticationProvider.staticWithAuth(WpAuthentication.Bearer(token = accessToken)
)
),
errorLogger = RequestErrorLogger { AppLog.e(AppLog.T.API, it) }
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,12 @@ import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.withContext
import org.wordpress.android.R
import org.wordpress.android.fluxc.model.SiteModel
import org.wordpress.android.fluxc.network.TrackNetworkRequestsInterceptor
import org.wordpress.android.fluxc.network.rest.wpapi.rs.WpApiClientProvider
import org.wordpress.android.fluxc.network.rest.wpapi.rs.WpNetworkAvailabilityProvider
import org.wordpress.android.fluxc.store.AccountStore
import org.wordpress.android.fluxc.utils.AppLogWrapper
import org.wordpress.android.modules.IO_THREAD
import org.wordpress.android.modules.UI_THREAD
import org.wordpress.android.networking.restapi.WpComApiClientProvider
import org.wordpress.android.ui.dataview.DataViewDropdownItem
import org.wordpress.android.ui.dataview.DataViewFieldType
import org.wordpress.android.ui.dataview.DataViewItem
Expand Down Expand Up @@ -44,8 +43,7 @@ class ApplicationPasswordsViewModel @Inject constructor(
sharedPrefs: SharedPreferences,
networkUtilsWrapper: NetworkUtilsWrapper,
@Named(IO_THREAD) ioDispatcher: CoroutineDispatcher,
trackNetworkRequestsInterceptor: TrackNetworkRequestsInterceptor,
networkAvailabilityProvider: WpNetworkAvailabilityProvider,
wpComApiClientProvider: WpComApiClientProvider,
) : DataViewViewModel(
mainDispatcher = mainDispatcher,
appLogWrapper = appLogWrapper,
Expand All @@ -54,8 +52,7 @@ class ApplicationPasswordsViewModel @Inject constructor(
selectedSiteRepository = selectedSiteRepository,
accountStore = accountStore,
ioDispatcher = ioDispatcher,
trackNetworkRequestsInterceptor = trackNetworkRequestsInterceptor,
networkAvailabilityProvider = networkAvailabilityProvider
wpComApiClientProvider = wpComApiClientProvider
) {
init {
initialize()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,10 @@ import org.wordpress.android.modules.UI_THREAD
import org.wordpress.android.ui.mysite.SelectedSiteRepository
import org.wordpress.android.util.AppLog
import org.wordpress.android.util.NetworkUtilsWrapper
import org.wordpress.android.fluxc.network.TrackNetworkRequestsInterceptor
import org.wordpress.android.fluxc.network.rest.wpapi.rs.WpNetworkAvailabilityProvider
import org.wordpress.android.networking.restapi.WpComApiClientProvider
import org.wordpress.android.viewmodel.ScopedViewModel
import rs.wordpress.api.kotlin.WpComApiClient
import uniffi.wp_api.WpApiParamOrder
import uniffi.wp_api.WpAuthentication
import uniffi.wp_api.WpAuthenticationProvider
import javax.inject.Inject
import javax.inject.Named

Expand All @@ -45,8 +42,7 @@ open class DataViewViewModel @Inject constructor(
private val selectedSiteRepository: SelectedSiteRepository,
private val accountStore: AccountStore,
@Named(IO_THREAD) protected val ioDispatcher: CoroutineDispatcher,
private val trackNetworkRequestsInterceptor: TrackNetworkRequestsInterceptor,
private val networkAvailabilityProvider: WpNetworkAvailabilityProvider,
private val wpComApiClientProvider: WpComApiClientProvider,
) : ScopedViewModel(mainDispatcher) {
private val _uiState = MutableStateFlow(DataViewUiState())
val uiState: StateFlow<DataViewUiState> = _uiState.asStateFlow()
Expand Down Expand Up @@ -82,16 +78,9 @@ open class DataViewViewModel @Inject constructor(
}
}

// TODO this is strictly for wp.com sites, we'll need different auth for self-hosted
protected val wpComApiClient: WpComApiClient by lazy {
WpComApiClient(
authProvider = WpAuthenticationProvider.staticWithAuth(
requireNotNull(accountStore.accessToken) { "Access token is required but was null" }.let { token ->
WpAuthentication.Bearer(token = token)
}
),
interceptors = listOf(trackNetworkRequestsInterceptor),
networkAvailabilityProvider = networkAvailabilityProvider
wpComApiClientProvider.getWpComApiClient(
requireNotNull(accountStore.accessToken) { "Access token is required but was null" }
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,19 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.withContext
import org.wordpress.android.R
import org.wordpress.android.fluxc.network.TrackNetworkRequestsInterceptor
import org.wordpress.android.fluxc.network.rest.wpapi.rs.WpNetworkAvailabilityProvider
import org.wordpress.android.fluxc.store.AccountStore
import org.wordpress.android.fluxc.utils.AppLogWrapper
import org.wordpress.android.modules.BG_THREAD
import org.wordpress.android.modules.IO_THREAD
import org.wordpress.android.modules.UI_THREAD
import org.wordpress.android.networking.restapi.WpComApiClientProvider
import org.wordpress.android.ui.mysite.SelectedSiteRepository
import org.wordpress.android.util.AppLog
import org.wordpress.android.util.ToastUtilsWrapper
import org.wordpress.android.viewmodel.ScopedViewModel
import rs.wordpress.api.kotlin.WpComApiClient
import rs.wordpress.api.kotlin.WpRequestResult
import uniffi.wp_api.AddSubscribersParams
import uniffi.wp_api.WpAuthentication
import uniffi.wp_api.WpAuthenticationProvider
import javax.inject.Inject
import javax.inject.Named

Expand All @@ -31,8 +28,7 @@ class AddSubscribersViewModel @Inject constructor(
@Named(BG_THREAD) private val bgDispatcher: CoroutineDispatcher,
private val appLogWrapper: AppLogWrapper,
private val toastUtilsWrapper: ToastUtilsWrapper,
private val trackNetworkRequestsInterceptor: TrackNetworkRequestsInterceptor,
private val networkAvailabilityProvider: WpNetworkAvailabilityProvider,
private val wpComApiClientProvider: WpComApiClientProvider,
) : ScopedViewModel(bgDispatcher) {
@Inject
@Named(IO_THREAD)
Expand All @@ -48,13 +44,7 @@ class AddSubscribersViewModel @Inject constructor(
val showProgress = _showProgress.asStateFlow()

private val wpComApiClient: WpComApiClient by lazy {
WpComApiClient(
WpAuthenticationProvider.staticWithAuth(
WpAuthentication.Bearer(token = accountStore.accessToken!!)
),
interceptors = listOf(trackNetworkRequestsInterceptor),
networkAvailabilityProvider = networkAvailabilityProvider
)
wpComApiClientProvider.getWpComApiClient(accountStore.accessToken!!)
}

private fun siteId(): Long {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,12 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.withContext
import org.wordpress.android.R
import org.wordpress.android.fluxc.network.TrackNetworkRequestsInterceptor
import org.wordpress.android.fluxc.network.rest.wpapi.rs.WpNetworkAvailabilityProvider
import org.wordpress.android.fluxc.store.AccountStore
import org.wordpress.android.fluxc.utils.AppLogWrapper
import org.wordpress.android.models.wrappers.SimpleDateFormatWrapper
import org.wordpress.android.modules.IO_THREAD
import org.wordpress.android.modules.UI_THREAD
import org.wordpress.android.networking.restapi.WpComApiClientProvider
import org.wordpress.android.ui.dataview.DataViewDropdownItem
import org.wordpress.android.ui.dataview.DataViewFieldType
import org.wordpress.android.ui.dataview.DataViewItem
Expand Down Expand Up @@ -45,8 +44,7 @@ class SubscribersViewModel @Inject constructor(
selectedSiteRepository: SelectedSiteRepository,
accountStore: AccountStore,
@Named(IO_THREAD) ioDispatcher: CoroutineDispatcher,
trackNetworkRequestsInterceptor: TrackNetworkRequestsInterceptor,
networkAvailabilityProvider: WpNetworkAvailabilityProvider,
wpComApiClientProvider: WpComApiClientProvider,
) : DataViewViewModel(
mainDispatcher = mainDispatcher,
appLogWrapper = appLogWrapper,
Expand All @@ -55,8 +53,7 @@ class SubscribersViewModel @Inject constructor(
selectedSiteRepository = selectedSiteRepository,
accountStore = accountStore,
ioDispatcher = ioDispatcher,
trackNetworkRequestsInterceptor = trackNetworkRequestsInterceptor,
networkAvailabilityProvider = networkAvailabilityProvider
wpComApiClientProvider = wpComApiClientProvider
) {
private val _subscriberStats = MutableStateFlow<IndividualSubscriberStats?>(null)
val subscriberStats = _subscriberStats.asStateFlow()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,7 @@ import org.wordpress.android.fluxc.generated.TaxonomyActionBuilder
import org.wordpress.android.fluxc.model.SiteModel
import org.wordpress.android.fluxc.model.TermModel
import org.wordpress.android.fluxc.model.TermsModel
import org.wordpress.android.fluxc.network.TrackNetworkRequestsInterceptor
import org.wordpress.android.fluxc.network.rest.wpapi.rs.WpApiClientProvider
import org.wordpress.android.fluxc.network.rest.wpapi.rs.WpNetworkAvailabilityProvider
import org.wordpress.android.fluxc.store.AccountStore
import org.wordpress.android.fluxc.store.TaxonomyStore
import org.wordpress.android.fluxc.store.TaxonomyStore.DEFAULT_TAXONOMY_CATEGORY
Expand All @@ -30,6 +28,7 @@ import org.wordpress.android.fluxc.store.TaxonomyStore.FetchTermsResponsePayload
import org.wordpress.android.fluxc.utils.AppLogWrapper
import org.wordpress.android.modules.IO_THREAD
import org.wordpress.android.modules.UI_THREAD
import org.wordpress.android.networking.restapi.WpComApiClientProvider
import org.wordpress.android.ui.dataview.DataViewDropdownItem
import org.wordpress.android.ui.dataview.DataViewFieldType
import org.wordpress.android.ui.dataview.DataViewItem
Expand Down Expand Up @@ -89,8 +88,7 @@ class TermsViewModel @Inject constructor(
sharedPrefs: SharedPreferences,
networkUtilsWrapper: NetworkUtilsWrapper,
@Named(IO_THREAD) ioDispatcher: CoroutineDispatcher,
trackNetworkRequestsInterceptor: TrackNetworkRequestsInterceptor,
networkAvailabilityProvider: WpNetworkAvailabilityProvider,
wpComApiClientProvider: WpComApiClientProvider,
) : DataViewViewModel(
mainDispatcher = mainDispatcher,
appLogWrapper = appLogWrapper,
Expand All @@ -99,8 +97,7 @@ class TermsViewModel @Inject constructor(
selectedSiteRepository = selectedSiteRepository,
accountStore = accountStore,
ioDispatcher = ioDispatcher,
trackNetworkRequestsInterceptor = trackNetworkRequestsInterceptor,
networkAvailabilityProvider = networkAvailabilityProvider
wpComApiClientProvider = wpComApiClientProvider
) {
private var taxonomySlug: String = ""
private var isHierarchical: Boolean = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,9 @@ import org.mockito.kotlin.whenever
import org.wordpress.android.BaseUnitTest
import org.wordpress.android.R
import org.wordpress.android.fluxc.model.SiteModel
import org.wordpress.android.fluxc.network.TrackNetworkRequestsInterceptor
import org.wordpress.android.fluxc.network.rest.wpapi.rs.WpNetworkAvailabilityProvider
import org.wordpress.android.fluxc.store.AccountStore
import org.wordpress.android.fluxc.utils.AppLogWrapper
import org.wordpress.android.networking.restapi.WpComApiClientProvider
import org.wordpress.android.ui.dataview.DataViewViewModel.Companion.PAGE_SIZE
import org.wordpress.android.ui.mysite.SelectedSiteRepository
import org.wordpress.android.util.NetworkUtilsWrapper
Expand All @@ -43,10 +42,7 @@ class DataViewViewModelTest : BaseUnitTest() {
private lateinit var accountStore: AccountStore

@Mock
private lateinit var trackNetworkRequestsInterceptor: TrackNetworkRequestsInterceptor

@Mock
private lateinit var networkAvailabilityProvider: WpNetworkAvailabilityProvider
private lateinit var wpComApiClientProvider: WpComApiClientProvider

private val testSite = SiteModel().apply {
id = 1
Expand Down Expand Up @@ -77,8 +73,7 @@ class DataViewViewModelTest : BaseUnitTest() {
selectedSiteRepository = selectedSiteRepository,
accountStore = accountStore,
ioDispatcher = testDispatcher(),
trackNetworkRequestsInterceptor = trackNetworkRequestsInterceptor,
networkAvailabilityProvider = networkAvailabilityProvider
wpComApiClientProvider = wpComApiClientProvider
)
}

Expand Down Expand Up @@ -237,8 +232,7 @@ class DataViewViewModelTest : BaseUnitTest() {
selectedSiteRepository = selectedSiteRepository,
accountStore = accountStore,
ioDispatcher = testDispatcher(),
trackNetworkRequestsInterceptor = trackNetworkRequestsInterceptor,
networkAvailabilityProvider = networkAvailabilityProvider
wpComApiClientProvider = wpComApiClientProvider
)
// Access the wpComApiClient property to trigger the lazy initialization
viewModel.testAccessWpComApiClient()
Expand Down Expand Up @@ -506,8 +500,7 @@ class DataViewViewModelTest : BaseUnitTest() {
selectedSiteRepository: SelectedSiteRepository,
accountStore: AccountStore,
ioDispatcher: kotlinx.coroutines.CoroutineDispatcher,
trackNetworkRequestsInterceptor: TrackNetworkRequestsInterceptor,
networkAvailabilityProvider: WpNetworkAvailabilityProvider
wpComApiClientProvider: WpComApiClientProvider
) : DataViewViewModel(
mainDispatcher,
appLogWrapper,
Expand All @@ -516,8 +509,7 @@ class DataViewViewModelTest : BaseUnitTest() {
selectedSiteRepository,
accountStore,
ioDispatcher,
trackNetworkRequestsInterceptor,
networkAvailabilityProvider
wpComApiClientProvider
) {
init {
initialize()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,13 @@ import org.wordpress.android.BaseUnitTest
import org.wordpress.android.R
import org.wordpress.android.fluxc.Dispatcher
import org.wordpress.android.fluxc.model.SiteModel
import org.wordpress.android.fluxc.network.TrackNetworkRequestsInterceptor
import org.wordpress.android.fluxc.network.rest.wpapi.rs.WpApiClientProvider
import org.wordpress.android.fluxc.network.rest.wpapi.rs.WpNetworkAvailabilityProvider
import org.wordpress.android.fluxc.store.AccountStore
import org.wordpress.android.fluxc.store.TaxonomyStore
import org.wordpress.android.fluxc.store.TaxonomyStore.DEFAULT_TAXONOMY_CATEGORY
import org.wordpress.android.fluxc.store.TaxonomyStore.DEFAULT_TAXONOMY_TAG
import org.wordpress.android.fluxc.utils.AppLogWrapper
import org.wordpress.android.networking.restapi.WpComApiClientProvider
import org.wordpress.android.ui.mysite.SelectedSiteRepository
import org.wordpress.android.util.NetworkUtilsWrapper

Expand Down Expand Up @@ -58,10 +57,7 @@ class TermsViewModelTest : BaseUnitTest() {
private lateinit var fluxCDispatcher: Dispatcher

@Mock
private lateinit var trackNetworkRequestsInterceptor: TrackNetworkRequestsInterceptor

@Mock
private lateinit var networkAvailabilityProvider: WpNetworkAvailabilityProvider
private lateinit var wpComApiClientProvider: WpComApiClientProvider

@Before
fun setUp() {
Expand All @@ -81,8 +77,7 @@ class TermsViewModelTest : BaseUnitTest() {
ioDispatcher = testDispatcher(),
taxonomyStore = taxonomyStore,
fluxCDispatcher = fluxCDispatcher,
trackNetworkRequestsInterceptor = trackNetworkRequestsInterceptor,
networkAvailabilityProvider = networkAvailabilityProvider
wpComApiClientProvider = wpComApiClientProvider
)
}

Expand Down
2 changes: 1 addition & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ wellsql = '2.0.0'
wordpress-aztec = 'v2.1.4'
wordpress-lint = '2.2.0'
wordpress-persistent-edittext = '1.0.2'
wordpress-rs = '0.4.0'
wordpress-rs = '1398-ba6481de5f07565a6c69442f2d3a77b2c12f6d89'
wordpress-utils = '3.14.0'
automattic-ucrop = '2.2.11'
zendesk = '5.5.3'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import org.wordpress.android.fluxc.model.SiteModel
import org.wordpress.android.fluxc.module.OkHttpClientQualifiers
import org.wordpress.android.fluxc.network.rest.wpapi.applicationpasswords.WpAppNotifierHandler
import org.wordpress.android.fluxc.store.AccountStore
import org.wordpress.android.util.AppLog
import rs.wordpress.api.kotlin.RequestErrorLogger
import rs.wordpress.api.kotlin.WpApiClient
import rs.wordpress.api.kotlin.WpHttpClient
import rs.wordpress.api.kotlin.WpRequestExecutor
Expand Down Expand Up @@ -36,6 +38,8 @@ class WpApiClientProvider @Inject constructor(
private val wpComClients = mutableMapOf<Long, WpApiClient>()
private val selfHostedClients = mutableMapOf<Int, WpApiClient>()

private val errorLogger = RequestErrorLogger { AppLog.e(AppLog.T.API, it) }

/** Removes all cached API clients (e.g. on sign-out). */
@Synchronized
fun clearAllClients() {
Expand Down Expand Up @@ -116,6 +120,7 @@ class WpApiClientProvider @Inject constructor(
)
}
},
errorLogger = errorLogger,
)
}

Expand Down Expand Up @@ -155,7 +160,8 @@ class WpApiClientProvider @Inject constructor(
override suspend fun requestedWithInvalidAuthentication(requestUrl: String) {
wpAppNotifierHandler.notifyRequestedWithInvalidAuthentication(site)
}
}
},
errorLogger = errorLogger
)
return client
}
Expand All @@ -175,7 +181,8 @@ class WpApiClientProvider @Inject constructor(
override suspend fun requestedWithInvalidAuthentication(requestUrl: String) {
wpAppNotifierHandler.notifyRequestedWithInvalidAuthentication(site)
}
}
},
errorLogger = errorLogger
)
}
}
Expand Down
Loading