From 212e0d8a459a9f7b14121eedcfc57edad5fe5253 Mon Sep 17 00:00:00 2001
From: Cuong-Tran <16017808+cuong-tran@users.noreply.github.com>
Date: Mon, 27 Oct 2025 11:33:35 +0700
Subject: [PATCH] fix(backup-job): Fix disappearing backup job (#1250)
* fix(backup-job): Fix disappearing backup job
* optimize
* localization
* fix string resource
* try/catch exception on workinfo
---
.../data/backup/create/BackupCreateJob.kt | 19 ++++++++++
.../kanade/tachiyomi/ui/main/MainActivity.kt | 36 +++++++++++++++++++
.../moko-resources/base/strings.xml | 1 +
3 files changed, 56 insertions(+)
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreateJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreateJob.kt
index 80c11c62f..a8f21cde1 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreateJob.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreateJob.kt
@@ -23,6 +23,7 @@ import eu.kanade.tachiyomi.util.system.cancelNotification
import eu.kanade.tachiyomi.util.system.isRunning
import eu.kanade.tachiyomi.util.system.setForegroundSafely
import eu.kanade.tachiyomi.util.system.workManager
+import kotlinx.coroutines.guava.await
import logcat.LogPriority
import tachiyomi.core.common.util.system.logcat
import tachiyomi.domain.backup.service.BackupPreferences
@@ -125,6 +126,24 @@ class BackupCreateJob(private val context: Context, workerParams: WorkerParamete
.build()
context.workManager.enqueueUniqueWork(TAG_MANUAL, ExistingWorkPolicy.KEEP, request)
}
+
+ // KMK -->
+ /**
+ * Returns true if a periodic backup job is currently scheduled.
+ * @param context The application context.
+ * @return True if a periodic backup job is scheduled, false otherwise.
+ * @throws Exception If there is an error retrieving the work info.
+ */
+ suspend fun isPeriodicBackupScheduled(context: Context): Boolean {
+ val workInfos = context.workManager
+ .getWorkInfosForUniqueWork(TAG_AUTO)
+ .await()
+
+ return workInfos.any { workInfo ->
+ !workInfo.state.isFinished
+ }
+ }
+ // KMK <--
}
}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt
index 8e6b1242e..370633985 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt
@@ -10,6 +10,7 @@ import android.os.Build
import android.os.Bundle
import android.os.Looper
import android.view.View
+import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.SystemBarStyle
import androidx.activity.enableEdgeToEdge
@@ -73,6 +74,7 @@ import eu.kanade.tachiyomi.BuildConfig
import eu.kanade.tachiyomi.data.BackupRestoreStatus
import eu.kanade.tachiyomi.data.LibraryUpdateStatus
import eu.kanade.tachiyomi.data.SyncStatus
+import eu.kanade.tachiyomi.data.backup.create.BackupCreateJob
import eu.kanade.tachiyomi.data.cache.ChapterCache
import eu.kanade.tachiyomi.data.coil.MangaCoverMetadata
import eu.kanade.tachiyomi.data.connections.discord.DiscordRPCService
@@ -101,6 +103,7 @@ import eu.kanade.tachiyomi.util.view.setComposeContent
import exh.debug.DebugToggles
import exh.eh.EHentaiUpdateWorker
import exh.log.DebugModeOverlay
+import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.callbackFlow
import kotlinx.coroutines.flow.collectLatest
@@ -109,10 +112,12 @@ import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
import logcat.LogPriority
import mihon.core.migration.Migrator
import mihon.core.migration.Migrator.scope
import tachiyomi.core.common.Constants
+import tachiyomi.core.common.i18n.stringResource
import tachiyomi.core.common.preference.Preference
import tachiyomi.core.common.preference.PreferenceStore
import tachiyomi.core.common.util.lang.launchIO
@@ -121,6 +126,8 @@ import tachiyomi.domain.UnsortedPreferences
import tachiyomi.domain.backup.service.BackupPreferences
import tachiyomi.domain.library.service.LibraryPreferences
import tachiyomi.domain.release.interactor.GetApplicationRelease
+import tachiyomi.i18n.MR
+import tachiyomi.i18n.kmk.KMR
import tachiyomi.presentation.core.components.material.Scaffold
import tachiyomi.presentation.core.util.collectAsState
import uy.kohesive.injekt.Injekt
@@ -376,6 +383,9 @@ class MainActivity : BaseActivity() {
HandleOnNewIntent(context = context, navigator = navigator)
+ // KMK -->
+ RearmJobs()
+ // KMK <--
CheckForUpdates()
ShowOnboarding()
}
@@ -493,6 +503,32 @@ class MainActivity : BaseActivity() {
}
}
+ // KMK -->
+ @Composable
+ private fun RearmJobs() {
+ val context = LocalContext.current
+
+ LaunchedEffect(Unit) {
+ launchIO {
+ try {
+ if (!BackupCreateJob.isPeriodicBackupScheduled(context)) {
+ BackupCreateJob.setupTask(context)
+ }
+ } catch (e: Exception) {
+ logcat(LogPriority.ERROR, e)
+ withContext(Dispatchers.Main) {
+ Toast.makeText(
+ context,
+ stringResource(KMR.strings.job_failed_schedule_update_check, stringResource(MR.strings.unknown_error)),
+ Toast.LENGTH_LONG,
+ ).show()
+ }
+ }
+ }
+ }
+ }
+ // KMK <--
+
@Composable
private fun CheckForUpdates() {
val context = LocalContext.current
diff --git a/i18n-kmk/src/commonMain/moko-resources/base/strings.xml b/i18n-kmk/src/commonMain/moko-resources/base/strings.xml
index 5a8cf2272..e2553b9c0 100644
--- a/i18n-kmk/src/commonMain/moko-resources/base/strings.xml
+++ b/i18n-kmk/src/commonMain/moko-resources/base/strings.xml
@@ -173,6 +173,7 @@
Current: %1$s
Migrating all entries from source
+ Failed to schedule automatic backup: %s
To be updated
Sponsor Me
Support: MangaDex, E-H, ExH, nH, 8Muses, Tsumino