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