From 94f9aaf351836caacc70c3ad7304db61387f2dee Mon Sep 17 00:00:00 2001 From: Roshan Varughese <40583749+Animeboynz@users.noreply.github.com> Date: Wed, 7 Aug 2024 19:49:17 +1200 Subject: [PATCH] Add Backup and Restore of Extension Repos (#1057) * Backup/Restore Extension Repos * Refactor * Moving to Under App Settings * Sort by URL, Check existing by SHA and Error Logging Untested. Currently in a lecture and can't test if the changes really work. * Changes to logic * Don't ask me what's happening here * Renaming Variables * Fixing restoreAmount & changes to logic Co-Authored-By: AntsyLich <59261191+AntsyLich@users.noreply.github.com> --------- Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> (cherry picked from commit 31263084eca3ba98624d258a317d53094bba2256) # 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/models/Backup.kt # app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/BackupRestorer.kt # app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/RestoreOptions.kt --- .../eu/kanade/domain/sync/SyncPreferences.kt | 6 ++- .../kanade/domain/sync/models/SyncSettings.kt | 4 +- .../screen/data/SyncSettingsSelector.kt | 6 ++- .../data/backup/create/BackupCreator.kt | 10 +++++ .../data/backup/create/BackupOptions.kt | 20 +++++++--- .../creators/ExtensionRepoBackupCreator.kt | 17 ++++++++ .../tachiyomi/data/backup/models/Backup.kt | 2 + .../backup/models/BackupExtensionRepos.kt | 25 ++++++++++++ .../data/backup/restore/BackupRestorer.kt | 32 +++++++++++++++ .../data/backup/restore/RestoreOptions.kt | 16 ++++++-- .../restorers/ExtensionRepoRestorer.kt | 40 +++++++++++++++++++ .../kanade/tachiyomi/data/sync/SyncManager.kt | 14 +++++-- .../moko-resources/base/strings.xml | 1 + 13 files changed, 176 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/ExtensionRepoBackupCreator.kt create mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupExtensionRepos.kt create mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/ExtensionRepoRestorer.kt diff --git a/app/src/main/java/eu/kanade/domain/sync/SyncPreferences.kt b/app/src/main/java/eu/kanade/domain/sync/SyncPreferences.kt index b86cd4ede..7795147d6 100644 --- a/app/src/main/java/eu/kanade/domain/sync/SyncPreferences.kt +++ b/app/src/main/java/eu/kanade/domain/sync/SyncPreferences.kt @@ -53,12 +53,14 @@ class SyncPreferences( tracking = preferenceStore.getBoolean("tracking", true).get(), history = preferenceStore.getBoolean("history", true).get(), appSettings = preferenceStore.getBoolean("appSettings", true).get(), + extensionRepoSettings = preferenceStore.getBoolean("extensionRepoSettings", true).get(), sourceSettings = preferenceStore.getBoolean("sourceSettings", true).get(), privateSettings = preferenceStore.getBoolean("privateSettings", true).get(), // SY --> customInfo = preferenceStore.getBoolean("customInfo", true).get(), - readEntries = preferenceStore.getBoolean("readEntries", true).get() + readEntries = preferenceStore.getBoolean("readEntries", true).get(), + savedSearches = preferenceStore.getBoolean("savedSearches", true).get(), // SY <-- ) } @@ -70,12 +72,14 @@ class SyncPreferences( preferenceStore.getBoolean("tracking", true).set(syncSettings.tracking) preferenceStore.getBoolean("history", true).set(syncSettings.history) preferenceStore.getBoolean("appSettings", true).set(syncSettings.appSettings) + preferenceStore.getBoolean("extensionRepoSettings", true).set(syncSettings.extensionRepoSettings) preferenceStore.getBoolean("sourceSettings", true).set(syncSettings.sourceSettings) preferenceStore.getBoolean("privateSettings", true).set(syncSettings.privateSettings) // SY --> preferenceStore.getBoolean("customInfo", true).set(syncSettings.customInfo) preferenceStore.getBoolean("readEntries", true).set(syncSettings.readEntries) + preferenceStore.getBoolean("savedSearches", true).set(syncSettings.savedSearches) // SY <-- } diff --git a/app/src/main/java/eu/kanade/domain/sync/models/SyncSettings.kt b/app/src/main/java/eu/kanade/domain/sync/models/SyncSettings.kt index 720f070c4..f0453f740 100644 --- a/app/src/main/java/eu/kanade/domain/sync/models/SyncSettings.kt +++ b/app/src/main/java/eu/kanade/domain/sync/models/SyncSettings.kt @@ -7,11 +7,13 @@ data class SyncSettings( val tracking: Boolean = true, val history: Boolean = true, val appSettings: Boolean = true, + val extensionRepoSettings: Boolean = true, val sourceSettings: Boolean = true, val privateSettings: Boolean = false, // SY --> val customInfo: Boolean = true, - val readEntries: Boolean = true + val readEntries: Boolean = true, + val savedSearches: Boolean = true, // SY <-- ) diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/data/SyncSettingsSelector.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/data/SyncSettingsSelector.kt index eebb91f52..2622c7bfd 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/data/SyncSettingsSelector.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/data/SyncSettingsSelector.kt @@ -49,7 +49,7 @@ class SyncSettingsSelector : Screen() { LazyColumnWithAction( contentPadding = contentPadding, actionLabel = stringResource(SYMR.strings.label_sync), - actionEnabled = state.options.anyEnabled(), + actionEnabled = state.options.canCreate(), onClickAction = { if (!SyncDataJob.isRunning(context)) { model.syncNow(context) @@ -122,12 +122,14 @@ private class SyncSettingsSelectorModel( tracking = syncSettings.tracking, history = syncSettings.history, appSettings = syncSettings.appSettings, + extensionRepoSettings = syncSettings.extensionRepoSettings, sourceSettings = syncSettings.sourceSettings, privateSettings = syncSettings.privateSettings, // SY --> customInfo = syncSettings.customInfo, readEntries = syncSettings.readEntries, + savedSearches = syncSettings.savedSearches, // SY <-- ) } @@ -140,12 +142,14 @@ private class SyncSettingsSelectorModel( tracking = backupOptions.tracking, history = backupOptions.history, appSettings = backupOptions.appSettings, + extensionRepoSettings = backupOptions.extensionRepoSettings, sourceSettings = backupOptions.sourceSettings, privateSettings = backupOptions.privateSettings, // SY --> customInfo = backupOptions.customInfo, readEntries = backupOptions.readEntries, + savedSearches = backupOptions.savedSearches, // SY <-- ) } 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 7b0a69c33..3677c806f 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 @@ -6,12 +6,14 @@ import com.hippo.unifile.UniFile import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.data.backup.BackupFileValidator import eu.kanade.tachiyomi.data.backup.create.creators.CategoriesBackupCreator +import eu.kanade.tachiyomi.data.backup.create.creators.ExtensionRepoBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.MangaBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.PreferenceBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.SavedSearchBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.SourcesBackupCreator import eu.kanade.tachiyomi.data.backup.models.Backup import eu.kanade.tachiyomi.data.backup.models.BackupCategory +import eu.kanade.tachiyomi.data.backup.models.BackupExtensionRepos import eu.kanade.tachiyomi.data.backup.models.BackupManga import eu.kanade.tachiyomi.data.backup.models.BackupPreference import eu.kanade.tachiyomi.data.backup.models.BackupSavedSearch @@ -50,6 +52,7 @@ class BackupCreator( private val categoriesBackupCreator: CategoriesBackupCreator = CategoriesBackupCreator(), private val mangaBackupCreator: MangaBackupCreator = MangaBackupCreator(), private val preferenceBackupCreator: PreferenceBackupCreator = PreferenceBackupCreator(), + private val extensionRepoBackupCreator: ExtensionRepoBackupCreator = ExtensionRepoBackupCreator(), private val sourcesBackupCreator: SourcesBackupCreator = SourcesBackupCreator(), // SY --> private val savedSearchBackupCreator: SavedSearchBackupCreator = SavedSearchBackupCreator(), @@ -96,6 +99,7 @@ class BackupCreator( backupCategories = backupCategories(options), backupSources = backupSources(backupManga), backupPreferences = backupAppPreferences(options), + backupExtensionRepo = backupExtensionRepos(options), backupSourcePreferences = backupSourcePreferences(options), // SY --> backupSavedSearches = backupSavedSearches(options), @@ -160,6 +164,12 @@ class BackupCreator( return preferenceBackupCreator.createSource(includePrivatePreferences = options.privateSettings) } + suspend fun backupExtensionRepos(options: BackupOptions): List { + if (!options.extensionRepoSettings) return emptyList() + + return extensionRepoBackupCreator() + } + // SY --> suspend fun backupSavedSearches(options: BackupOptions): List { if (!options.savedSearches) return emptyList() 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 fe1f0e137..45a4c14b7 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 @@ -12,6 +12,7 @@ data class BackupOptions( val tracking: Boolean = true, val history: Boolean = true, val appSettings: Boolean = true, + val extensionRepoSettings: Boolean = true, val sourceSettings: Boolean = true, val privateSettings: Boolean = false, // SY --> @@ -28,6 +29,7 @@ data class BackupOptions( tracking, history, appSettings, + extensionRepoSettings, sourceSettings, privateSettings, // SY --> @@ -37,7 +39,7 @@ data class BackupOptions( // SY <-- ) - fun canCreate() = libraryEntries || categories || appSettings || sourceSettings + fun canCreate() = libraryEntries || categories || appSettings || extensionRepoSettings || sourceSettings || savedSearches companion object { val libraryOptions = persistentListOf( @@ -96,6 +98,11 @@ data class BackupOptions( getter = BackupOptions::appSettings, setter = { options, enabled -> options.copy(appSettings = enabled) }, ), + Entry( + label = MR.strings.extensionRepo_settings, + getter = BackupOptions::extensionRepoSettings, + setter = { options, enabled -> options.copy(extensionRepoSettings = enabled) }, + ), Entry( label = MR.strings.source_settings, getter = BackupOptions::sourceSettings, @@ -116,12 +123,13 @@ data class BackupOptions( tracking = array[3], history = array[4], appSettings = array[5], - sourceSettings = array[6], - privateSettings = array[7], + extensionRepoSettings = array[6], + sourceSettings = array[7], + privateSettings = array[8], // SY --> - customInfo = array[8], - readEntries = array[9], - savedSearches = array[10], + customInfo = array[9], + readEntries = array[10], + savedSearches = array[11], // SY <-- ) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/ExtensionRepoBackupCreator.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/ExtensionRepoBackupCreator.kt new file mode 100644 index 000000000..2db6a6f06 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/ExtensionRepoBackupCreator.kt @@ -0,0 +1,17 @@ +package eu.kanade.tachiyomi.data.backup.create.creators + +import eu.kanade.tachiyomi.data.backup.models.BackupExtensionRepos +import eu.kanade.tachiyomi.data.backup.models.backupExtensionReposMapper +import mihon.domain.extensionrepo.interactor.GetExtensionRepo +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get + +class ExtensionRepoBackupCreator( + private val getExtensionRepos: GetExtensionRepo = Injekt.get(), +) { + + suspend operator fun invoke(): List { + return getExtensionRepos.getAll() + .map(backupExtensionReposMapper) + } +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/Backup.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/Backup.kt index 63d631a32..0de472370 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/Backup.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/Backup.kt @@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.data.backup.models import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber +@Suppress("MagicNumber") @Serializable data class Backup( @ProtoNumber(1) val backupManga: List, @@ -11,6 +12,7 @@ data class Backup( @ProtoNumber(101) var backupSources: List = emptyList(), @ProtoNumber(104) var backupPreferences: List = emptyList(), @ProtoNumber(105) var backupSourcePreferences: List = emptyList(), + @ProtoNumber(106) var backupExtensionRepo: List = emptyList(), // SY specific values @ProtoNumber(600) var backupSavedSearches: List = emptyList(), ) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupExtensionRepos.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupExtensionRepos.kt new file mode 100644 index 000000000..fa9968667 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupExtensionRepos.kt @@ -0,0 +1,25 @@ +package eu.kanade.tachiyomi.data.backup.models + +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber +import mihon.domain.extensionrepo.model.ExtensionRepo + +@Suppress("MagicNumber") +@Serializable +class BackupExtensionRepos( + @ProtoNumber(1) var baseUrl: String, + @ProtoNumber(2) var name: String, + @ProtoNumber(3) var shortName: String?, + @ProtoNumber(4) var website: String, + @ProtoNumber(5) var signingKeyFingerprint: String, +) + +val backupExtensionReposMapper = { repo: ExtensionRepo -> + BackupExtensionRepos( + baseUrl = repo.baseUrl, + name = repo.name, + shortName = repo.shortName, + website = repo.website, + signingKeyFingerprint = repo.signingKeyFingerprint, + ) +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/BackupRestorer.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/BackupRestorer.kt index eafd63cac..77e57f554 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/BackupRestorer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/BackupRestorer.kt @@ -5,11 +5,13 @@ import android.net.Uri import eu.kanade.tachiyomi.data.backup.BackupDecoder import eu.kanade.tachiyomi.data.backup.BackupNotifier import eu.kanade.tachiyomi.data.backup.models.BackupCategory +import eu.kanade.tachiyomi.data.backup.models.BackupExtensionRepos import eu.kanade.tachiyomi.data.backup.models.BackupManga import eu.kanade.tachiyomi.data.backup.models.BackupPreference import eu.kanade.tachiyomi.data.backup.models.BackupSavedSearch import eu.kanade.tachiyomi.data.backup.models.BackupSourcePreferences import eu.kanade.tachiyomi.data.backup.restore.restorers.CategoriesRestorer +import eu.kanade.tachiyomi.data.backup.restore.restorers.ExtensionRepoRestorer import eu.kanade.tachiyomi.data.backup.restore.restorers.MangaRestorer import eu.kanade.tachiyomi.data.backup.restore.restorers.PreferenceRestorer import eu.kanade.tachiyomi.data.backup.restore.restorers.SavedSearchRestorer @@ -34,6 +36,7 @@ class BackupRestorer( private val categoriesRestorer: CategoriesRestorer = CategoriesRestorer(), private val preferenceRestorer: PreferenceRestorer = PreferenceRestorer(context), + private val extensionRepoRestorer: ExtensionRepoRestorer = ExtensionRepoRestorer(), private val mangaRestorer: MangaRestorer = MangaRestorer(isSync), // SY --> private val savedSearchRestorer: SavedSearchRestorer = SavedSearchRestorer(), @@ -88,6 +91,9 @@ class BackupRestorer( if (options.appSettings) { restoreAmount += 1 } + if (options.extensionRepoSettings) { + restoreAmount += backup.backupExtensionRepo.size + } if (options.sourceSettings) { restoreAmount += 1 } @@ -110,6 +116,9 @@ class BackupRestorer( if (options.libraryEntries) { restoreManga(backup.backupManga, if (options.categories) backup.backupCategories else emptyList()) } + if (options.extensionRepoSettings) { + restoreExtensionRepos(backup.backupExtensionRepo) + } // TODO: optionally trigger online library + tracker update } @@ -190,6 +199,29 @@ class BackupRestorer( ) } + private fun CoroutineScope.restoreExtensionRepos( + backupExtensionRepo: List + ) = launch { + backupExtensionRepo + .forEach { + ensureActive() + + try { + extensionRepoRestorer(it) + } catch (e: Exception) { + errors.add(Date() to "Error Adding Repo: ${it.name} : ${e.message}") + } + + restoreProgress += 1 + notifier.showRestoreProgress( + context.stringResource(MR.strings.extensionRepo_settings), + restoreProgress, + restoreAmount, + isSync, + ) + } + } + private fun writeErrorLog(): File { try { if (errors.isNotEmpty()) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/RestoreOptions.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/RestoreOptions.kt index a0a45ea7a..533b939eb 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/RestoreOptions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/RestoreOptions.kt @@ -9,6 +9,7 @@ data class RestoreOptions( val libraryEntries: Boolean = true, val categories: Boolean = true, val appSettings: Boolean = true, + val extensionRepoSettings: Boolean = true, val sourceSettings: Boolean = true, // SY --> val savedSearches: Boolean = true, @@ -19,13 +20,14 @@ data class RestoreOptions( libraryEntries, categories, appSettings, + extensionRepoSettings, sourceSettings, // SY --> - savedSearches + savedSearches, // SY <-- ) - fun canRestore() = libraryEntries || categories || appSettings || sourceSettings /* SY --> */ || savedSearches /* SY <-- */ + fun canRestore() = libraryEntries || categories || appSettings || extensionRepoSettings || sourceSettings /* SY --> */ || savedSearches /* SY <-- */ companion object { val options = persistentListOf( @@ -44,6 +46,11 @@ data class RestoreOptions( getter = RestoreOptions::appSettings, setter = { options, enabled -> options.copy(appSettings = enabled) }, ), + Entry( + label = MR.strings.extensionRepo_settings, + getter = RestoreOptions::extensionRepoSettings, + setter = { options, enabled -> options.copy(extensionRepoSettings = enabled) }, + ), Entry( label = MR.strings.source_settings, getter = RestoreOptions::sourceSettings, @@ -62,9 +69,10 @@ data class RestoreOptions( libraryEntries = array[0], categories = array[1], appSettings = array[2], - sourceSettings = array[3], + extensionRepoSettings = array[3], + sourceSettings = array[4], // SY --> - savedSearches = array[4] + savedSearches = array[5] // SY <-- ) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/ExtensionRepoRestorer.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/ExtensionRepoRestorer.kt new file mode 100644 index 000000000..1dd0da491 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/ExtensionRepoRestorer.kt @@ -0,0 +1,40 @@ +package eu.kanade.tachiyomi.data.backup.restore.restorers + +import eu.kanade.tachiyomi.data.backup.models.BackupExtensionRepos +import mihon.domain.extensionrepo.interactor.GetExtensionRepo +import tachiyomi.data.DatabaseHandler +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get + +class ExtensionRepoRestorer( + private val handler: DatabaseHandler = Injekt.get(), + private val getExtensionRepos: GetExtensionRepo = Injekt.get() +) { + + suspend operator fun invoke( + backupRepo: BackupExtensionRepos, + ) { + val dbRepos = getExtensionRepos.getAll() + val existingReposBySHA = dbRepos.associateBy { it.signingKeyFingerprint } + val existingReposByUrl = dbRepos.associateBy { it.baseUrl } + + val urlExists = existingReposByUrl[backupRepo.baseUrl] + val shaExists = existingReposBySHA[backupRepo.signingKeyFingerprint] + + if (urlExists != null && urlExists.signingKeyFingerprint != backupRepo.signingKeyFingerprint) { + error("Already Exists with different signing key fingerprint") + } else if (shaExists != null) { + error("${shaExists.name} has the same signing key fingerprint") + } else { + handler.await { + extension_reposQueries.insert( + backupRepo.baseUrl, + backupRepo.name, + backupRepo.shortName, + backupRepo.website, + backupRepo.signingKeyFingerprint + ) + } + } + } +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/sync/SyncManager.kt b/app/src/main/java/eu/kanade/tachiyomi/data/sync/SyncManager.kt index a2b35ff1e..337b5ae74 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/sync/SyncManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/sync/SyncManager.kt @@ -84,6 +84,7 @@ class SyncManager( chapters = syncOptions.chapters, tracking = syncOptions.tracking, history = syncOptions.history, + extensionRepoSettings = syncOptions.extensionRepoSettings, appSettings = syncOptions.appSettings, sourceSettings = syncOptions.sourceSettings, privateSettings = syncOptions.privateSettings, @@ -91,19 +92,22 @@ class SyncManager( // SY --> customInfo = syncOptions.customInfo, readEntries = syncOptions.readEntries, + savedSearches = syncOptions.savedSearches, // SY <-- ) logcat(LogPriority.DEBUG) { "Begin create backup" } + val backupManga = backupCreator.backupMangas(databaseManga, backupOptions) val backup = Backup( - backupManga = backupCreator.backupMangas(databaseManga, backupOptions), + backupManga = backupManga, backupCategories = backupCreator.backupCategories(backupOptions), - backupSources = backupCreator.backupSources(databaseManga), + backupSources = backupCreator.backupSources(backupManga), backupPreferences = backupCreator.backupAppPreferences(backupOptions), backupSourcePreferences = backupCreator.backupSourcePreferences(backupOptions), + backupExtensionRepo = backupCreator.backupExtensionRepos(backupOptions), // SY --> - backupSavedSearches = backupCreator.backupSavedSearches(), + backupSavedSearches = backupCreator.backupSavedSearches(backupOptions), // SY <-- ) logcat(LogPriority.DEBUG) { "End create backup" } @@ -174,6 +178,7 @@ class SyncManager( backupSources = remoteBackup.backupSources, backupPreferences = remoteBackup.backupPreferences, backupSourcePreferences = remoteBackup.backupSourcePreferences, + backupExtensionRepo = remoteBackup.backupExtensionRepo, // SY --> backupSavedSearches = remoteBackup.backupSavedSearches, @@ -198,7 +203,8 @@ class SyncManager( options = RestoreOptions( appSettings = true, sourceSettings = true, - library = true, + libraryEntries = true, + extensionRepoSettings = true, ), ) diff --git a/i18n/src/commonMain/moko-resources/base/strings.xml b/i18n/src/commonMain/moko-resources/base/strings.xml index f32ee3336..7f39dc81a 100755 --- a/i18n/src/commonMain/moko-resources/base/strings.xml +++ b/i18n/src/commonMain/moko-resources/base/strings.xml @@ -529,6 +529,7 @@ What do you want to backup? App settings Source settings + Extension Repos Include sensitive settings (e.g., tracker login tokens) Creating backup Backup failed