diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/work/WorkScheduleManager.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/work/WorkScheduleManager.kt index b9fb85596..725e36cb8 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/work/WorkScheduleManager.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/work/WorkScheduleManager.kt @@ -47,7 +47,7 @@ class WorkScheduleManager @Inject constructor( fun init() { settings.subscribe(this) processLifecycleScope.launch(Dispatchers.Default) { - updateWorkerImpl(trackerScheduler, settings.isTrackerEnabled, false) + updateWorkerImpl(trackerScheduler, settings.isTrackerEnabled, true) // always force due to adaptive interval updateWorkerImpl(suggestionScheduler, settings.isSuggestionsEnabled, false) updateWorkerImpl(periodicalBackupScheduler, settings.isPeriodicalBackupEnabled, false) } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/tracker/data/TracksDao.kt b/app/src/main/kotlin/org/koitharu/kotatsu/tracker/data/TracksDao.kt index 486f22fc7..e05053655 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/tracker/data/TracksDao.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/tracker/data/TracksDao.kt @@ -30,6 +30,9 @@ abstract class TracksDao { @Query("SELECT chapters_new FROM tracks WHERE manga_id = :mangaId") abstract suspend fun findNewChapters(mangaId: Long): Int? + @Query("SELECT COUNT(*) FROM tracks") + abstract suspend fun getTracksCount(): Int + @Query("SELECT manga_id, chapters_new FROM tracks") abstract fun observeNewChaptersMap(): Flow> diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/tracker/work/TrackWorker.kt b/app/src/main/kotlin/org/koitharu/kotatsu/tracker/work/TrackWorker.kt index b36774bce..d3060499b 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/tracker/work/TrackWorker.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/tracker/work/TrackWorker.kt @@ -44,6 +44,7 @@ import kotlinx.coroutines.sync.withPermit import kotlinx.coroutines.withContext import org.koitharu.kotatsu.R import org.koitharu.kotatsu.browser.cloudflare.CaptchaNotifier +import org.koitharu.kotatsu.core.db.MangaDatabase import org.koitharu.kotatsu.core.exceptions.CloudFlareProtectedException import org.koitharu.kotatsu.core.logs.FileLogger import org.koitharu.kotatsu.core.logs.TrackerLogger @@ -57,12 +58,14 @@ import org.koitharu.kotatsu.details.ui.DetailsActivity import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.util.runCatchingCancellable +import org.koitharu.kotatsu.parsers.util.toIntUp import org.koitharu.kotatsu.settings.SettingsActivity import org.koitharu.kotatsu.settings.work.PeriodicWorkScheduler import org.koitharu.kotatsu.tracker.domain.Tracker import org.koitharu.kotatsu.tracker.domain.model.MangaUpdates import java.util.concurrent.TimeUnit import javax.inject.Inject +import javax.inject.Provider import com.google.android.material.R as materialR @HiltWorker @@ -303,11 +306,15 @@ class TrackWorker @AssistedInject constructor( class Scheduler @Inject constructor( private val workManager: WorkManager, private val settings: AppSettings, + private val dbProvider: Provider, ) : PeriodicWorkScheduler { override suspend fun schedule() { val constraints = createConstraints() - val request = PeriodicWorkRequestBuilder(4, TimeUnit.HOURS) + val runCount = dbProvider.get().getTracksDao().getTracksCount() + val runsPerFullCheck = (runCount / BATCH_SIZE.toFloat()).toIntUp() + val interval = (6 / runsPerFullCheck).coerceAtLeast(2) + val request = PeriodicWorkRequestBuilder(interval.toLong(), TimeUnit.HOURS) .setConstraints(constraints) .addTag(TAG) .setBackoffCriteria(BackoffPolicy.LINEAR, 30, TimeUnit.MINUTES)