Fix library is backed up when disabled and make categories backup/restore independent

(cherry picked from commit 56fb4f62a152e87a71892aa68c78cac51a2c8596)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreator.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupOptions.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/RestoreOptions.kt
This commit is contained in:
AntsyLich 2024-07-30 04:47:57 +06:00 committed by Jobobby04
parent a0786d9b09
commit a62dd5821a
7 changed files with 51 additions and 37 deletions

View File

@ -6,7 +6,6 @@ import android.content.Intent
import android.net.Uri import android.net.Uri
import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.Immutable import androidx.compose.runtime.Immutable
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
@ -69,7 +68,7 @@ class CreateBackupScreen : Screen() {
LazyColumnWithAction( LazyColumnWithAction(
contentPadding = contentPadding, contentPadding = contentPadding,
actionLabel = stringResource(MR.strings.action_create), actionLabel = stringResource(MR.strings.action_create),
actionEnabled = state.options.anyEnabled(), actionEnabled = state.options.canCreate(),
onClickAction = { onClickAction = {
if (!BackupCreateJob.isManualJobRunning(context)) { if (!BackupCreateJob.isManualJobRunning(context)) {
try { try {
@ -104,7 +103,7 @@ class CreateBackupScreen : Screen() {
} }
@Composable @Composable
private fun ColumnScope.Options( private fun Options(
options: ImmutableList<BackupOptions.Entry>, options: ImmutableList<BackupOptions.Entry>,
state: CreateBackupScreenModel.State, state: CreateBackupScreenModel.State,
model: CreateBackupScreenModel, model: CreateBackupScreenModel,

View File

@ -63,7 +63,7 @@ class RestoreBackupScreen(
LazyColumnWithAction( LazyColumnWithAction(
contentPadding = contentPadding, contentPadding = contentPadding,
actionLabel = stringResource(MR.strings.action_restore), actionLabel = stringResource(MR.strings.action_restore),
actionEnabled = state.canRestore && state.options.anyEnabled(), actionEnabled = state.canRestore && state.options.canRestore(),
onClickAction = { onClickAction = {
model.startRestore() model.startRestore()
navigator.pop() navigator.pop()

View File

@ -84,16 +84,19 @@ class BackupCreator(
throw IllegalStateException(context.stringResource(MR.strings.create_backup_file_error)) throw IllegalStateException(context.stringResource(MR.strings.create_backup_file_error))
} }
val databaseManga = getFavorites.await() /* SY --> */ + val backupManga = backupMangas(
if (options.readEntries) { getFavorites.await() /* SY --> */ +
handler.awaitList { mangasQueries.getReadMangaNotInLibrary(MangaMapper::mapManga) } if (options.readEntries) {
} else { handler.awaitList { mangasQueries.getReadMangaNotInLibrary(MangaMapper::mapManga) }
emptyList() } else {
} + getMergedManga.await() // SY <-- emptyList()
} + getMergedManga.await(), // SY <--
options
)
val backup = Backup( val backup = Backup(
backupManga = backupMangas(databaseManga, options), backupManga = backupManga,
backupCategories = backupCategories(options), backupCategories = backupCategories(options),
backupSources = backupSources(databaseManga), backupSources = backupSources(backupManga),
backupPreferences = backupAppPreferences(options), backupPreferences = backupAppPreferences(options),
backupSourcePreferences = backupSourcePreferences(options), backupSourcePreferences = backupSourcePreferences(options),
// SY --> // SY -->
@ -138,10 +141,12 @@ class BackupCreator(
} }
suspend fun backupMangas(mangas: List<Manga>, options: BackupOptions): List<BackupManga> { suspend fun backupMangas(mangas: List<Manga>, options: BackupOptions): List<BackupManga> {
if (!options.libraryEntries) return emptyList()
return mangaBackupCreator.backupMangas(mangas, options) return mangaBackupCreator.backupMangas(mangas, options)
} }
fun backupSources(mangas: List<Manga>): List<BackupSource> { fun backupSources(mangas: List<BackupManga>): List<BackupSource> {
return sourcesBackupCreator.backupSources(mangas) return sourcesBackupCreator.backupSources(mangas)
} }

View File

@ -35,7 +35,7 @@ data class BackupOptions(
// SY <-- // SY <--
) )
fun anyEnabled() = libraryEntries || appSettings || sourceSettings fun canCreate() = libraryEntries || categories || appSettings || sourceSettings
companion object { companion object {
val libraryOptions = persistentListOf( val libraryOptions = persistentListOf(
@ -44,12 +44,6 @@ data class BackupOptions(
getter = BackupOptions::libraryEntries, getter = BackupOptions::libraryEntries,
setter = { options, enabled -> options.copy(libraryEntries = enabled) }, setter = { options, enabled -> options.copy(libraryEntries = enabled) },
), ),
Entry(
label = MR.strings.categories,
getter = BackupOptions::categories,
setter = { options, enabled -> options.copy(categories = enabled) },
enabled = { it.libraryEntries },
),
Entry( Entry(
label = MR.strings.chapters, label = MR.strings.chapters,
getter = BackupOptions::chapters, getter = BackupOptions::chapters,
@ -68,6 +62,11 @@ data class BackupOptions(
setter = { options, enabled -> options.copy(history = enabled) }, setter = { options, enabled -> options.copy(history = enabled) },
enabled = { it.libraryEntries }, enabled = { it.libraryEntries },
), ),
Entry(
label = MR.strings.categories,
getter = BackupOptions::categories,
setter = { options, enabled -> options.copy(categories = enabled) },
),
// SY --> // SY -->
Entry( Entry(
label = SYMR.strings.custom_entry_info, label = SYMR.strings.custom_entry_info,

View File

@ -1,8 +1,8 @@
package eu.kanade.tachiyomi.data.backup.create.creators package eu.kanade.tachiyomi.data.backup.create.creators
import eu.kanade.tachiyomi.data.backup.models.BackupManga
import eu.kanade.tachiyomi.data.backup.models.BackupSource import eu.kanade.tachiyomi.data.backup.models.BackupSource
import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.Source
import tachiyomi.domain.manga.model.Manga
import tachiyomi.domain.source.service.SourceManager import tachiyomi.domain.source.service.SourceManager
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
@ -11,10 +11,10 @@ class SourcesBackupCreator(
private val sourceManager: SourceManager = Injekt.get(), private val sourceManager: SourceManager = Injekt.get(),
) { ) {
fun backupSources(mangas: List<Manga>): List<BackupSource> { fun backupSources(mangas: List<BackupManga>): List<BackupSource> {
return mangas return mangas
.asSequence() .asSequence()
.map(Manga::source) .map(BackupManga::source)
.distinct() .distinct()
.map(sourceManager::getOrStub) .map(sourceManager::getOrStub)
.map { it.toBackupSource() } .map { it.toBackupSource() }

View File

@ -74,8 +74,11 @@ class BackupRestorer(
val backupMaps = backup.backupSources + backup.backupBrokenSources.map { it.toBackupSource() } val backupMaps = backup.backupSources + backup.backupBrokenSources.map { it.toBackupSource() }
sourceMapping = backupMaps.associate { it.sourceId to it.name } sourceMapping = backupMaps.associate { it.sourceId to it.name }
if (options.library) { if (options.libraryEntries) {
restoreAmount += backup.backupManga.size + 1 // +1 for categories restoreAmount += backup.backupManga.size
}
if (options.categories) {
restoreAmount += 1
} }
// SY --> // SY -->
if (options.savedSearches) { if (options.savedSearches) {
@ -90,7 +93,7 @@ class BackupRestorer(
} }
coroutineScope { coroutineScope {
if (options.library) { if (options.categories) {
restoreCategories(backup.backupCategories) restoreCategories(backup.backupCategories)
} }
// SY --> // SY -->
@ -104,8 +107,8 @@ class BackupRestorer(
if (options.sourceSettings) { if (options.sourceSettings) {
restoreSourcePreferences(backup.backupSourcePreferences) restoreSourcePreferences(backup.backupSourcePreferences)
} }
if (options.library) { if (options.libraryEntries) {
restoreManga(backup.backupManga, backup.backupCategories) restoreManga(backup.backupManga, if (options.categories) backup.backupCategories else emptyList())
} }
// TODO: optionally trigger online library + tracker update // TODO: optionally trigger online library + tracker update

View File

@ -6,7 +6,8 @@ import tachiyomi.i18n.MR
import tachiyomi.i18n.sy.SYMR import tachiyomi.i18n.sy.SYMR
data class RestoreOptions( data class RestoreOptions(
val library: Boolean = true, val libraryEntries: Boolean = true,
val categories: Boolean = true,
val appSettings: Boolean = true, val appSettings: Boolean = true,
val sourceSettings: Boolean = true, val sourceSettings: Boolean = true,
// SY --> // SY -->
@ -15,7 +16,8 @@ data class RestoreOptions(
) { ) {
fun asBooleanArray() = booleanArrayOf( fun asBooleanArray() = booleanArrayOf(
library, libraryEntries,
categories,
appSettings, appSettings,
sourceSettings, sourceSettings,
// SY --> // SY -->
@ -23,14 +25,19 @@ data class RestoreOptions(
// SY <-- // SY <--
) )
fun anyEnabled() = library || appSettings || sourceSettings /* SY --> */ || savedSearches /* SY <-- */ fun canRestore() = libraryEntries || categories || appSettings || sourceSettings /* SY --> */ || savedSearches /* SY <-- */
companion object { companion object {
val options = persistentListOf( val options = persistentListOf(
Entry( Entry(
label = MR.strings.label_library, label = MR.strings.label_library,
getter = RestoreOptions::library, getter = RestoreOptions::libraryEntries,
setter = { options, enabled -> options.copy(library = enabled) }, setter = { options, enabled -> options.copy(libraryEntries = enabled) },
),
Entry(
label = MR.strings.categories,
getter = RestoreOptions::categories,
setter = { options, enabled -> options.copy(categories = enabled) },
), ),
Entry( Entry(
label = MR.strings.app_settings, label = MR.strings.app_settings,
@ -52,11 +59,12 @@ data class RestoreOptions(
) )
fun fromBooleanArray(array: BooleanArray) = RestoreOptions( fun fromBooleanArray(array: BooleanArray) = RestoreOptions(
library = array[0], libraryEntries = array[0],
appSettings = array[1], categories = array[1],
sourceSettings = array[2], appSettings = array[2],
sourceSettings = array[3],
// SY --> // SY -->
savedSearches = array[3] savedSearches = array[4]
// SY <-- // SY <--
) )
} }