From 014bf97248f7b55cb97e9fdeedfe3857c108af55 Mon Sep 17 00:00:00 2001 From: Kashish Aggarwal <73023696+kashish-aggarwal21@users.noreply.github.com> Date: Sat, 1 Nov 2025 21:23:33 +0545 Subject: [PATCH] Fix date picker not allowing the same start and finish date in negative time zones (#2617) Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> (cherry picked from commit 8662f80fbf6b7c3aee4945bf656def8341cfdfd3) --- .../ui/manga/track/TrackInfoDialog.kt | 80 ++++++++----------- 1 file changed, 35 insertions(+), 45 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackInfoDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackInfoDialog.kt index 1c8285c95..27cd243fe 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackInfoDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackInfoDialog.kt @@ -61,6 +61,7 @@ import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.data.track.model.TrackSearch import eu.kanade.tachiyomi.source.online.MetadataSource import eu.kanade.tachiyomi.util.lang.convertEpochMillisZone +import eu.kanade.tachiyomi.util.lang.toLocalDate import eu.kanade.tachiyomi.util.system.copyToClipboard import eu.kanade.tachiyomi.util.system.openInBrowser import eu.kanade.tachiyomi.util.system.toast @@ -94,7 +95,6 @@ import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.time.Instant import java.time.LocalDate -import java.time.ZoneId import java.time.ZoneOffset data class TrackInfoDialogHomeScreen( @@ -250,7 +250,7 @@ data class TrackInfoDialogHomeScreen( try { val matchResult = item.tracker.match(manga) ?: throw Exception() item.tracker.register(matchResult, mangaId) - } catch (e: Exception) { + } catch (_: Exception) { withUIContext { Injekt.get().toast(MR.strings.error_no_match) } } } @@ -552,56 +552,46 @@ private data class TrackDateSelectorScreen( @Transient private val selectableDates = object : SelectableDates { override fun isSelectableDate(utcTimeMillis: Long): Boolean { - val dateToCheck = Instant.ofEpochMilli(utcTimeMillis) - .atZone(ZoneOffset.systemDefault()) - .toLocalDate() + val targetDate = Instant.ofEpochMilli(utcTimeMillis).toLocalDate(ZoneOffset.UTC) - if (dateToCheck > LocalDate.now()) { - // Disallow future dates - return false - } + // Disallow future dates + if (targetDate > LocalDate.now(ZoneOffset.UTC)) return false - return if (start && track.finishDate > 0) { - // Disallow start date to be set later than finish date - val dateFinished = Instant.ofEpochMilli(track.finishDate) - .atZone(ZoneId.systemDefault()) - .toLocalDate() - dateToCheck <= dateFinished - } else if (!start && track.startDate > 0) { - // Disallow end date to be set earlier than start date - val dateStarted = Instant.ofEpochMilli(track.startDate) - .atZone(ZoneId.systemDefault()) - .toLocalDate() - dateToCheck >= dateStarted - } else { - // Nothing set before - true + return when { + // Disallow setting start date after finish date + start && track.finishDate > 0 -> { + val finishDate = Instant.ofEpochMilli(track.finishDate).toLocalDate(ZoneOffset.UTC) + targetDate <= finishDate + } + // Disallow setting finish date before start date + !start && track.startDate > 0 -> { + val startDate = Instant.ofEpochMilli(track.startDate).toLocalDate(ZoneOffset.UTC) + startDate <= targetDate + } + else -> { + true + } } } override fun isSelectableYear(year: Int): Boolean { - if (year > LocalDate.now().year) { - // Disallow future dates - return false - } + // Disallow future years + if (year > LocalDate.now(ZoneOffset.UTC).year) return false - return if (start && track.finishDate > 0) { - // Disallow start date to be set later than finish date - val dateFinished = Instant.ofEpochMilli(track.finishDate) - .atZone(ZoneId.systemDefault()) - .toLocalDate() - .year - year <= dateFinished - } else if (!start && track.startDate > 0) { - // Disallow end date to be set earlier than start date - val dateStarted = Instant.ofEpochMilli(track.startDate) - .atZone(ZoneId.systemDefault()) - .toLocalDate() - .year - year >= dateStarted - } else { - // Nothing set before - true + return when { + // Disallow setting start year after finish year + start && track.finishDate > 0 -> { + val finishDate = Instant.ofEpochMilli(track.finishDate).toLocalDate(ZoneOffset.UTC) + year <= finishDate.year + } + // Disallow setting finish year before start year + !start && track.startDate > 0 -> { + val startDate = Instant.ofEpochMilli(track.startDate).toLocalDate(ZoneOffset.UTC) + startDate.year <= year + } + else -> { + true + } } } }