Convert tracker add/update/login methods to coroutines

This commit is contained in:
arkon
2020-12-24 17:50:28 -05:00
parent 6fcf6ae1f5
commit ea33179a95
15 changed files with 152 additions and 190 deletions

View File

@@ -8,6 +8,9 @@ import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.data.track.TrackService
import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter
import eu.kanade.tachiyomi.util.lang.await
import eu.kanade.tachiyomi.util.lang.launchIO
import eu.kanade.tachiyomi.util.lang.launchUI
import eu.kanade.tachiyomi.util.system.toast
import rx.Observable
import rx.Subscription
@@ -107,19 +110,22 @@ class TrackPresenter(
}
private fun updateRemote(track: Track, service: TrackService) {
service.update(track)
.flatMap { db.insertTrack(track).asRxObservable() }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeFirst(
{ view, _ -> view.onRefreshDone() },
{ view, error ->
view.onRefreshError(error)
launchIO {
try {
service.update(track)
db.insertTrack(track).await()
launchUI {
view!!.onRefreshDone()
}
} catch (e: Throwable) {
launchUI {
view!!.onRefreshError(e)
// Restart on error to set old values
fetchTrackings()
}
)
}
}
}
fun setStatus(item: TrackItem, index: Int) {

View File

@@ -21,13 +21,15 @@ import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter
import eu.kanade.tachiyomi.ui.reader.model.ReaderPage
import eu.kanade.tachiyomi.ui.reader.model.ViewerChapters
import eu.kanade.tachiyomi.util.isLocal
import eu.kanade.tachiyomi.util.lang.await
import eu.kanade.tachiyomi.util.lang.byteSize
import eu.kanade.tachiyomi.util.lang.launchIO
import eu.kanade.tachiyomi.util.lang.takeBytes
import eu.kanade.tachiyomi.util.storage.DiskUtil
import eu.kanade.tachiyomi.util.system.ImageUtil
import eu.kanade.tachiyomi.util.updateCoverLastModified
import rx.Completable
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import rx.Observable
import rx.Subscription
import rx.android.schedulers.AndroidSchedulers
@@ -661,29 +663,25 @@ class ReaderPresenter(
val trackManager = Injekt.get<TrackManager>()
db.getTracks(manga).asRxSingle()
.flatMapCompletable { trackList ->
Completable.concat(
trackList.map { track ->
val service = trackManager.getService(track.sync_id)
if (service != null && service.isLogged && chapterRead > track.last_chapter_read) {
track.last_chapter_read = chapterRead
launchIO {
db.getTracks(manga).await()
.mapNotNull { track ->
val service = trackManager.getService(track.sync_id)
if (service != null && service.isLogged && chapterRead > track.last_chapter_read) {
track.last_chapter_read = chapterRead
// We wan't these to execute even if the presenter is destroyed and leaks
// for a while. The view can still be garbage collected.
Observable.defer { service.update(track) }
.map { db.insertTrack(track).executeAsBlocking() }
.toCompletable()
.onErrorComplete()
} else {
Completable.complete()
// We want these to execute even if the presenter is destroyed and leaks
// for a while. The view can still be garbage collected.
async {
service.update(track)
db.insertTrack(track).await()
}
} else {
null
}
)
}
.onErrorComplete()
.subscribeOn(Schedulers.io())
.subscribe()
}
.awaitAll()
}
}
/**

View File

@@ -1,8 +1,8 @@
package eu.kanade.tachiyomi.ui.setting.track
import android.net.Uri
import rx.android.schedulers.AndroidSchedulers
import rx.schedulers.Schedulers
import eu.kanade.tachiyomi.util.lang.launchIO
import eu.kanade.tachiyomi.util.lang.launchUI
class AnilistLoginActivity : BaseOAuthLoginActivity() {
@@ -10,17 +10,12 @@ class AnilistLoginActivity : BaseOAuthLoginActivity() {
val regex = "(?:access_token=)(.*?)(?:&)".toRegex()
val matchResult = regex.find(data?.fragment.toString())
if (matchResult?.groups?.get(1) != null) {
trackManager.aniList.login(matchResult.groups[1]!!.value)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
returnToSettings()
},
{
returnToSettings()
}
)
launchIO {
trackManager.aniList.login(matchResult.groups[1]!!.value)
launchUI {
returnToSettings()
}
}
} else {
trackManager.aniList.logout()
returnToSettings()

View File

@@ -1,25 +1,20 @@
package eu.kanade.tachiyomi.ui.setting.track
import android.net.Uri
import rx.android.schedulers.AndroidSchedulers
import rx.schedulers.Schedulers
import eu.kanade.tachiyomi.util.lang.launchIO
import eu.kanade.tachiyomi.util.lang.launchUI
class BangumiLoginActivity : BaseOAuthLoginActivity() {
override fun handleResult(data: Uri?) {
val code = data?.getQueryParameter("code")
if (code != null) {
trackManager.bangumi.login(code)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
returnToSettings()
},
{
returnToSettings()
}
)
launchIO {
trackManager.bangumi.login(code)
launchUI {
returnToSettings()
}
}
} else {
trackManager.bangumi.logout()
returnToSettings()

View File

@@ -1,25 +1,20 @@
package eu.kanade.tachiyomi.ui.setting.track
import android.net.Uri
import rx.android.schedulers.AndroidSchedulers
import rx.schedulers.Schedulers
import eu.kanade.tachiyomi.util.lang.launchIO
import eu.kanade.tachiyomi.util.lang.launchUI
class MyAnimeListLoginActivity : BaseOAuthLoginActivity() {
override fun handleResult(data: Uri?) {
val code = data?.getQueryParameter("code")
if (code != null) {
trackManager.myAnimeList.login(code)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
returnToSettings()
},
{
returnToSettings()
}
)
launchIO {
trackManager.myAnimeList.login(code)
launchUI {
returnToSettings()
}
}
} else {
trackManager.myAnimeList.logout()
returnToSettings()

View File

@@ -1,25 +1,20 @@
package eu.kanade.tachiyomi.ui.setting.track
import android.net.Uri
import rx.android.schedulers.AndroidSchedulers
import rx.schedulers.Schedulers
import eu.kanade.tachiyomi.util.lang.launchIO
import eu.kanade.tachiyomi.util.lang.launchUI
class ShikimoriLoginActivity : BaseOAuthLoginActivity() {
override fun handleResult(data: Uri?) {
val code = data?.getQueryParameter("code")
if (code != null) {
trackManager.shikimori.login(code)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
returnToSettings()
},
{
returnToSettings()
}
)
launchIO {
trackManager.shikimori.login(code)
launchUI {
returnToSettings()
}
}
} else {
trackManager.shikimori.logout()
returnToSettings()

View File

@@ -7,10 +7,10 @@ import androidx.core.os.bundleOf
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.data.track.TrackService
import eu.kanade.tachiyomi.util.lang.launchIO
import eu.kanade.tachiyomi.util.lang.launchUI
import eu.kanade.tachiyomi.util.system.toast
import eu.kanade.tachiyomi.widget.preference.LoginDialogPreference
import rx.android.schedulers.AndroidSchedulers
import rx.schedulers.Schedulers
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
@@ -34,8 +34,6 @@ class TrackLoginDialog(
}
override fun checkLogin() {
requestSubscription?.unsubscribe()
if (binding!!.username.text.isNullOrEmpty() || binding!!.password.text.isNullOrEmpty()) {
return
}
@@ -44,20 +42,21 @@ class TrackLoginDialog(
val user = binding!!.username.text.toString()
val pass = binding!!.password.text.toString()
requestSubscription = service.login(user, pass)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
launchIO {
try {
service.login(user, pass)
launchUI {
dialog?.dismiss()
view?.context?.toast(R.string.login_success)
},
{ error ->
}
} catch (e: Throwable) {
launchUI {
binding!!.login.progress = -1
binding!!.login.setText(R.string.unknown_error)
error.message?.let { view?.context?.toast(it) }
e.message?.let { view?.context?.toast(it) }
}
)
}
}
}
override fun onDialogClosed() {