From de792be47d8f6a08ef4af012b862b86a5013d25f Mon Sep 17 00:00:00 2001 From: Darryl Lynch Date: Fri, 27 Dec 2024 14:09:49 +0000 Subject: [PATCH] Move string handling to UI --- .../components/ProjectGeometryViewModel.kt | 27 +++++++------------ .../screens/ProjectGeometryScreen.kt | 24 ++++++++++++++++- 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/samples/project-geometry/src/main/java/com/esri/arcgismaps/sample/projectgeometry/components/ProjectGeometryViewModel.kt b/samples/project-geometry/src/main/java/com/esri/arcgismaps/sample/projectgeometry/components/ProjectGeometryViewModel.kt index 15896bd89..456290f53 100644 --- a/samples/project-geometry/src/main/java/com/esri/arcgismaps/sample/projectgeometry/components/ProjectGeometryViewModel.kt +++ b/samples/project-geometry/src/main/java/com/esri/arcgismaps/sample/projectgeometry/components/ProjectGeometryViewModel.kt @@ -35,9 +35,10 @@ import com.arcgismaps.toolkit.geoviewcompose.MapViewProxy import com.esri.arcgismaps.sample.projectgeometry.R import com.esri.arcgismaps.sample.sampleslib.components.MessageDialogViewModel import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch -import java.util.Locale + +data class PointProjection (val original: Point, val projection: Point) class ProjectGeometryViewModel(val app: Application) : AndroidViewModel(app) { // create a map with a navigation night basemap style @@ -55,6 +56,10 @@ class ProjectGeometryViewModel(val app: Application) : AndroidViewModel(app) { // Create a message dialog view model for handling error messages val messageDialogVM = MessageDialogViewModel() + // state flow of a point and its projection for presentation in UI + private val _pointProjectionFlow = MutableStateFlow(null) + val pointFlow = _pointProjectionFlow.asStateFlow() + // setup the red pin marker image as bitmap drawable private val markerDrawable: BitmapDrawable by lazy { // load the bitmap from resources and create a drawable @@ -80,9 +85,6 @@ class ProjectGeometryViewModel(val app: Application) : AndroidViewModel(app) { graphics.add(markerGraphic) } - private val _infoText = MutableStateFlow(app.resources.getString(R.string.tap_to_begin)) - val infoText: StateFlow = _infoText - init { viewModelScope.launch { arcGISMap.load().onFailure { error -> @@ -109,18 +111,9 @@ class ProjectGeometryViewModel(val app: Application) : AndroidViewModel(app) { geometry = point, spatialReference = SpatialReference.wgs84() ) - _infoText.value = app.resources.getString( - R.string.projection_info_text, - point.toDisplayFormat(), - projectedPoint?.toDisplayFormat() - ) + projectedPoint?.let { projection -> + _pointProjectionFlow.value = PointProjection(point, projection) + } } } } - -/** - * Extension function for the Point type that returns - * a float-precision formatted string suitable for display - */ -private fun Point.toDisplayFormat() = - "${String.format(Locale.getDefault(),"%.5f", x)}, ${String.format(Locale.getDefault(),"%.5f", y)}" diff --git a/samples/project-geometry/src/main/java/com/esri/arcgismaps/sample/projectgeometry/screens/ProjectGeometryScreen.kt b/samples/project-geometry/src/main/java/com/esri/arcgismaps/sample/projectgeometry/screens/ProjectGeometryScreen.kt index 4a763d10e..7e2a61c55 100644 --- a/samples/project-geometry/src/main/java/com/esri/arcgismaps/sample/projectgeometry/screens/ProjectGeometryScreen.kt +++ b/samples/project-geometry/src/main/java/com/esri/arcgismaps/sample/projectgeometry/screens/ProjectGeometryScreen.kt @@ -30,11 +30,13 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel +import com.arcgismaps.geometry.Point import com.arcgismaps.toolkit.geoviewcompose.MapView import com.esri.arcgismaps.sample.projectgeometry.R import com.esri.arcgismaps.sample.projectgeometry.components.ProjectGeometryViewModel import com.esri.arcgismaps.sample.sampleslib.components.MessageDialog import com.esri.arcgismaps.sample.sampleslib.components.SampleTopAppBar +import java.util.Locale /** * Main screen layout for the sample app @@ -42,7 +44,20 @@ import com.esri.arcgismaps.sample.sampleslib.components.SampleTopAppBar @Composable fun ProjectGeometryScreen(sampleName: String) { val mapViewModel: ProjectGeometryViewModel = viewModel() - val infoText by mapViewModel.infoText.collectAsState() + val projectionInfo by mapViewModel.pointFlow.collectAsState() + + val infoText = + if (projectionInfo == null) { + "Tap to begin" + } + else { + stringResource( + R.string.projection_info_text, + projectionInfo?.original?.toDisplayFormat()!!, + projectionInfo?.projection?.toDisplayFormat()!! + ) + } + Scaffold( topBar = { SampleTopAppBar(title = sampleName) }, content = { @@ -88,3 +103,10 @@ fun ProjectGeometryScreen(sampleName: String) { } ) } + +/** + * Extension function for the Point type that returns + * a float-precision formatted string suitable for display + */ +private fun Point.toDisplayFormat() = + "${String.format(Locale.getDefault(),"%.5f", x)}, ${String.format(Locale.getDefault(),"%.5f", y)}"