Skip to content

Commit 7495634

Browse files
committed
Centralize WpComApiClient construction in WpComApiClientProvider
Route DataViewViewModel (with its SubscribersViewModel, TermsViewModel, and ApplicationPasswordsViewModel subclasses) and AddSubscribersViewModel through WpComApiClientProvider instead of constructing WpComApiClient directly. Keeps the RequestErrorLogger wiring in one place and drops the per-call auth/ interceptor/logger boilerplate. The provider now attaches TrackNetworkRequestsInterceptor, so all its consumers (previously only these ViewModels) become inspectable via the in-app network tracker when that debug setting is enabled.
1 parent 388482f commit 7495634

8 files changed

Lines changed: 28 additions & 72 deletions

File tree

WordPress/src/main/java/org/wordpress/android/networking/restapi/WpComApiClientProvider.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.wordpress.android.networking.restapi
22

33
import okhttp3.OkHttpClient
4+
import org.wordpress.android.fluxc.network.TrackNetworkRequestsInterceptor
45
import org.wordpress.android.fluxc.network.rest.wpapi.rs.WpNetworkAvailabilityProvider
56
import org.wordpress.android.util.AppLog
67
import rs.wordpress.api.kotlin.RequestErrorLogger
@@ -17,12 +18,14 @@ private const val CONNECT_TIMEOUT = 30L
1718

