feat: Add request metadata action to NodeDetail (#1896)

This commit is contained in:
James Rich 2025-05-21 10:50:33 -05:00 committed by GitHub
parent 6fa329751d
commit 0057a6f2de
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 52 additions and 12 deletions

View file

@ -41,6 +41,7 @@ import com.geeksville.mesh.database.entity.MeshLog
import com.geeksville.mesh.model.map.CustomTileSource
import com.geeksville.mesh.navigation.Route
import com.geeksville.mesh.repository.datastore.RadioConfigRepository
import com.geeksville.mesh.service.ServiceAction
import com.geeksville.mesh.ui.map.MAP_STYLE_ID
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
@ -66,6 +67,7 @@ import java.util.concurrent.TimeUnit
import javax.inject.Inject
data class MetricsState(
val isLocal: Boolean = false,
val isManaged: Boolean = true,
val isFahrenheit: Boolean = false,
val displayUnits: DisplayUnits = DisplayUnits.METRIC,
@ -214,6 +216,10 @@ class MetricsViewModel @Inject constructor(
}
}
fun onServiceAction(action: ServiceAction) = viewModelScope.launch {
radioConfigRepository.onServiceAction(action)
}
private val _state = MutableStateFlow(MetricsState.Empty)
val state: StateFlow<MetricsState> = _state
@ -228,10 +234,10 @@ class MetricsViewModel @Inject constructor(
init {
destNum?.let {
radioConfigRepository.nodeDBbyNum
.mapLatest { nodes -> nodes[destNum] }
.mapLatest { nodes -> nodes[destNum] to nodes.keys.firstOrNull() }
.distinctUntilChanged()
.onEach { node ->
_state.update { state -> state.copy(node = node) }
.onEach { (node, ourNode) ->
_state.update { state -> state.copy(node = node, isLocal = destNum == ourNode) }
node?.user?.hwModel?.let { hwModel ->
val deviceHardware = getDeviceHardwareFromHardwareModel(hwModel)
deviceHardware?.let {

View file

@ -98,6 +98,7 @@ import com.geeksville.mesh.model.Node
import com.geeksville.mesh.model.UIViewModel
import com.geeksville.mesh.model.isUnmessageableRole
import com.geeksville.mesh.navigation.Route
import com.geeksville.mesh.service.ServiceAction
import com.geeksville.mesh.ui.components.PreferenceCategory
import com.geeksville.mesh.ui.preview.NodePreviewParameterProvider
import com.geeksville.mesh.ui.radioconfig.NavCard
@ -158,7 +159,12 @@ fun NodeDetailScreen(
NodeDetailList(
node = node,
metricsState = state,
onNavigate = onNavigate,
onAction = { action ->
when (action) {
is Route -> onNavigate(action)
is ServiceAction -> viewModel.onServiceAction(action)
}
},
modifier = modifier,
metricsAvailability = availabilities,
onShared = {
@ -181,7 +187,7 @@ private fun NodeDetailList(
modifier: Modifier = Modifier,
node: Node,
metricsState: MetricsState,
onNavigate: (Route) -> Unit = {},
onAction: (Any) -> Unit = {},
metricsAvailability: BooleanArray,
onShared: () -> Unit = {}
) {
@ -203,11 +209,11 @@ private fun NodeDetailList(
}
item {
NavCard(
title = stringResource(id = R.string.share_contact),
icon = Icons.Default.Share,
enabled = true,
onClick = onShared
DeviceActions(
isLocal = metricsState.isLocal,
node = node,
onShared = onShared,
onAction = onAction
)
}
@ -236,7 +242,7 @@ private fun NodeDetailList(
icon = type.icon,
enabled = metricsAvailability[type.ordinal]
) {
onNavigate(type.route)
onAction(type.route)
}
}
}
@ -249,7 +255,7 @@ private fun NodeDetailList(
icon = Icons.Default.Settings,
enabled = true
) {
onNavigate(Route.RadioConfig(node.num))
onAction(Route.RadioConfig(node.num))
}
}
}
@ -282,6 +288,31 @@ private fun NodeDetailRow(
}
}
@Composable
private fun DeviceActions(
isLocal: Boolean = false,
node: Node,
onShared: () -> Unit,
onAction: (ServiceAction) -> Unit,
) {
PreferenceCategory(text = stringResource(R.string.actions))
NavCard(
title = stringResource(id = R.string.share_contact),
icon = Icons.Default.Share,
enabled = true,
onClick = onShared
)
if (!isLocal) {
NavCard(
title = stringResource(id = R.string.request_metadata),
icon = Icons.Default.Memory,
enabled = true,
onClick = { onAction(ServiceAction.GetDeviceMetadata(node.num)) }
)
}
}
@Composable
private fun DeviceDetailsContent(
state: MetricsState,

View file

@ -626,4 +626,6 @@
<string name="import_known_shared_contact_text">Warning: This contact is known, importing will overwrite the previous contact information.</string>
<string name="public_key_changed">Public Key Changed</string>
<string name="import_label">Import</string>
<string name="request_metadata">Request Metadata</string>
<string name="actions">Actions</string>
</resources>

View file

@ -2,6 +2,7 @@
<SmellBaseline>
<ManuallySuppressedIssues>
<ID>TooManyFunctions:ContactSharing.kt$com.geeksville.mesh.ui.ContactSharing.kt</ID>
<ID>TooManyFunctions:NodeDetail.kt$com.geeksville.mesh.ui.NodeDetail.kt</ID>
</ManuallySuppressedIssues>
<CurrentIssues>
<ID>AbsentOrWrongFileLicense:LazyColumnDragAndDropDemo.kt$com.geeksville.mesh.ui.components.LazyColumnDragAndDropDemo.kt</ID>