Просмотр исходного кода

fix: 护眼定时的时段点不开

ThemeConfigRouteScreen 收到 OpenTimePicker 后只有一条注释,没有任何时间
选择器实现,点击「开始/结束时间」看起来毫无反应。

改为与本页其它 dialog/sheet 一致的 state 通道:RequestTimePicker 写入
activeDialog,由 ThemeConfigScreen 渲染 M3 TimePicker(24 小时制,包在
AppAlertDialog 里以兼容 Miuix 引擎),确定时发 SetTime + DismissDialog。
随之删除已无消费方的 OpenTimePicker effect。
5151561 3 месяцев назад
Родитель
Сommit
629af1dd02

+ 4 - 4
app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfigContract.kt

@@ -26,6 +26,10 @@ sealed interface ThemeConfigSheet {
 
 sealed interface ThemeConfigDialog {
     data object ResetDefaults : ThemeConfigDialog
+    data class TimePicker(
+        val field: ThemeTimeField,
+        val currentValue: String,
+    ) : ThemeConfigDialog
 }
 
 enum class ThemeTimeField {
@@ -88,9 +92,5 @@ sealed interface ThemeConfigEffect {
     data object OpenFontFolder : ThemeConfigEffect
     data class OpenNavigationIcon(val destination: String) : ThemeConfigEffect
     data class OpenBackgroundImage(val dark: Boolean) : ThemeConfigEffect
-    data class OpenTimePicker(
-        val field: ThemeTimeField,
-        val currentValue: String,
-    ) : ThemeConfigEffect
     data class ShowToast(val stringRes: Int) : ThemeConfigEffect
 }

+ 0 - 3
app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfigRouteScreen.kt

@@ -89,9 +89,6 @@ fun ThemeConfigRouteScreen(
                     backgroundImageLauncher.launch("image/*")
                 }
                 is ThemeConfigEffect.ShowToast -> context.toastOnUi(effect.stringRes)
-                is ThemeConfigEffect.OpenTimePicker -> {
-                    // Time picker intent handled by ThemeConfigScreen internally
-                }
             }
         }
     }

+ 54 - 0
app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfigScreen.kt

@@ -40,8 +40,10 @@ import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
 import androidx.compose.material3.Icon
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.Text
+import androidx.compose.material3.TimePicker
 import androidx.compose.material3.ToggleButton
 import androidx.compose.material3.ToggleButtonDefaults
+import androidx.compose.material3.rememberTimePickerState
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.remember
@@ -840,6 +842,24 @@ fun ThemeConfigScreen(
         onDismiss = { onIntent(ThemeConfigIntent.DismissDialog) },
     )
 
+    val timePickerDialog = state.activeDialog as? ThemeConfigDialog.TimePicker
+    if (timePickerDialog != null) {
+        TimePickerDialog(
+            title = stringResource(
+                when (timePickerDialog.field) {
+                    ThemeTimeField.EyeProtectionStart -> R.string.eye_protection_start_time
+                    ThemeTimeField.EyeProtectionEnd -> R.string.eye_protection_end_time
+                }
+            ),
+            currentValue = timePickerDialog.currentValue,
+            onDismissRequest = { onIntent(ThemeConfigIntent.DismissDialog) },
+            onConfirm = { value ->
+                onIntent(ThemeConfigIntent.SetTime(timePickerDialog.field, value))
+                onIntent(ThemeConfigIntent.DismissDialog)
+            },
+        )
+    }
+
 
     BackgroundImageManageSheet(
         isDarkTheme = (state.activeSheet as? ThemeConfigSheet.Background)?.dark,
@@ -928,6 +948,40 @@ fun ThemeConfigScreen(
 
 }
 
+@OptIn(ExperimentalMaterial3Api::class)
+@Composable
+private fun TimePickerDialog(
+    title: String,
+    currentValue: String,
+    onDismissRequest: () -> Unit,
+    onConfirm: (String) -> Unit,
+) {
+    val timePickerState = rememberTimePickerState(
+        initialHour = currentValue.substringBefore(':').toIntOrNull()?.coerceIn(0, 23) ?: 0,
+        initialMinute = currentValue.substringAfter(':', "").toIntOrNull()?.coerceIn(0, 59) ?: 0,
+        is24Hour = true,
+    )
+    AppAlertDialog(
+        show = true,
+        onDismissRequest = onDismissRequest,
+        title = title,
+        content = {
+            Box(
+                modifier = Modifier.fillMaxWidth(),
+                contentAlignment = Alignment.Center
+            ) {
+                TimePicker(state = timePickerState)
+            }
+        },
+        confirmText = stringResource(R.string.ok),
+        onConfirm = {
+            onConfirm("%02d:%02d".format(timePickerState.hour, timePickerState.minute))
+        },
+        dismissText = stringResource(R.string.cancel),
+        onDismiss = onDismissRequest,
+    )
+}
+
 @Composable
 private fun BaseCardBorderColorSettingItem(
     title: String,

+ 8 - 3
app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfigViewModel.kt

@@ -154,9 +154,14 @@ class ThemeConfigViewModel(
                 readSettingsGateway.update { it.copy(fontFolder = intent.path) }
             }
             ThemeConfigIntent.RequestFontFolder -> _effects.tryEmit(ThemeConfigEffect.OpenFontFolder)
-            is ThemeConfigIntent.RequestTimePicker -> _effects.tryEmit(
-                ThemeConfigEffect.OpenTimePicker(intent.field, intent.currentValue)
-            )
+            is ThemeConfigIntent.RequestTimePicker -> _uiState.update {
+                it.copy(
+                    activeDialog = ThemeConfigDialog.TimePicker(
+                        field = intent.field,
+                        currentValue = intent.currentValue,
+                    )
+                )
+            }
             is ThemeConfigIntent.SetTime -> setTime(intent.field, intent.value)
             ThemeConfigIntent.DismissRefactorTip -> updateTheme {
                 it.copy(showRefactorTip = false)