From 9320221a4e8b118ef68deb60d8c4c32bcbb9e06f Mon Sep 17 00:00:00 2001 From: arkon Date: Sun, 24 Jan 2021 11:04:25 -0500 Subject: [PATCH] Minor cleanup (cherry picked from commit a93c0577acdf9fdc591087838ecb5a004d3acf81) # Conflicts: # app/src/main/java/eu/kanade/tachiyomi/data/backup/AbstractBackupRestore.kt # app/src/main/java/eu/kanade/tachiyomi/util/lang/RxCoroutineBridge.kt # app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt --- .../data/backup/AbstractBackupRestore.kt | 7 +- .../data/library/LibraryUpdateService.kt | 14 ++-- .../ui/browse/source/index/IndexPresenter.kt | 15 ++--- .../eu/kanade/tachiyomi/util/CrashLogUtil.kt | 8 +-- .../tachiyomi/util/lang/RxCoroutineBridge.kt | 64 ------------------- .../util/system/ContextExtensions.kt | 10 +++ 6 files changed, 26 insertions(+), 92 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/AbstractBackupRestore.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/AbstractBackupRestore.kt index 12e6f865f..c2ad4f637 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/AbstractBackupRestore.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/AbstractBackupRestore.kt @@ -10,6 +10,7 @@ import eu.kanade.tachiyomi.data.database.models.Track import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.util.chapter.NoChaptersException +import eu.kanade.tachiyomi.util.system.createFileInCacheDir import exh.eh.EHentaiThrottleManager import kotlinx.coroutines.Job import uy.kohesive.injekt.injectLazy @@ -123,15 +124,15 @@ abstract class AbstractBackupRestore(protected val co internal fun writeErrorLog(): File { try { if (errors.isNotEmpty()) { - val destFile = File(context.externalCacheDir, "tachiyomi_restore.txt") + val file = context.createFileInCacheDir("tachiyomi_restore.txt") val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.getDefault()) - destFile.bufferedWriter().use { out -> + file.bufferedWriter().use { out -> errors.forEach { (date, message) -> out.write("[${sdf.format(date)}] $message\n") } } - return destFile + return file } } catch (e: Exception) { // Empty diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt index c986848d0..f552b2492 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt @@ -37,6 +37,7 @@ import eu.kanade.tachiyomi.util.prepUpdateCover import eu.kanade.tachiyomi.util.shouldDownloadNewChapters import eu.kanade.tachiyomi.util.storage.getUriCompat import eu.kanade.tachiyomi.util.system.acquireWakeLock +import eu.kanade.tachiyomi.util.system.createFileInCacheDir import eu.kanade.tachiyomi.util.system.isServiceRunning import exh.md.utils.FollowStatus import exh.md.utils.MdUtil @@ -328,13 +329,9 @@ class LibraryUpdateService( * @return an observable delivering the progress of each update. */ suspend fun updateChapterList(mangaToUpdate: List) { - // Initialize the variables holding the progress of the updates. val progressCount = AtomicInteger(0) - // List containing new updates val newUpdates = mutableListOf>>() - // List containing failed updates val failedUpdates = mutableListOf>() - // Boolean to determine if DownloadManager has downloads var hasDownloads = false mangaToUpdate @@ -433,7 +430,7 @@ class LibraryUpdateService( } } - scope.launchIO { + ioScope.launchIO { if (source is MangaDex && trackManager.mdList.isLogged) { val tracks = db.getTracks(manga).executeOnIO() if (tracks.isEmpty() || tracks.none { it.sync_id == TrackManager.MDLIST }) { @@ -591,15 +588,14 @@ class LibraryUpdateService( private fun writeErrorFile(errors: List>): File { try { if (errors.isNotEmpty()) { - val destFile = File(externalCacheDir, "tachiyomi_update_errors.txt") - - destFile.bufferedWriter().use { out -> + val file = createFileInCacheDir("tachiyomi_update_errors.txt") + file.bufferedWriter().use { out -> errors.forEach { (manga, error) -> val source = sourceManager.getOrStub(manga.source) out.write("${manga.title} ($source): $error\n") } } - return destFile + return file } } catch (e: Exception) { // Empty diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/index/IndexPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/index/IndexPresenter.kt index 7a10d7820..019f96a60 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/index/IndexPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/index/IndexPresenter.kt @@ -13,13 +13,12 @@ import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.toSManga import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourcePresenter.Companion.toItems -import eu.kanade.tachiyomi.util.lang.asFlow +import eu.kanade.tachiyomi.util.lang.awaitSingle import eu.kanade.tachiyomi.util.lang.runAsObservable import eu.kanade.tachiyomi.util.lang.withUIContext import exh.savedsearches.EXHSavedSearch import exh.savedsearches.JsonSavedSearch import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.flow.singleOrNull import kotlinx.coroutines.launch import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json @@ -107,10 +106,8 @@ open class IndexPresenter( if (source.supportsLatest) { val results = try { source.fetchLatestUpdates(1) - .asFlow() - .singleOrNull() - ?.mangas - .orEmpty() + .awaitSingle() + .mangas .take(10) .map { networkToLocalManga(it, source.id) } } catch (e: Exception) { @@ -135,10 +132,8 @@ open class IndexPresenter( val results = try { source.fetchPopularManga(1) - .asFlow() - .singleOrNull() - ?.mangas - .orEmpty() + .awaitSingle() + .mangas .take(10) .map { networkToLocalManga(it, source.id) } } catch (e: Exception) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/CrashLogUtil.kt b/app/src/main/java/eu/kanade/tachiyomi/util/CrashLogUtil.kt index 751bd8cd0..dc75452f3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/CrashLogUtil.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/CrashLogUtil.kt @@ -6,10 +6,10 @@ import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.notification.NotificationReceiver import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.util.storage.getUriCompat +import eu.kanade.tachiyomi.util.system.createFileInCacheDir import eu.kanade.tachiyomi.util.system.notificationBuilder import eu.kanade.tachiyomi.util.system.notificationManager import eu.kanade.tachiyomi.util.system.toast -import java.io.File import java.io.IOException class CrashLogUtil(private val context: Context) { @@ -20,11 +20,7 @@ class CrashLogUtil(private val context: Context) { fun dumpLogs() { try { - val file = File(context.externalCacheDir, "tachiyomi_crash_logs.txt") - if (file.exists()) { - file.delete() - } - file.createNewFile() + val file = context.createFileInCacheDir("tachiyomi_crash_logs.txt") Runtime.getRuntime().exec("logcat *:E -d -f ${file.absolutePath}") showNotification(file.getUriCompat(context)) diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/lang/RxCoroutineBridge.kt b/app/src/main/java/eu/kanade/tachiyomi/util/lang/RxCoroutineBridge.kt index 21df36525..ce760e03d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/lang/RxCoroutineBridge.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/lang/RxCoroutineBridge.kt @@ -5,17 +5,10 @@ import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CoroutineStart import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.channels.awaitClose -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.launch import kotlinx.coroutines.suspendCancellableCoroutine import rx.Emitter import rx.Observable -import rx.Observer -import rx.Scheduler -import rx.Single -import rx.SingleSubscriber import rx.Subscriber import rx.Subscription import kotlin.coroutines.resume @@ -25,45 +18,6 @@ import kotlin.coroutines.resumeWithException * Util functions for bridging RxJava and coroutines. Taken from TachiyomiEH/SY. */ -suspend fun Single.await(subscribeOn: Scheduler? = null): T { - return suspendCancellableCoroutine { continuation -> - val self = if (subscribeOn != null) subscribeOn(subscribeOn) else this - lateinit var sub: Subscription - sub = self.subscribe( - { - continuation.resume(it) { - sub.unsubscribe() - } - }, - { - if (!continuation.isCancelled) { - continuation.resumeWithException(it) - } - } - ) - - continuation.invokeOnCancellation { - sub.unsubscribe() - } - } -} - -suspend fun Single.await(): T = suspendCancellableCoroutine { cont -> - cont.unsubscribeOnCancellation( - subscribe( - object : SingleSubscriber() { - override fun onSuccess(t: T) { - cont.resume(t) - } - - override fun onError(error: Throwable) { - cont.resumeWithException(error) - } - } - ) - ) -} - suspend fun Observable.awaitSingle(): T = single().awaitOne() private suspend fun Observable.awaitOne(): T = suspendCancellableCoroutine { cont -> @@ -105,24 +59,6 @@ private suspend fun Observable.awaitOne(): T = suspendCancellableCoroutin internal fun CancellableContinuation.unsubscribeOnCancellation(sub: Subscription) = invokeOnCancellation { sub.unsubscribe() } -fun Observable.asFlow(): Flow = callbackFlow { - val observer = object : Observer { - override fun onNext(t: T) { - offer(t) - } - - override fun onError(e: Throwable) { - close(e) - } - - override fun onCompleted() { - close() - } - } - val subscription = subscribe(observer) - awaitClose { subscription.unsubscribe() } -} - fun runAsObservable( block: suspend () -> T, backpressureMode: Emitter.BackpressureMode = Emitter.BackpressureMode.NONE diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt index 62067dd0c..e59487365 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt @@ -36,6 +36,7 @@ import eu.kanade.tachiyomi.util.lang.truncateCenter import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch +import java.io.File import kotlin.math.roundToInt /** @@ -255,3 +256,12 @@ fun Context.openInBrowser(uri: Uri, @ColorInt toolbarColor: Int? = null) { toast(e.message) } } + +fun Context.createFileInCacheDir(name: String): File { + val file = File(externalCacheDir, name) + if (file.exists()) { + file.delete() + } + file.createNewFile() + return file +}