diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt index 3c9fd3596d..8473a54c6e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt @@ -88,7 +88,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { val netResponse = authClient.newCall(request).execute() val response = responseToJson(netResponse) - val media = response["data"]!!.obj["Page"].obj["mediaList"].array + val media = response["data"]!!.obj["Page"].obj["media"].array val entries = media.map { jsonToALManga(it.obj) } entries.map { it.toTrack() } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdateChecker.kt b/app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdateChecker.kt index fd056bbc08..c4eb465651 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdateChecker.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdateChecker.kt @@ -1,8 +1,6 @@ package eu.kanade.tachiyomi.data.updater -import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.data.updater.github.GithubUpdateChecker -import rx.Observable abstract class UpdateChecker { @@ -11,8 +9,8 @@ abstract class UpdateChecker { } /** - * Returns observable containing release information + * Returns suspended result containing release information */ - abstract fun checkForUpdate(): Observable + abstract suspend fun checkForUpdate(): UpdateResult } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdaterJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdaterJob.kt index 5c6209ec53..aef189fe52 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdaterJob.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdaterJob.kt @@ -9,39 +9,46 @@ import com.evernote.android.job.JobManager import com.evernote.android.job.JobRequest import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.notification.Notifications -import java.util.concurrent.TimeUnit import eu.kanade.tachiyomi.util.system.notificationManager +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import java.util.concurrent.TimeUnit class UpdaterJob : Job() { override fun onRunJob(params: Params): Result { - return UpdateChecker.getUpdateChecker() - .checkForUpdate() - .map { result -> - if (result is UpdateResult.NewUpdate<*>) { - val url = result.release.downloadLink + GlobalScope.launch(Dispatchers.IO) { + val result = try { UpdateChecker.getUpdateChecker().checkForUpdate() } + catch (e: Exception) { return@launch } + if (result is UpdateResult.NewUpdate<*>) { + val url = result.release.downloadLink - val intent = Intent(context, UpdaterService::class.java).apply { - putExtra(UpdaterService.EXTRA_DOWNLOAD_URL, url) - } - - NotificationCompat.Builder(context, Notifications.CHANNEL_COMMON).update { - setContentTitle(context.getString(R.string.app_name)) - setContentText(context.getString(R.string.update_check_notification_update_available)) - setSmallIcon(android.R.drawable.stat_sys_download_done) - color = ContextCompat.getColor(context, R.color.colorAccent) - // Download action - addAction(android.R.drawable.stat_sys_download_done, - context.getString(R.string.action_download), - PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)) - } - } - Result.SUCCESS + val intent = Intent(context, UpdaterService::class.java).apply { + putExtra(UpdaterService.EXTRA_DOWNLOAD_URL, url) } - .onErrorReturn { Result.FAILURE } - // Sadly, the task needs to be synchronous. - .toBlocking() - .single() + + NotificationCompat.Builder(context, Notifications.CHANNEL_COMMON).update { + setContentTitle(context.getString(R.string.app_name)) + setContentText(context.getString(R.string.update_check_notification_update_available)) + setSmallIcon(android.R.drawable.stat_sys_download_done) + color = ContextCompat.getColor(context, R.color.colorAccent) + // Download action + addAction( + android.R.drawable.stat_sys_download_done, + context.getString(R.string.action_download), + PendingIntent.getService( + context, + 0, + intent, + PendingIntent.FLAG_UPDATE_CURRENT + ) + ) + } + } + Result.SUCCESS + } + return Result.SUCCESS } fun NotificationCompat.Builder.update(block: NotificationCompat.Builder.() -> Unit) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/updater/github/GithubUpdateChecker.kt b/app/src/main/java/eu/kanade/tachiyomi/data/updater/github/GithubUpdateChecker.kt index 6fc6297409..b1be97df33 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/updater/github/GithubUpdateChecker.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/updater/github/GithubUpdateChecker.kt @@ -3,22 +3,20 @@ package eu.kanade.tachiyomi.data.updater.github import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.data.updater.UpdateChecker import eu.kanade.tachiyomi.data.updater.UpdateResult -import rx.Observable -class GithubUpdateChecker : UpdateChecker() { + class GithubUpdateChecker : UpdateChecker() { private val service: GithubService = GithubService.create() - override fun checkForUpdate(): Observable { - return service.getLatestVersion().map { release -> - val newVersion = release.version.replace("[^\\d.]".toRegex(), "") + override suspend fun checkForUpdate(): UpdateResult { + val release = service.getLatestVersion() + val newVersion = release.version.replace("[^\\d.]".toRegex(), "") - // Check if latest version is different from current version - if (newVersion != BuildConfig.VERSION_NAME) { - GithubUpdateResult.NewUpdate(release) - } else { - GithubUpdateResult.NoNewUpdate() - } + // Check if latest version is different from current version + return if (newVersion != BuildConfig.VERSION_NAME) { + GithubUpdateResult.NewUpdate(release) + } else { + GithubUpdateResult.NoNewUpdate() } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsPresenter.kt index b57745530c..c1afbeb655 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaDetailsPresenter.kt @@ -54,11 +54,7 @@ class MangaDetailsPresenter(private val controller: MangaDetailsController, DownloadQueue.DownloadListener, LibraryServiceListener { -<<<<<<< Updated upstream private var scope = CoroutineScope(Job() + Dispatchers.Default) -======= - var scope = CoroutineScope(Job() + Dispatchers.Default) ->>>>>>> Stashed changes var isLockedFromSearch = false var hasRequested = false @@ -715,17 +711,15 @@ class MangaDetailsPresenter(private val controller: MangaDetailsController, fun trackSearch(query: String, service: TrackService) { scope.launch(Dispatchers.IO) { -<<<<<<< Updated upstream - val results = try {service.search(query) } -======= - val results = try {service.search(query).toBlocking().single() } ->>>>>>> Stashed changes - catch (e: Exception) { + val results = try { + service.search(query) + } catch (e: Exception) { withContext(Dispatchers.Main) { controller.trackSearchError(e) } - null } - if (!results.isNullOrEmpty()) { - withContext(Dispatchers.Main) { controller.onTrackSearchResults(results) } - } + null + } + if (!results.isNullOrEmpty()) { + withContext(Dispatchers.Main) { controller.onTrackSearchResults(results) } + } } } @@ -734,11 +728,7 @@ class MangaDetailsPresenter(private val controller: MangaDetailsController, item.manga_id = manga.id!! scope.launch { -<<<<<<< Updated upstream val binding = try { service.bind(item) } -======= - val binding = try { service.bind(item).toBlocking().single() } ->>>>>>> Stashed changes catch (e: Exception) { trackError(e) null @@ -758,11 +748,7 @@ class MangaDetailsPresenter(private val controller: MangaDetailsController, private fun updateRemote(track: Track, service: TrackService) { scope.launch { -<<<<<<< Updated upstream val binding = try { service.update(track) } -======= - val binding = try { service.update(track).toBlocking().single() } ->>>>>>> Stashed changes catch (e: Exception) { trackError(e) null diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/TrackingBottomSheet.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/TrackingBottomSheet.kt index 63c7b35608..6a13f11870 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/TrackingBottomSheet.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/TrackingBottomSheet.kt @@ -95,6 +95,7 @@ class TrackingBottomSheet(private val controller: MangaDetailsController) : Bott fun onSearchResultsError(error: Throwable) { Timber.e(error) + activity.toast(error.message) getSearchDialog()?.onSearchResultsError() } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAboutController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAboutController.kt index 03622f7d5f..019fda27aa 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAboutController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAboutController.kt @@ -4,7 +4,6 @@ import android.app.Dialog import android.content.Intent import android.net.Uri import android.os.Bundle -import android.view.View import androidx.preference.PreferenceScreen import com.afollestad.materialdialogs.MaterialDialog import eu.kanade.tachiyomi.BuildConfig @@ -16,11 +15,13 @@ import eu.kanade.tachiyomi.data.updater.UpdateResult import eu.kanade.tachiyomi.data.updater.UpdaterService import eu.kanade.tachiyomi.ui.base.controller.DialogController import eu.kanade.tachiyomi.ui.main.ChangelogDialogController -import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.lang.toTimestampString -import rx.Subscription -import rx.android.schedulers.AndroidSchedulers -import rx.schedulers.Schedulers +import eu.kanade.tachiyomi.util.system.toast +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import timber.log.Timber import uy.kohesive.injekt.injectLazy import java.text.DateFormat @@ -43,7 +44,7 @@ class SettingsAboutController : SettingsController() { /** * The subscribtion service of the obtained release object */ - private var releaseSubscription: Subscription? = null + private val scope = CoroutineScope(Job() + Dispatchers.IO) private val isUpdaterEnabled = BuildConfig.INCLUDE_UPDATER @@ -95,12 +96,6 @@ class SettingsAboutController : SettingsController() { } } - override fun onDestroyView(view: View) { - super.onDestroyView(view) - releaseSubscription?.unsubscribe() - releaseSubscription = null - } - /** * Checks version and shows a user prompt if an update is available. */ @@ -108,27 +103,30 @@ class SettingsAboutController : SettingsController() { if (activity == null) return activity?.toast(R.string.update_check_look_for_updates) - releaseSubscription?.unsubscribe() - releaseSubscription = updateChecker.checkForUpdate() - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ result -> - when (result) { - is UpdateResult.NewUpdate<*> -> { - val body = result.release.info - val url = result.release.downloadLink + scope.launch { + val result = try { + updateChecker.checkForUpdate() + } catch (error: Exception) { + activity?.toast(error.message) + Timber.e(error) + } + when (result) { + is UpdateResult.NewUpdate<*> -> { + val body = result.release.info + val url = result.release.downloadLink - // Create confirmation window - NewUpdateDialogController(body, url).showDialog(router) - } - is UpdateResult.NoNewUpdate -> { - activity?.toast(R.string.update_check_no_new_updates) - } + // Create confirmation window + withContext(Dispatchers.Main) { + NewUpdateDialogController(body, url).showDialog(router) } - }, { error -> - activity?.toast(error.message) - Timber.e(error) - }) + } + is UpdateResult.NoNewUpdate -> { + withContext(Dispatchers.Main) { + activity?.toast(R.string.update_check_no_new_updates) + } + } + } + } } class NewUpdateDialogController(bundle: Bundle? = null) : DialogController(bundle) {