More domain model usage

(cherry picked from commit a3ab8746bf8b1cfca628431e76f9c63ecd973010)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryAdapter.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryView.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt
This commit is contained in:
arkon 2022-07-03 16:12:31 -04:00 committed by Jobobby04
parent 22da633ee3
commit d48427152e
11 changed files with 68 additions and 80 deletions

View File

@ -2,6 +2,7 @@ package eu.kanade.domain.category.model
import android.content.Context import android.content.Context
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.CategoryImpl
import eu.kanade.tachiyomi.ui.library.setting.DisplayModeSetting import eu.kanade.tachiyomi.ui.library.setting.DisplayModeSetting
import eu.kanade.tachiyomi.ui.library.setting.SortDirectionSetting import eu.kanade.tachiyomi.ui.library.setting.SortDirectionSetting
import eu.kanade.tachiyomi.ui.library.setting.SortModeSetting import eu.kanade.tachiyomi.ui.library.setting.SortModeSetting
@ -40,7 +41,8 @@ data class Category(
} }
} }
fun Category.toDbCategory(): DbCategory = DbCategory.create(name).also { fun Category.toDbCategory(): DbCategory = CategoryImpl().also {
it.name = name
it.id = id.toInt() it.id = id.toInt()
it.order = order.toInt() it.order = order.toInt()
it.flags = flags.toInt() it.flags = flags.toInt()

View File

@ -1,7 +1,5 @@
package eu.kanade.tachiyomi.data.database.models package eu.kanade.tachiyomi.data.database.models
import android.content.Context
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.ui.library.setting.DisplayModeSetting import eu.kanade.tachiyomi.ui.library.setting.DisplayModeSetting
import eu.kanade.tachiyomi.ui.library.setting.SortDirectionSetting import eu.kanade.tachiyomi.ui.library.setting.SortDirectionSetting
import eu.kanade.tachiyomi.ui.library.setting.SortModeSetting import eu.kanade.tachiyomi.ui.library.setting.SortModeSetting
@ -37,15 +35,6 @@ interface Category : Serializable {
var sortDirection: Int var sortDirection: Int
get() = flags and SortDirectionSetting.MASK.toInt() get() = flags and SortDirectionSetting.MASK.toInt()
set(mode) = setFlags(mode, SortDirectionSetting.MASK.toInt()) set(mode) = setFlags(mode, SortDirectionSetting.MASK.toInt())
companion object {
fun create(name: String): Category = CategoryImpl().apply {
this.name = name
}
fun createDefault(context: Context): Category = create(context.getString(R.string.label_default)).apply { id = 0 }
}
} }
fun Category.toDomainCategory(): DomainCategory? { fun Category.toDomainCategory(): DomainCategory? {

View File

@ -13,9 +13,9 @@ import androidx.core.app.NotificationManagerCompat
import coil.imageLoader import coil.imageLoader
import coil.request.ImageRequest import coil.request.ImageRequest
import coil.transform.CircleCropTransformation import coil.transform.CircleCropTransformation
import eu.kanade.domain.chapter.model.Chapter
import eu.kanade.domain.manga.model.Manga
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Chapter
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.download.Downloader import eu.kanade.tachiyomi.data.download.Downloader
import eu.kanade.tachiyomi.data.notification.NotificationHandler import eu.kanade.tachiyomi.data.notification.NotificationHandler
import eu.kanade.tachiyomi.data.notification.NotificationReceiver import eu.kanade.tachiyomi.data.notification.NotificationReceiver
@ -295,8 +295,8 @@ class LibraryUpdateNotifier(private val context: Context) {
val displayableChapterNumbers = chapters val displayableChapterNumbers = chapters
.filter { it.isRecognizedNumber } .filter { it.isRecognizedNumber }
.sortedBy { it.chapter_number } .sortedBy { it.chapterNumber }
.map { formatter.format(it.chapter_number) } .map { formatter.format(it.chapterNumber) }
.toSet() .toSet()
return when (displayableChapterNumbers.size) { return when (displayableChapterNumbers.size) {

View File

@ -32,6 +32,7 @@ import eu.kanade.tachiyomi.data.cache.CoverCache
import eu.kanade.tachiyomi.data.database.models.Chapter import eu.kanade.tachiyomi.data.database.models.Chapter
import eu.kanade.tachiyomi.data.database.models.LibraryManga import eu.kanade.tachiyomi.data.database.models.LibraryManga
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.database.models.toDomainChapter
import eu.kanade.tachiyomi.data.database.models.toDomainManga import eu.kanade.tachiyomi.data.database.models.toDomainManga
import eu.kanade.tachiyomi.data.database.models.toMangaInfo import eu.kanade.tachiyomi.data.database.models.toMangaInfo
import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.download.DownloadManager
@ -394,7 +395,7 @@ class LibraryUpdateService(
val semaphore = Semaphore(5) val semaphore = Semaphore(5)
val progressCount = AtomicInteger(0) val progressCount = AtomicInteger(0)
val currentlyUpdatingManga = CopyOnWriteArrayList<LibraryManga>() val currentlyUpdatingManga = CopyOnWriteArrayList<LibraryManga>()
val newUpdates = CopyOnWriteArrayList<Pair<LibraryManga, Array<Chapter>>>() val newUpdates = CopyOnWriteArrayList<Pair<DomainManga, Array<DomainChapter>>>()
val skippedUpdates = CopyOnWriteArrayList<Pair<Manga, String?>>() val skippedUpdates = CopyOnWriteArrayList<Pair<Manga, String?>>()
val failedUpdates = CopyOnWriteArrayList<Pair<Manga, String?>>() val failedUpdates = CopyOnWriteArrayList<Pair<Manga, String?>>()
val hasDownloads = AtomicBoolean(false) val hasDownloads = AtomicBoolean(false)
@ -448,7 +449,10 @@ class LibraryUpdateService(
// Convert to the manga that contains new chapters // Convert to the manga that contains new chapters
newUpdates.add( newUpdates.add(
mangaWithNotif to newDbChapters.sortedByDescending { ch -> ch.source_order } mangaWithNotif.toDomainManga()!! to
newDbChapters
.map { it.toDomainChapter()!! }
.sortedByDescending { it.sourceOrder }
.toTypedArray(), .toTypedArray(),
) )
} }

View File

@ -9,14 +9,14 @@ import android.os.Build
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import eu.kanade.domain.chapter.interactor.GetChapter import eu.kanade.domain.chapter.interactor.GetChapter
import eu.kanade.domain.chapter.interactor.UpdateChapter import eu.kanade.domain.chapter.interactor.UpdateChapter
import eu.kanade.domain.chapter.model.Chapter
import eu.kanade.domain.chapter.model.toChapterUpdate import eu.kanade.domain.chapter.model.toChapterUpdate
import eu.kanade.domain.chapter.model.toDbChapter import eu.kanade.domain.chapter.model.toDbChapter
import eu.kanade.domain.manga.interactor.GetManga import eu.kanade.domain.manga.interactor.GetManga
import eu.kanade.domain.manga.model.Manga
import eu.kanade.domain.manga.model.toDbManga import eu.kanade.domain.manga.model.toDbManga
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.backup.BackupRestoreService import eu.kanade.tachiyomi.data.backup.BackupRestoreService
import eu.kanade.tachiyomi.data.database.models.Chapter
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.download.DownloadManager
import eu.kanade.tachiyomi.data.download.DownloadService import eu.kanade.tachiyomi.data.download.DownloadService
import eu.kanade.tachiyomi.data.library.LibraryUpdateService import eu.kanade.tachiyomi.data.library.LibraryUpdateService

View File

@ -4,9 +4,9 @@ import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.kanade.domain.manga.interactor.GetIdsOfFavoriteMangaWithMetadata import eu.kanade.domain.manga.interactor.GetIdsOfFavoriteMangaWithMetadata
import eu.kanade.domain.manga.interactor.GetSearchTags import eu.kanade.domain.manga.interactor.GetSearchTags
import eu.kanade.domain.manga.interactor.GetSearchTitles import eu.kanade.domain.manga.interactor.GetSearchTitles
import eu.kanade.domain.manga.model.Manga
import eu.kanade.domain.track.interactor.GetTracks import eu.kanade.domain.track.interactor.GetTracks
import eu.kanade.tachiyomi.data.database.models.LibraryManga import eu.kanade.tachiyomi.data.database.models.LibraryManga
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.SourceManager

View File

@ -13,8 +13,9 @@ import eu.kanade.domain.category.interactor.UpdateCategory
import eu.kanade.domain.category.model.Category import eu.kanade.domain.category.model.Category
import eu.kanade.domain.category.model.CategoryUpdate import eu.kanade.domain.category.model.CategoryUpdate
import eu.kanade.domain.category.model.toDbCategory import eu.kanade.domain.category.model.toDbCategory
import eu.kanade.domain.manga.model.Manga
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.toDomainManga
import eu.kanade.tachiyomi.data.library.LibraryUpdateService import eu.kanade.tachiyomi.data.library.LibraryUpdateService
import eu.kanade.tachiyomi.data.preference.PreferenceValues import eu.kanade.tachiyomi.data.preference.PreferenceValues
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
@ -216,7 +217,7 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att
.filter { it == category.id } .filter { it == category.id }
.subscribe { .subscribe {
adapter.currentItems.forEach { item -> adapter.currentItems.forEach { item ->
controller.setSelection(item.manga, true) controller.setSelection(item.manga.toDomainManga()!!, true)
} }
controller.invalidateActionMode() controller.invalidateActionMode()
} }
@ -225,7 +226,7 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att
.filter { it == category.id } .filter { it == category.id }
.subscribe { .subscribe {
adapter.currentItems.forEach { item -> adapter.currentItems.forEach { item ->
controller.toggleSelection(item.manga) controller.toggleSelection(item.manga.toDomainManga()!!)
} }
controller.invalidateActionMode() controller.invalidateActionMode()
} }
@ -290,7 +291,7 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att
val position = adapter.indexOf(manga) val position = adapter.indexOf(manga)
if (position != -1 && !adapter.isSelected(position)) { if (position != -1 && !adapter.isSelected(position)) {
adapter.toggleSelection(position) adapter.toggleSelection(position)
(recycler.findViewHolderForItemId(manga.id!!) as? LibraryHolder<*>)?.toggleActivation() (recycler.findViewHolderForItemId(manga.id) as? LibraryHolder<*>)?.toggleActivation()
} }
} }
} }
@ -349,7 +350,7 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att
val position = adapter.indexOf(manga) val position = adapter.indexOf(manga)
if (position != -1) { if (position != -1) {
adapter.toggleSelection(position) adapter.toggleSelection(position)
(recycler.findViewHolderForItemId(manga.id!!) as? LibraryHolder<*>)?.toggleActivation() (recycler.findViewHolderForItemId(manga.id) as? LibraryHolder<*>)?.toggleActivation()
} }
} }
@ -371,7 +372,7 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att
toggleSelection(position) toggleSelection(position)
true true
} else { } else {
openManga(item.manga) openManga(item.manga.toDomainManga()!!)
false false
} }
} }
@ -478,7 +479,7 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att
private fun toggleSelection(position: Int) { private fun toggleSelection(position: Int) {
val item = adapter.getItem(position) ?: return val item = adapter.getItem(position) ?: return
controller.setSelection(item.manga, !adapter.isSelected(position)) controller.setSelection(item.manga.toDomainManga()!!, !adapter.isSelected(position))
controller.invalidateActionMode() controller.invalidateActionMode()
} }
@ -490,7 +491,7 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att
private fun setSelection(position: Int) { private fun setSelection(position: Int) {
val item = adapter.getItem(position) ?: return val item = adapter.getItem(position) ?: return
controller.setSelection(item.manga, true) controller.setSelection(item.manga.toDomainManga()!!, true)
controller.invalidateActionMode() controller.invalidateActionMode()
} }
} }

