feat(map): Site Planner coverage integration — import + estimate (#6136)

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
James Rich
2026-07-07 18:24:14 -05:00
committed by GitHub
parent e12c4a579d
commit 17501048b4
18 changed files with 1267 additions and 10 deletions

View File

@@ -38,12 +38,16 @@ import androidx.compose.ui.unit.dp
import org.jetbrains.compose.resources.stringResource
import org.meshtastic.core.model.Node
import org.meshtastic.core.model.util.toDistanceString
import org.meshtastic.core.navigation.MapRoute
import org.meshtastic.core.resources.Res
import org.meshtastic.core.resources.open_compass
import org.meshtastic.core.resources.site_planner_estimate
import org.meshtastic.core.ui.icon.CellTower
import org.meshtastic.core.ui.icon.Compass
import org.meshtastic.core.ui.icon.Distance
import org.meshtastic.core.ui.icon.MeshtasticIcons
import org.meshtastic.core.ui.util.LocalInlineMapProvider
import org.meshtastic.core.ui.util.LocalSitePlannerAvailable
import org.meshtastic.feature.node.model.NodeDetailAction
import org.meshtastic.proto.Config
@@ -79,6 +83,24 @@ internal fun PositionInlineContent(
overflow = TextOverflow.Ellipsis,
)
}
// Estimate RF coverage for this node in the Site Planner (Google flavor, position-gated).
if (LocalSitePlannerAvailable.current && node.validPosition != null) {
Spacer(Modifier.height(8.dp))
FilledTonalButton(
onClick = { onAction(NodeDetailAction.Navigate(MapRoute.Map(sitePlannerNodeNum = node.num))) },
modifier = Modifier.fillMaxWidth(),
shape = MaterialTheme.shapes.large,
) {
Icon(MeshtasticIcons.CellTower, null, Modifier.size(18.dp))
Spacer(Modifier.width(6.dp))
Text(
text = stringResource(Res.string.site_planner_estimate),
style = MaterialTheme.typography.labelLarge,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
)
}
}
}
@Composable