From 85898df7032cdafe098c106616c55ba9192f0fc6 Mon Sep 17 00:00:00 2001 From: arkon Date: Sat, 2 Jul 2022 15:19:52 -0400 Subject: [PATCH] More SQLDelight migrations (cherry picked from commit 21771e62aa0dc7e1393b27ea8eb146de277cebd9) # Conflicts: # app/src/main/java/eu/kanade/domain/manga/model/Manga.kt # app/src/main/java/eu/kanade/tachiyomi/data/backup/AbstractBackupManager.kt # app/src/main/java/eu/kanade/tachiyomi/data/backup/full/models/BackupManga.kt # app/src/main/java/eu/kanade/tachiyomi/data/database/queries/ChapterQueries.kt # app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt # app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt --- .../data/manga/MangaMergeRepositoryImpl.kt | 8 +++ .../kanade/data/manga/MangaRepositoryImpl.kt | 4 ++ .../java/eu/kanade/domain/DomainModule.kt | 4 +- .../java/eu/kanade/domain/SYDomainModule.kt | 2 + ...FavoritesBySourceId.kt => GetFavorites.kt} | 6 +- .../interactor/GetMangaByUrlAndSource.kt | 0 .../domain/manga/interactor/GetMergedManga.kt | 25 ++++++++ .../eu/kanade/domain/manga/model/Manga.kt | 6 +- .../manga/repository/MangaMergeRepository.kt | 4 ++ .../manga/repository/MangaRepository.kt | 2 + .../data/backup/AbstractBackupManager.kt | 18 ++++-- .../data/backup/full/FullBackupManager.kt | 23 ++++--- .../data/backup/full/models/BackupManga.kt | 31 +++++----- .../data/notification/NotificationReceiver.kt | 4 +- .../source/online/all/MergedSource.kt | 9 ++- .../manga/MigrationMangaPresenter.kt | 6 +- .../tachiyomi/ui/library/LibraryController.kt | 2 +- .../tachiyomi/ui/library/LibraryPresenter.kt | 4 +- .../tachiyomi/ui/reader/ReaderActivity.kt | 5 -- .../tachiyomi/ui/reader/ReaderPresenter.kt | 61 +++++++++++-------- .../exh/ui/intercept/InterceptActivity.kt | 2 +- 21 files changed, 142 insertions(+), 84 deletions(-) rename app/src/main/java/eu/kanade/domain/manga/interactor/{GetFavoritesBySourceId.kt => GetFavorites.kt} (76%) create mode 100644 app/src/main/java/eu/kanade/domain/manga/interactor/GetMangaByUrlAndSource.kt create mode 100644 app/src/main/java/eu/kanade/domain/manga/interactor/GetMergedManga.kt diff --git a/app/src/main/java/eu/kanade/data/manga/MangaMergeRepositoryImpl.kt b/app/src/main/java/eu/kanade/data/manga/MangaMergeRepositoryImpl.kt index 29f862951..849755c39 100644 --- a/app/src/main/java/eu/kanade/data/manga/MangaMergeRepositoryImpl.kt +++ b/app/src/main/java/eu/kanade/data/manga/MangaMergeRepositoryImpl.kt @@ -11,6 +11,14 @@ class MangaMergeRepositoryImpl( private val handler: DatabaseHandler, ) : MangaMergeRepository { + override suspend fun getMergedManga(): List { + return handler.awaitList { mergedQueries.selectAllMergedMangas(mangaMapper) } + } + + override suspend fun subscribeMergedManga(): Flow> { + return handler.subscribeToList { mergedQueries.selectAllMergedMangas(mangaMapper) } + } + override suspend fun getMergedMangaById(id: Long): List { return handler.awaitList { mergedQueries.selectMergedMangasById(id, mangaMapper) } } diff --git a/app/src/main/java/eu/kanade/data/manga/MangaRepositoryImpl.kt b/app/src/main/java/eu/kanade/data/manga/MangaRepositoryImpl.kt index f0b2a7575..61f2061b9 100644 --- a/app/src/main/java/eu/kanade/data/manga/MangaRepositoryImpl.kt +++ b/app/src/main/java/eu/kanade/data/manga/MangaRepositoryImpl.kt @@ -27,6 +27,10 @@ class MangaRepositoryImpl( return handler.subscribeToOne { mangasQueries.getMangaById(id, mangaMapper) } } + override suspend fun getFavorites(): List { + return handler.awaitList { mangasQueries.getFavorites(mangaMapper) } + } + override fun getFavoritesBySourceId(sourceId: Long): Flow> { return handler.subscribeToList { mangasQueries.getFavoriteBySourceId(sourceId, mangaMapper) } } diff --git a/app/src/main/java/eu/kanade/domain/DomainModule.kt b/app/src/main/java/eu/kanade/domain/DomainModule.kt index 622060862..971bde777 100644 --- a/app/src/main/java/eu/kanade/domain/DomainModule.kt +++ b/app/src/main/java/eu/kanade/domain/DomainModule.kt @@ -31,7 +31,7 @@ import eu.kanade.domain.history.interactor.RemoveHistoryByMangaId import eu.kanade.domain.history.interactor.UpsertHistory import eu.kanade.domain.history.repository.HistoryRepository import eu.kanade.domain.manga.interactor.GetDuplicateLibraryManga -import eu.kanade.domain.manga.interactor.GetFavoritesBySourceId +import eu.kanade.domain.manga.interactor.GetFavorites import eu.kanade.domain.manga.interactor.GetMangaById import eu.kanade.domain.manga.interactor.GetMangaWithChapters import eu.kanade.domain.manga.interactor.ResetViewerFlags @@ -70,7 +70,7 @@ class DomainModule : InjektModule { addSingletonFactory { MangaRepositoryImpl(get()) } addFactory { GetDuplicateLibraryManga(get()) } - addFactory { GetFavoritesBySourceId(get()) } + addFactory { GetFavorites(get()) } addFactory { GetMangaWithChapters(get(), get()) } addFactory { GetMangaById(get()) } addFactory { GetNextChapter(get()) } diff --git a/app/src/main/java/eu/kanade/domain/SYDomainModule.kt b/app/src/main/java/eu/kanade/domain/SYDomainModule.kt index 64d0ab756..c371a47ba 100644 --- a/app/src/main/java/eu/kanade/domain/SYDomainModule.kt +++ b/app/src/main/java/eu/kanade/domain/SYDomainModule.kt @@ -4,6 +4,7 @@ import eu.kanade.data.manga.MangaMergeRepositoryImpl import eu.kanade.data.manga.MangaMetadataRepositoryImpl import eu.kanade.domain.chapter.interactor.GetMergedChapterByMangaId import eu.kanade.domain.manga.interactor.GetFlatMetadataById +import eu.kanade.domain.manga.interactor.GetMergedManga import eu.kanade.domain.manga.interactor.GetMergedMangaById import eu.kanade.domain.manga.interactor.GetMergedReferencesById import eu.kanade.domain.manga.interactor.SetMangaFilteredScanlators @@ -34,6 +35,7 @@ class SYDomainModule : InjektModule { addFactory { GetFlatMetadataById(get()) } addSingletonFactory { MangaMergeRepositoryImpl(get()) } + addFactory { GetMergedManga(get()) } addFactory { GetMergedMangaById(get()) } addFactory { GetMergedReferencesById(get()) } addFactory { GetMergedChapterByMangaId(get()) } diff --git a/app/src/main/java/eu/kanade/domain/manga/interactor/GetFavoritesBySourceId.kt b/app/src/main/java/eu/kanade/domain/manga/interactor/GetFavorites.kt similarity index 76% rename from app/src/main/java/eu/kanade/domain/manga/interactor/GetFavoritesBySourceId.kt rename to app/src/main/java/eu/kanade/domain/manga/interactor/GetFavorites.kt index 8489d4d57..6365d86be 100644 --- a/app/src/main/java/eu/kanade/domain/manga/interactor/GetFavoritesBySourceId.kt +++ b/app/src/main/java/eu/kanade/domain/manga/interactor/GetFavorites.kt @@ -4,10 +4,14 @@ import eu.kanade.domain.manga.model.Manga import eu.kanade.domain.manga.repository.MangaRepository import kotlinx.coroutines.flow.Flow -class GetFavoritesBySourceId( +class GetFavorites( private val mangaRepository: MangaRepository, ) { + suspend fun await(): List { + return mangaRepository.getFavorites() + } + fun subscribe(sourceId: Long): Flow> { return mangaRepository.getFavoritesBySourceId(sourceId) } diff --git a/app/src/main/java/eu/kanade/domain/manga/interactor/GetMangaByUrlAndSource.kt b/app/src/main/java/eu/kanade/domain/manga/interactor/GetMangaByUrlAndSource.kt new file mode 100644 index 000000000..e69de29bb diff --git a/app/src/main/java/eu/kanade/domain/manga/interactor/GetMergedManga.kt b/app/src/main/java/eu/kanade/domain/manga/interactor/GetMergedManga.kt new file mode 100644 index 000000000..f6cd0732b --- /dev/null +++ b/app/src/main/java/eu/kanade/domain/manga/interactor/GetMergedManga.kt @@ -0,0 +1,25 @@ +package eu.kanade.domain.manga.interactor + +import eu.kanade.domain.manga.model.Manga +import eu.kanade.domain.manga.repository.MangaMergeRepository +import eu.kanade.tachiyomi.util.system.logcat +import kotlinx.coroutines.flow.Flow +import logcat.LogPriority + +class GetMergedManga( + private val mangaMergeRepository: MangaMergeRepository, +) { + + suspend fun await(): List { + return try { + mangaMergeRepository.getMergedManga() + } catch (e: Exception) { + logcat(LogPriority.ERROR, e) + emptyList() + } + } + + suspend fun subscribe(): Flow> { + return mangaMergeRepository.subscribeMergedManga() + } +} diff --git a/app/src/main/java/eu/kanade/domain/manga/model/Manga.kt b/app/src/main/java/eu/kanade/domain/manga/model/Manga.kt index 19fc8e59d..99e9a16e2 100644 --- a/app/src/main/java/eu/kanade/domain/manga/model/Manga.kt +++ b/app/src/main/java/eu/kanade/domain/manga/model/Manga.kt @@ -62,9 +62,6 @@ data class Manga( get() = customMangaInfo?.statusLong ?: ogStatus // SY <-- - val sorting: Long - get() = chapterFlags and CHAPTER_SORTING_MASK - fun toSManga(): SManga { return SManga.create().also { it.url = url @@ -79,6 +76,9 @@ data class Manga( } } + val sorting: Long + get() = chapterFlags and CHAPTER_SORTING_MASK + val displayMode: Long get() = chapterFlags and CHAPTER_DISPLAY_MASK diff --git a/app/src/main/java/eu/kanade/domain/manga/repository/MangaMergeRepository.kt b/app/src/main/java/eu/kanade/domain/manga/repository/MangaMergeRepository.kt index 61d926f4a..531f53ef1 100644 --- a/app/src/main/java/eu/kanade/domain/manga/repository/MangaMergeRepository.kt +++ b/app/src/main/java/eu/kanade/domain/manga/repository/MangaMergeRepository.kt @@ -5,6 +5,10 @@ import exh.merged.sql.models.MergedMangaReference import kotlinx.coroutines.flow.Flow interface MangaMergeRepository { + suspend fun getMergedManga(): List + + suspend fun subscribeMergedManga(): Flow> + suspend fun getMergedMangaById(id: Long): List suspend fun subscribeMergedMangaById(id: Long): Flow> diff --git a/app/src/main/java/eu/kanade/domain/manga/repository/MangaRepository.kt b/app/src/main/java/eu/kanade/domain/manga/repository/MangaRepository.kt index d5d282832..97c35de42 100644 --- a/app/src/main/java/eu/kanade/domain/manga/repository/MangaRepository.kt +++ b/app/src/main/java/eu/kanade/domain/manga/repository/MangaRepository.kt @@ -12,6 +12,8 @@ interface MangaRepository { suspend fun getMangaByIdAsFlow(id: Long): Flow + suspend fun getFavorites(): List + fun getFavoritesBySourceId(sourceId: Long): Flow> suspend fun getDuplicateLibraryManga(title: String, sourceId: Long): Manga? diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/AbstractBackupManager.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/AbstractBackupManager.kt index d249975ce..8e4d3af6f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/AbstractBackupManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/AbstractBackupManager.kt @@ -3,7 +3,10 @@ package eu.kanade.tachiyomi.data.backup import android.content.Context import android.net.Uri import eu.kanade.data.DatabaseHandler +import eu.kanade.data.manga.mangaMapper import eu.kanade.data.toLong +import eu.kanade.domain.manga.interactor.GetFavorites +import eu.kanade.domain.manga.interactor.GetMergedManga import eu.kanade.tachiyomi.data.database.models.Chapter import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.library.CustomMangaManager @@ -13,6 +16,7 @@ import eu.kanade.tachiyomi.source.SourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import data.Mangas as DbManga +import eu.kanade.domain.manga.model.Manga as DomainManga abstract class AbstractBackupManager(protected val context: Context) { @@ -21,8 +25,10 @@ abstract class AbstractBackupManager(protected val context: Context) { internal val sourceManager: SourceManager = Injekt.get() internal val trackManager: TrackManager = Injekt.get() protected val preferences: PreferencesHelper = Injekt.get() + private val getFavorites: GetFavorites = Injekt.get() // SY --> + private val getMergedManga: GetMergedManga = Injekt.get() protected val customMangaManager: CustomMangaManager = Injekt.get() // SY <-- @@ -42,13 +48,13 @@ abstract class AbstractBackupManager(protected val context: Context) { * * @return [Manga] from library */ - protected suspend fun getFavoriteManga(): List { - return handler.awaitList { mangasQueries.getFavorites() } + protected suspend fun getFavoriteManga(): List { + return getFavorites.await() } // SY --> - protected suspend fun getReadManga(): List { - return handler.awaitList { mangasQueries.getReadMangaNotInLibrary() } + protected suspend fun getReadManga(): List { + return handler.awaitList { mangasQueries.getReadMangaNotInLibrary(mangaMapper) } } /** @@ -56,8 +62,8 @@ abstract class AbstractBackupManager(protected val context: Context) { * * @return merged [Manga] that are possibly not in the library */ - protected suspend fun getMergedManga(): List { - return handler.awaitList { mergedQueries.selectAllMergedMangas() } + protected suspend fun getMergedManga(): List { + return getMergedManga.await() } // SY <-- diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/FullBackupManager.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/FullBackupManager.kt index 589f3e879..4c0eb87cb 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/FullBackupManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/FullBackupManager.kt @@ -56,6 +56,7 @@ import okio.sink import java.io.FileOutputStream import java.util.Date import kotlin.math.max +import eu.kanade.domain.manga.model.Manga as DomainManga class FullBackupManager(context: Context) : AbstractBackupManager(context) { @@ -138,13 +139,13 @@ class FullBackupManager(context: Context) : AbstractBackupManager(context) { } } - private suspend fun backupManga(mangas: List, flags: Int): List { + private suspend fun backupManga(mangas: List, flags: Int): List { return mangas.map { backupMangaObject(it, flags) } } - private fun backupExtensionInfo(mangas: List): List { + private fun backupExtensionInfo(mangas: List): List { return mangas .asSequence() .map { it.source } @@ -186,21 +187,19 @@ class FullBackupManager(context: Context) : AbstractBackupManager(context) { * @param options options for the backup * @return [BackupManga] containing manga in a serializable form */ - private suspend fun backupMangaObject(manga: Mangas, options: Int): BackupManga { + private suspend fun backupMangaObject(manga: DomainManga, options: Int): BackupManga { // Entry for this manga val mangaObject = BackupManga.copyFrom(manga /* SY --> */, if (options and BACKUP_CUSTOM_INFO_MASK == BACKUP_CUSTOM_INFO) customMangaManager else null /* SY <-- */) // SY --> if (manga.source == MERGED_SOURCE_ID) { - mangaObject.mergedMangaReferences = handler.awaitList { mergedQueries.selectByMergeId(manga._id, backupMergedMangaReferenceMapper) } + mangaObject.mergedMangaReferences = handler.awaitList { mergedQueries.selectByMergeId(manga.id, backupMergedMangaReferenceMapper) } } val source = sourceManager.get(manga.source)?.getMainSource>() if (source != null) { - manga._id.let { mangaId -> - handler.getFlatMetadataForManga(mangaId)?.let { flatMetadata -> - mangaObject.flatMetadata = BackupFlatMetadata.copyFrom(flatMetadata) - } + handler.getFlatMetadataForManga(manga.id)?.let { flatMetadata -> + mangaObject.flatMetadata = BackupFlatMetadata.copyFrom(flatMetadata) } } // SY <-- @@ -208,7 +207,7 @@ class FullBackupManager(context: Context) : AbstractBackupManager(context) { // Check if user wants chapter information in backup if (options and BACKUP_CHAPTER_MASK == BACKUP_CHAPTER) { // Backup all the chapters - val chapters = handler.awaitList { chaptersQueries.getChaptersByMangaId(manga._id, backupChapterMapper) } + val chapters = handler.awaitList { chaptersQueries.getChaptersByMangaId(manga.id, backupChapterMapper) } if (chapters.isNotEmpty()) { mangaObject.chapters = chapters } @@ -217,7 +216,7 @@ class FullBackupManager(context: Context) : AbstractBackupManager(context) { // Check if user wants category information in backup if (options and BACKUP_CATEGORY_MASK == BACKUP_CATEGORY) { // Backup categories for this manga - val categoriesForManga = handler.awaitList { categoriesQueries.getCategoriesByMangaId(manga._id) } + val categoriesForManga = handler.awaitList { categoriesQueries.getCategoriesByMangaId(manga.id) } if (categoriesForManga.isNotEmpty()) { mangaObject.categories = categoriesForManga.map { it.order } } @@ -225,7 +224,7 @@ class FullBackupManager(context: Context) : AbstractBackupManager(context) { // Check if user wants track information in backup if (options and BACKUP_TRACK_MASK == BACKUP_TRACK) { - val tracks = handler.awaitList { manga_syncQueries.getTracksByMangaId(manga._id, backupTrackMapper) } + val tracks = handler.awaitList { manga_syncQueries.getTracksByMangaId(manga.id, backupTrackMapper) } if (tracks.isNotEmpty()) { mangaObject.tracking = tracks } @@ -233,7 +232,7 @@ class FullBackupManager(context: Context) : AbstractBackupManager(context) { // Check if user wants history information in backup if (options and BACKUP_HISTORY_MASK == BACKUP_HISTORY) { - val historyByMangaId = handler.awaitList(true) { historyQueries.getHistoryByMangaId(manga._id) } + val historyByMangaId = handler.awaitList(true) { historyQueries.getHistoryByMangaId(manga.id) } if (historyByMangaId.isNotEmpty()) { val history = historyByMangaId.map { history -> val chapter = handler.awaitOne { chaptersQueries.getChapterById(history.chapter_id) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/models/BackupManga.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/models/BackupManga.kt index a81769700..4ff71a664 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/models/BackupManga.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/models/BackupManga.kt @@ -1,13 +1,12 @@ package eu.kanade.tachiyomi.data.backup.full.models -import data.Mangas import eu.kanade.data.listOfStringsAndAdapter +import eu.kanade.domain.manga.model.Manga import eu.kanade.tachiyomi.data.database.models.ChapterImpl import eu.kanade.tachiyomi.data.database.models.MangaImpl import eu.kanade.tachiyomi.data.database.models.TrackImpl import eu.kanade.tachiyomi.data.library.CustomMangaManager import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType -import exh.util.nullIfBlank import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber @@ -112,28 +111,28 @@ data class BackupManga( } companion object { - fun copyFrom(manga: Mangas /* SY --> */, customMangaManager: CustomMangaManager?/* SY <-- */): BackupManga { + fun copyFrom(manga: Manga /* SY --> */, customMangaManager: CustomMangaManager?/* SY <-- */): BackupManga { return BackupManga( url = manga.url, // SY --> - title = manga.title, - artist = manga.artist, - author = manga.author, - description = manga.description, - genre = manga.genre ?: emptyList(), - status = manga.status.toInt(), + title = manga.ogTitle, + artist = manga.ogArtist, + author = manga.ogAuthor, + description = manga.ogDescription, + genre = manga.ogGenre ?: emptyList(), + status = manga.ogStatus.toInt(), // SY <-- - thumbnailUrl = manga.thumbnail_url, + thumbnailUrl = manga.thumbnailUrl, favorite = manga.favorite, source = manga.source, - dateAdded = manga.date_added, - viewer = (manga.viewer.toInt() and ReadingModeType.MASK), - viewer_flags = manga.viewer.toInt(), - chapterFlags = manga.chapter_flags.toInt(), - filtered_scanlators = manga.filtered_scanlators?.let(listOfStringsAndAdapter::encode).nullIfBlank(), + dateAdded = manga.dateAdded, + viewer = (manga.viewerFlags.toInt() and ReadingModeType.MASK), + viewer_flags = manga.viewerFlags.toInt(), + chapterFlags = manga.chapterFlags.toInt(), // SY --> + filtered_scanlators = manga.filteredScanlators?.let(listOfStringsAndAdapter::encode), ).also { backupManga -> - customMangaManager?.getManga(manga._id)?.let { + customMangaManager?.getManga(manga.id)?.let { backupManga.customTitle = it.title backupManga.customArtist = it.artist backupManga.customAuthor = it.author diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt b/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt index 7fc7415c8..887c0ae4b 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt @@ -173,7 +173,7 @@ class NotificationReceiver : BroadcastReceiver() { val manga = db.getManga(mangaId).executeAsBlocking() val chapter = db.getChapter(chapterId).executeAsBlocking() if (manga != null && chapter != null) { - val intent = ReaderActivity.newIntent(context, manga, chapter).apply { + val intent = ReaderActivity.newIntent(context, manga.id, chapter.id).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP } context.startActivity(intent) @@ -440,7 +440,7 @@ class NotificationReceiver : BroadcastReceiver() { * @param chapter chapter that needs to be opened */ internal fun openChapterPendingActivity(context: Context, manga: Manga, chapter: Chapter): PendingIntent { - val newIntent = ReaderActivity.newIntent(context, manga, chapter) + val newIntent = ReaderActivity.newIntent(context, manga.id, chapter.id) return PendingIntent.getActivity(context, manga.id.hashCode(), newIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/MergedSource.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/all/MergedSource.kt index 6d52bb439..5f37ee0d4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/MergedSource.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/online/all/MergedSource.kt @@ -121,9 +121,12 @@ class MergedSource : HttpSource() { return if (dedupe) dedupeChapterList(mangaReferences, chapters) else chapters } - fun getChaptersAsBlocking(mangaId: Long, editScanlators: Boolean = false, dedupe: Boolean = true): List { + fun getChaptersAsBlockingAsDbChapter(mangaId: Long, editScanlators: Boolean = false, dedupe: Boolean = true): List { + return getChaptersAsBlocking(mangaId, editScanlators, dedupe).map(DomainChapter::toDbChapter) + } + + fun getChaptersAsBlocking(mangaId: Long, editScanlators: Boolean = false, dedupe: Boolean = true): List { return transformMergedChapters(mangaId, runBlocking { getMergedChaptersByMangaId.await(mangaId) }, editScanlators, dedupe) - .map(DomainChapter::toDbChapter) } private fun dedupeChapterList(mangaReferences: List, chapterList: List): List { @@ -155,7 +158,7 @@ class MergedSource : HttpSource() { suspend fun fetchChaptersForMergedManga(manga: DomainManga, downloadChapters: Boolean = true, editScanlators: Boolean = false, dedupe: Boolean = true): List { return withIOContext { fetchChaptersAndSync(manga, downloadChapters) - getChaptersAsBlocking(manga.id, editScanlators, dedupe) + getChaptersAsBlockingAsDbChapter(manga.id, editScanlators, dedupe) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MigrationMangaPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MigrationMangaPresenter.kt index 3aa4ae181..06b60088b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MigrationMangaPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MigrationMangaPresenter.kt @@ -1,7 +1,7 @@ package eu.kanade.tachiyomi.ui.browse.migration.manga import android.os.Bundle -import eu.kanade.domain.manga.interactor.GetFavoritesBySourceId +import eu.kanade.domain.manga.interactor.GetFavorites import eu.kanade.domain.manga.model.Manga import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter import eu.kanade.tachiyomi.util.lang.launchIO @@ -16,7 +16,7 @@ import uy.kohesive.injekt.api.get class MigrationMangaPresenter( private val sourceId: Long, - private val getFavoritesBySourceId: GetFavoritesBySourceId = Injekt.get(), + private val getFavorites: GetFavorites = Injekt.get(), ) : BasePresenter() { private val _state: MutableStateFlow = MutableStateFlow(MigrateMangaState.Loading) val state: StateFlow = _state.asStateFlow() @@ -24,7 +24,7 @@ class MigrationMangaPresenter( override fun onCreate(savedState: Bundle?) { super.onCreate(savedState) presenterScope.launchIO { - getFavoritesBySourceId + getFavorites .subscribe(sourceId) .catch { exception -> _state.value = MigrateMangaState.Error(exception) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt index 1fba6bde4..692f456f3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt @@ -871,7 +871,7 @@ class LibraryController( } val activity = activity ?: return val chapter = presenter.getFirstUnread(manga) ?: return - val intent = ReaderActivity.newIntent(activity, manga, chapter) + val intent = ReaderActivity.newIntent(activity, manga.id!!, chapter.id!!) destroyActionModeIfNeeded() startActivity(intent) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt index be9a008df..2d2131675 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt @@ -719,7 +719,7 @@ class LibraryPresenter( val mergedSource = sourceManager.get(MERGED_SOURCE_ID) as MergedSource val mergedMangas = getMergedMangaById.await(manga.id!!) mergedSource - .getChaptersAsBlocking(manga.id!!) + .getChaptersAsBlockingAsDbChapter(manga.id!!) .filter { !it.read } .groupBy { it.manga_id!! } .forEach ab@{ (mangaId, chapters) -> @@ -886,7 +886,7 @@ class LibraryPresenter( /** Returns first unread chapter of a manga */ fun getFirstUnread(manga: Manga): Chapter? { val chapters = if (manga.source == MERGED_SOURCE_ID) { - (sourceManager.get(MERGED_SOURCE_ID) as MergedSource).getChaptersAsBlocking(manga.id!!) + (sourceManager.get(MERGED_SOURCE_ID) as MergedSource).getChaptersAsBlockingAsDbChapter(manga.id!!) } else runBlocking { getChapterByMangaId.await(manga.id!!) }.map { it.toDbChapter() } return if (manga.isEhBasedManga()) { val chapter = chapters.sortedBy { it.source_order }.getOrNull(0) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt index 9b3e2bd20..27581e7e3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt @@ -51,7 +51,6 @@ import com.google.android.material.transition.platform.MaterialContainerTransfor import dev.chrisbanes.insetter.applyInsetter import eu.kanade.tachiyomi.BuildConfig 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.notification.NotificationReceiver import eu.kanade.tachiyomi.data.notification.Notifications @@ -136,10 +135,6 @@ class ReaderActivity : BaseRxActivity() { } } - fun newIntent(context: Context, manga: Manga, chapter: Chapter): Intent { - return newIntent(context, manga.id, chapter.id) - } - const val SHIFT_DOUBLE_PAGES = "shiftingDoublePages" const val SHIFTED_PAGE_INDEX = "shiftedPageIndex" const val SHIFTED_CHAP_INDEX = "shiftedChapterIndex" diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt index 466d05ef0..5c7d2a3f5 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt @@ -6,11 +6,16 @@ import android.net.Uri import android.os.Bundle import androidx.annotation.ColorInt import com.jakewharton.rxrelay.BehaviorRelay +import eu.kanade.domain.chapter.interactor.GetChapterByMangaId import eu.kanade.domain.chapter.interactor.UpdateChapter import eu.kanade.domain.chapter.model.ChapterUpdate +import eu.kanade.domain.chapter.model.toDbChapter import eu.kanade.domain.history.interactor.UpsertHistory import eu.kanade.domain.history.model.HistoryUpdate +import eu.kanade.domain.manga.interactor.GetFlatMetadataById +import eu.kanade.domain.manga.interactor.GetMangaById import eu.kanade.domain.manga.model.isLocal +import eu.kanade.domain.manga.model.toDbManga import eu.kanade.domain.track.interactor.GetTracks import eu.kanade.domain.track.interactor.InsertTrack import eu.kanade.domain.track.model.toDbTrack @@ -46,6 +51,7 @@ import eu.kanade.tachiyomi.util.lang.byteSize import eu.kanade.tachiyomi.util.lang.launchIO import eu.kanade.tachiyomi.util.lang.launchUI import eu.kanade.tachiyomi.util.lang.takeBytes +import eu.kanade.tachiyomi.util.lang.withUIContext import eu.kanade.tachiyomi.util.storage.DiskUtil import eu.kanade.tachiyomi.util.storage.cacheImageDir import eu.kanade.tachiyomi.util.system.ImageUtil @@ -54,7 +60,6 @@ import eu.kanade.tachiyomi.util.system.logcat import exh.md.utils.FollowStatus import exh.md.utils.MdUtil import exh.metadata.metadata.base.RaisedSearchMetadata -import exh.metadata.metadata.base.getFlatMetadataForManga import exh.source.MERGED_SOURCE_ID import exh.source.getMainSource import exh.source.isEhBasedManga @@ -86,10 +91,15 @@ class ReaderPresenter( private val downloadManager: DownloadManager = Injekt.get(), private val preferences: PreferencesHelper = Injekt.get(), private val delayedTrackingStore: DelayedTrackingStore = Injekt.get(), + private val getMangaById: GetMangaById = Injekt.get(), + private val getChapterByMangaId: GetChapterByMangaId = Injekt.get(), private val getTracks: GetTracks = Injekt.get(), private val insertTrack: InsertTrack = Injekt.get(), private val upsertHistory: UpsertHistory = Injekt.get(), private val updateChapter: UpdateChapter = Injekt.get(), + // SY --> + private val getFlatMetadataById: GetFlatMetadataById, + // SY <-- ) : BasePresenter() { /** @@ -147,17 +157,19 @@ class ReaderPresenter( // SY --> val filteredScanlators = manga.filtered_scanlators?.let { MdUtil.getScanlators(it) } // SY <-- - val dbChapters = /* SY --> */ if (manga.source == MERGED_SOURCE_ID) { - (sourceManager.get(MERGED_SOURCE_ID) as MergedSource) - .getChaptersAsBlocking(manga.id!!) - } else /* SY <-- */ db.getChapters(manga).executeAsBlocking() + val chapters = runBlocking { + /* SY --> */ if (manga.source == MERGED_SOURCE_ID) { + (sourceManager.get(MERGED_SOURCE_ID) as MergedSource) + .getChaptersAsBlocking(manga.id!!) + } else /* SY <-- */ getChapterByMangaId.await(manga.id!!) + } - val selectedChapter = dbChapters.find { it.id == chapterId } + val selectedChapter = chapters.find { it.id == chapterId } ?: error("Requested chapter of id $chapterId not found in chapter list") val chaptersForReader = when { (preferences.skipRead() || preferences.skipFiltered()) -> { - val filteredChapters = dbChapters.filterNot { + val filteredChapters = chapters.filterNot { when { preferences.skipRead() && it.read -> true preferences.skipFiltered() -> { @@ -180,10 +192,11 @@ class ReaderPresenter( filteredChapters + listOf(selectedChapter) } } - else -> dbChapters + else -> chapters } chaptersForReader + .map { it.toDbChapter() } .sortedWith(getChapterSort(manga, sortDescending = false)) .map(::ReaderChapter) } @@ -266,28 +279,22 @@ class ReaderPresenter( fun init(mangaId: Long, initialChapterId: Long) { if (!needsInit()) return - db.getManga(mangaId).asRxObservable() - .first() - .observeOn(AndroidSchedulers.mainThread()) - // SY --> - .flatMap { manga -> + launchIO { + try { + // SY --> + val manga = getMangaById.await(mangaId) ?: return@launchIO val source = sourceManager.get(manga.source)?.getMainSource>() - if (manga.initialized && source != null) { - db.getFlatMetadataForManga(mangaId).asRxSingle().map { - manga to it?.raise(source.metaClass) - }.toObservable() - } else { - Observable.just(manga to null) + val metadata = if (source != null) { + getFlatMetadataById.await(mangaId)?.raise(source.metaClass) + } else null + withUIContext { + init(manga.toDbManga(), initialChapterId, metadata) } + // SY <-- + } catch (e: Throwable) { + view?.setInitialChapterError(e) } - .doOnNext { init(it.first, initialChapterId, it.second) } - // SY <-- - .subscribeFirst( - { _, _ -> - // Ignore onNext event - }, - ReaderActivity::setInitialChapterError, - ) + } } /** diff --git a/app/src/main/java/exh/ui/intercept/InterceptActivity.kt b/app/src/main/java/exh/ui/intercept/InterceptActivity.kt index f045677ac..b62b65295 100755 --- a/app/src/main/java/exh/ui/intercept/InterceptActivity.kt +++ b/app/src/main/java/exh/ui/intercept/InterceptActivity.kt @@ -70,7 +70,7 @@ class InterceptActivity : BaseActivity() { onBackPressed() startActivity( if (it.chapter != null) { - ReaderActivity.newIntent(this, it.manga, it.chapter) + ReaderActivity.newIntent(this, it.manga.id!!, it.chapter.id!!) } else { Intent(this, MainActivity::class.java) .setAction(MainActivity.SHORTCUT_MANGA)