Skip to content

Commit 4a4029c

Browse files
committed
migrate pagers to coroutines
1 parent c65c1ad commit 4a4029c

File tree

8 files changed

+46
-63
lines changed

8 files changed

+46
-63
lines changed

app/build.gradle

+4
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ android {
6868
versionNameSuffix "-${getCommitCount()}"
6969
applicationIdSuffix ".debug"
7070
ext.enableCrashlytics = false
71+
minifyEnabled true
72+
shrinkResources true
73+
zipAlignEnabled true
74+
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
7175
}
7276
releaseTest {
7377
applicationIdSuffix ".rt"

app/src/main/java/eu/kanade/tachiyomi/ui/source/browse/BrowseSourcePresenter.kt

+13-9
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,13 @@ import eu.kanade.tachiyomi.ui.source.filter.TriStateSectionItem
3333
import eu.kanade.tachiyomi.util.lang.launchIO
3434
import eu.kanade.tachiyomi.util.lang.launchUI
3535
import eu.kanade.tachiyomi.util.removeCovers
36+
import eu.kanade.tachiyomi.util.system.withUIContext
3637
import exh.isEhBasedSource
3738
import exh.savedsearches.EXHSavedSearch
3839
import exh.savedsearches.JsonSavedSearch
3940
import java.lang.RuntimeException
4041
import java.util.Date
42+
import kotlinx.coroutines.Job
4143
import kotlinx.coroutines.flow.MutableStateFlow
4244
import kotlinx.coroutines.flow.asFlow
4345
import kotlinx.coroutines.flow.catch
@@ -49,7 +51,6 @@ import kotlinx.serialization.decodeFromString
4951
import kotlinx.serialization.json.Json
5052
import kotlinx.serialization.json.buildJsonObject
5153
import kotlinx.serialization.json.put
52-
import rx.Observable
5354
import rx.Subscription
5455
import rx.android.schedulers.AndroidSchedulers
5556
import rx.schedulers.Schedulers
@@ -113,6 +114,7 @@ open class BrowseSourcePresenter(
113114
* Subscription for the pager.
114115
*/
115116
private var pagerSubscription: Subscription? = null
117+
private var nextPageJob: Job? = null
116118

117119
/**
118120
* Subscription for one request from the pager.
@@ -184,14 +186,16 @@ open class BrowseSourcePresenter(
184186
fun requestNext() {
185187
if (!hasNextPage()) return
186188

187-
pageSubscription?.let { remove(it) }
188-
pageSubscription = Observable.defer { pager.requestNext() }
189-
.subscribeFirst(
190-
{ _, _ ->
191-
// Nothing to do when onNext is emitted.
192-
},
193-
BrowseSourceController::onAddPageError
194-
)
189+
nextPageJob?.cancel()
190+
nextPageJob = launchIO {
191+
try {
192+
pager.requestNextPage()
193+
} catch (e: Throwable) {
194+
withUIContext {
195+
view().subscribe { view -> view?.onAddPageError(e) }
196+
}
197+
}
198+
}
195199
}
196200

197201
/**

app/src/main/java/eu/kanade/tachiyomi/ui/source/browse/ExhPager.kt

+9-14
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,12 @@ package eu.kanade.tachiyomi.ui.source.browse
33
import eu.kanade.tachiyomi.source.CatalogueSource
44
import eu.kanade.tachiyomi.source.model.FilterList
55
import eu.kanade.tachiyomi.source.model.MangasPage
6+
import eu.kanade.tachiyomi.util.lang.awaitSingle
67
import exh.EH_SOURCE_ID
7-
import rx.Observable
8-
import rx.android.schedulers.AndroidSchedulers
9-
import rx.schedulers.Schedulers
108

119
open class ExhPager(val source: CatalogueSource, val query: String, val filters: FilterList) : Pager() {
1210

13-
override fun requestNext(): Observable<MangasPage> {
11+
override suspend fun requestNextPage() {
1412
val page = currentPage
1513

1614
val observable = if (query.isBlank() && filters.isEmpty()) {
@@ -19,16 +17,13 @@ open class ExhPager(val source: CatalogueSource, val query: String, val filters:
1917
source.fetchSearchManga(page, query, filters)
2018
}
2119

22-
return observable
23-
.subscribeOn(Schedulers.io())
24-
.observeOn(AndroidSchedulers.mainThread())
25-
.doOnNext {
26-
if (it.mangas.isNotEmpty()) {
27-
onPageReceived(it)
28-
} else {
29-
throw NoResultsException()
30-
}
31-
}
20+
val mangasPage = observable.awaitSingle()
21+
22+
if (mangasPage.mangas.isNotEmpty()) {
23+
onPageReceived(mangasPage)
24+
} else {
25+
throw NoResultsException()
26+
}
3227
}
3328

3429
override fun onPageReceived(mangasPage: MangasPage) {

app/src/main/java/eu/kanade/tachiyomi/ui/source/browse/Pager.kt

+1-2
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@ abstract class Pager(var currentPage: Int = 1) {
1919
return results.asObservable()
2020
}
2121

22-
abstract fun requestNext(): Observable<MangasPage>
23-
22+
abstract suspend fun requestNextPage()
2423
open fun onPageReceived(mangasPage: MangasPage) {
2524
val page = currentPage
2625
currentPage++

app/src/main/java/eu/kanade/tachiyomi/ui/source/browse/RecommendsPager.kt

+2-5
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import okhttp3.MediaType.Companion.toMediaTypeOrNull
2727
import okhttp3.OkHttpClient
2828
import okhttp3.Request
2929
import okhttp3.RequestBody.Companion.toRequestBody
30-
import rx.Observable
3130
import timber.log.Timber
3231

3332
abstract class API(_endpoint: String) {
@@ -248,7 +247,7 @@ class Anilist() : API("https://graphql.anilist.co/") {
248247
open class RecommendsPager(
249248
val manga: Manga,
250249
val smart: Boolean = true,
251-
var preferredApi: API = API.MYANIMELIST
250+
var preferredApi: API = API.ANILIST
252251
) : Pager() {
253252
private val apiList = API_MAP.toMutableMap()
254253
private var currentApi: API? = null
@@ -292,7 +291,7 @@ open class RecommendsPager(
292291
}
293292
}
294293

295-
override fun requestNext(): Observable<MangasPage> {
294+
override suspend fun requestNextPage() {
296295
if (smart) {
297296
preferredApi =
298297
if (manga.mangaType() != MangaType.TYPE_MANGA) API.ANILIST else preferredApi
@@ -301,8 +300,6 @@ open class RecommendsPager(
301300
currentApi = preferredApi
302301

303302
getRecs(currentApi!!)
304-
305-
return Observable.just(MangasPage(listOf(), false))
306303
}
307304

308305
companion object {

app/src/main/java/eu/kanade/tachiyomi/ui/source/browse/SourcePager.kt

+9-16
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,10 @@ package eu.kanade.tachiyomi.ui.source.browse
22

33
import eu.kanade.tachiyomi.source.CatalogueSource
44
import eu.kanade.tachiyomi.source.model.FilterList
5-
import eu.kanade.tachiyomi.source.model.MangasPage
6-
import rx.Observable
7-
import rx.android.schedulers.AndroidSchedulers
8-
import rx.schedulers.Schedulers
9-
5+
import eu.kanade.tachiyomi.util.lang.awaitSingle
106
open class SourcePager(val source: CatalogueSource, val query: String, val filters: FilterList) : Pager() {
117

12-
override fun requestNext(): Observable<MangasPage> {
8+
override suspend fun requestNextPage() {
139
val page = currentPage
1410

1511
val observable = if (query.isBlank() && filters.isEmpty()) {
@@ -18,15 +14,12 @@ open class SourcePager(val source: CatalogueSource, val query: String, val filte
1814
source.fetchSearchManga(page, query, filters)
1915
}
2016

21-
return observable
22-
.subscribeOn(Schedulers.io())
23-
.observeOn(AndroidSchedulers.mainThread())
24-
.doOnNext {
25-
if (it.mangas.isNotEmpty()) {
26-
onPageReceived(it)
27-
} else {
28-
throw NoResultsException()
29-
}
30-
}
17+
val mangasPage = observable.awaitSingle()
18+
19+
if (mangasPage.mangas.isNotEmpty()) {
20+
onPageReceived(mangasPage)
21+
} else {
22+
throw NoResultsException()
23+
}
3124
}
3225
}

app/src/main/java/eu/kanade/tachiyomi/ui/source/latest/ExhLatestUpdatesPager.kt

+4-8
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,16 @@ package eu.kanade.tachiyomi.ui.source.latest
33
import eu.kanade.tachiyomi.source.CatalogueSource
44
import eu.kanade.tachiyomi.source.model.MangasPage
55
import eu.kanade.tachiyomi.ui.source.browse.Pager
6-
import rx.Observable
7-
import rx.android.schedulers.AndroidSchedulers
8-
import rx.schedulers.Schedulers
6+
import eu.kanade.tachiyomi.util.lang.awaitSingle
97

108
/**
119
* ExhLatestUpdatesPager inherited from the Exh Pager.
1210
*/
1311
class ExhLatestUpdatesPager(val source: CatalogueSource) : Pager() {
1412

15-
override fun requestNext(): Observable<MangasPage> {
16-
return source.fetchLatestUpdates(currentPage)
17-
.subscribeOn(Schedulers.io())
18-
.observeOn(AndroidSchedulers.mainThread())
19-
.doOnNext { onPageReceived(it) }
13+
override suspend fun requestNextPage() {
14+
val mangasPage = source.fetchLatestUpdates(currentPage).awaitSingle()
15+
onPageReceived(mangasPage)
2016
}
2117

2218
override fun onPageReceived(mangasPage: MangasPage) {
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,16 @@
11
package eu.kanade.tachiyomi.ui.source.latest
22

33
import eu.kanade.tachiyomi.source.CatalogueSource
4-
import eu.kanade.tachiyomi.source.model.MangasPage
54
import eu.kanade.tachiyomi.ui.source.browse.Pager
6-
import rx.Observable
7-
import rx.android.schedulers.AndroidSchedulers
8-
import rx.schedulers.Schedulers
5+
import eu.kanade.tachiyomi.util.lang.awaitSingle
96

107
/**
118
* LatestUpdatesPager inherited from the general Pager.
129
*/
1310
class LatestUpdatesPager(val source: CatalogueSource) : Pager() {
1411

15-
override fun requestNext(): Observable<MangasPage> {
16-
return source.fetchLatestUpdates(currentPage)
17-
.subscribeOn(Schedulers.io())
18-
.observeOn(AndroidSchedulers.mainThread())
19-
.doOnNext { onPageReceived(it) }
12+
override suspend fun requestNextPage() {
13+
val mangasPage = source.fetchLatestUpdates(currentPage).awaitSingle()
14+
onPageReceived(mangasPage)
2015
}
2116
}

0 commit comments

Comments
 (0)