Skip to content

Commit afe267f

Browse files
use suspend function for network calls
Signed-off-by: parneet-guraya <gurayaparneet@gmail.com>
1 parent 8c851ba commit afe267f

File tree

3 files changed

+56
-48
lines changed

3 files changed

+56
-48
lines changed

app/build.gradle

-1
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,6 @@ dependencies {
114114
testImplementation "org.junit.jupiter:junit-jupiter-api:5.10.0"
115115
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.10.0"
116116
testImplementation 'com.facebook.soloader:soloader:0.10.5'
117-
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-rx2:1.9.0"
118117
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.3"
119118
debugImplementation("androidx.fragment:fragment-testing:1.6.2")
120119
testImplementation "commons-io:commons-io:2.6"

app/src/main/java/fr/free/nrw/commons/media/MediaDetailViewModel.kt

+2-3
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import kotlinx.coroutines.flow.MutableStateFlow
1313
import kotlinx.coroutines.flow.asStateFlow
1414
import kotlinx.coroutines.flow.update
1515
import kotlinx.coroutines.launch
16-
import kotlinx.coroutines.rx2.awaitSingle
1716
import timber.log.Timber
1817
import javax.inject.Inject
1918

@@ -39,7 +38,7 @@ class MediaDetailViewModel(
3938

4039
try {
4140
val result =
42-
okHttpJsonApiClient.getFileUsagesOnCommons(fileName, 10).awaitSingle()
41+
okHttpJsonApiClient.getFileUsagesOnCommons(fileName, 10)
4342

4443
val data = result?.query?.pages?.first()?.fileUsage?.map { it.toUiModel() }
4544

@@ -69,7 +68,7 @@ class MediaDetailViewModel(
6968
_globalContainerState.update { FileUsagesContainerState.Loading }
7069

7170
try {
72-
val result = okHttpJsonApiClient.getGlobalFileUsages(fileName, 10).awaitSingle()
71+
val result = okHttpJsonApiClient.getGlobalFileUsages(fileName, 10)
7372

7473
val data = result?.query?.pages?.first()?.fileUsage?.map { it.toUiModel() }
7574

app/src/main/java/fr/free/nrw/commons/mwapi/OkHttpJsonApiClient.kt

+54-44
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ import fr.free.nrw.commons.utils.ConfigUtils.isBetaFlavour
2323
import fr.free.nrw.commons.wikidata.model.GetWikidataEditCountResponse
2424
import io.reactivex.Observable
2525
import io.reactivex.Single
26+
import kotlinx.coroutines.Dispatchers
27+
import kotlinx.coroutines.withContext
2628
import okhttp3.HttpUrl
2729
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
2830
import okhttp3.OkHttpClient
@@ -53,8 +55,10 @@ class OkHttpJsonApiClient @Inject constructor(
5355
): Observable<LeaderboardResponse> {
5456
val fetchLeaderboardUrlTemplate =
5557
wikiMediaToolforgeUrl.toString() + LeaderboardConstants.LEADERBOARD_END_POINT
56-
val url = String.format(Locale.ENGLISH,
57-
fetchLeaderboardUrlTemplate, userName, duration, category, limit, offset)
58+
val url = String.format(
59+
Locale.ENGLISH,
60+
fetchLeaderboardUrlTemplate, userName, duration, category, limit, offset
61+
)
5862
val urlBuilder: HttpUrl.Builder = url.toHttpUrlOrNull()!!.newBuilder()
5963
.addQueryParameter("user", userName)
6064
.addQueryParameter("duration", duration)
@@ -83,66 +87,72 @@ class OkHttpJsonApiClient @Inject constructor(
8387
})
8488
}
8589

86-
fun getFileUsagesOnCommons(
90+
suspend fun getFileUsagesOnCommons(
8791
fileName: String?,
8892
pageSize: Int
89-
): Observable<FileUsagesResponse?> {
90-
val urlBuilder = BuildConfig.FILE_USAGES_BASE_URL.toHttpUrlOrNull()!!.newBuilder()
91-
urlBuilder.addQueryParameter("prop", "fileusage")
92-
urlBuilder.addQueryParameter("titles", fileName)
93-
urlBuilder.addQueryParameter("fulimit", pageSize.toString())
93+
): FileUsagesResponse? {
94+
return withContext(Dispatchers.IO) {
9495

95-
Timber.i("Url %s", urlBuilder.toString())
96-
val request: Request = Request.Builder()
97-
.url(urlBuilder.toString())
98-
.build()
96+
return@withContext try {
9997

100-
return Observable.fromCallable({
101-
val response: Response = okHttpClient.newCall(request).execute()
102-
if (response.body != null && response.isSuccessful) {
103-
val json: String = response.body!!.string()
104-
try {
105-
return@fromCallable gson.fromJson<FileUsagesResponse>(
98+
val urlBuilder = BuildConfig.FILE_USAGES_BASE_URL.toHttpUrlOrNull()!!.newBuilder()
99+
urlBuilder.addQueryParameter("prop", "fileusage")
100+
urlBuilder.addQueryParameter("titles", fileName)
101+
urlBuilder.addQueryParameter("fulimit", pageSize.toString())
102+
103+
Timber.i("Url %s", urlBuilder.toString())
104+
val request: Request = Request.Builder()
105+
.url(urlBuilder.toString())
106+
.build()
107+
108+
val response: Response = okHttpClient.newCall(request).execute()
109+
if (response.body != null && response.isSuccessful) {
110+
val json: String = response.body!!.string()
111+
gson.fromJson<FileUsagesResponse>(
106112
json,
107113
FileUsagesResponse::class.java
108114
)
109-
} catch (e: java.lang.Exception) {
110-
return@fromCallable null
111-
}
115+
} else null
116+
} catch (e: Exception) {
117+
Timber.e(e)
118+
null
112119
}
113-
null
114-
})
120+
}
115121
}
116122

117-
fun getGlobalFileUsages(
123+
suspend fun getGlobalFileUsages(
118124
fileName: String?,
119125
pageSize: Int
120-
): Observable<GlobalFileUsagesResponse?> {
121-
val urlBuilder = BuildConfig.FILE_USAGES_BASE_URL.toHttpUrlOrNull()!!.newBuilder()
122-
urlBuilder.addQueryParameter("prop", "globalusage")
123-
urlBuilder.addQueryParameter("titles", fileName)
124-
urlBuilder.addQueryParameter("gulimit", pageSize.toString())
126+
): GlobalFileUsagesResponse? {
125127

126-
Timber.i("Url %s", urlBuilder.toString())
127-
val request: Request = Request.Builder()
128-
.url(urlBuilder.toString())
129-
.build()
128+
return withContext(Dispatchers.IO) {
130129

131-
return Observable.fromCallable({
132-
val response: Response = okHttpClient.newCall(request).execute()
133-
if (response.body != null && response.isSuccessful) {
134-
val json: String = response.body!!.string()
135-
try {
136-
return@fromCallable gson.fromJson<GlobalFileUsagesResponse>(
130+
return@withContext try {
131+
132+
val urlBuilder = BuildConfig.FILE_USAGES_BASE_URL.toHttpUrlOrNull()!!.newBuilder()
133+
urlBuilder.addQueryParameter("prop", "globalusage")
134+
urlBuilder.addQueryParameter("titles", fileName)
135+
urlBuilder.addQueryParameter("gulimit", pageSize.toString())
136+
137+
Timber.i("Url %s", urlBuilder.toString())
138+
val request: Request = Request.Builder()
139+
.url(urlBuilder.toString())
140+
.build()
141+
142+
val response: Response = okHttpClient.newCall(request).execute()
143+
if (response.body != null && response.isSuccessful) {
144+
val json: String = response.body!!.string()
145+
146+
gson.fromJson<GlobalFileUsagesResponse>(
137147
json,
138148
GlobalFileUsagesResponse::class.java
139149
)
140-
} catch (e: java.lang.Exception) {
141-
return@fromCallable null
142-
}
150+
} else null
151+
} catch (e: Exception) {
152+
Timber.e(e)
153+
null
143154
}
144-
null
145-
})
155+
}
146156
}
147157

148158
fun setAvatar(username: String?, avatar: String?): Single<UpdateAvatarResponse?> {

0 commit comments

Comments
 (0)