From 175e1d7df976983d48318a73c9bbe8e8cdfdd255 Mon Sep 17 00:00:00 2001 From: GG Bond Date: Mon, 27 Nov 2023 22:46:37 +0800 Subject: [PATCH] Convert TimePicker to use a dialogState --- .../hippo/ehviewer/ui/settings/EhScreen.kt | 26 ++------ .../com/hippo/ehviewer/ui/tools/Dialog.kt | 49 ++++++++++++++ .../com/hippo/ehviewer/ui/tools/TimePicker.kt | 65 ------------------- 3 files changed, 55 insertions(+), 85 deletions(-) delete mode 100644 app/src/main/kotlin/com/hippo/ehviewer/ui/tools/TimePicker.kt diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/EhScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/EhScreen.kt index 9851ce18c..cdbcdd96d 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/EhScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/EhScreen.kt @@ -15,10 +15,8 @@ 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 @@ -50,7 +48,6 @@ import com.hippo.ehviewer.ui.destinations.SignInScreenDestination import com.hippo.ehviewer.ui.destinations.UConfigScreenDestination import com.hippo.ehviewer.ui.legacy.BaseDialogBuilder import com.hippo.ehviewer.ui.tools.LocalDialogState -import com.hippo.ehviewer.ui.tools.TimePickerDialog import com.hippo.ehviewer.ui.tools.observed import com.hippo.ehviewer.ui.tools.rememberedAccessor import com.hippo.ehviewer.util.copyTextToClipboard @@ -325,24 +322,13 @@ fun EhScreen(navigator: DestinationsNavigator) { ) AnimatedVisibility(visible = reqNews.value) { 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 + coroutineScope.launch { + val (hour, minute) = dialogState.showTimePicker(pickerTitle, schedHour, schedMinute) + Settings.requestNewsTimerHour = hour + Settings.requestNewsTimerMinute = minute + updateDailyCheckWork(context) + } } } AnimatedVisibility(visible = reqNews.value) { diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/Dialog.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/Dialog.kt index df066ac23..80dae133e 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/Dialog.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/Dialog.kt @@ -1,14 +1,18 @@ package com.hippo.ehviewer.ui.tools import androidx.annotation.StringRes +import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.defaultMinSize 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.foundation.lazy.LazyColumn @@ -41,7 +45,9 @@ import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.material3.TextField import androidx.compose.material3.TextFieldDefaults +import androidx.compose.material3.TimePicker import androidx.compose.material3.rememberDatePickerState +import androidx.compose.material3.rememberTimePickerState import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.compositionLocalOf @@ -60,6 +66,7 @@ import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import com.jamal.composeprefs3.ui.ifNotNullThen import com.jamal.composeprefs3.ui.ifTrueThen @@ -344,6 +351,48 @@ class DialogState { } } + suspend fun showTimePicker( + title: String, + initialHour: Int, + initialMinute: Int, + ) = dialog { cont -> + val state = rememberTimePickerState(initialHour, initialMinute) + Dialog( + onDismissRequest = { cont.cancel() }, + 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, + ) + TimePicker(state = state) + Row(modifier = Modifier.height(40.dp).fillMaxWidth()) { + Spacer(modifier = Modifier.weight(1f)) + TextButton(onClick = { cont.cancel() }) { + Text(stringResource(id = android.R.string.cancel)) + } + TextButton(onClick = { cont.resume(state.hour to state.minute) }) { + Text(stringResource(id = android.R.string.ok)) + } + } + } + } + } + } + suspend fun showSingleChoice( items: Array, selected: Int, diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/TimePicker.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/TimePicker.kt deleted file mode 100644 index fbd637261..000000000 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/TimePicker.kt +++ /dev/null @@ -1,65 +0,0 @@ -package com.hippo.ehviewer.ui.tools - -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)) - } - } - } - } - } -}