diff --git a/app/src/main/java/com/hippo/ehviewer/dailycheck/DailyCheckWork.kt b/app/src/main/java/com/hippo/ehviewer/dailycheck/DailyCheckWork.kt index 08e446382..8958b0d1e 100644 --- a/app/src/main/java/com/hippo/ehviewer/dailycheck/DailyCheckWork.kt +++ b/app/src/main/java/com/hippo/ehviewer/dailycheck/DailyCheckWork.kt @@ -41,10 +41,10 @@ class DailyCheckWork(context: Context, workerParams: WorkerParameters) : } val schedHour - get() = Settings.requestNewsTimerHour.takeUnless { it == -1 } + get() = Settings.requestNewsTimerHour.takeUnless { it == -1 } ?: 0 val schedMinute - get() = Settings.requestNewsTimerMinute.takeUnless { it == -1 } + get() = Settings.requestNewsTimerMinute.takeUnless { it == -1 } ?: 0 private val whenToWork get() = LocalDateTime.now() diff --git a/app/src/main/java/com/hippo/ehviewer/ui/settings/EhScreen.kt b/app/src/main/java/com/hippo/ehviewer/ui/settings/EhScreen.kt index 396fcecc2..e73cf8a10 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/settings/EhScreen.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/settings/EhScreen.kt @@ -18,8 +18,10 @@ import androidx.compose.material3.Scaffold import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text +import androidx.compose.material3.TimePicker import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.material3.rememberTimePickerState import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -38,6 +40,9 @@ import com.hippo.ehviewer.client.EhEngine import com.hippo.ehviewer.client.EhUrl import com.hippo.ehviewer.client.EhUtils import com.hippo.ehviewer.client.parser.HomeParser +import com.hippo.ehviewer.dailycheck.schedHour +import com.hippo.ehviewer.dailycheck.schedMinute +import com.hippo.ehviewer.dailycheck.updateDailyCheckWork import com.hippo.ehviewer.ui.compose.observed import com.hippo.ehviewer.ui.compose.rememberedAccessor import com.hippo.ehviewer.ui.legacy.BaseDialogBuilder @@ -261,9 +266,26 @@ fun EhScreen() { value = reqNews.rememberedAccessor, ) AnimatedVisibility(visible = reqNews.value) { - Preference( - title = stringResource(id = R.string.settings_eh_request_news_timepicker), - ) + val pickerTitle = stringResource(id = R.string.settings_eh_request_news_timepicker) + var showPicker by rememberSaveable { mutableStateOf(false) } + val state = rememberTimePickerState(schedHour, schedMinute) + if (showPicker) { + TimePickerDialog( + title = pickerTitle, + onCancel = { showPicker = false }, + onConfirm = { + showPicker = false + Settings.requestNewsTimerHour = state.hour + Settings.requestNewsTimerMinute = state.minute + updateDailyCheckWork(context) + }, + ) { + TimePicker(state = state) + } + } + Preference(title = pickerTitle) { + showPicker = true + } } AnimatedVisibility(visible = reqNews.value) { SwitchPreference( diff --git a/app/src/main/java/com/hippo/ehviewer/ui/settings/TimePicker.kt b/app/src/main/java/com/hippo/ehviewer/ui/settings/TimePicker.kt new file mode 100644 index 000000000..221f77548 --- /dev/null +++ b/app/src/main/java/com/hippo/ehviewer/ui/settings/TimePicker.kt @@ -0,0 +1,65 @@ +package com.hippo.ehviewer.ui.settings + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.IntrinsicSize +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Dialog +import androidx.compose.ui.window.DialogProperties + +@Composable +fun TimePickerDialog( + title: String, + onCancel: () -> Unit, + onConfirm: () -> Unit, + content: @Composable () -> Unit, +) { + Dialog( + onDismissRequest = onCancel, + properties = DialogProperties(usePlatformDefaultWidth = false), + ) { + Surface( + shape = MaterialTheme.shapes.extraLarge, + tonalElevation = 6.dp, + modifier = Modifier.width(IntrinsicSize.Min).height(IntrinsicSize.Min).background( + shape = MaterialTheme.shapes.extraLarge, + color = MaterialTheme.colorScheme.surface, + ), + ) { + Column( + modifier = Modifier.padding(24.dp), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Text( + modifier = Modifier.fillMaxWidth().padding(bottom = 20.dp), + text = title, + style = MaterialTheme.typography.labelMedium, + ) + content() + Row(modifier = Modifier.height(40.dp).fillMaxWidth()) { + Spacer(modifier = Modifier.weight(1f)) + TextButton(onClick = onCancel) { + Text(stringResource(id = android.R.string.cancel)) + } + TextButton(onClick = onConfirm) { + Text(stringResource(id = android.R.string.ok)) + } + } + } + } + } +}