diff --git a/app/src/main/kotlin/io/github/landwarderer/futon/details/ui/pager/ChaptersPagesViewModel.kt b/app/src/main/kotlin/io/github/landwarderer/futon/details/ui/pager/ChaptersPagesViewModel.kt index b2fb03a8db..8b7c4c4a23 100644 --- a/app/src/main/kotlin/io/github/landwarderer/futon/details/ui/pager/ChaptersPagesViewModel.kt +++ b/app/src/main/kotlin/io/github/landwarderer/futon/details/ui/pager/ChaptersPagesViewModel.kt @@ -244,7 +244,7 @@ abstract class ChaptersPagesViewModel( return filter { it.contains(query) } } - private suspend fun onDownloadComplete(downloadedManga: LocalManga?) { + protected open suspend fun onDownloadComplete(downloadedManga: LocalManga?) { downloadedManga ?: return mangaDetails.update { interactor.updateLocal(it, downloadedManga) diff --git a/app/src/main/kotlin/io/github/landwarderer/futon/reader/ui/ReaderViewModel.kt b/app/src/main/kotlin/io/github/landwarderer/futon/reader/ui/ReaderViewModel.kt index 5800f3cb73..23bb7efc25 100644 --- a/app/src/main/kotlin/io/github/landwarderer/futon/reader/ui/ReaderViewModel.kt +++ b/app/src/main/kotlin/io/github/landwarderer/futon/reader/ui/ReaderViewModel.kt @@ -30,6 +30,7 @@ import io.github.landwarderer.futon.R import io.github.landwarderer.futon.bookmarks.domain.Bookmark import io.github.landwarderer.futon.bookmarks.domain.BookmarksRepository import io.github.landwarderer.futon.core.exceptions.EmptyMangaException +import io.github.landwarderer.futon.core.model.LocalMangaSource import io.github.landwarderer.futon.core.model.getPreferredBranch import io.github.landwarderer.futon.core.nav.MangaIntent import io.github.landwarderer.futon.core.nav.ReaderIntent @@ -409,23 +410,36 @@ class ReaderViewModel @Inject constructor( } } - fun updateReadingProgress() { - viewModelScope.launch { - withContext(Dispatchers.IO) { - manga.collectLatest { - if (it != null) { - progressUpdateUseCase(it) + override suspend fun onDownloadComplete(downloadedManga: LocalManga?) { + super.onDownloadComplete(downloadedManga) + val state = readingState.value ?: return + val details = mangaDetails.value ?: return + if (downloadedManga != null && details.id == downloadedManga.manga.id) { + chaptersLoader.init(details) + if (chaptersLoader.peekChapter(state.chapterId)?.source == LocalMangaSource) { + val pages = chaptersLoader.getPages(state.chapterId) + if (pages.isEmpty() || pages.first().source != LocalMangaSource) { + runCatchingCancellable { + chaptersLoader.loadSingleChapter(state.chapterId) + }.onSuccess { + content.value = ReaderContent(chaptersLoader.snapshot(), state) } } - - pageLoader.updateCache(getCurrentPage()!!) } } } + fun updateReadingProgress() { + viewModelScope.launch(Dispatchers.IO) { + val manga = manga.filterNotNull().first() + progressUpdateUseCase(manga) + getCurrentPage()?.let { pageLoader.updateCache(it) } + } + } + private fun loadImpl() { loadingJob = launchLoadingJob(Dispatchers.IO + EventExceptionHandler(onLoadingError)) { - var exception: Exception? = null + var exception: Throwable? = null var loadedDetails: MangaDetails? = null try { detailsLoadUseCase(intent, force = false) @@ -434,7 +448,14 @@ class ReaderViewModel @Inject constructor( if (mangaDetails.value == null) { mangaDetails.value = details } + val currentChapterId = readingState.value?.chapterId + val wasCurrentChapterLocal = currentChapterId?.let { + chaptersLoader.peekChapter(it)?.source == LocalMangaSource + } ?: false chaptersLoader.init(details) + val isCurrentChapterLocal = currentChapterId?.let { + chaptersLoader.peekChapter(it)?.source == LocalMangaSource + } ?: false val manga = details.toManga() // obtain state if (readingState.value == null) { @@ -451,11 +472,19 @@ class ReaderViewModel @Inject constructor( readerMode.value = mode try { chaptersLoader.loadSingleChapter(newState.chapterId) - } catch (e: Exception) { + } catch (e: Throwable) { readingState.value = null // try next time exception = e.mergeWith(exception) return@collect } + } else if (!wasCurrentChapterLocal && isCurrentChapterLocal) { + readingState.value?.let { + runCatchingCancellable { + chaptersLoader.loadSingleChapter(it.chapterId) + }.onFailure { e -> + exception = e.mergeWith(exception) + } + } } mangaDetails.value = details.filterChapters(selectedBranch.value) @@ -471,7 +500,7 @@ class ReaderViewModel @Inject constructor( } } catch (e: CancellationException) { throw e - } catch (e: Exception) { + } catch (e: Throwable) { exception = e.mergeWith(exception) } if (readingState.value == null) { @@ -633,7 +662,7 @@ class ReaderViewModel @Inject constructor( return ReaderState(manga, preferredBranch) } - private fun Exception.mergeWith(other: Exception?): Exception = if (other == null) { + private fun Throwable.mergeWith(other: Throwable?): Throwable = if (other == null) { this } else { other.addSuppressed(this) diff --git a/gradle.properties b/gradle.properties index c44e78122d..7f518ce2d5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,11 +15,11 @@ android.enableJetifier=false android.nonTransitiveRClass=true android.useAndroidX=true kotlin.code.style=official -org.gradle.jvmargs=-Xmx8192M -Dkotlin.daemon.jvm.options\="-Xmx8192M" +org.gradle.jvmargs=-Xmx2192M -Dkotlin.daemon.jvm.options\="-Xmx2192M" android.enableR8.fullMode=true android.nonFinalResIds=false org.gradle.parallel=true -org.gradle.workers.max=8 +org.gradle.workers.max=2 org.gradle.caching=true org.gradle.configuration-cache=true kotlin.incremental=true