1819
class WpComApiClientProvider @Inject constructor(
1920
private val networkAvailabilityProvider: WpNetworkAvailabilityProvider,
21+
private val trackNetworkRequestsInterceptor: TrackNetworkRequestsInterceptor,
2022
) {
2123
fun getWpComApiClient(accessToken: String): WpComApiClient {
2224
val okHttpClient = OkHttpClient.Builder()
2325
.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS)
2426
.readTimeout(READ_WRITE_TIMEOUT, TimeUnit.SECONDS)
2527
.writeTimeout(READ_WRITE_TIMEOUT, TimeUnit.SECONDS)
28+
.addInterceptor(trackNetworkRequestsInterceptor)
2629
.build()
2730

2831
return WpComApiClient(

WordPress/src/main/java/org/wordpress/android/ui/accounts/applicationpassword/ApplicationPasswordsViewModel.kt

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,12 @@ import kotlinx.coroutines.CoroutineDispatcher
88
import kotlinx.coroutines.withContext
99
import org.wordpress.android.R
1010
import org.wordpress.android.fluxc.model.SiteModel
11-
import org.wordpress.android.fluxc.network.TrackNetworkRequestsInterceptor
1211
import org.wordpress.android.fluxc.network.rest.wpapi.rs.WpApiClientProvider
13-
import org.wordpress.android.fluxc.network.rest.wpapi.rs.WpNetworkAvailabilityProvider
1412
import org.wordpress.android.fluxc.store.AccountStore
1513
import org.wordpress.android.fluxc.utils.AppLogWrapper
1614
import org.wordpress.android.modules.IO_THREAD
1715
import org.wordpress.android.modules.UI_THREAD
16+
import org.wordpress.android.networking.restapi.WpComApiClientProvider
1817
import org.wordpress.android.ui.dataview.DataViewDropdownItem
1918
import org.wordpress.android.ui.dataview.DataViewFieldType
2019
import org.wordpress.android.ui.dataview.DataViewItem
@@ -44,8 +43,7 @@ class ApplicationPasswordsViewModel @Inject constructor(
4443
sharedPrefs: SharedPreferences,
4544
networkUtilsWrapper: NetworkUtilsWrapper,
4645
@Named(IO_THREAD) ioDispatcher: CoroutineDispatcher,
47-
trackNetworkRequestsInterceptor: TrackNetworkRequestsInterceptor,
48-
networkAvailabilityProvider: WpNetworkAvailabilityProvider,
46+
wpComApiClientProvider: WpComApiClientProvider,
4947
) : DataViewViewModel(
5048
mainDispatcher = mainDispatcher,
5149
appLogWrapper = appLogWrapper,
@@ -54,8 +52,7 @@ class ApplicationPasswordsViewModel @Inject constructor(
5452
selectedSiteRepository = selectedSiteRepository,
5553
accountStore = accountStore,
5654
ioDispatcher = ioDispatcher,
57-
trackNetworkRequestsInterceptor = trackNetworkRequestsInterceptor,
58-
networkAvailabilityProvider = networkAvailabilityProvider
55+
wpComApiClientProvider = wpComApiClientProvider
5956
) {
6057
init {
6158
initialize()

WordPress/src/main/java/org/wordpress/android/ui/dataview/DataViewViewModel.kt

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,10 @@ import org.wordpress.android.modules.UI_THREAD
2121
import org.wordpress.android.ui.mysite.SelectedSiteRepository
2222
import org.wordpress.android.util.AppLog
2323
import org.wordpress.android.util.NetworkUtilsWrapper
24-
import org.wordpress.android.fluxc.network.TrackNetworkRequestsInterceptor
25-
import org.wordpress.android.fluxc.network.rest.wpapi.rs.WpNetworkAvailabilityProvider
24+
import org.wordpress.android.networking.restapi.WpComApiClientProvider
2625
import org.wordpress.android.viewmodel.ScopedViewModel
27-
import rs.wordpress.api.kotlin.RequestErrorLogger
2826
import rs.wordpress.api.kotlin.WpComApiClient
2927
import uniffi.wp_api.WpApiParamOrder
30-
import uniffi.wp_api.WpAuthentication
31-
import uniffi.wp_api.WpAuthenticationProvider
3228
import javax.inject.Inject
3329
import javax.inject.Named
3430

@@ -46,8 +42,7 @@ open class DataViewViewModel @Inject constructor(
4642
private val selectedSiteRepository: SelectedSiteRepository,
4743
private val accountStore: AccountStore,
4844
@Named(IO_THREAD) protected val ioDispatcher: CoroutineDispatcher,
49-
private val trackNetworkRequestsInterceptor: TrackNetworkRequestsInterceptor,
50-
private val networkAvailabilityProvider: WpNetworkAvailabilityProvider,
45+
private val wpComApiClientProvider: WpComApiClientProvider,
5146
) : ScopedViewModel(mainDispatcher) {
5247
private val _uiState = MutableStateFlow(DataViewUiState())
5348
val uiState: StateFlow<DataViewUiState> = _uiState.asStateFlow()
@@ -83,17 +78,9 @@ open class DataViewViewModel @Inject constructor(
8378
}
8479
}
8580

86-
// TODO this is strictly for wp.com sites, we'll need different auth for self-hosted
8781
protected val wpComApiClient: WpComApiClient by lazy {
88-
WpComApiClient(
89-
authProvider = WpAuthenticationProvider.staticWithAuth(
90-
requireNotNull(accountStore.accessToken) { "Access token is required but was null" }.let { token ->
91-
WpAuthentication.Bearer(token = token)
92-
}
93-
),
94-
interceptors = listOf(trackNetworkRequestsInterceptor),
95-
networkAvailabilityProvider = networkAvailabilityProvider,
96-
errorLogger = RequestErrorLogger { AppLog.e(AppLog.T.API, it) }
82+
wpComApiClientProvider.getWpComApiClient(
83+
requireNotNull(accountStore.accessToken) { "Access token is required but was null" }
9784
)
9885
}
9986

WordPress/src/main/java/org/wordpress/android/ui/subscribers/AddSubscribersViewModel.kt

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,19 @@ import kotlinx.coroutines.flow.MutableStateFlow
66
import kotlinx.coroutines.flow.asStateFlow
77
import kotlinx.coroutines.withContext
88
import org.wordpress.android.R
9-
import org.wordpress.android.fluxc.network.TrackNetworkRequestsInterceptor
10-
import org.wordpress.android.fluxc.network.rest.wpapi.rs.WpNetworkAvailabilityProvider
119
import org.wordpress.android.fluxc.store.AccountStore
1210
import org.wordpress.android.fluxc.utils.AppLogWrapper
1311
import org.wordpress.android.modules.BG_THREAD
1412
import org.wordpress.android.modules.IO_THREAD
1513
import org.wordpress.android.modules.UI_THREAD
14+
import org.wordpress.android.networking.restapi.WpComApiClientProvider
1615
import org.wordpress.android.ui.mysite.SelectedSiteRepository
1716
import org.wordpress.android.util.AppLog
1817
import org.wordpress.android.util.ToastUtilsWrapper
1918
import org.wordpress.android.viewmodel.ScopedViewModel
20-
import rs.wordpress.api.kotlin.RequestErrorLogger
2119
import rs.wordpress.api.kotlin.WpComApiClient
2220
import rs.wordpress.api.kotlin.WpRequestResult
2321
import uniffi.wp_api.AddSubscribersParams
24-
import uniffi.wp_api.WpAuthentication
25-
import uniffi.wp_api.WpAuthenticationProvider
2622
import javax.inject.Inject
2723
import javax.inject.Named
2824

@@ -32,8 +28,7 @@ class AddSubscribersViewModel @Inject constructor(
3228
@Named(BG_THREAD) private val bgDispatcher: CoroutineDispatcher,
3329
private val appLogWrapper: AppLogWrapper,
3430
private val toastUtilsWrapper: ToastUtilsWrapper,
35-
private val trackNetworkRequestsInterceptor: TrackNetworkRequestsInterceptor,
36-
private val networkAvailabilityProvider: WpNetworkAvailabilityProvider,
31+
private val wpComApiClientProvider: WpComApiClientProvider,
3732
) : ScopedViewModel(bgDispatcher) {
3833
@Inject
3934
@Named(IO_THREAD)
@@ -49,14 +44,7 @@ class AddSubscribersViewModel @Inject constructor(
4944
val showProgress = _showProgress.asStateFlow()
5045

5146
private val wpComApiClient: WpComApiClient by lazy {
52-
WpComApiClient(
53-
WpAuthenticationProvider.staticWithAuth(
54-
WpAuthentication.Bearer(token = accountStore.accessToken!!)
55-
),
56-
interceptors = listOf(trackNetworkRequestsInterceptor),
57-
networkAvailabilityProvider = networkAvailabilityProvider,
58-
errorLogger = RequestErrorLogger { AppLog.e(AppLog.T.API, it) }
59-
)
47+
wpComApiClientProvider.getWpComApiClient(accountStore.accessToken!!)
6048
}
6149

6250
private fun siteId(): Long {

WordPress/src/main/java/org/wordpress/android/ui/subscribers/SubscribersViewModel.kt

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,12 @@ import kotlinx.coroutines.flow.MutableStateFlow
88
import kotlinx.coroutines.flow.asStateFlow
99
import kotlinx.coroutines.withContext
1010
import org.wordpress.android.R
11-
import org.wordpress.android.fluxc.network.TrackNetworkRequestsInterceptor
12-
import org.wordpress.android.fluxc.network.rest.wpapi.rs.WpNetworkAvailabilityProvider
1311
import org.wordpress.android.fluxc.store.AccountStore
1412
import org.wordpress.android.fluxc.utils.AppLogWrapper
1513
import org.wordpress.android.models.wrappers.SimpleDateFormatWrapper
1614
import org.wordpress.android.modules.IO_THREAD
1715
import org.wordpress.android.modules.UI_THREAD
16+
import org.wordpress.android.networking.restapi.WpComApiClientProvider
1817
import org.wordpress.android.ui.dataview.DataViewDropdownItem
1918
import org.wordpress.android.ui.dataview.DataViewFieldType
2019
import org.wordpress.android.ui.dataview.DataViewItem
@@ -45,8 +44,7 @@ class SubscribersViewModel @Inject constructor(
4544
selectedSiteRepository: SelectedSiteRepository,
4645
accountStore: AccountStore,
4746
@Named(IO_THREAD) ioDispatcher: CoroutineDispatcher,
48-
trackNetworkRequestsInterceptor: TrackNetworkRequestsInterceptor,
49-
networkAvailabilityProvider: WpNetworkAvailabilityProvider,
47+
wpComApiClientProvider: WpComApiClientProvider,
5048
) : DataViewViewModel(
5149
mainDispatcher = mainDispatcher,
5250
appLogWrapper = appLogWrapper,
@@ -55,8 +53,7 @@ class SubscribersViewModel @Inject constructor(
5553
selectedSiteRepository = selectedSiteRepository,
5654
accountStore = accountStore,
5755
ioDispatcher = ioDispatcher,
58-
trackNetworkRequestsInterceptor = trackNetworkRequestsInterceptor,
59-
networkAvailabilityProvider = networkAvailabilityProvider
56+
wpComApiClientProvider = wpComApiClientProvider
6057
) {
6158
private val _subscriberStats = MutableStateFlow<IndividualSubscriberStats?>(null)
6259
val subscriberStats = _subscriberStats.asStateFlow()

WordPress/src/main/java/org/wordpress/android/ui/taxonomies/TermsViewModel.kt

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,7 @@ import org.wordpress.android.fluxc.generated.TaxonomyActionBuilder
1919
import org.wordpress.android.fluxc.model.SiteModel
2020
import org.wordpress.android.fluxc.model.TermModel
2121
import org.wordpress.android.fluxc.model.TermsModel
22-
import org.wordpress.android.fluxc.network.TrackNetworkRequestsInterceptor
2322
import org.wordpress.android.fluxc.network.rest.wpapi.rs.WpApiClientProvider
24-
import org.wordpress.android.fluxc.network.rest.wpapi.rs.WpNetworkAvailabilityProvider
2523
import org.wordpress.android.fluxc.store.AccountStore
2624
import org.wordpress.android.fluxc.store.TaxonomyStore
2725
import org.wordpress.android.fluxc.store.TaxonomyStore.DEFAULT_TAXONOMY_CATEGORY
@@ -30,6 +28,7 @@ import org.wordpress.android.fluxc.store.TaxonomyStore.FetchTermsResponsePayload
3028
import org.wordpress.android.fluxc.utils.AppLogWrapper
3129
import org.wordpress.android.modules.IO_THREAD
3230
import org.wordpress.android.modules.UI_THREAD
31+
import org.wordpress.android.networking.restapi.WpComApiClientProvider
3332
import org.wordpress.android.ui.dataview.DataViewDropdownItem
3433
import org.wordpress.android.ui.dataview.DataViewFieldType
3534
import org.wordpress.android.ui.dataview.DataViewItem
@@ -89,8 +88,7 @@ class TermsViewModel @Inject constructor(
8988
sharedPrefs: SharedPreferences,
9089
networkUtilsWrapper: NetworkUtilsWrapper,
9190
@Named(IO_THREAD) ioDispatcher: CoroutineDispatcher,
92-
trackNetworkRequestsInterceptor: TrackNetworkRequestsInterceptor,
93-
networkAvailabilityProvider: WpNetworkAvailabilityProvider,
91+
wpComApiClientProvider: WpComApiClientProvider,
9492
) : DataViewViewModel(
9593
mainDispatcher = mainDispatcher,
9694
appLogWrapper = appLogWrapper,
@@ -99,8 +97,7 @@ class TermsViewModel @Inject constructor(
9997
selectedSiteRepository = selectedSiteRepository,
10098
accountStore = accountStore,
10199
ioDispatcher = ioDispatcher,
102-
trackNetworkRequestsInterceptor = trackNetworkRequestsInterceptor,
103-
networkAvailabilityProvider = networkAvailabilityProvider
100+
wpComApiClientProvider = wpComApiClientProvider
104101
) {
105102
private var taxonomySlug: String = ""
106103
private var isHierarchical: Boolean = false

WordPress/src/test/java/org/wordpress/android/ui/dataview/DataViewViewModelTest.kt

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,9 @@ import org.mockito.kotlin.whenever
1313
import org.wordpress.android.BaseUnitTest
1414
import org.wordpress.android.R
1515
import org.wordpress.android.fluxc.model.SiteModel
16-
import org.wordpress.android.fluxc.network.TrackNetworkRequestsInterceptor
17-
import org.wordpress.android.fluxc.network.rest.wpapi.rs.WpNetworkAvailabilityProvider
1816
import org.wordpress.android.fluxc.store.AccountStore
1917
import org.wordpress.android.fluxc.utils.AppLogWrapper
18+
import org.wordpress.android.networking.restapi.WpComApiClientProvider
2019
import org.wordpress.android.ui.dataview.DataViewViewModel.Companion.PAGE_SIZE
2120
import org.wordpress.android.ui.mysite.SelectedSiteRepository
2221
import org.wordpress.android.util.NetworkUtilsWrapper
@@ -43,10 +42,7 @@ class DataViewViewModelTest : BaseUnitTest() {
4342
private lateinit var accountStore: AccountStore
4443

4544
@Mock
46-
private lateinit var trackNetworkRequestsInterceptor: TrackNetworkRequestsInterceptor
47-
48-
@Mock
49-
private lateinit var networkAvailabilityProvider: WpNetworkAvailabilityProvider
45+
private lateinit var wpComApiClientProvider: WpComApiClientProvider
5046

5147
private val testSite = SiteModel().apply {
5248
id = 1
@@ -77,8 +73,7 @@ class DataViewViewModelTest : BaseUnitTest() {
7773
selectedSiteRepository = selectedSiteRepository,
7874
accountStore = accountStore,
7975
ioDispatcher = testDispatcher(),
80-
trackNetworkRequestsInterceptor = trackNetworkRequestsInterceptor,
81-
networkAvailabilityProvider = networkAvailabilityProvider
76+
wpComApiClientProvider = wpComApiClientProvider
8277
)
8378
}
8479

@@ -237,8 +232,7 @@ class DataViewViewModelTest : BaseUnitTest() {
237232
selectedSiteRepository = selectedSiteRepository,
238233
accountStore = accountStore,
239234
ioDispatcher = testDispatcher(),
240-
trackNetworkRequestsInterceptor = trackNetworkRequestsInterceptor,
241-
networkAvailabilityProvider = networkAvailabilityProvider
235+
wpComApiClientProvider = wpComApiClientProvider
242236
)
243237
// Access the wpComApiClient property to trigger the lazy initialization
244238
viewModel.testAccessWpComApiClient()
@@ -506,8 +500,7 @@ class DataViewViewModelTest : BaseUnitTest() {
506500
selectedSiteRepository: SelectedSiteRepository,
507501
accountStore: AccountStore,
508502
ioDispatcher: kotlinx.coroutines.CoroutineDispatcher,
509-
trackNetworkRequestsInterceptor: TrackNetworkRequestsInterceptor,
510-
networkAvailabilityProvider: WpNetworkAvailabilityProvider
503+
wpComApiClientProvider: WpComApiClientProvider
511504
) : DataViewViewModel(
512505
mainDispatcher,
513506
appLogWrapper,
@@ -516,8 +509,7 @@ class DataViewViewModelTest : BaseUnitTest() {
516509
selectedSiteRepository,
517510
accountStore,
518511
ioDispatcher,
519-
trackNetworkRequestsInterceptor,
520-
networkAvailabilityProvider
512+
wpComApiClientProvider
521513
) {
522514
init {
523515
initialize()

WordPress/src/test/java/org/wordpress/android/ui/taxonomies/TermsViewModelTest.kt

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,13 @@ import org.wordpress.android.BaseUnitTest
1717
import org.wordpress.android.R
1818
import org.wordpress.android.fluxc.Dispatcher
1919
import org.wordpress.android.fluxc.model.SiteModel
20-
import org.wordpress.android.fluxc.network.TrackNetworkRequestsInterceptor
2120
import org.wordpress.android.fluxc.network.rest.wpapi.rs.WpApiClientProvider
22-
import org.wordpress.android.fluxc.network.rest.wpapi.rs.WpNetworkAvailabilityProvider
2321
import org.wordpress.android.fluxc.store.AccountStore
2422
import org.wordpress.android.fluxc.store.TaxonomyStore
2523
import org.wordpress.android.fluxc.store.TaxonomyStore.DEFAULT_TAXONOMY_CATEGORY
2624
import org.wordpress.android.fluxc.store.TaxonomyStore.DEFAULT_TAXONOMY_TAG
2725
import org.wordpress.android.fluxc.utils.AppLogWrapper
26+
import org.wordpress.android.networking.restapi.WpComApiClientProvider
2827
import org.wordpress.android.ui.mysite.SelectedSiteRepository
2928
import org.wordpress.android.util.NetworkUtilsWrapper
3029

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

6059
@Mock
61-
private lateinit var trackNetworkRequestsInterceptor: TrackNetworkRequestsInterceptor
62-
63-
@Mock
64-
private lateinit var networkAvailabilityProvider: WpNetworkAvailabilityProvider
60+
private lateinit var wpComApiClientProvider: WpComApiClientProvider
6561

6662
@Before
6763
fun setUp() {
@@ -81,8 +77,7 @@ class TermsViewModelTest : BaseUnitTest() {
8177
ioDispatcher = testDispatcher(),
8278
taxonomyStore = taxonomyStore,
8379
fluxCDispatcher = fluxCDispatcher,
84-
trackNetworkRequestsInterceptor = trackNetworkRequestsInterceptor,
85-
networkAvailabilityProvider = networkAvailabilityProvider
80+
wpComApiClientProvider = wpComApiClientProvider
8681
)
8782
}
8883

0 commit comments

Comments
 (0)