diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreator.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreator.kt index fa06f55bb..5d4cb4022 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreator.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreator.kt @@ -24,6 +24,8 @@ import okio.gzip import okio.sink import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.system.logcat +import tachiyomi.data.DatabaseHandler +import tachiyomi.data.manga.MangaMapper import tachiyomi.domain.backup.service.BackupPreferences import tachiyomi.domain.manga.interactor.GetFavorites import tachiyomi.domain.manga.model.Manga @@ -43,6 +45,7 @@ class BackupCreator( private val parser: ProtoBuf = Injekt.get(), private val getFavorites: GetFavorites = Injekt.get(), private val backupPreferences: BackupPreferences = Injekt.get(), + private val handler: DatabaseHandler = Injekt.get(), private val categoriesBackupCreator: CategoriesBackupCreator = CategoriesBackupCreator(), private val mangaBackupCreator: MangaBackupCreator = MangaBackupCreator(), @@ -75,7 +78,16 @@ class BackupCreator( throw IllegalStateException(context.stringResource(MR.strings.create_backup_file_error)) } - val backupManga = backupMangas(getFavorites.await(), options) + val backupManga = backupMangas( + getFavorites.await() + + if (options.readEntries) { + handler.awaitList { mangasQueries.getReadMangaNotInLibrary(MangaMapper::mapManga) } + } else { + emptyList() + }, + options, + ) + val backup = Backup( backupManga = backupManga, backupCategories = backupCategories(options), diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupOptions.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupOptions.kt index daaecff8e..b500ac6d9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupOptions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupOptions.kt @@ -10,6 +10,7 @@ data class BackupOptions( val chapters: Boolean = true, val tracking: Boolean = true, val history: Boolean = true, + val readEntries: Boolean = true, val appSettings: Boolean = true, val extensionRepoSettings: Boolean = true, val sourceSettings: Boolean = true, @@ -22,13 +23,14 @@ data class BackupOptions( chapters, tracking, history, + readEntries, appSettings, extensionRepoSettings, sourceSettings, privateSettings, ) - fun canCreate() = libraryEntries || categories || appSettings || extensionRepoSettings || sourceSettings + fun canCreate() = libraryEntries || categories || readEntries || appSettings || extensionRepoSettings || sourceSettings companion object { val libraryOptions = persistentListOf( @@ -60,6 +62,12 @@ data class BackupOptions( getter = BackupOptions::categories, setter = { options, enabled -> options.copy(categories = enabled) }, ), + Entry( + label = MR.strings.non_library_settings, + getter = BackupOptions::readEntries, + setter = { options, enabled -> options.copy(readEntries = enabled) }, + enabled = { it.libraryEntries }, + ), ) val settingsOptions = persistentListOf( @@ -92,10 +100,11 @@ data class BackupOptions( chapters = array[2], tracking = array[3], history = array[4], - appSettings = array[5], - extensionRepoSettings = array[6], - sourceSettings = array[7], - privateSettings = array[8], + readEntries = array[5], + appSettings = array[6], + extensionRepoSettings = array[7], + sourceSettings = array[8], + privateSettings = array[9], ) } diff --git a/data/src/main/java/tachiyomi/data/manga/MangaRepositoryImpl.kt b/data/src/main/java/tachiyomi/data/manga/MangaRepositoryImpl.kt index f7aaf4c99..ae6c8d340 100644 --- a/data/src/main/java/tachiyomi/data/manga/MangaRepositoryImpl.kt +++ b/data/src/main/java/tachiyomi/data/manga/MangaRepositoryImpl.kt @@ -49,6 +49,10 @@ class MangaRepositoryImpl( return handler.awaitList { mangasQueries.getFavorites(MangaMapper::mapManga) } } + override suspend fun getReadMangaNotInLibrary(): List { + return handler.awaitList { mangasQueries.getReadMangaNotInLibrary(MangaMapper::mapManga) } + } + override suspend fun getLibraryManga(): List { return handler.awaitList { libraryViewQueries.library(MangaMapper::mapLibraryManga) } } diff --git a/data/src/main/sqldelight/tachiyomi/data/mangas.sq b/data/src/main/sqldelight/tachiyomi/data/mangas.sq index 3e21e5bc0..2a260ad24 100644 --- a/data/src/main/sqldelight/tachiyomi/data/mangas.sq +++ b/data/src/main/sqldelight/tachiyomi/data/mangas.sq @@ -78,6 +78,13 @@ SELECT * FROM mangas WHERE favorite = 1; +getReadMangaNotInLibrary: +SELECT * +FROM mangas +WHERE favorite = 0 AND _id IN( + SELECT chapters.manga_id FROM chapters WHERE read = 1 OR last_page_read != 0 +); + getAllManga: SELECT * FROM mangas; diff --git a/domain/src/main/java/tachiyomi/domain/manga/repository/MangaRepository.kt b/domain/src/main/java/tachiyomi/domain/manga/repository/MangaRepository.kt index 8c74851f3..f81650102 100644 --- a/domain/src/main/java/tachiyomi/domain/manga/repository/MangaRepository.kt +++ b/domain/src/main/java/tachiyomi/domain/manga/repository/MangaRepository.kt @@ -17,6 +17,8 @@ interface MangaRepository { suspend fun getFavorites(): List + suspend fun getReadMangaNotInLibrary(): List + suspend fun getLibraryManga(): List fun getLibraryMangaAsFlow(): Flow> diff --git a/i18n/src/commonMain/moko-resources/base/strings.xml b/i18n/src/commonMain/moko-resources/base/strings.xml index ffd19e5ed..8543cfe2d 100644 --- a/i18n/src/commonMain/moko-resources/base/strings.xml +++ b/i18n/src/commonMain/moko-resources/base/strings.xml @@ -543,6 +543,7 @@ Source settings Extension repos Include sensitive settings (e.g., tracker login tokens) + All read entries Creating backup Backup failed Storage permissions not granted