From ba43e5584c5ab20de24c5a2fe5cc6c986587ebd4 Mon Sep 17 00:00:00 2001 From: kana-shii <79055104+kana-shii@users.noreply.github.com> Date: Thu, 12 Sep 2024 14:48:13 -0300 Subject: [PATCH] disable smart-update for individual & fix custom interval (#318) * set custom disabled interval * fix wrong calculation of nextUpdate when setting custom fetchInterval --------- Co-authored-by: Cuong-Tran --- .../kanade/presentation/manga/MangaScreen.kt | 2 + .../manga/components/MangaDialogs.kt | 40 ++++++++++++++----- .../manga/components/MangaInfoHeader.kt | 28 +++++++++++-- .../domain/manga/interactor/FetchInterval.kt | 6 ++- 4 files changed, 60 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt b/app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt index 36ca310bd..c3eddad31 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt @@ -595,6 +595,7 @@ private fun MangaScreenSmallImpl( // SY <-- // KMK --> status = state.manga.status, + interval = state.manga.fetchInterval, // KMK <-- ) } @@ -1000,6 +1001,7 @@ private fun MangaScreenLargeImpl( // SY <-- // KMK --> status = state.manga.status, + interval = state.manga.fetchInterval, // KMK <-- ) // SY --> diff --git a/app/src/main/java/eu/kanade/presentation/manga/components/MangaDialogs.kt b/app/src/main/java/eu/kanade/presentation/manga/components/MangaDialogs.kt index bee8a8844..d6ce7a5a2 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/components/MangaDialogs.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/components/MangaDialogs.kt @@ -117,20 +117,38 @@ fun SetIntervalDialog( contentAlignment = Alignment.Center, ) { val size = DpSize(width = maxWidth / 2, height = 128.dp) - val items = (0..FetchInterval.MAX_INTERVAL) - .map { - if (it == 0) { - stringResource(MR.strings.label_default) - } else { - it.toString() - } - } - .toImmutableList() + val items = + // KMK --> + ( + listOf(stringResource(MR.strings.action_disable)) + + // KMK <-- + (0..FetchInterval.MAX_INTERVAL) + .map { + if (it == 0) { + stringResource(MR.strings.label_default) + } else { + it.toString() + } + } + ) + .toImmutableList() WheelTextPicker( items = items, size = size, - startIndex = selectedInterval, - onSelectionChanged = { selectedInterval = it }, + startIndex = ( + selectedInterval + + // KMK --> + 1 + ).takeIf { selectedInterval != FetchInterval.MANUAL_DISABLE } ?: 0, + // KMK <-- + onSelectionChanged = { idx -> + selectedInterval = ( + idx - + // KMK --> + 1 + ).takeIf { idx != 0 } ?: FetchInterval.MANUAL_DISABLE + // KMK <-- + }, ) } } diff --git a/app/src/main/java/eu/kanade/presentation/manga/components/MangaInfoHeader.kt b/app/src/main/java/eu/kanade/presentation/manga/components/MangaInfoHeader.kt index 3fa9abca5..acd1f82c8 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/components/MangaInfoHeader.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/components/MangaInfoHeader.kt @@ -28,6 +28,7 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.CallMerge import androidx.compose.material.icons.filled.Brush import androidx.compose.material.icons.filled.Favorite +import androidx.compose.material.icons.filled.HourglassDisabled import androidx.compose.material.icons.filled.HourglassEmpty import androidx.compose.material.icons.filled.PersonOutline import androidx.compose.material.icons.filled.Warning @@ -51,6 +52,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable @@ -83,6 +85,7 @@ import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.util.system.copyToClipboard import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.library.service.LibraryPreferences.Companion.MANGA_NON_COMPLETED +import tachiyomi.domain.manga.interactor.FetchInterval import tachiyomi.domain.manga.model.Manga import tachiyomi.i18n.MR import tachiyomi.i18n.kmk.KMR @@ -205,21 +208,31 @@ fun MangaActionRow( // SY <-- // KMK --> status: Long, + interval: Int, // KMK <-- modifier: Modifier = Modifier, ) { // KMK --> val libraryPreferences: LibraryPreferences = Injekt.get() val restrictions = libraryPreferences.autoUpdateMangaRestrictions().get() - val isSkipCompleted = MANGA_NON_COMPLETED !in restrictions || status != SManga.COMPLETED.toLong() + val notSkipCompleted = MANGA_NON_COMPLETED !in restrictions || status != SManga.COMPLETED.toLong() + val selectedInterval by remember(interval) { mutableIntStateOf(if (interval < 0) -interval else 0) } // KMK <-- val defaultActionButtonColor = MaterialTheme.colorScheme.onSurface.copy(alpha = DISABLED_ALPHA) // TODO: show something better when using custom interval - val nextUpdateDays = remember(nextUpdate) { - return@remember if (nextUpdate != null && isSkipCompleted) { + val nextUpdateDays = remember(nextUpdate, selectedInterval, notSkipCompleted) { + return@remember if (nextUpdate != null && + // KMK --> + notSkipCompleted + // KMK <-- + ) { val now = Instant.now() now.until(nextUpdate, ChronoUnit.DAYS).toInt().coerceAtLeast(0) + // KMK --> + .takeIf { selectedInterval != FetchInterval.MANUAL_DISABLE } + ?: FetchInterval.MANUAL_DISABLE + // KMK <-- } else { null } @@ -241,13 +254,20 @@ fun MangaActionRow( title = when (nextUpdateDays) { null -> stringResource(MR.strings.not_applicable) 0 -> stringResource(MR.strings.manga_interval_expected_update_soon) + // KMK --> + FetchInterval.MANUAL_DISABLE -> stringResource(MR.strings.disabled) + // KMK <-- else -> pluralStringResource( MR.plurals.day, count = nextUpdateDays, nextUpdateDays, ) }, - icon = Icons.Default.HourglassEmpty, + icon = Icons.Default.HourglassEmpty + // KMK --> + .takeIf { nextUpdateDays != FetchInterval.MANUAL_DISABLE } + ?: Icons.Default.HourglassDisabled, + // KMK <-- color = if (isUserIntervalMode || // KMK --> nextUpdateDays?.let { it <= 1 } == true diff --git a/domain/src/main/java/tachiyomi/domain/manga/interactor/FetchInterval.kt b/domain/src/main/java/tachiyomi/domain/manga/interactor/FetchInterval.kt index f77f34a7e..6692413bf 100644 --- a/domain/src/main/java/tachiyomi/domain/manga/interactor/FetchInterval.kt +++ b/domain/src/main/java/tachiyomi/domain/manga/interactor/FetchInterval.kt @@ -107,7 +107,7 @@ class FetchInterval( interval.absoluteValue.takeIf { interval < 0 } ?: increaseInterval(interval, timeSinceLatest, increaseWhenOver = 10), ) - return latestDate.plusDays((cycle + 1) * interval.toLong()).toEpochSecond(dateTime.offset) * 1000 + return latestDate.plusDays((cycle + 1) * interval.absoluteValue.toLong()).toEpochSecond(dateTime.offset) * 1000 } private fun increaseInterval(delta: Int, timeSinceLatest: Int, increaseWhenOver: Int): Int { @@ -126,5 +126,9 @@ class FetchInterval( const val MAX_INTERVAL = 28 private const val GRACE_PERIOD = 1L + + // KMK --> + const val MANUAL_DISABLE = 99999 // 274 years in future + // KMK <-- } }