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:
parent
22da633ee3
commit
d48427152e
@ -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()
|
||||||
|
@ -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? {
|
||||||
|
@ -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) {
|
||||||
|
@ -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,8 +449,11 @@ 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
|
||||||
.toTypedArray(),
|
newDbChapters
|
||||||
|
.map { it.toDomainChapter()!! }
|
||||||
|
.sortedByDescending { it.sourceOrder }
|
||||||
|
.toTypedArray(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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(),
|
)
|
||||||
)
|
|
||||||
}
|
customMangaManager.saveMangaInfo(mangaJson)
|
||||||
if (mangaJson != null) {
|
|
||||||
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user