diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/CommonOperations.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/CommonOperations.kt index 29ae9a837..3d57a2a7f 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/CommonOperations.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/CommonOperations.kt @@ -33,7 +33,9 @@ import androidx.compose.material.icons.filled.Favorite import androidx.compose.material.icons.filled.FavoriteBorder import androidx.compose.material.icons.filled.HeartBroken import androidx.compose.material3.Checkbox +import androidx.compose.material3.DisplayMode import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.SelectableDates import androidx.compose.material3.Text import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -66,12 +68,20 @@ import com.hippo.ehviewer.util.findActivity import com.hippo.ehviewer.util.isAtLeastT import com.hippo.ehviewer.util.mapToLongArray import com.hippo.ehviewer.util.requestPermission +import com.hippo.ehviewer.util.toEpochMillis import com.hippo.unifile.UniFile import eu.kanade.tachiyomi.ui.reader.ReaderActivity import eu.kanade.tachiyomi.util.lang.withIOContext import eu.kanade.tachiyomi.util.lang.withUIContext import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock +import kotlinx.datetime.Clock +import kotlinx.datetime.DateTimeUnit +import kotlinx.datetime.LocalDate +import kotlinx.datetime.TimeZone +import kotlinx.datetime.minus +import kotlinx.datetime.toLocalDateTime +import kotlinx.datetime.todayIn import moe.tarsin.coroutines.runSuspendCatching import splitties.init.appCtx @@ -408,3 +418,28 @@ suspend fun DialogState.showMoveDownloadLabelList(list: Collection val label = if (selected == 0) null else labels[selected - 1] withUIContext { DownloadManager.changeLabel(list, label) } } + +suspend fun DialogState.showDatePicker(): String? { + val initial = LocalDate(2007, 3, 21) + val yesterday = Clock.System.todayIn(TimeZone.UTC).minus(1, DateTimeUnit.DAY) + val initialMillis = initial.toEpochMillis() + val yesterdayMillis = yesterday.toEpochMillis() + val dateRange = initialMillis..yesterdayMillis + // TODO: Enable picker mode + // https://issuetracker.google.com/issues/306193893 + val dateMillis = showDatePicker( + title = R.string.go_to, + yearRange = initial.year..yesterday.year, + initialDisplayMode = DisplayMode.Input, + selectableDates = object : SelectableDates { + override fun isSelectableDate(utcTimeMillis: Long): Boolean { + return utcTimeMillis in dateRange + } + }, + showModeToggle = false, + ) + val date = dateMillis?.let { + kotlinx.datetime.Instant.fromEpochMilliseconds(it).toLocalDateTime(TimeZone.UTC).date.toString() + } + return date +} diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/FavoritesFragment.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/FavoritesFragment.kt index 49e8ff02a..c1c9a1f38 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/FavoritesFragment.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/FavoritesFragment.kt @@ -54,11 +54,6 @@ import androidx.paging.PagingSource import androidx.paging.PagingState import androidx.paging.cachedIn import androidx.paging.compose.collectAsLazyPagingItems -import com.google.android.material.datepicker.CalendarConstraints -import com.google.android.material.datepicker.CompositeDateValidator -import com.google.android.material.datepicker.DateValidatorPointBackward -import com.google.android.material.datepicker.DateValidatorPointForward -import com.google.android.material.datepicker.MaterialDatePicker import com.hippo.ehviewer.EhDB import com.hippo.ehviewer.R import com.hippo.ehviewer.Settings @@ -77,6 +72,7 @@ import com.hippo.ehviewer.ui.main.FabLayout import com.hippo.ehviewer.ui.main.GalleryInfoGridItem import com.hippo.ehviewer.ui.main.GalleryInfoListItem import com.hippo.ehviewer.ui.main.GalleryList +import com.hippo.ehviewer.ui.showDatePicker import com.hippo.ehviewer.ui.startDownload import com.hippo.ehviewer.ui.tools.LocalDialogState import com.hippo.ehviewer.ui.tools.rememberInVM @@ -85,12 +81,6 @@ import com.hippo.ehviewer.util.mapToLongArray import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.navigation.DestinationsNavigator import eu.kanade.tachiyomi.util.lang.withIOContext -import java.time.Instant -import java.time.LocalDateTime -import java.time.ZoneId -import java.time.ZoneOffset -import java.time.format.DateTimeFormatter -import java.util.Locale import kotlin.math.roundToInt import kotlinx.coroutines.CancellationException import kotlinx.coroutines.launch @@ -334,26 +324,9 @@ fun FavouritesScreen(navigator: DestinationsNavigator) { ) { if (!select) { onClick(EhIcons.Default.GoTo) { - val local = LocalDateTime.of(2007, 3, 21, 0, 0) - val fromDate = local.atZone(ZoneId.ofOffset("UTC", ZoneOffset.UTC)).toInstant().toEpochMilli() - val toDate = MaterialDatePicker.todayInUtcMilliseconds() - val listValidators = ArrayList() - listValidators.add(DateValidatorPointForward.from(fromDate)) - listValidators.add(DateValidatorPointBackward.before(toDate)) - val constraintsBuilder = CalendarConstraints.Builder() - .setStart(fromDate) - .setEnd(toDate) - .setValidator(CompositeDateValidator.allOf(listValidators)) - val datePicker = MaterialDatePicker.Builder.datePicker() - .setCalendarConstraints(constraintsBuilder.build()) - .setTitleText(R.string.go_to) - .setSelection(toDate) - .build() - datePicker.show(activity.supportFragmentManager, "date-picker") - datePicker.addOnPositiveButtonClickListener { time: Long -> - val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.US).withZone(ZoneOffset.UTC) - val jumpTo = formatter.format(Instant.ofEpochMilli(time)) - refresh(urlBuilder.copy(jumpTo = jumpTo)) + coroutineScope.launch { + val date = dialogState.showDatePicker() + refresh(urlBuilder.copy(jumpTo = date)) } } onClick(Icons.Default.Refresh) { diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryListFragment.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryListFragment.kt index 3b60657eb..487ab0b35 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryListFragment.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryListFragment.kt @@ -42,7 +42,6 @@ import androidx.compose.material.icons.filled.Translate import androidx.compose.material.icons.outlined.Bookmarks import androidx.compose.material3.DismissDirection import androidx.compose.material3.DismissValue -import androidx.compose.material3.DisplayMode import androidx.compose.material3.ElevatedCard import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon @@ -51,7 +50,6 @@ import androidx.compose.material3.LeadingIconTab import androidx.compose.material3.ListItem import androidx.compose.material3.MaterialTheme import androidx.compose.material3.PrimaryTabRow -import androidx.compose.material3.SelectableDates import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.pulltorefresh.rememberPullToRefreshState @@ -137,6 +135,7 @@ import com.hippo.ehviewer.ui.main.GalleryList import com.hippo.ehviewer.ui.main.ImageSearch import com.hippo.ehviewer.ui.main.NormalSearch import com.hippo.ehviewer.ui.main.SearchAdvanced +import com.hippo.ehviewer.ui.showDatePicker import com.hippo.ehviewer.ui.tools.Deferred import com.hippo.ehviewer.ui.tools.DragHandle import com.hippo.ehviewer.ui.tools.LocalDialogState @@ -158,15 +157,6 @@ import java.io.File import kotlin.math.roundToInt import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import kotlinx.datetime.Clock -import kotlinx.datetime.DateTimeUnit -import kotlinx.datetime.Instant -import kotlinx.datetime.LocalDate -import kotlinx.datetime.TimeZone -import kotlinx.datetime.atStartOfDayIn -import kotlinx.datetime.minus -import kotlinx.datetime.toLocalDateTime -import kotlinx.datetime.todayIn import moe.tarsin.coroutines.runSuspendCatching import sh.calvin.reorderable.ReorderableItem import sh.calvin.reorderable.rememberReorderableLazyColumnState @@ -836,28 +826,9 @@ fun GalleryListScreen(lub: ListUrlBuilder, navigator: DestinationsNavigator) { urlBuilder.setJumpTo(text) data.refresh() } else { - val initial = LocalDate(2007, 3, 21) - val yesterday = Clock.System.todayIn(TimeZone.UTC).minus(1, DateTimeUnit.DAY) - val initialMillis = initial.atStartOfDayIn(TimeZone.UTC).toEpochMilliseconds() - val yesterdayMillis = yesterday.atStartOfDayIn(TimeZone.UTC).toEpochMilliseconds() - val dateRange = initialMillis..yesterdayMillis coroutineScope.launch { - // TODO: Enable picker mode - // https://issuetracker.google.com/issues/306193893 - val dateMillis = dialogState.showDatePicker( - title = R.string.go_to, - yearRange = initial.year..yesterday.year, - initialDisplayMode = DisplayMode.Input, - selectableDates = object : SelectableDates { - override fun isSelectableDate(utcTimeMillis: Long): Boolean { - return utcTimeMillis in dateRange - } - }, - showModeToggle = false, - ) - urlBuilder.mJumpTo = dateMillis?.let { - Instant.fromEpochMilliseconds(it).toLocalDateTime(TimeZone.UTC).date.toString() - } + val date = dialogState.showDatePicker() + urlBuilder.mJumpTo = date data.refresh() } } diff --git a/app/src/main/kotlin/com/hippo/ehviewer/util/DateTimeUtil.kt b/app/src/main/kotlin/com/hippo/ehviewer/util/DateTimeUtil.kt new file mode 100644 index 000000000..227fcc3f5 --- /dev/null +++ b/app/src/main/kotlin/com/hippo/ehviewer/util/DateTimeUtil.kt @@ -0,0 +1,8 @@ +package com.hippo.ehviewer.util + +import kotlinx.datetime.LocalDate +import kotlinx.datetime.TimeZone +import kotlinx.datetime.atStartOfDayIn + +fun LocalDate.toEpochMillis(): Long = + atStartOfDayIn(TimeZone.UTC).toEpochMilliseconds()