mirror of
https://github.com/meshtastic/Meshtastic-Android.git
synced 2026-04-20 22:23:37 +00:00
feat(config): implement excluded modules validation (#1460)
* feat(config): implement excluded modules validation * feat: hide excluded configs from metadata * refactor: save local metadata from WantConfig * refactor: delete metadata from deleted nodes * fix: always request metadata for admin routes * feat: show node firmware when metadata is available * refactor: rename filter function * feat: add `ServiceAction` request metadata
This commit is contained in:
parent
bdefbc3ce2
commit
60e7e18116
28 changed files with 1164 additions and 358 deletions
|
|
@ -36,12 +36,12 @@ import androidx.compose.ui.Modifier
|
|||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.unit.dp
|
||||
import com.geeksville.mesh.R
|
||||
import com.geeksville.mesh.database.entity.NodeEntity
|
||||
import com.geeksville.mesh.model.Node
|
||||
|
||||
@Suppress("LongMethod")
|
||||
@Composable
|
||||
fun NodeMenu(
|
||||
node: NodeEntity,
|
||||
node: Node,
|
||||
showFullMenu: Boolean = false,
|
||||
onDismissRequest: () -> Unit,
|
||||
expanded: Boolean = false,
|
||||
|
|
@ -150,11 +150,11 @@ fun NodeMenu(
|
|||
}
|
||||
|
||||
sealed class NodeMenuAction {
|
||||
data class Remove(val node: NodeEntity) : NodeMenuAction()
|
||||
data class Ignore(val node: NodeEntity) : NodeMenuAction()
|
||||
data class DirectMessage(val node: NodeEntity) : NodeMenuAction()
|
||||
data class RequestUserInfo(val node: NodeEntity) : NodeMenuAction()
|
||||
data class RequestPosition(val node: NodeEntity) : NodeMenuAction()
|
||||
data class TraceRoute(val node: NodeEntity) : NodeMenuAction()
|
||||
data class MoreDetails(val node: NodeEntity) : NodeMenuAction()
|
||||
data class Remove(val node: Node) : NodeMenuAction()
|
||||
data class Ignore(val node: Node) : NodeMenuAction()
|
||||
data class DirectMessage(val node: Node) : NodeMenuAction()
|
||||
data class RequestUserInfo(val node: Node) : NodeMenuAction()
|
||||
data class RequestPosition(val node: Node) : NodeMenuAction()
|
||||
data class TraceRoute(val node: Node) : NodeMenuAction()
|
||||
data class MoreDetails(val node: Node) : NodeMenuAction()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,8 +26,8 @@ import androidx.compose.ui.tooling.preview.Preview
|
|||
import androidx.compose.ui.tooling.preview.PreviewLightDark
|
||||
import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||
import com.geeksville.mesh.R
|
||||
import com.geeksville.mesh.database.entity.NodeEntity
|
||||
import com.geeksville.mesh.ui.preview.NodeEntityPreviewParameterProvider
|
||||
import com.geeksville.mesh.model.Node
|
||||
import com.geeksville.mesh.ui.preview.NodePreviewParameterProvider
|
||||
import com.geeksville.mesh.ui.theme.AppTheme
|
||||
|
||||
const val MAX_VALID_SNR = 100F
|
||||
|
|
@ -36,7 +36,7 @@ const val MAX_VALID_RSSI = 0
|
|||
@Composable
|
||||
fun SignalInfo(
|
||||
modifier: Modifier = Modifier,
|
||||
node: NodeEntity,
|
||||
node: Node,
|
||||
isThisNode: Boolean
|
||||
) {
|
||||
val text = if (isThisNode) {
|
||||
|
|
@ -81,7 +81,7 @@ fun SignalInfo(
|
|||
fun SignalInfoSimplePreview() {
|
||||
AppTheme {
|
||||
SignalInfo(
|
||||
node = NodeEntity(
|
||||
node = Node(
|
||||
num = 1,
|
||||
lastHeard = 0,
|
||||
channel = 0,
|
||||
|
|
@ -97,8 +97,8 @@ fun SignalInfoSimplePreview() {
|
|||
@PreviewLightDark
|
||||
@Composable
|
||||
fun SignalInfoPreview(
|
||||
@PreviewParameter(NodeEntityPreviewParameterProvider::class)
|
||||
node: NodeEntity
|
||||
@PreviewParameter(NodePreviewParameterProvider::class)
|
||||
node: Node
|
||||
) {
|
||||
AppTheme {
|
||||
SignalInfo(
|
||||
|
|
@ -111,8 +111,8 @@ fun SignalInfoPreview(
|
|||
@Composable
|
||||
@PreviewLightDark
|
||||
fun SignalInfoSelfPreview(
|
||||
@PreviewParameter(NodeEntityPreviewParameterProvider::class)
|
||||
node: NodeEntity
|
||||
@PreviewParameter(NodePreviewParameterProvider::class)
|
||||
node: Node
|
||||
) {
|
||||
AppTheme {
|
||||
SignalInfo(
|
||||
|
|
|
|||
|
|
@ -81,6 +81,8 @@ fun NetworkConfigScreen(
|
|||
}
|
||||
|
||||
NetworkConfigItemList(
|
||||
hasWifi = state.metadata?.hasWifi ?: true,
|
||||
hasEthernet = state.metadata?.hasEthernet ?: true,
|
||||
networkConfig = state.radioConfig.network,
|
||||
enabled = state.connected,
|
||||
onSaveClicked = { networkInput ->
|
||||
|
|
@ -94,8 +96,11 @@ private fun extractWifiCredentials(qrCode: String) = Regex("""WIFI:S:(.*?);.*?P:
|
|||
.find(qrCode)?.destructured
|
||||
?.let { (ssid, password) -> ssid to password } ?: (null to null)
|
||||
|
||||
@Suppress("LongMethod", "CyclomaticComplexMethod")
|
||||
@Composable
|
||||
fun NetworkConfigItemList(
|
||||
hasWifi: Boolean,
|
||||
hasEthernet: Boolean,
|
||||
networkConfig: NetworkConfig,
|
||||
enabled: Boolean,
|
||||
onSaveClicked: (NetworkConfig) -> Unit,
|
||||
|
|
@ -137,16 +142,16 @@ fun NetworkConfigItemList(
|
|||
item {
|
||||
SwitchPreference(title = "WiFi enabled",
|
||||
checked = networkInput.wifiEnabled,
|
||||
enabled = enabled,
|
||||
enabled = enabled && hasWifi,
|
||||
onCheckedChange = { networkInput = networkInput.copy { wifiEnabled = it } })
|
||||
Divider()
|
||||
}
|
||||
item { Divider() }
|
||||
|
||||
item {
|
||||
EditTextPreference(title = "SSID",
|
||||
value = networkInput.wifiSsid,
|
||||
maxSize = 32, // wifi_ssid max_size:33
|
||||
enabled = enabled,
|
||||
enabled = enabled && hasWifi,
|
||||
isError = false,
|
||||
keyboardOptions = KeyboardOptions.Default.copy(
|
||||
keyboardType = KeyboardType.Text, imeAction = ImeAction.Done
|
||||
|
|
@ -161,7 +166,7 @@ fun NetworkConfigItemList(
|
|||
EditPasswordPreference(title = "PSK",
|
||||
value = networkInput.wifiPsk,
|
||||
maxSize = 64, // wifi_psk max_size:65
|
||||
enabled = enabled,
|
||||
enabled = enabled && hasWifi,
|
||||
keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }),
|
||||
onValueChanged = { networkInput = networkInput.copy { wifiPsk = it } })
|
||||
}
|
||||
|
|
@ -173,12 +178,20 @@ fun NetworkConfigItemList(
|
|||
.fillMaxWidth()
|
||||
.padding(vertical = 8.dp)
|
||||
.height(48.dp),
|
||||
enabled = enabled,
|
||||
enabled = enabled && hasWifi,
|
||||
) {
|
||||
Text(text = stringResource(R.string.wifi_qr_code_scan))
|
||||
}
|
||||
}
|
||||
|
||||
item {
|
||||
SwitchPreference(title = "Ethernet enabled",
|
||||
checked = networkInput.ethEnabled,
|
||||
enabled = enabled && hasEthernet,
|
||||
onCheckedChange = { networkInput = networkInput.copy { ethEnabled = it } })
|
||||
Divider()
|
||||
}
|
||||
|
||||
item {
|
||||
EditTextPreference(title = "NTP server",
|
||||
value = networkInput.ntpServer,
|
||||
|
|
@ -209,14 +222,6 @@ fun NetworkConfigItemList(
|
|||
})
|
||||
}
|
||||
|
||||
item {
|
||||
SwitchPreference(title = "Ethernet enabled",
|
||||
checked = networkInput.ethEnabled,
|
||||
enabled = enabled,
|
||||
onCheckedChange = { networkInput = networkInput.copy { ethEnabled = it } })
|
||||
}
|
||||
item { Divider() }
|
||||
|
||||
item {
|
||||
DropDownPreference(title = "IPv4 mode",
|
||||
enabled = enabled,
|
||||
|
|
@ -225,8 +230,8 @@ fun NetworkConfigItemList(
|
|||
.map { it to it.name },
|
||||
selectedItem = networkInput.addressMode,
|
||||
onItemSelected = { networkInput = networkInput.copy { addressMode = it } })
|
||||
Divider()
|
||||
}
|
||||
item { Divider() }
|
||||
|
||||
item {
|
||||
EditIPv4Preference(title = "IP",
|
||||
|
|
@ -292,6 +297,8 @@ fun NetworkConfigItemList(
|
|||
@Composable
|
||||
private fun NetworkConfigPreview() {
|
||||
NetworkConfigItemList(
|
||||
hasWifi = true,
|
||||
hasEthernet = true,
|
||||
networkConfig = NetworkConfig.getDefaultInstance(),
|
||||
enabled = true,
|
||||
onSaveClicked = { },
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue