Move chapter preferences from PreferencesHelper to LibraryPrefrences (#8061)

This commit is contained in:
Andreas
2022-09-24 16:14:16 +02:00
committed by GitHub
parent 747cbd24cb
commit b5dca2eb09
15 changed files with 154 additions and 128 deletions

View File

@@ -22,6 +22,7 @@ import eu.kanade.core.prefs.mapAsCheckboxState
import eu.kanade.domain.category.interactor.GetCategories
import eu.kanade.domain.category.interactor.SetMangaCategories
import eu.kanade.domain.chapter.interactor.GetChapterByMangaId
import eu.kanade.domain.chapter.interactor.SetMangaDefaultChapterFlags
import eu.kanade.domain.chapter.interactor.SyncChaptersWithTrackServiceTwoWay
import eu.kanade.domain.library.service.LibraryPreferences
import eu.kanade.domain.manga.interactor.GetDuplicateLibraryManga
@@ -63,7 +64,6 @@ import eu.kanade.tachiyomi.ui.browse.source.filter.TextItem
import eu.kanade.tachiyomi.ui.browse.source.filter.TextSectionItem
import eu.kanade.tachiyomi.ui.browse.source.filter.TriStateItem
import eu.kanade.tachiyomi.ui.browse.source.filter.TriStateSectionItem
import eu.kanade.tachiyomi.util.chapter.ChapterSettingsHelper
import eu.kanade.tachiyomi.util.lang.launchIO
import eu.kanade.tachiyomi.util.lang.withIOContext
import eu.kanade.tachiyomi.util.removeCovers
@@ -97,6 +97,7 @@ open class BrowseSourcePresenter(
private val getCategories: GetCategories = Injekt.get(),
private val getChapterByMangaId: GetChapterByMangaId = Injekt.get(),
private val setMangaCategories: SetMangaCategories = Injekt.get(),
private val setMangaDefaultChapterFlags: SetMangaDefaultChapterFlags = Injekt.get(),
private val insertManga: InsertManga = Injekt.get(),
private val updateManga: UpdateManga = Injekt.get(),
private val insertTrack: InsertTrack = Injekt.get(),
@@ -246,7 +247,7 @@ open class BrowseSourcePresenter(
if (!new.favorite) {
new = new.removeCovers(coverCache)
} else {
ChapterSettingsHelper.applySettingDefaults(manga.id)
setMangaDefaultChapterFlags.await(manga)
autoAddTrack(manga)
}

View File

@@ -48,7 +48,7 @@ import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter
import eu.kanade.tachiyomi.util.lang.combineLatest
import eu.kanade.tachiyomi.util.lang.launchIO
import eu.kanade.tachiyomi.util.lang.launchNonCancellableIO
import eu.kanade.tachiyomi.util.lang.launchNonCancellable
import eu.kanade.tachiyomi.util.removeCovers
import eu.kanade.tachiyomi.widget.ExtendedNavigationView.Item.TriStateGroup.State
import kotlinx.coroutines.Job
@@ -524,7 +524,7 @@ class LibraryPresenter(
* @param mangas the list of manga.
*/
fun downloadUnreadChapters(mangas: List<Manga>) {
presenterScope.launchNonCancellableIO {
presenterScope.launchNonCancellable {
mangas.forEach { manga ->
val chapters = getChapterByMangaId.await(manga.id)
.filter { !it.read }
@@ -541,7 +541,7 @@ class LibraryPresenter(
* @param mangas the list of manga.
*/
fun markReadStatus(mangas: List<Manga>, read: Boolean) {
presenterScope.launchNonCancellableIO {
presenterScope.launchNonCancellable {
mangas.forEach { manga ->
setReadStatus.await(
manga = manga,
@@ -559,7 +559,7 @@ class LibraryPresenter(
* @param deleteChapters whether to delete downloaded chapters.
*/
fun removeMangas(mangaList: List<DbManga>, deleteFromLibrary: Boolean, deleteChapters: Boolean) {
presenterScope.launchNonCancellableIO {
presenterScope.launchNonCancellable {
val mangaToDelete = mangaList.distinctBy { it.id }
if (deleteFromLibrary) {
@@ -592,7 +592,7 @@ class LibraryPresenter(
* @param removeCategories the categories to remove in all mangas.
*/
fun setMangaCategories(mangaList: List<Manga>, addCategories: List<Long>, removeCategories: List<Long>) {
presenterScope.launchNonCancellableIO {
presenterScope.launchNonCancellable {
mangaList.map { manga ->
val categoryIds = getCategories.await(manga.id)
.map { it.id }

View File

@@ -9,6 +9,7 @@ import eu.kanade.core.prefs.mapAsCheckboxState
import eu.kanade.domain.category.interactor.GetCategories
import eu.kanade.domain.category.interactor.SetMangaCategories
import eu.kanade.domain.category.model.Category
import eu.kanade.domain.chapter.interactor.SetMangaDefaultChapterFlags
import eu.kanade.domain.chapter.interactor.SetReadStatus
import eu.kanade.domain.chapter.interactor.SyncChaptersWithSource
import eu.kanade.domain.chapter.interactor.SyncChaptersWithTrackServiceTwoWay
@@ -41,10 +42,9 @@ import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter
import eu.kanade.tachiyomi.ui.manga.track.TrackItem
import eu.kanade.tachiyomi.util.chapter.ChapterSettingsHelper
import eu.kanade.tachiyomi.util.chapter.getChapterSort
import eu.kanade.tachiyomi.util.lang.launchIO
import eu.kanade.tachiyomi.util.lang.launchNonCancellableIO
import eu.kanade.tachiyomi.util.lang.launchNonCancellable
import eu.kanade.tachiyomi.util.lang.toRelativeString
import eu.kanade.tachiyomi.util.lang.withUIContext
import eu.kanade.tachiyomi.util.preference.asHotFlow
@@ -91,6 +91,7 @@ class MangaPresenter(
private val getMangaAndChapters: GetMangaWithChapters = Injekt.get(),
private val getDuplicateLibraryManga: GetDuplicateLibraryManga = Injekt.get(),
private val setMangaChapterFlags: SetMangaChapterFlags = Injekt.get(),
private val setMangaDefaultChapterFlags: SetMangaDefaultChapterFlags = Injekt.get(),
private val setReadStatus: SetReadStatus = Injekt.get(),
private val updateChapter: UpdateChapter = Injekt.get(),
private val updateManga: UpdateManga = Injekt.get(),
@@ -162,7 +163,7 @@ class MangaPresenter(
val manga = getMangaAndChapters.awaitManga(mangaId)
if (!manga.favorite) {
ChapterSettingsHelper.applySettingDefaults(mangaId)
setMangaDefaultChapterFlags.await(manga)
}
// Show what we have earlier.
@@ -646,7 +647,7 @@ class MangaPresenter(
* @param chapters the list of chapters to delete.
*/
fun deleteChapters(chapters: List<DomainChapter>) {
presenterScope.launchNonCancellableIO {
presenterScope.launchNonCancellable {
val chapters2 = chapters.map { it.toDbChapter() }
try {
updateSuccessState { successState ->
@@ -678,10 +679,10 @@ class MangaPresenter(
}
private fun downloadNewChapters(chapters: List<DomainChapter>) {
presenterScope.launchNonCancellableIO {
val manga = successState?.manga ?: return@launchNonCancellableIO
presenterScope.launchNonCancellable {
val manga = successState?.manga ?: return@launchNonCancellable
val categories = getCategories.await(manga.id).map { it.id }
if (chapters.isEmpty() || !manga.shouldDownloadNewChapters(categories, downloadPreferences)) return@launchNonCancellableIO
if (chapters.isEmpty() || !manga.shouldDownloadNewChapters(categories, downloadPreferences)) return@launchNonCancellable
downloadChapters(chapters)
}
}
@@ -698,7 +699,7 @@ class MangaPresenter(
State.INCLUDE -> DomainManga.CHAPTER_SHOW_UNREAD
State.EXCLUDE -> DomainManga.CHAPTER_SHOW_READ
}
presenterScope.launchNonCancellableIO {
presenterScope.launchNonCancellable {
setMangaChapterFlags.awaitSetUnreadFilter(manga, flag)
}
}
@@ -716,7 +717,7 @@ class MangaPresenter(
State.EXCLUDE -> DomainManga.CHAPTER_SHOW_NOT_DOWNLOADED
}
presenterScope.launchNonCancellableIO {
presenterScope.launchNonCancellable {
setMangaChapterFlags.awaitSetDownloadedFilter(manga, flag)
}
}
@@ -734,7 +735,7 @@ class MangaPresenter(
State.EXCLUDE -> DomainManga.CHAPTER_SHOW_NOT_BOOKMARKED
}
presenterScope.launchNonCancellableIO {
presenterScope.launchNonCancellable {
setMangaChapterFlags.awaitSetBookmarkFilter(manga, flag)
}
}
@@ -746,7 +747,7 @@ class MangaPresenter(
fun setDisplayMode(mode: Long) {
val manga = successState?.manga ?: return
presenterScope.launchNonCancellableIO {
presenterScope.launchNonCancellable {
setMangaChapterFlags.awaitSetDisplayMode(manga, mode)
}
}
@@ -758,7 +759,7 @@ class MangaPresenter(
fun setSorting(sort: Long) {
val manga = successState?.manga ?: return
presenterScope.launchNonCancellableIO {
presenterScope.launchNonCancellable {
setMangaChapterFlags.awaitSetSortingModeOrFlipOrder(manga, sort)
}
}
@@ -873,7 +874,7 @@ class MangaPresenter(
fun refreshTrackers() {
refreshTrackersJob?.cancel()
refreshTrackersJob = presenterScope.launchNonCancellableIO {
refreshTrackersJob = presenterScope.launchNonCancellable {
supervisorScope {
try {
trackList
@@ -921,7 +922,7 @@ class MangaPresenter(
val successState = successState ?: return
if (item != null) {
item.manga_id = successState.manga.id
presenterScope.launchNonCancellableIO {
presenterScope.launchNonCancellable {
try {
val allChapters = successState.chapters.map { it.chapter }
val hasReadChapters = allChapters.any { it.read }
@@ -962,13 +963,13 @@ class MangaPresenter(
fun unregisterTracking(service: TrackService) {
val manga = successState?.manga ?: return
presenterScope.launchNonCancellableIO {
presenterScope.launchNonCancellable {
deleteTrack.await(manga.id, service.id)
}
}
private fun updateRemote(track: Track, service: TrackService) {
presenterScope.launchNonCancellableIO {
presenterScope.launchNonCancellable {
try {
service.update(track)

View File

@@ -4,16 +4,27 @@ import android.app.Dialog
import android.os.Bundle
import androidx.core.os.bundleOf
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.domain.chapter.interactor.SetMangaDefaultChapterFlags
import eu.kanade.domain.library.service.LibraryPreferences
import eu.kanade.domain.manga.model.Manga
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.ui.base.controller.DialogController
import eu.kanade.tachiyomi.util.chapter.ChapterSettingsHelper
import eu.kanade.tachiyomi.util.system.getSerializableCompat
import eu.kanade.tachiyomi.util.system.toast
import eu.kanade.tachiyomi.widget.DialogCheckboxView
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.cancel
import kotlinx.coroutines.launch
import uy.kohesive.injekt.injectLazy
class SetChapterSettingsDialog(bundle: Bundle? = null) : DialogController(bundle) {
private val scope = CoroutineScope(Dispatchers.IO)
private val libraryPreferences: LibraryPreferences by injectLazy()
private val setMangaDefaultChapterFlags: SetMangaDefaultChapterFlags by injectLazy()
constructor(manga: Manga) : this(
bundleOf(MANGA_KEY to manga),
)
@@ -28,9 +39,11 @@ class SetChapterSettingsDialog(bundle: Bundle? = null) : DialogController(bundle
.setTitle(R.string.chapter_settings)
.setView(view)
.setPositiveButton(android.R.string.ok) { _, _ ->
ChapterSettingsHelper.setGlobalSettings(args.getSerializableCompat(MANGA_KEY)!!)
libraryPreferences.setChapterSettingsDefault(args.getSerializableCompat(MANGA_KEY)!!)
if (view.isChecked()) {
ChapterSettingsHelper.updateAllMangasWithGlobalDefaults()
scope.launch {
setMangaDefaultChapterFlags.awaitAll()
}
}
activity?.toast(activity!!.getString(R.string.chapter_settings_updated))
@@ -38,6 +51,11 @@ class SetChapterSettingsDialog(bundle: Bundle? = null) : DialogController(bundle
.setNegativeButton(android.R.string.cancel, null)
.create()
}
override fun onDestroy() {
super.onDestroy()
scope.cancel()
}
}
private const val MANGA_KEY = "manga"

View File

@@ -50,7 +50,7 @@ import eu.kanade.tachiyomi.util.chapter.getChapterSort
import eu.kanade.tachiyomi.util.editCover
import eu.kanade.tachiyomi.util.lang.byteSize
import eu.kanade.tachiyomi.util.lang.launchIO
import eu.kanade.tachiyomi.util.lang.launchNonCancellableIO
import eu.kanade.tachiyomi.util.lang.launchNonCancellable
import eu.kanade.tachiyomi.util.lang.takeBytes
import eu.kanade.tachiyomi.util.lang.withUIContext
import eu.kanade.tachiyomi.util.storage.DiskUtil
@@ -239,7 +239,7 @@ class ReaderPresenter(
*/
fun onSaveInstanceStateNonConfigurationChange() {
val currentChapter = getCurrentChapter() ?: return
presenterScope.launchNonCancellableIO {
presenterScope.launchNonCancellable {
saveChapterProgress(currentChapter)
}
}
@@ -530,7 +530,7 @@ class ReaderPresenter(
* Called when reader chapter is changed in reader or when activity is paused.
*/
private fun saveReadingProgress(readerChapter: ReaderChapter) {
presenterScope.launchNonCancellableIO {
presenterScope.launchNonCancellable {
saveChapterProgress(readerChapter)
saveChapterHistory(readerChapter)
}
@@ -611,7 +611,7 @@ class ReaderPresenter(
fun bookmarkCurrentChapter(bookmarked: Boolean) {
val chapter = getCurrentChapter()?.chapter ?: return
chapter.bookmark = bookmarked // Otherwise the bookmark icon doesn't update
presenterScope.launchNonCancellableIO {
presenterScope.launchNonCancellable {
updateChapter.await(
ChapterUpdate(
id = chapter.id!!.toLong(),
@@ -724,7 +724,7 @@ class ReaderPresenter(
// Copy file in background.
try {
presenterScope.launchNonCancellableIO {
presenterScope.launchNonCancellable {
val uri = imageSaver.save(
image = Image.Page(
inputStream = page.stream!!,
@@ -760,7 +760,7 @@ class ReaderPresenter(
val filename = generateFilename(manga, page)
try {
presenterScope.launchNonCancellableIO {
presenterScope.launchNonCancellable {
destDir.deleteRecursively()
val uri = imageSaver.save(
image = Image.Page(
@@ -786,7 +786,7 @@ class ReaderPresenter(
val manga = manga?.toDomainManga() ?: return
val stream = page.stream ?: return
presenterScope.launchNonCancellableIO {
presenterScope.launchNonCancellable {
try {
manga.editCover(context, stream())
withUIContext {
@@ -832,7 +832,7 @@ class ReaderPresenter(
val trackManager = Injekt.get<TrackManager>()
val context = Injekt.get<Application>()
presenterScope.launchNonCancellableIO {
presenterScope.launchNonCancellable {
getTracks.await(manga.id!!)
.mapNotNull { track ->
val service = trackManager.getService(track.syncId)
@@ -870,7 +870,7 @@ class ReaderPresenter(
if (!chapter.chapter.read) return
val manga = manga ?: return
presenterScope.launchNonCancellableIO {
presenterScope.launchNonCancellable {
downloadManager.enqueueDeleteChapters(listOf(chapter.chapter), manga.toDomainManga()!!)
}
}
@@ -880,7 +880,7 @@ class ReaderPresenter(
* are ignored.
*/
private fun deletePendingChapters() {
presenterScope.launchNonCancellableIO {
presenterScope.launchNonCancellable {
downloadManager.deletePendingChapters()
}
}

View File

@@ -23,7 +23,7 @@ import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter
import eu.kanade.tachiyomi.util.lang.launchIO
import eu.kanade.tachiyomi.util.lang.launchNonCancellableIO
import eu.kanade.tachiyomi.util.lang.launchNonCancellable
import eu.kanade.tachiyomi.util.lang.withUIContext
import eu.kanade.tachiyomi.util.system.logcat
import kotlinx.coroutines.Job
@@ -236,7 +236,7 @@ class UpdatesPresenter(
* @param updatesItem the list of chapters to download.
*/
fun downloadChapters(updatesItem: List<UpdatesItem>) {
presenterScope.launchNonCancellableIO {
presenterScope.launchNonCancellable {
val groupedUpdates = updatesItem.groupBy { it.update.mangaId }.values
for (updates in groupedUpdates) {
val mangaId = updates.first().update.mangaId
@@ -255,7 +255,7 @@ class UpdatesPresenter(
* @param updatesItem list of chapters
*/
fun deleteChapters(updatesItem: List<UpdatesItem>) {
presenterScope.launchNonCancellableIO {
presenterScope.launchNonCancellable {
val groupedUpdates = updatesItem.groupBy { it.update.mangaId }.values
val deletedIds = groupedUpdates.flatMap { updates ->
val mangaId = updates.first().update.mangaId
@@ -268,7 +268,7 @@ class UpdatesPresenter(
val deletedUpdates = items.filter {
deletedIds.contains(it.update.chapterId)
}
if (deletedUpdates.isEmpty()) return@launchNonCancellableIO
if (deletedUpdates.isEmpty()) return@launchNonCancellable
// TODO: Don't do this fake status update
state.items = items.toMutableList().apply {

View File

@@ -33,7 +33,7 @@ import eu.kanade.tachiyomi.ui.base.controller.openInBrowser
import eu.kanade.tachiyomi.ui.base.controller.pushController
import eu.kanade.tachiyomi.ui.setting.database.ClearDatabaseController
import eu.kanade.tachiyomi.util.CrashLogUtil
import eu.kanade.tachiyomi.util.lang.launchNonCancellableIO
import eu.kanade.tachiyomi.util.lang.launchNonCancellable
import eu.kanade.tachiyomi.util.lang.withUIContext
import eu.kanade.tachiyomi.util.preference.bindTo
import eu.kanade.tachiyomi.util.preference.defaultValue
@@ -90,7 +90,7 @@ class SettingsAdvancedController(
summaryRes = R.string.pref_dump_crash_logs_summary
onClick {
viewScope.launchNonCancellableIO {
viewScope.launchNonCancellable {
CrashLogUtil(context).dumpLogs()
}
}
@@ -343,7 +343,7 @@ class SettingsAdvancedController(
private fun clearChapterCache() {
val activity = activity ?: return
viewScope.launchNonCancellableIO {
viewScope.launchNonCancellable {
try {
val deletedFiles = chapterCache.clear()
withUIContext {
@@ -379,7 +379,7 @@ class SettingsAdvancedController(
private fun resetViewerFlags() {
val activity = activity ?: return
viewScope.launchNonCancellableIO {
viewScope.launchNonCancellable {
val success = mangaRepository.resetViewerFlags()
withUIContext {
val message = if (success) {