Decouple MapView from UiViewModel (#3213)

This commit is contained in:
Phil Oliver
2025-09-26 16:34:36 -04:00
committed by GitHub
parent 3d94391bb1
commit af8e1daa5d
10 changed files with 102 additions and 86 deletions

View File

@@ -71,7 +71,6 @@ import com.geeksville.mesh.MeshProtos.Waypoint
import com.geeksville.mesh.android.BuildUtils.debug
import com.geeksville.mesh.android.BuildUtils.warn
import com.geeksville.mesh.copy
import com.geeksville.mesh.model.UIViewModel
import com.geeksville.mesh.ui.map.components.ClusterItemsListDialog
import com.geeksville.mesh.ui.map.components.CustomMapLayersSheet
import com.geeksville.mesh.ui.map.components.CustomTileProviderManagerSheet
@@ -178,7 +177,6 @@ private fun filterNodeTrack(nodeTrack: List<Position>?): List<Position> {
@OptIn(MapsComposeExperimentalApi::class, ExperimentalMaterial3Api::class, ExperimentalMaterial3ExpressiveApi::class)
@Composable
fun MapView(
uiViewModel: UIViewModel,
mapViewModel: MapViewModel = hiltViewModel(),
navigateToNodeDetails: (Int) -> Unit,
focusedNodeNum: Int? = null,
@@ -208,7 +206,7 @@ fun MapView(
var mapFilterMenuExpanded by remember { mutableStateOf(false) }
val mapFilterState by mapViewModel.mapFilterStateFlow.collectAsStateWithLifecycle()
val ourNodeInfo by uiViewModel.ourNodeInfo.collectAsStateWithLifecycle()
val ourNodeInfo by mapViewModel.ourNodeInfo.collectAsStateWithLifecycle()
var editingWaypoint by remember { mutableStateOf<Waypoint?>(null) }
val selectedGoogleMapType by mapViewModel.selectedGoogleMapType.collectAsStateWithLifecycle()
@@ -319,8 +317,8 @@ fun MapView(
nodeSnippet = "${node.user.longName}",
)
}
val isConnected by uiViewModel.isConnectedStateFlow.collectAsStateWithLifecycle()
val theme by uiViewModel.theme.collectAsStateWithLifecycle()
val isConnected by mapViewModel.isConnected.collectAsStateWithLifecycle()
val theme by mapViewModel.theme.collectAsStateWithLifecycle()
val dark =
when (theme) {
AppCompatDelegate.MODE_NIGHT_YES -> true
@@ -531,7 +529,7 @@ fun MapView(
WaypointMarkers(
displayableWaypoints = displayableWaypoints,
mapFilterState = mapFilterState,
myNodeNum = uiViewModel.myNodeNum ?: 0,
myNodeNum = mapViewModel.myNodeNum ?: 0,
isConnected = isConnected,
unicodeEmojiToBitmapProvider = ::unicodeEmojiToBitmap,
onEditWaypointRequest = { waypointToEdit -> editingWaypoint = waypointToEdit },
@@ -577,21 +575,21 @@ fun MapView(
onSendClicked = { updatedWp ->
var finalWp = updatedWp
if (updatedWp.id == 0) {
finalWp = finalWp.copy { id = uiViewModel.generatePacketId() ?: 0 }
finalWp = finalWp.copy { id = mapViewModel.generatePacketId() ?: 0 }
}
if (updatedWp.icon == 0) {
finalWp = finalWp.copy { icon = 0x1F4CD }
}
uiViewModel.sendWaypoint(finalWp)
mapViewModel.sendWaypoint(finalWp)
editingWaypoint = null
},
onDeleteClicked = { wpToDelete ->
if (wpToDelete.lockedTo == 0 && isConnected && wpToDelete.id != 0) {
val deleteMarkerWp = wpToDelete.copy { expire = 1 }
uiViewModel.sendWaypoint(deleteMarkerWp)
mapViewModel.sendWaypoint(deleteMarkerWp)
}
uiViewModel.deleteWaypoint(wpToDelete.id)
mapViewModel.deleteWaypoint(wpToDelete.id)
editingWaypoint = null
},
onDismissRequest = { editingWaypoint = null },

View File

@@ -52,6 +52,7 @@ import kotlinx.serialization.Serializable
import org.json.JSONObject
import org.meshtastic.core.data.model.CustomTileProviderConfig
import org.meshtastic.core.data.repository.CustomTileProviderRepository
import org.meshtastic.core.datastore.UiPreferencesDataSource
import org.meshtastic.core.prefs.map.GoogleMapsPrefs
import org.meshtastic.core.prefs.map.MapPrefs
import timber.log.Timber
@@ -88,8 +89,11 @@ constructor(
radioConfigRepository: RadioConfigRepository,
serviceRepository: ServiceRepository,
private val customTileProviderRepository: CustomTileProviderRepository,
uiPreferencesDataSource: UiPreferencesDataSource,
) : BaseMapViewModel(mapPrefs, nodeRepository, packetRepository, serviceRepository) {
val theme: StateFlow<Int> = uiPreferencesDataSource.theme
private val _errorFlow = MutableSharedFlow<String>()
val errorFlow: SharedFlow<String> = _errorFlow.asSharedFlow()

View File

@@ -61,12 +61,7 @@ fun NodeMapScreen(
},
) { paddingValues ->
Box(modifier = Modifier.padding(paddingValues)) {
MapView(
uiViewModel = uiViewModel,
focusedNodeNum = destNum,
nodeTrack = positions,
navigateToNodeDetails = {},
)
MapView(focusedNodeNum = destNum, nodeTrack = positions, navigateToNodeDetails = {})
}
}
}