From 1d8ae61ac22683dd4db99cad5c76a8fc27d3bbad Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Tue, 9 Dec 2025 15:07:07 -0600 Subject: [PATCH] refactor(settings): Use string resources for update intervals (#3937) Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com> --- .../composeResources/values/strings.xml | 15 ++++ .../settings/util/FixedUpdateIntervals.kt | 84 +++++++++++-------- .../feature/settings/util/Formatting.kt | 11 +-- 3 files changed, 70 insertions(+), 40 deletions(-) diff --git a/core/strings/src/commonMain/composeResources/values/strings.xml b/core/strings/src/commonMain/composeResources/values/strings.xml index a79af3186..2b810b1bb 100644 --- a/core/strings/src/commonMain/composeResources/values/strings.xml +++ b/core/strings/src/commonMain/composeResources/values/strings.xml @@ -1016,4 +1016,19 @@ Update via %1$s Select DFU USB Drive Your device has rebooted into DFU mode and should appear as a USB drive (e.g., RAK4631).\n\nWhen the file picker opens, please select the root of that drive to save the firmware file. + + Unset + Always On + + 1 second + %d seconds + + + 1 minute + %d minutes + + + 1 hour + %d hours + \ No newline at end of file diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/util/FixedUpdateIntervals.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/util/FixedUpdateIntervals.kt index 321a18799..314ccc9d5 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/util/FixedUpdateIntervals.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/util/FixedUpdateIntervals.kt @@ -19,48 +19,62 @@ package org.meshtastic.feature.settings.util +import org.jetbrains.compose.resources.PluralStringResource +import org.jetbrains.compose.resources.StringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.interval_always_on +import org.meshtastic.core.strings.interval_unset +import org.meshtastic.core.strings.plurals_hours +import org.meshtastic.core.strings.plurals_minutes +import org.meshtastic.core.strings.plurals_seconds import java.util.concurrent.TimeUnit /** * Defines a set of fixed time intervals in seconds, commonly used for configuration settings. * * @param value The interval duration in seconds. + * @param textRes The string resource for the display name of the interval. */ -enum class FixedUpdateIntervals(val value: Long) { - UNSET(0L), - ONE_SECOND(1L), - TWO_SECONDS(2L), - THREE_SECONDS(3L), - FOUR_SECONDS(4L), - FIVE_SECONDS(5L), - TEN_SECONDS(10L), - FIFTEEN_SECONDS(15L), - TWENTY_SECONDS(20L), - THIRTY_SECONDS(30L), - FORTY_FIVE_SECONDS(45L), - ONE_MINUTE(TimeUnit.MINUTES.toSeconds(1)), - TWO_MINUTES(TimeUnit.MINUTES.toSeconds(2)), - FIVE_MINUTES(TimeUnit.MINUTES.toSeconds(5)), - TEN_MINUTES(TimeUnit.MINUTES.toSeconds(10)), - FIFTEEN_MINUTES(TimeUnit.MINUTES.toSeconds(15)), - THIRTY_MINUTES(TimeUnit.MINUTES.toSeconds(30)), - ONE_HOUR(TimeUnit.HOURS.toSeconds(1)), - TWO_HOURS(TimeUnit.HOURS.toSeconds(2)), - THREE_HOURS(TimeUnit.HOURS.toSeconds(3)), - FOUR_HOURS(TimeUnit.HOURS.toSeconds(4)), - FIVE_HOURS(TimeUnit.HOURS.toSeconds(5)), - SIX_HOURS(TimeUnit.HOURS.toSeconds(6)), - TWELVE_HOURS(TimeUnit.HOURS.toSeconds(12)), - EIGHTEEN_HOURS(TimeUnit.HOURS.toSeconds(18)), - TWENTY_FOUR_HOURS(TimeUnit.HOURS.toSeconds(24)), - THIRTY_SIX_HOURS(TimeUnit.HOURS.toSeconds(36)), - FORTY_EIGHT_HOURS(TimeUnit.HOURS.toSeconds(48)), - SEVENTY_TWO_HOURS(TimeUnit.HOURS.toSeconds(72)), - ALWAYS_ON(Int.MAX_VALUE.toLong()), - EIGHTY_SECONDS(TimeUnit.SECONDS.toSeconds(80)), - NINETY_SECONDS(TimeUnit.SECONDS.toSeconds(90)), - EIGHT_SECONDS(TimeUnit.SECONDS.toSeconds(8)), - FORTY_SECONDS(TimeUnit.SECONDS.toSeconds(40)), +enum class FixedUpdateIntervals( + val value: Long, + val textRes: StringResource? = null, + val pluralRes: PluralStringResource? = null, + val quantity: Int? = null, +) { + UNSET(0L, textRes = Res.string.interval_unset), + ONE_SECOND(1L, pluralRes = Res.plurals.plurals_seconds, quantity = 1), + TWO_SECONDS(2L, pluralRes = Res.plurals.plurals_seconds, quantity = 2), + THREE_SECONDS(3L, pluralRes = Res.plurals.plurals_seconds, quantity = 3), + FOUR_SECONDS(4L, pluralRes = Res.plurals.plurals_seconds, quantity = 4), + FIVE_SECONDS(5L, pluralRes = Res.plurals.plurals_seconds, quantity = 5), + TEN_SECONDS(10L, pluralRes = Res.plurals.plurals_seconds, quantity = 10), + FIFTEEN_SECONDS(15L, pluralRes = Res.plurals.plurals_seconds, quantity = 15), + TWENTY_SECONDS(20L, pluralRes = Res.plurals.plurals_seconds, quantity = 20), + THIRTY_SECONDS(30L, pluralRes = Res.plurals.plurals_seconds, quantity = 30), + FORTY_FIVE_SECONDS(45L, pluralRes = Res.plurals.plurals_seconds, quantity = 45), + ONE_MINUTE(TimeUnit.MINUTES.toSeconds(1), pluralRes = Res.plurals.plurals_minutes, quantity = 1), + TWO_MINUTES(TimeUnit.MINUTES.toSeconds(2), pluralRes = Res.plurals.plurals_minutes, quantity = 2), + FIVE_MINUTES(TimeUnit.MINUTES.toSeconds(5), pluralRes = Res.plurals.plurals_minutes, quantity = 5), + TEN_MINUTES(TimeUnit.MINUTES.toSeconds(10), pluralRes = Res.plurals.plurals_minutes, quantity = 10), + FIFTEEN_MINUTES(TimeUnit.MINUTES.toSeconds(15), pluralRes = Res.plurals.plurals_minutes, quantity = 15), + THIRTY_MINUTES(TimeUnit.MINUTES.toSeconds(30), pluralRes = Res.plurals.plurals_minutes, quantity = 30), + ONE_HOUR(TimeUnit.HOURS.toSeconds(1), pluralRes = Res.plurals.plurals_hours, quantity = 1), + TWO_HOURS(TimeUnit.HOURS.toSeconds(2), pluralRes = Res.plurals.plurals_hours, quantity = 2), + THREE_HOURS(TimeUnit.HOURS.toSeconds(3), pluralRes = Res.plurals.plurals_hours, quantity = 3), + FOUR_HOURS(TimeUnit.HOURS.toSeconds(4), pluralRes = Res.plurals.plurals_hours, quantity = 4), + FIVE_HOURS(TimeUnit.HOURS.toSeconds(5), pluralRes = Res.plurals.plurals_hours, quantity = 5), + SIX_HOURS(TimeUnit.HOURS.toSeconds(6), pluralRes = Res.plurals.plurals_hours, quantity = 6), + TWELVE_HOURS(TimeUnit.HOURS.toSeconds(12), pluralRes = Res.plurals.plurals_hours, quantity = 12), + EIGHTEEN_HOURS(TimeUnit.HOURS.toSeconds(18), pluralRes = Res.plurals.plurals_hours, quantity = 18), + TWENTY_FOUR_HOURS(TimeUnit.HOURS.toSeconds(24), pluralRes = Res.plurals.plurals_hours, quantity = 24), + THIRTY_SIX_HOURS(TimeUnit.HOURS.toSeconds(36), pluralRes = Res.plurals.plurals_hours, quantity = 36), + FORTY_EIGHT_HOURS(TimeUnit.HOURS.toSeconds(48), pluralRes = Res.plurals.plurals_hours, quantity = 48), + SEVENTY_TWO_HOURS(TimeUnit.HOURS.toSeconds(72), pluralRes = Res.plurals.plurals_hours, quantity = 72), + ALWAYS_ON(Int.MAX_VALUE.toLong(), textRes = Res.string.interval_always_on), + EIGHTY_SECONDS(TimeUnit.SECONDS.toSeconds(80), pluralRes = Res.plurals.plurals_seconds, quantity = 80), + NINETY_SECONDS(TimeUnit.SECONDS.toSeconds(90), pluralRes = Res.plurals.plurals_seconds, quantity = 90), + EIGHT_SECONDS(TimeUnit.SECONDS.toSeconds(8), pluralRes = Res.plurals.plurals_seconds, quantity = 8), + FORTY_SECONDS(TimeUnit.SECONDS.toSeconds(40), pluralRes = Res.plurals.plurals_seconds, quantity = 40), ; companion object { diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/util/Formatting.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/util/Formatting.kt index edd6e15cd..c56946c1d 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/util/Formatting.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/util/Formatting.kt @@ -18,13 +18,14 @@ package org.meshtastic.feature.settings.util import androidx.compose.runtime.Composable +import org.jetbrains.compose.resources.pluralStringResource import org.jetbrains.compose.resources.stringResource -import org.meshtastic.core.strings.Res -import org.meshtastic.core.strings.unset @Composable -fun FixedUpdateIntervals.toDisplayString(): String = if (this == FixedUpdateIntervals.UNSET) { - stringResource(Res.string.unset) +fun FixedUpdateIntervals.toDisplayString(): String = if (pluralRes != null && quantity != null) { + pluralStringResource(pluralRes, quantity, quantity) +} else if (textRes != null) { + stringResource(textRes) } else { - name.split('_').joinToString(" ") { word -> word.lowercase().replaceFirstChar { it.uppercase() } } + "" }