From 99470e8133ec344d114a40b7fc92f32ea6cd30aa Mon Sep 17 00:00:00 2001 From: Cuong-Tran <16017808+cuong-tran@users.noreply.github.com> Date: Wed, 27 May 2026 14:20:56 +0700 Subject: [PATCH] Revert "fix(library): notify when sync fails before library update" This reverts commit 9ccf5ca29153eff061cf5da87cc1c91f33e5b60e. --- .../data/library/LibraryUpdateJob.kt | 12 ------ .../data/library/LibraryUpdateNotifier.kt | 4 +- .../data/library/LibraryUpdateSyncResult.kt | 20 ---------- .../kanade/tachiyomi/data/sync/SyncDataJob.kt | 31 ++------------- .../tachiyomi/data/sync/SyncDataResult.kt | 28 ------------- .../kanade/tachiyomi/data/sync/SyncManager.kt | 39 +++++-------------- .../sync/service/GoogleDriveSyncService.kt | 9 +---- .../data/sync/service/SyncYomiSyncService.kt | 16 +++----- .../data/sync/service/WebDavSyncService.kt | 6 +-- .../moko-resources/base/strings.xml | 2 - 10 files changed, 24 insertions(+), 143 deletions(-) delete mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateSyncResult.kt delete mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/sync/SyncDataResult.kt diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt index 7a98c4bae..e5c2c5124 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt @@ -182,17 +182,6 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet return withIOContext { try { - LibraryUpdateSyncResult.consumeFailure()?.let { syncError -> - notifier.showUpdateErrorNotification( - failed = 1, - errorMessage = context.stringResource( - MR.strings.library_update_skipped_sync_error, - syncError, - ), - ) - return@withIOContext Result.success() - } - when (target) { Target.CHAPTERS -> updateChapterList() // SY --> @@ -855,7 +844,6 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet // Define the SyncDataJob val syncDataJob = OneTimeWorkRequestBuilder() .addTag(SyncDataJob.TAG_MANUAL) - .addTag(SyncDataJob.TAG_BEFORE_LIBRARY_UPDATE) .build() // Chain SyncDataJob to run before LibraryUpdateJob diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateNotifier.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateNotifier.kt index ebbbb35ca..8267edad2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateNotifier.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateNotifier.kt @@ -153,7 +153,7 @@ class LibraryUpdateNotifier( * * @param failed Number of entries that failed to update. */ - fun showUpdateErrorNotification(failed: Int, errorMessage: String? = null) { + fun showUpdateErrorNotification(failed: Int) { if (failed == 0) { return } @@ -163,7 +163,7 @@ class LibraryUpdateNotifier( Notifications.CHANNEL_LIBRARY_ERROR, ) { setContentTitle(context.stringResource(MR.strings.notification_update_error, failed)) - setContentText(errorMessage ?: context.stringResource(MR.strings.action_show_errors)) + setContentText(context.stringResource(MR.strings.action_show_errors)) setSmallIcon(R.drawable.ic_komikku) setColor(ContextCompat.getColor(context, R.color.ic_launcher)) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateSyncResult.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateSyncResult.kt deleted file mode 100644 index 9867d748b..000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateSyncResult.kt +++ /dev/null @@ -1,20 +0,0 @@ -package eu.kanade.tachiyomi.data.library - -/** - * Holds a sync failure message to be reported by [LibraryUpdateJob] when a library update - * was chained to run after [eu.kanade.tachiyomi.data.sync.SyncDataJob]. - */ -object LibraryUpdateSyncResult { - @Volatile - private var pendingError: String? = null - - fun setFailure(message: String) { - pendingError = message - } - - fun consumeFailure(): String? { - val error = pendingError - pendingError = null - return error - } -} diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/sync/SyncDataJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/sync/SyncDataJob.kt index c17df974e..b1bef64af 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/sync/SyncDataJob.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/sync/SyncDataJob.kt @@ -14,18 +14,14 @@ import androidx.work.WorkQuery import androidx.work.WorkerParameters import eu.kanade.domain.sync.SyncPreferences import eu.kanade.tachiyomi.data.SyncStatus -import eu.kanade.tachiyomi.data.library.LibraryUpdateSyncResult import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.util.system.isOnline import eu.kanade.tachiyomi.util.system.isRunning import eu.kanade.tachiyomi.util.system.setForegroundSafely import eu.kanade.tachiyomi.util.system.workManager -import kotlinx.coroutines.CancellationException import kotlinx.coroutines.runBlocking import logcat.LogPriority -import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.system.logcat -import tachiyomi.i18n.MR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.util.concurrent.TimeUnit @@ -57,22 +53,12 @@ class SyncDataJob(private val context: Context, workerParams: WorkerParameters) setForegroundSafely() return try { - when (val result = SyncManager(context).syncData()) { - SyncDataResult.Success -> Result.success() - is SyncDataResult.Failure -> { - handleSyncFailure(result.message, result.errorAlreadyNotified) - Result.success() - } - } - } catch (e: CancellationException) { - throw e + SyncManager(context).syncData() + Result.success() } catch (e: Exception) { logcat(LogPriority.ERROR, e) - handleSyncFailure( - e.message ?: context.stringResource(MR.strings.unknown_error), - errorAlreadyNotified = false, - ) - Result.success() + notifier.showSyncError(e.message) + Result.success() // try again next time } finally { // KMK --> syncStatus.stop() @@ -92,19 +78,10 @@ class SyncDataJob(private val context: Context, workerParams: WorkerParameters) ) } - private fun handleSyncFailure(message: String, errorAlreadyNotified: Boolean) { - if (tags.contains(TAG_BEFORE_LIBRARY_UPDATE)) { - LibraryUpdateSyncResult.setFailure(message) - } else if (!errorAlreadyNotified) { - notifier.showSyncError(message) - } - } - companion object { private const val TAG_JOB = "SyncDataJob" private const val TAG_AUTO = "$TAG_JOB:auto" const val TAG_MANUAL = "$TAG_JOB:manual" - const val TAG_BEFORE_LIBRARY_UPDATE = "$TAG_JOB:before-library-update" fun isRunning(context: Context): Boolean { return context.workManager.isRunning(TAG_JOB) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/sync/SyncDataResult.kt b/app/src/main/java/eu/kanade/tachiyomi/data/sync/SyncDataResult.kt deleted file mode 100644 index 3c1d50292..000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/data/sync/SyncDataResult.kt +++ /dev/null @@ -1,28 +0,0 @@ -package eu.kanade.tachiyomi.data.sync - -/** - * Captures the most recent sync failure reported by a [eu.kanade.tachiyomi.data.sync.service.SyncService] - * implementation so [SyncManager] can propagate the message without losing context. - */ -internal object SyncFailureState { - private var failure: Pair? = null - - fun report(message: String, errorAlreadyNotified: Boolean = true) { - failure = message to errorAlreadyNotified - } - - fun consume(): Pair? = failure.also { failure = null } -} - -sealed interface SyncDataResult { - data object Success : SyncDataResult - - /** - * @param message Human-readable failure reason. - * @param errorAlreadyNotified `true` when a sync service already showed a sync error notification. - */ - data class Failure( - val message: String, - val errorAlreadyNotified: Boolean = false, - ) : SyncDataResult -} 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 a4727a50c..ec289d2e7 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 @@ -19,9 +19,7 @@ import kotlinx.serialization.json.Json import kotlinx.serialization.protobuf.ProtoBuf import logcat.LogPriority import logcat.logcat -import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.system.logcat -import tachiyomi.i18n.MR import tachiyomi.data.Chapters import tachiyomi.data.DatabaseHandler import tachiyomi.data.manga.MangaMapper.mapManga @@ -74,9 +72,7 @@ class SyncManager( * This function retrieves local data (favorites, manga, extensions, and categories) * from the database using the BackupManager, then synchronizes the data with a sync service. */ - suspend fun syncData(): SyncDataResult { - SyncFailureState.consume() - + suspend fun syncData() { // Reset isSyncing in case it was left over or failed syncing during restore. handler.await(inTransaction = true) { mangasQueries.resetIsSyncing() @@ -157,22 +153,12 @@ class SyncManager( } } - if (syncService == null) { - return SyncDataResult.Failure( - message = context.stringResource(MR.strings.sync_failed_generic), - ) - } - - val remoteBackup = syncService.doSync(syncData) + val remoteBackup = syncService?.doSync(syncData) if (remoteBackup == null) { - logcat(LogPriority.DEBUG) { "Skip restore due to sync failure" } - val (message, errorAlreadyNotified) = SyncFailureState.consume() - ?: (context.stringResource(MR.strings.sync_failed_generic) to false) - return SyncDataResult.Failure( - message = message, - errorAlreadyNotified = errorAlreadyNotified, - ) + logcat(LogPriority.DEBUG) { "Skip restore due to network issues" } + // should we call showSyncError? + return } if (remoteBackup === syncData.backup) { @@ -180,14 +166,13 @@ class SyncManager( logcat(LogPriority.DEBUG) { "Skip restore due to remote was overwrite from local" } syncPreferences.lastSyncTimestamp().set(Date().time) notifier.showSyncSuccess("Sync completed successfully") - return SyncDataResult.Success + return } // Stop the sync early if the remote backup is null or empty if (remoteBackup.backupManga.isEmpty()) { - val message = "No data found on remote server." - notifier.showSyncError(message) - return SyncDataResult.Failure(message = message, errorAlreadyNotified = true) + notifier.showSyncError("No data found on remote server.") + return } // Check if it's first sync based on lastSyncTimestamp @@ -195,7 +180,7 @@ class SyncManager( // It's first sync no need to restore data. (just update remote data) syncPreferences.lastSyncTimestamp().set(Date().time) notifier.showSyncSuccess("Updated remote data successfully") - return SyncDataResult.Success + return } val (filteredFavorites, nonFavorites) = filterFavoritesAndNonFavorites(remoteBackup) @@ -223,7 +208,7 @@ class SyncManager( // update the sync timestamp syncPreferences.lastSyncTimestamp().set(Date().time) notifier.showSyncSuccess("Sync completed successfully") - return SyncDataResult.Success + return } val backupUri = writeSyncDataToCache(context, newSyncData) @@ -243,12 +228,8 @@ class SyncManager( // update the sync timestamp syncPreferences.lastSyncTimestamp().set(Date().time) - return SyncDataResult.Success } else { logcat(LogPriority.ERROR) { "Failed to write sync data to file" } - return SyncDataResult.Failure( - message = context.stringResource(MR.strings.sync_failed_generic), - ) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/sync/service/GoogleDriveSyncService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/sync/service/GoogleDriveSyncService.kt index 6a34c0329..0393649a7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/sync/service/GoogleDriveSyncService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/sync/service/GoogleDriveSyncService.kt @@ -18,8 +18,6 @@ import com.google.api.services.drive.DriveScopes import com.google.api.services.drive.model.File import eu.kanade.domain.sync.SyncPreferences import eu.kanade.tachiyomi.data.backup.models.Backup -import eu.kanade.tachiyomi.data.sync.SyncFailureState -import eu.kanade.tachiyomi.data.sync.SyncNotifier import kotlinx.coroutines.launch import kotlinx.serialization.json.Json import kotlinx.serialization.protobuf.ProtoBuf @@ -65,8 +63,6 @@ class GoogleDriveSyncService(context: Context, json: Json, syncPreferences: Sync private val googleDriveService = GoogleDriveService(context) - private val notifier = SyncNotifier(context) - private val protoBuf: ProtoBuf = Injekt.get() override suspend fun doSync(syncData: SyncData): Backup? { @@ -100,10 +96,7 @@ class GoogleDriveSyncService(context: Context, json: Json, syncPreferences: Sync pushSyncData(syncData) return syncData.backup } catch (e: Exception) { - val message = e.message ?: context.stringResource(MR.strings.unknown_error) - logcat(LogPriority.ERROR, "SyncService") { "Error syncing: $message" } - notifier.showSyncError(message) - SyncFailureState.report(message) + logcat(LogPriority.ERROR, "SyncService") { "Error syncing: ${e.message}" } return null } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/sync/service/SyncYomiSyncService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/sync/service/SyncYomiSyncService.kt index 0667085b8..3db50c859 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/sync/service/SyncYomiSyncService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/sync/service/SyncYomiSyncService.kt @@ -3,7 +3,6 @@ package eu.kanade.tachiyomi.data.sync.service import android.content.Context import eu.kanade.domain.sync.SyncPreferences import eu.kanade.tachiyomi.data.backup.models.Backup -import eu.kanade.tachiyomi.data.sync.SyncFailureState import eu.kanade.tachiyomi.data.sync.SyncNotifier import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.POST @@ -88,11 +87,10 @@ class SyncYomiSyncService( if (success) { reportSyncEvent(SyncEventStatus.SYNC_SUCCESS) } else { - val message = "Failed to push sync data" - reportSyncEvent(SyncEventStatus.SYNC_FAILED, message) - notifier.showSyncError(message) - SyncFailureState.report(message) + reportSyncEvent(SyncEventStatus.SYNC_FAILED, "Failed to push sync data") + // KMK --> return null + // KMK <-- } return finalSyncData.backup @@ -101,11 +99,9 @@ class SyncYomiSyncService( reportSyncEvent(SyncEventStatus.SYNC_CANCELLED, e.message) throw e } - val message = e.message ?: context.stringResource(MR.strings.unknown_error) - logcat(LogPriority.ERROR) { "Error syncing: $message" } - notifier.showSyncError(message) - SyncFailureState.report(message) - reportSyncEvent(SyncEventStatus.SYNC_ERROR, message) + logcat(LogPriority.ERROR) { "Error syncing: ${e.message}" } + notifier.showSyncError(e.message) + reportSyncEvent(SyncEventStatus.SYNC_ERROR, e.message) return null } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/sync/service/WebDavSyncService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/sync/service/WebDavSyncService.kt index 77a2f0aa7..40b3366a9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/sync/service/WebDavSyncService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/sync/service/WebDavSyncService.kt @@ -3,7 +3,6 @@ package eu.kanade.tachiyomi.data.sync.service import android.content.Context import eu.kanade.domain.sync.SyncPreferences import eu.kanade.tachiyomi.data.backup.models.Backup -import eu.kanade.tachiyomi.data.sync.SyncFailureState import eu.kanade.tachiyomi.data.sync.SyncNotifier import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.PUT @@ -118,9 +117,7 @@ class WebDavSyncService( return finalSyncData.backup } catch (e: Exception) { xLogE("WebDAV sync error:", e) - val message = e.message ?: context.stringResource(MR.strings.unknown_error) - notifier.showSyncError(message) - SyncFailureState.report(message) + notifier.showSyncError(e.message) return null } } @@ -185,7 +182,6 @@ class WebDavSyncService( "Please retry syncing or check your WebDAV folder." xLogW(message) notifier.showSyncError(message) - SyncFailureState.report(message) } else -> { val bodyStr = response.body.string() diff --git a/i18n/src/commonMain/moko-resources/base/strings.xml b/i18n/src/commonMain/moko-resources/base/strings.xml index ff5b40419..a1466b4f4 100644 --- a/i18n/src/commonMain/moko-resources/base/strings.xml +++ b/i18n/src/commonMain/moko-resources/base/strings.xml @@ -923,8 +923,6 @@ Chapter %1$s and %2$d more Chapters %1$s %1$d update(s) failed - Library update skipped: %1$s - Could not sync with the remote service Tap to learn more Failed to update cover Please add the entry to your library before doing this