Refactor: Use string resources for config and module titles

The titles for config and module settings are now retrieved from string resources instead of being hardcoded.
This commit adds new string resources for the titles of config and module routes, such as "User", "Channels", "Device", "MQTT", and "Serial".
It also changes `ModuleRoute` and `ConfigRoute` classes to use `stringRes` to refer to these string resources, and changes `RadioConfig` class to use `stringResource` to retrieve the title.
pull/1794/head
James Rich 2025-04-28 15:58:28 -05:00
rodzic fd709addc8
commit 9bd9108f5e
4 zmienionych plików z 54 dodań i 27 usunięć

Wyświetl plik

@ -17,6 +17,7 @@
package com.geeksville.mesh.ui.radioconfig package com.geeksville.mesh.ui.radioconfig
import androidx.annotation.StringRes
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.List import androidx.compose.material.icons.automirrored.filled.List
import androidx.compose.material.icons.filled.Bluetooth import androidx.compose.material.icons.filled.Bluetooth
@ -30,21 +31,22 @@ import androidx.compose.material.icons.filled.Security
import androidx.compose.material.icons.filled.Wifi import androidx.compose.material.icons.filled.Wifi
import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector
import com.geeksville.mesh.MeshProtos.DeviceMetadata import com.geeksville.mesh.MeshProtos.DeviceMetadata
import com.geeksville.mesh.R
import com.geeksville.mesh.navigation.Route import com.geeksville.mesh.navigation.Route
@Suppress("MagicNumber") @Suppress("MagicNumber")
// Config (type = AdminProtos.AdminMessage.ConfigType) // Config (type = AdminProtos.AdminMessage.ConfigType)
enum class ConfigRoute(val title: String, val route: Route, val icon: ImageVector?, val type: Int = 0) { enum class ConfigRoute(@StringRes val title: Int, val route: Route, val icon: ImageVector?, val type: Int = 0) {
USER("User", Route.User, Icons.Default.Person, 0), USER(R.string.user, Route.User, Icons.Default.Person, 0),
CHANNELS("Channels", Route.ChannelConfig, Icons.AutoMirrored.Default.List, 0), CHANNELS(R.string.channels, Route.ChannelConfig, Icons.AutoMirrored.Default.List, 0),
DEVICE("Device", Route.Device, Icons.Default.Router, 0), DEVICE(R.string.device, Route.Device, Icons.Default.Router, 0),
POSITION("Position", Route.Position, Icons.Default.LocationOn, 1), POSITION(R.string.position, Route.Position, Icons.Default.LocationOn, 1),
POWER("Power", Route.Power, Icons.Default.Power, 2), POWER(R.string.power, Route.Power, Icons.Default.Power, 2),
NETWORK("Network", Route.Network, Icons.Default.Wifi, 3), NETWORK(R.string.network, Route.Network, Icons.Default.Wifi, 3),
DISPLAY("Display", Route.Display, Icons.Default.DisplaySettings, 4), DISPLAY(R.string.display, Route.Display, Icons.Default.DisplaySettings, 4),
LORA("LoRa", Route.LoRa, Icons.Default.CellTower, 5), LORA(R.string.lora, Route.LoRa, Icons.Default.CellTower, 5),
BLUETOOTH("Bluetooth", Route.Bluetooth, Icons.Default.Bluetooth, 6), BLUETOOTH(R.string.bluetooth, Route.Bluetooth, Icons.Default.Bluetooth, 6),
SECURITY("Security", Route.Security, Icons.Default.Security, 7), SECURITY(R.string.security, Route.Security, Icons.Default.Security, 7),
; ;
companion object { companion object {

Wyświetl plik

@ -17,6 +17,7 @@
package com.geeksville.mesh.ui.radioconfig package com.geeksville.mesh.ui.radioconfig
import androidx.annotation.StringRes
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.Forward import androidx.compose.material.icons.automirrored.filled.Forward
import androidx.compose.material.icons.automirrored.filled.Message import androidx.compose.material.icons.automirrored.filled.Message
@ -33,24 +34,25 @@ import androidx.compose.material.icons.filled.Speed
import androidx.compose.material.icons.filled.Usb import androidx.compose.material.icons.filled.Usb
import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector
import com.geeksville.mesh.MeshProtos.DeviceMetadata import com.geeksville.mesh.MeshProtos.DeviceMetadata
import com.geeksville.mesh.R
import com.geeksville.mesh.navigation.Route import com.geeksville.mesh.navigation.Route
@Suppress("MagicNumber") @Suppress("MagicNumber")
// ModuleConfig (type = AdminProtos.AdminMessage.ModuleConfigType) // ModuleConfig (type = AdminProtos.AdminMessage.ModuleConfigType)
enum class ModuleRoute(val title: String, val route: Route, val icon: ImageVector?, val type: Int = 0) { enum class ModuleRoute(@StringRes val title: Int, val route: Route, val icon: ImageVector?, val type: Int = 0) {
MQTT("MQTT", Route.MQTT, Icons.Default.Cloud, 0), MQTT(R.string.mqtt, Route.MQTT, Icons.Default.Cloud, 0),
SERIAL("Serial", Route.Serial, Icons.Default.Usb, 1), SERIAL(R.string.serial, Route.Serial, Icons.Default.Usb, 1),
EXT_NOTIFICATION("External Notification", Route.ExtNotification, Icons.Default.Notifications, 2), EXT_NOTIFICATION(R.string.external_notification, Route.ExtNotification, Icons.Default.Notifications, 2),
STORE_FORWARD("Store & Forward", Route.StoreForward, Icons.AutoMirrored.Default.Forward, 3), STORE_FORWARD(R.string.store_forward, Route.StoreForward, Icons.AutoMirrored.Default.Forward, 3),
RANGE_TEST("Range Test", Route.RangeTest, Icons.Default.Speed, 4), RANGE_TEST(R.string.range_test, Route.RangeTest, Icons.Default.Speed, 4),
TELEMETRY("Telemetry", Route.Telemetry, Icons.Default.DataUsage, 5), TELEMETRY(R.string.telemetry, Route.Telemetry, Icons.Default.DataUsage, 5),
CANNED_MESSAGE("Canned Message", Route.CannedMessage, Icons.AutoMirrored.Default.Message, 6), CANNED_MESSAGE(R.string.canned_message, Route.CannedMessage, Icons.AutoMirrored.Default.Message, 6),
AUDIO("Audio", Route.Audio, Icons.AutoMirrored.Default.VolumeUp, 7), AUDIO(R.string.audio, Route.Audio, Icons.AutoMirrored.Default.VolumeUp, 7),
REMOTE_HARDWARE("Remote Hardware", Route.RemoteHardware, Icons.Default.SettingsRemote, 8), REMOTE_HARDWARE(R.string.remote_hardware, Route.RemoteHardware, Icons.Default.SettingsRemote, 8),
NEIGHBOR_INFO("Neighbor Info", Route.NeighborInfo, Icons.Default.People, 9), NEIGHBOR_INFO(R.string.neighbor_info, Route.NeighborInfo, Icons.Default.People, 9),
AMBIENT_LIGHTING("Ambient Lighting", Route.AmbientLighting, Icons.Default.LightMode, 10), AMBIENT_LIGHTING(R.string.ambient_lighting, Route.AmbientLighting, Icons.Default.LightMode, 10),
DETECTION_SENSOR("Detection Sensor", Route.DetectionSensor, Icons.Default.Sensors, 11), DETECTION_SENSOR(R.string.detection_sensor, Route.DetectionSensor, Icons.Default.Sensors, 11),
PAXCOUNTER("Paxcounter", Route.Paxcounter, Icons.Default.PermScanWifi, 12), PAXCOUNTER(R.string.paxcounter, Route.Paxcounter, Icons.Default.PermScanWifi, 12),
; ;
val bitfield: Int get() = 1 shl ordinal val bitfield: Int get() = 1 shl ordinal

Wyświetl plik

@ -301,12 +301,12 @@ private fun RadioConfigItemList(
) { ) {
item { PreferenceCategory(stringResource(R.string.device_settings)) } item { PreferenceCategory(stringResource(R.string.device_settings)) }
items(ConfigRoute.filterExcludedFrom(state.metadata)) { items(ConfigRoute.filterExcludedFrom(state.metadata)) {
NavCard(title = it.title, icon = it.icon, enabled = enabled) { onRouteClick(it) } NavCard(title = stringResource(it.title), icon = it.icon, enabled = enabled) { onRouteClick(it) }
} }
item { PreferenceCategory(stringResource(R.string.module_settings)) } item { PreferenceCategory(stringResource(R.string.module_settings)) }
items(ModuleRoute.filterExcludedFrom(state.metadata)) { items(ModuleRoute.filterExcludedFrom(state.metadata)) {
NavCard(title = it.title, icon = it.icon, enabled = enabled) { onRouteClick(it) } NavCard(title = stringResource(it.title), icon = it.icon, enabled = enabled) { onRouteClick(it) }
} }
if (state.isLocal) { if (state.isLocal) {

Wyświetl plik

@ -348,4 +348,27 @@
<string name="udp_config">UDP Config</string> <string name="udp_config">UDP Config</string>
<string name="map_node_popup_details"><![CDATA[%s<br>Last heard: %s<br>Last position: %s<br>Battery: %s]]></string> <string name="map_node_popup_details"><![CDATA[%s<br>Last heard: %s<br>Last position: %s<br>Battery: %s]]></string>
<string name="toggle_my_position">Toggle my position</string> <string name="toggle_my_position">Toggle my position</string>
<string name="user">User</string>
<string name="channels">Channels</string>
<string name="device">Device</string>
<string name="position">Position</string>
<string name="power">Power</string>
<string name="network">Network</string>
<string name="display">Display</string>
<string name="lora">LoRa</string>
<string name="bluetooth">Bluetooth</string>
<string name="security">Security</string>
<string name="mqtt">MQTT</string>
<string name="serial">Serial</string>
<string name="external_notification">External Notification</string>
<string name="store_forward"><![CDATA[Store & Forward]]></string>
<string name="range_test">Range Test</string>
<string name="telemetry">Telemetry</string>
<string name="canned_message">Canned Message</string>
<string name="audio">Audio</string>
<string name="remote_hardware">Remote Hardware</string>
<string name="neighbor_info">Neighbor Info</string>
<string name="ambient_lighting">Ambient Lighting</string>
<string name="detection_sensor">Detection Sensor</string>
<string name="paxcounter">Paxcounter</string>
</resources> </resources>