View File

@ -24,7 +24,6 @@ import eu.kanade.domain.category.model.toDbCategory
import eu.kanade.domain.manga.model.Manga import eu.kanade.domain.manga.model.Manga
import eu.kanade.domain.manga.model.toDbManga import eu.kanade.domain.manga.model.toDbManga
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.toDomainManga
import eu.kanade.tachiyomi.data.library.LibraryUpdateService import eu.kanade.tachiyomi.data.library.LibraryUpdateService
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.track.TrackManager
@ -75,7 +74,6 @@ import uy.kohesive.injekt.api.get
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import kotlin.time.Duration.Companion.milliseconds import kotlin.time.Duration.Companion.milliseconds
import kotlin.time.Duration.Companion.seconds import kotlin.time.Duration.Companion.seconds
import eu.kanade.tachiyomi.data.database.models.Manga as DbManga
class LibraryController( class LibraryController(
bundle: Bundle? = null, bundle: Bundle? = null,
@ -101,7 +99,7 @@ class LibraryController(
/** /**
* Currently selected mangas. * Currently selected mangas.
*/ */
val selectedMangas = mutableSetOf<DbManga>() val selectedMangas = mutableSetOf<Manga>()
/** /**
* Relay to notify the UI of selection updates. * Relay to notify the UI of selection updates.
@ -582,18 +580,18 @@ class LibraryController(
override fun onDestroyActionMode(mode: ActionMode) { override fun onDestroyActionMode(mode: ActionMode) {
// Clear all the manga selections and notify child views. // Clear all the manga selections and notify child views.
selectedMangas.clear() selectedMangas.clear()
selectionRelay.call(LibrarySelectionEvent.Cleared()) selectionRelay.call(LibrarySelectionEvent.Cleared)
(activity as? MainActivity)?.showBottomNav(true) (activity as? MainActivity)?.showBottomNav(true)
actionMode = null actionMode = null
} }
fun openManga(manga: DbManga) { fun openManga(manga: Manga) {
// Notify the presenter a manga is being opened. // Notify the presenter a manga is being opened.
presenter.onOpenManga() presenter.onOpenManga()
router.pushController(MangaController(manga.id!!)) router.pushController(MangaController(manga.id))
} }
/** /**
@ -602,7 +600,7 @@ class LibraryController(
* @param manga the manga whose selection has changed. * @param manga the manga whose selection has changed.
* @param selected whether it's now selected or not. * @param selected whether it's now selected or not.
*/ */
fun setSelection(manga: DbManga, selected: Boolean) { fun setSelection(manga: Manga, selected: Boolean) {
if (selected) { if (selected) {
if (selectedMangas.add(manga)) { if (selectedMangas.add(manga)) {
selectionRelay.call(LibrarySelectionEvent.Selected(manga)) selectionRelay.call(LibrarySelectionEvent.Selected(manga))
@ -619,7 +617,7 @@ class LibraryController(
* *
* @param manga the manga whose selection to change. * @param manga the manga whose selection to change.
*/ */
fun toggleSelection(manga: DbManga) { fun toggleSelection(manga: Manga) {
if (selectedMangas.add(manga)) { if (selectedMangas.add(manga)) {
selectionRelay.call(LibrarySelectionEvent.Selected(manga)) selectionRelay.call(LibrarySelectionEvent.Selected(manga))
} else if (selectedMangas.remove(manga)) { } else if (selectedMangas.remove(manga)) {
@ -633,7 +631,7 @@ class LibraryController(
*/ */
fun clearSelection() { fun clearSelection() {
selectedMangas.clear() selectedMangas.clear()
selectionRelay.call(LibrarySelectionEvent.Cleared()) selectionRelay.call(LibrarySelectionEvent.Cleared)
invalidateActionMode() invalidateActionMode()
} }
@ -660,7 +658,7 @@ class LibraryController(
} }
}.toTypedArray() }.toTypedArray()
launchUI { launchUI {
ChangeMangaCategoriesDialog(this@LibraryController, mangas.map { it.toDomainManga()!! }, categories, preselected) ChangeMangaCategoriesDialog(this@LibraryController, mangas, categories, preselected)
.showDialog(router) .showDialog(router)
} }
} }
@ -679,7 +677,7 @@ class LibraryController(
} }
private fun showDeleteMangaDialog() { private fun showDeleteMangaDialog() {
DeleteLibraryMangasDialog(this, selectedMangas.toList().map { it.toDomainManga()!! }).showDialog(router) DeleteLibraryMangasDialog(this, selectedMangas.toList()).showDialog(router)
} }
// SY --> // SY -->
@ -807,7 +805,7 @@ class LibraryController(
?.setMessage(activity!!.getString(R.string.favorites_sync_bad_library_state, status.message)) ?.setMessage(activity!!.getString(R.string.favorites_sync_bad_library_state, status.message))
?.setCancelable(false) ?.setCancelable(false)
?.setPositiveButton(R.string.show_gallery) { _, _ -> ?.setPositiveButton(R.string.show_gallery) { _, _ ->
openManga(status.manga.toDbManga()) openManga(status.manga)
presenter.favoritesSync.status.value = FavoritesSyncStatus.Idle(activity!!) presenter.favoritesSync.status.value = FavoritesSyncStatus.Idle(activity!!)
} }
?.setNegativeButton(android.R.string.ok) { _, _ -> ?.setNegativeButton(android.R.string.ok) { _, _ ->
@ -870,7 +868,7 @@ class LibraryController(
fun startReading(manga: Manga, adapter: LibraryCategoryAdapter) { fun startReading(manga: Manga, adapter: LibraryCategoryAdapter) {
if (adapter.mode == SelectableAdapter.Mode.MULTI) { if (adapter.mode == SelectableAdapter.Mode.MULTI) {
toggleSelection(manga.toDbManga()) toggleSelection(manga)
return return
} }
val activity = activity ?: return val activity = activity ?: return

View File

@ -657,10 +657,10 @@ class LibraryPresenter(
* *
* @param mangas the list of manga. * @param mangas the list of manga.
*/ */
suspend fun getCommonCategories(mangas: List<DbManga>): Collection<Category> { suspend fun getCommonCategories(mangas: List<Manga>): Collection<Category> {
if (mangas.isEmpty()) return emptyList() if (mangas.isEmpty()) return emptyList()
return mangas.toSet() return mangas.toSet()
.map { getCategories.await(it.id!!) } .map { getCategories.await(it.id) }
.reduce { set1, set2 -> set1.intersect(set2).toMutableList() } .reduce { set1, set2 -> set1.intersect(set2).toMutableList() }
} }
@ -669,9 +669,9 @@ class LibraryPresenter(
* *
* @param mangas the list of manga. * @param mangas the list of manga.
*/ */
suspend fun getMixCategories(mangas: List<DbManga>): Collection<Category> { suspend fun getMixCategories(mangas: List<Manga>): Collection<Category> {
if (mangas.isEmpty()) return emptyList() if (mangas.isEmpty()) return emptyList()
val mangaCategories = mangas.toSet().map { getCategories.await(it.id!!) } val mangaCategories = mangas.toSet().map { getCategories.await(it.id) }
val common = mangaCategories.reduce { set1, set2 -> set1.intersect(set2).toMutableList() } val common = mangaCategories.reduce { set1, set2 -> set1.intersect(set2).toMutableList() }
return mangaCategories.flatten().distinct().subtract(common).toMutableList() return mangaCategories.flatten().distinct().subtract(common).toMutableList()
} }
@ -681,14 +681,14 @@ class LibraryPresenter(
* *
* @param mangas the list of manga. * @param mangas the list of manga.
*/ */
fun downloadUnreadChapters(mangas: List<DbManga>) { fun downloadUnreadChapters(mangas: List<Manga>) {
mangas.forEach { manga -> mangas.forEach { manga ->
launchIO { launchIO {
if (manga.source == MERGED_SOURCE_ID) { if (manga.source == MERGED_SOURCE_ID) {
val mergedSource = sourceManager.get(MERGED_SOURCE_ID) as MergedSource val mergedSource = sourceManager.get(MERGED_SOURCE_ID) as MergedSource
val mergedMangas = getMergedMangaById.await(manga.id!!) val mergedMangas = getMergedMangaById.await(manga.id)
mergedSource mergedSource
.getChaptersAsBlockingAsDbChapter(manga.id!!) .getChaptersAsBlockingAsDbChapter(manga.id)
.filter { !it.read } .filter { !it.read }
.groupBy { it.manga_id!! } .groupBy { it.manga_id!! }
.forEach ab@{ (mangaId, chapters) -> .forEach ab@{ (mangaId, chapters) ->
@ -698,20 +698,20 @@ class LibraryPresenter(
} else { } else {
/* SY --> */ /* SY --> */
val chapters = if (manga.isEhBasedManga()) { val chapters = if (manga.isEhBasedManga()) {
getChapterByMangaId.await(manga.id!!).minByOrNull { it.sourceOrder }?.let { chapter -> getChapterByMangaId.await(manga.id).minByOrNull { it.sourceOrder }?.let { chapter ->
if (!chapter.read) listOf(chapter) else emptyList() if (!chapter.read) listOf(chapter) else emptyList()
} ?: emptyList() } ?: emptyList()
} else /* SY <-- */ getChapterByMangaId.await(manga.id!!) } else /* SY <-- */ getChapterByMangaId.await(manga.id)
.filter { !it.read } .filter { !it.read }
downloadManager.downloadChapters(manga, chapters.map { it.toDbChapter() }) downloadManager.downloadChapters(manga.toDbManga(), chapters.map { it.toDbChapter() })
} }
} }
} }
} }
// SY --> // SY -->
fun cleanTitles(mangas: List<DbManga>) { fun cleanTitles(mangas: List<Manga>) {
mangas.forEach { manga -> mangas.forEach { manga ->
val editedTitle = manga.title.replace("\\[.*?]".toRegex(), "").trim().replace("\\(.*?\\)".toRegex(), "").trim().replace("\\{.*?\\}".toRegex(), "").trim().let { val editedTitle = manga.title.replace("\\[.*?]".toRegex(), "").trim().replace("\\(.*?\\)".toRegex(), "").trim().replace("\\{.*?\\}".toRegex(), "").trim().let {
if (it.contains("|")) { if (it.contains("|")) {
@ -721,24 +721,21 @@ class LibraryPresenter(
} }
} }
if (manga.title == editedTitle) return@forEach if (manga.title == editedTitle) return@forEach
val mangaJson = manga.id?.let { mangaId -> val mangaJson = CustomMangaManager.MangaJson(
CustomMangaManager.MangaJson( id = manga.id,
mangaId, title = editedTitle.nullIfBlank(),
editedTitle.nullIfBlank(), author = manga.author.takeUnless { it == manga.ogAuthor },
manga.author.takeUnless { it == manga.originalAuthor }, artist = manga.artist.takeUnless { it == manga.ogArtist },
manga.artist.takeUnless { it == manga.originalArtist }, description = manga.description.takeUnless { it == manga.ogDescription },
manga.description.takeUnless { it == manga.originalDescription }, genre = manga.genre.takeUnless { it == manga.ogGenre },
manga.genre.takeUnless { it == manga.originalGenre }?.let { manga.getGenres() }, status = manga.status.takeUnless { it == manga.ogStatus }?.toLong(),
manga.status.takeUnless { it == manga.originalStatus }?.toLong(),
) )
}
if (mangaJson != null) {
customMangaManager.saveMangaInfo(mangaJson) customMangaManager.saveMangaInfo(mangaJson)
} }
} }
}
fun syncMangaToDex(mangaList: List<DbManga>) { fun syncMangaToDex(mangaList: List<Manga>) {
launchIO { launchIO {
MdUtil.getEnabledMangaDex(preferences, sourceManager)?.let { mdex -> MdUtil.getEnabledMangaDex(preferences, sourceManager)?.let { mdex ->
mangaList.forEach { mangaList.forEach {
@ -754,10 +751,10 @@ class LibraryPresenter(
* *
* @param mangas the list of manga. * @param mangas the list of manga.
*/ */
fun markReadStatus(mangas: List<DbManga>, read: Boolean) { fun markReadStatus(mangas: List<Manga>, read: Boolean) {
mangas.forEach { manga -> mangas.forEach { manga ->
launchIO { launchIO {
val chapters = if (manga.source == MERGED_SOURCE_ID) getMergedChaptersByMangaId.await(manga.id!!) else getChapterByMangaId.await(manga.id!!) val chapters = if (manga.source == MERGED_SOURCE_ID) getMergedChaptersByMangaId.await(manga.id) else getChapterByMangaId.await(manga.id)
val toUpdate = chapters val toUpdate = chapters
.map { chapter -> .map { chapter ->
@ -776,18 +773,18 @@ class LibraryPresenter(
} }
} }
private fun deleteChapters(manga: DbManga, chapters: List<Chapter>) { private fun deleteChapters(manga: Manga, chapters: List<Chapter>) {
sourceManager.get(manga.source)?.let { source -> sourceManager.get(manga.source)?.let { source ->
// SY --> // SY -->
if (source is MergedSource) { if (source is MergedSource) {
val mergedMangas = runBlocking { getMergedMangaById.await(manga.id!!) } val mergedMangas = runBlocking { getMergedMangaById.await(manga.id) }
val sources = mergedMangas.distinctBy { it.source }.map { sourceManager.getOrStub(it.source) } val sources = mergedMangas.distinctBy { it.source }.map { sourceManager.getOrStub(it.source) }
chapters.groupBy { it.manga_id }.forEach { (mangaId, chapters) -> chapters.groupBy { it.manga_id }.forEach { (mangaId, chapters) ->
val mergedManga = mergedMangas.firstOrNull { it.id == mangaId } ?: return@forEach val mergedManga = mergedMangas.firstOrNull { it.id == mangaId } ?: return@forEach
val mergedMangaSource = sources.firstOrNull { it.id == mergedManga.source } ?: return@forEach val mergedMangaSource = sources.firstOrNull { it.id == mergedManga.source } ?: return@forEach
downloadManager.deleteChapters(chapters, mergedManga.toDbManga(), mergedMangaSource) downloadManager.deleteChapters(chapters, mergedManga.toDbManga(), mergedMangaSource)
} }
} else /* SY <-- */ downloadManager.deleteChapters(chapters, manga, source) } else /* SY <-- */ downloadManager.deleteChapters(chapters, manga.toDbManga(), source)
} }
} }

View File

@ -1,10 +1,9 @@
package eu.kanade.tachiyomi.ui.library package eu.kanade.tachiyomi.ui.library
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.domain.manga.model.Manga
sealed class LibrarySelectionEvent { sealed class LibrarySelectionEvent {
class Selected(val manga: Manga) : LibrarySelectionEvent() class Selected(val manga: Manga) : LibrarySelectionEvent()
class Unselected(val manga: Manga) : LibrarySelectionEvent() class Unselected(val manga: Manga) : LibrarySelectionEvent()
class Cleared : LibrarySelectionEvent() object Cleared : LibrarySelectionEvent()
} }

View File

@ -14,13 +14,11 @@ import com.elvishew.xlog.XLog
import eu.kanade.domain.chapter.interactor.GetChapterByMangaId import eu.kanade.domain.chapter.interactor.GetChapterByMangaId
import eu.kanade.domain.chapter.interactor.SyncChaptersWithSource import eu.kanade.domain.chapter.interactor.SyncChaptersWithSource
import eu.kanade.domain.chapter.model.Chapter import eu.kanade.domain.chapter.model.Chapter
import eu.kanade.domain.chapter.model.toDbChapter
import eu.kanade.domain.manga.interactor.GetExhFavoriteMangaWithMetadata import eu.kanade.domain.manga.interactor.GetExhFavoriteMangaWithMetadata
import eu.kanade.domain.manga.interactor.GetFlatMetadataById import eu.kanade.domain.manga.interactor.GetFlatMetadataById
import eu.kanade.domain.manga.interactor.InsertFlatMetadata import eu.kanade.domain.manga.interactor.InsertFlatMetadata
import eu.kanade.domain.manga.interactor.UpdateManga import eu.kanade.domain.manga.interactor.UpdateManga
import eu.kanade.domain.manga.model.Manga import eu.kanade.domain.manga.model.Manga
import eu.kanade.domain.manga.model.toDbManga
import eu.kanade.domain.manga.model.toMangaInfo import eu.kanade.domain.manga.model.toMangaInfo
import eu.kanade.tachiyomi.data.library.LibraryUpdateNotifier import eu.kanade.tachiyomi.data.library.LibraryUpdateNotifier
import eu.kanade.tachiyomi.data.preference.DEVICE_CHARGING import eu.kanade.tachiyomi.data.preference.DEVICE_CHARGING
@ -194,7 +192,7 @@ class EHentaiUpdateWorker(private val context: Context, workerParams: WorkerPara
) )
if (updatedManga.isNotEmpty()) { if (updatedManga.isNotEmpty()) {
updateNotifier.showUpdateNotifications(updatedManga.map { it.first.toDbManga() to it.second.map { it.toDbChapter() }.toTypedArray() }) updateNotifier.showUpdateNotifications(updatedManga)
} }
} }
} }