Move showDatePicker to CommonOperations.kt

This commit is contained in:
FooIbar committed 2023-11-28 01:36:55 +08:00
1 parent e465356df8
commit 30d6c11220
4 files changed
+50 -63

No files matched your search

@@ -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<DownloadInfo>
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
}
@@ -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<CalendarConstraints.DateValidator>()
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) {
@@ -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()
}
}
@@ -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()