chore(sync): migrate sync preference keys (#1747)

This commit is contained in:
Cuong-Tran 2026-07-09 02:43:00 +07:00 committed by GitHub
parent ce6a0ea7fa
commit 1763d947df
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 103 additions and 32 deletions

View file

@ -10,8 +10,8 @@ import java.util.UUID
class SyncPreferences(
private val preferenceStore: PreferenceStore,
) {
fun clientHost() = preferenceStore.getString("sync_client_host", "https://sync.tachiyomi.org")
fun clientAPIKey() = preferenceStore.getString("sync_client_api_key", "")
fun clientHost() = preferenceStore.getString("connection_sync_client_host", "https://sync.tachiyomi.org")
fun clientAPIKey() = preferenceStore.getString("connection_sync_client_api_key", "")
fun lastSyncTimestamp() = preferenceStore.getLong(Preference.appStateKey("last_sync_timestamp"), 0L)
fun lastSyncEtag() = preferenceStore.getString("sync_etag", "")
@ -20,19 +20,19 @@ class SyncPreferences(
fun syncService() = preferenceStore.getInt("sync_service", 0)
// KMK -->
fun webDavUrl() = preferenceStore.getString("webdav_url", "")
fun webDavUsername() = preferenceStore.getString("webdav_username", "")
fun webDavPassword() = preferenceStore.getString("webdav_password", "")
fun webDavFolder() = preferenceStore.getString("webdav_folder", "komikku")
fun webDavUrl() = preferenceStore.getString("connection_webdav_url", "")
fun webDavUsername() = preferenceStore.getString("connection_webdav_username", "")
fun webDavPassword() = preferenceStore.getString("connection_webdav_password", "")
fun webDavFolder() = preferenceStore.getString("connection_webdav_folder", "komikku")
// KMK <--
fun googleDriveAccessToken() = preferenceStore.getString(
Preference.appStateKey("google_drive_access_token"),
Preference.appStateKey("connection_google_drive_access_token"),
"",
)
fun googleDriveRefreshToken() = preferenceStore.getString(
Preference.appStateKey("google_drive_refresh_token"),
Preference.appStateKey("connection_google_drive_refresh_token"),
"",
)
@ -55,39 +55,39 @@ class SyncPreferences(
fun getSyncSettings(): SyncSettings {
return SyncSettings(
libraryEntries = preferenceStore.getBoolean("library_entries", true).get(),
categories = preferenceStore.getBoolean("categories", true).get(),
chapters = preferenceStore.getBoolean("chapters", true).get(),
tracking = preferenceStore.getBoolean("tracking", true).get(),
history = preferenceStore.getBoolean("history", true).get(),
appSettings = preferenceStore.getBoolean("appSettings", true).get(),
extensionStores = preferenceStore.getBoolean("extensionStores", true).get(),
sourceSettings = preferenceStore.getBoolean("sourceSettings", true).get(),
privateSettings = preferenceStore.getBoolean("privateSettings", true).get(),
libraryEntries = preferenceStore.getBoolean("sync_library_entries", true).get(),
categories = preferenceStore.getBoolean("sync_categories", true).get(),
chapters = preferenceStore.getBoolean("sync_chapters", true).get(),
tracking = preferenceStore.getBoolean("sync_tracking", true).get(),
history = preferenceStore.getBoolean("sync_history", true).get(),
appSettings = preferenceStore.getBoolean("sync_appSettings", true).get(),
extensionStores = preferenceStore.getBoolean("sync_extensionStores", true).get(),
sourceSettings = preferenceStore.getBoolean("sync_sourceSettings", true).get(),
privateSettings = preferenceStore.getBoolean("sync_privateSettings", true).get(),
// SY -->
customInfo = preferenceStore.getBoolean("customInfo", true).get(),
readEntries = preferenceStore.getBoolean("readEntries", true).get(),
savedSearchesFeeds = preferenceStore.getBoolean("savedSearchesFeeds", true).get(),
customInfo = preferenceStore.getBoolean("sync_customInfo", true).get(),
readEntries = preferenceStore.getBoolean("sync_readEntries", true).get(),
savedSearchesFeeds = preferenceStore.getBoolean("sync_savedSearchesFeeds", true).get(),
// SY <--
)
}
fun setSyncSettings(syncSettings: SyncSettings) {
preferenceStore.getBoolean("library_entries", true).set(syncSettings.libraryEntries)
preferenceStore.getBoolean("categories", true).set(syncSettings.categories)
preferenceStore.getBoolean("chapters", true).set(syncSettings.chapters)
preferenceStore.getBoolean("tracking", true).set(syncSettings.tracking)
preferenceStore.getBoolean("history", true).set(syncSettings.history)
preferenceStore.getBoolean("appSettings", true).set(syncSettings.appSettings)
preferenceStore.getBoolean("extensionStores", true).set(syncSettings.extensionStores)
preferenceStore.getBoolean("sourceSettings", true).set(syncSettings.sourceSettings)
preferenceStore.getBoolean("privateSettings", true).set(syncSettings.privateSettings)
preferenceStore.getBoolean("sync_library_entries", true).set(syncSettings.libraryEntries)
preferenceStore.getBoolean("sync_categories", true).set(syncSettings.categories)
preferenceStore.getBoolean("sync_chapters", true).set(syncSettings.chapters)
preferenceStore.getBoolean("sync_tracking", true).set(syncSettings.tracking)
preferenceStore.getBoolean("sync_history", true).set(syncSettings.history)
preferenceStore.getBoolean("sync_appSettings", true).set(syncSettings.appSettings)
preferenceStore.getBoolean("sync_extensionStores", true).set(syncSettings.extensionStores)
preferenceStore.getBoolean("sync_sourceSettings", true).set(syncSettings.sourceSettings)
preferenceStore.getBoolean("sync_privateSettings", true).set(syncSettings.privateSettings)
// SY -->
preferenceStore.getBoolean("customInfo", true).set(syncSettings.customInfo)
preferenceStore.getBoolean("readEntries", true).set(syncSettings.readEntries)
preferenceStore.getBoolean("savedSearchesFeeds", true).set(syncSettings.savedSearchesFeeds)
preferenceStore.getBoolean("sync_customInfo", true).set(syncSettings.customInfo)
preferenceStore.getBoolean("sync_readEntries", true).set(syncSettings.readEntries)
preferenceStore.getBoolean("sync_savedSearchesFeeds", true).set(syncSettings.savedSearchesFeeds)
// SY <--
}

View file

@ -54,5 +54,6 @@ val migrations: List<Migration>
RemoveDuplicateReaderPreferenceMigration(),
// KMK -->
DisabledRepoMigration(),
SyncPrefKeyMigration(),
// KMK <--
)

View file

@ -0,0 +1,70 @@
package mihon.core.migration.migrations
import android.app.Application
import androidx.core.content.edit
import androidx.preference.PreferenceManager
import mihon.core.migration.Migration
import mihon.core.migration.MigrationContext
import tachiyomi.core.common.preference.Preference
/**
* Migrates sync preference storage keys to namespaced forms so that
* connection keys ("connection_*") and sync-toggle keys ("sync_*") no longer
* collide with unrelated preferences.
*/
class SyncPrefKeyMigration : Migration {
override val version: Float = 80f
override suspend fun invoke(migrationContext: MigrationContext): Boolean {
val context = migrationContext.get<Application>() ?: return false
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
val stringRenames = listOf(
// Sync service connection
"sync_client_host" to "connection_sync_client_host",
"sync_client_api_key" to "connection_sync_client_api_key",
// WebDAV connection (KMK)
"webdav_url" to "connection_webdav_url",
"webdav_username" to "connection_webdav_username",
"webdav_password" to "connection_webdav_password",
"webdav_folder" to "connection_webdav_folder",
// Google Drive tokens — appStateKey() prepends "__APP_STATE_"
Preference.appStateKey("google_drive_access_token") to Preference.appStateKey("connection_google_drive_access_token"),
Preference.appStateKey("google_drive_refresh_token") to Preference.appStateKey("connection_google_drive_refresh_token"),
)
val booleanRenames = listOf(
// Core sync toggles
"library_entries" to "sync_library_entries",
"categories" to "sync_categories",
"chapters" to "sync_chapters",
"tracking" to "sync_tracking",
"history" to "sync_history",
"appSettings" to "sync_appSettings",
"extensionRepoSettings" to "sync_extensionStores",
"sourceSettings" to "sync_sourceSettings",
"privateSettings" to "sync_privateSettings",
// SY sync toggles
"customInfo" to "sync_customInfo",
"readEntries" to "sync_readEntries",
"savedSearchesFeeds" to "sync_savedSearchesFeeds",
)
prefs.edit {
stringRenames.forEach { (oldKey, newKey) ->
if (prefs.contains(oldKey)) {
putString(newKey, prefs.getString(oldKey, null))
remove(oldKey)
}
}
booleanRenames.forEach { (oldKey, newKey) ->
if (prefs.contains(oldKey)) {
putBoolean(newKey, prefs.getBoolean(oldKey, true))
remove(oldKey)
}
}
}
return true
}
}