From e8522dbfa8d276c44f31bf33fcc98a49f2c9a360 Mon Sep 17 00:00:00 2001 From: Darryl Lynch Date: Fri, 10 Jan 2025 20:31:22 +0000 Subject: [PATCH 01/12] Initialize new sample Initialize the create and edit geometries sample --- samples/create-and-edit-geometries/README.md | 1 + .../README.metadata.json | 19 +++++ .../build.gradle.kts | 22 ++++++ .../create-and-edit-geometries.png | Bin 0 -> 96133 bytes .../src/main/AndroidManifest.xml | 14 ++++ .../createandeditgeometries/MainActivity.kt | 53 ++++++++++++++ .../CreateAndEditGeometriesViewModel.kt | 51 ++++++++++++++ .../screens/CreateAndEditGeometriesScreen.kt | 66 ++++++++++++++++++ .../src/main/res/values/strings.xml | 3 + 9 files changed, 229 insertions(+) create mode 100644 samples/create-and-edit-geometries/README.md create mode 100644 samples/create-and-edit-geometries/README.metadata.json create mode 100644 samples/create-and-edit-geometries/build.gradle.kts create mode 100644 samples/create-and-edit-geometries/create-and-edit-geometries.png create mode 100644 samples/create-and-edit-geometries/src/main/AndroidManifest.xml create mode 100644 samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/MainActivity.kt create mode 100644 samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt create mode 100644 samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/CreateAndEditGeometriesScreen.kt create mode 100644 samples/create-and-edit-geometries/src/main/res/values/strings.xml diff --git a/samples/create-and-edit-geometries/README.md b/samples/create-and-edit-geometries/README.md new file mode 100644 index 000000000..e9937546c --- /dev/null +++ b/samples/create-and-edit-geometries/README.md @@ -0,0 +1 @@ +# Create and edit geometries diff --git a/samples/create-and-edit-geometries/README.metadata.json b/samples/create-and-edit-geometries/README.metadata.json new file mode 100644 index 000000000..4bcd74115 --- /dev/null +++ b/samples/create-and-edit-geometries/README.metadata.json @@ -0,0 +1,19 @@ +{ + "category": "Edit and Manage Data", + "description": "TODO", + "formal_name": "CreateAndEditGeometries", + "ignore": false, + "images": [ + "create-and-edit-geometries.png" + ], + "keywords": [ ], + "language": "kotlin", + "redirect_from": "", + "relevant_apis": [ ], + "snippets": [ + "src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/CreateAndEditGeometriesViewModel.kt", + "src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/CreateAndEditGeometriesScreen.kt", + "src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/MainActivity.kt" + ], + "title": "Create and edit geometries" +} diff --git a/samples/create-and-edit-geometries/build.gradle.kts b/samples/create-and-edit-geometries/build.gradle.kts new file mode 100644 index 000000000..18dc9f4c1 --- /dev/null +++ b/samples/create-and-edit-geometries/build.gradle.kts @@ -0,0 +1,22 @@ +plugins { + alias(libs.plugins.arcgismaps.android.library) + alias(libs.plugins.arcgismaps.android.library.compose) + alias(libs.plugins.arcgismaps.kotlin.sample) + alias(libs.plugins.gradle.secrets) +} + +secrets { + // this file doesn't contain secrets, it just provides defaults which can be committed into git. + defaultPropertiesFileName = "secrets.defaults.properties" +} + +android { + namespace = "com.esri.arcgismaps.sample.createandeditgeometries" + buildFeatures { + buildConfig = true + } +} + +dependencies { + // Only module specific dependencies needed here +} diff --git a/samples/create-and-edit-geometries/create-and-edit-geometries.png b/samples/create-and-edit-geometries/create-and-edit-geometries.png new file mode 100644 index 0000000000000000000000000000000000000000..84b726c2e8c015fa86f2e6b22fb855039e196980 GIT binary patch literal 96133 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 z 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 UsQg%s0|!71bWL>1w4O!$59vIe{Qv*} literal 0 HcmV?d00001 diff --git a/samples/create-and-edit-geometries/src/main/AndroidManifest.xml b/samples/create-and-edit-geometries/src/main/AndroidManifest.xml new file mode 100644 index 000000000..7f287fc31 --- /dev/null +++ b/samples/create-and-edit-geometries/src/main/AndroidManifest.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + diff --git a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/MainActivity.kt b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/MainActivity.kt new file mode 100644 index 000000000..2c61db02f --- /dev/null +++ b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/MainActivity.kt @@ -0,0 +1,53 @@ +/* Copyright 2025 Esri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.esri.arcgismaps.sample.createandeditgeometries + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.runtime.Composable +import com.arcgismaps.ApiKey +import com.arcgismaps.ArcGISEnvironment +import com.esri.arcgismaps.sample.sampleslib.theme.SampleAppTheme +import com.esri.arcgismaps.sample.createandeditgeometries.screens.CreateAndEditGeometriesScreen + +class MainActivity : ComponentActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + // authentication with an API key or named user is + // required to access basemaps and other location services + ArcGISEnvironment.apiKey = ApiKey.create(BuildConfig.ACCESS_TOKEN) + + setContent { + SampleAppTheme { + CreateAndEditGeometriesApp() + } + } + } + + @Composable + private fun CreateAndEditGeometriesApp() { + Surface(color = MaterialTheme.colorScheme.background) { + CreateAndEditGeometriesScreen( + sampleName = getString(R.string.create_and_edit_geometries_app_name) + ) + } + } +} diff --git a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt new file mode 100644 index 000000000..e2056b00e --- /dev/null +++ b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt @@ -0,0 +1,51 @@ +/* Copyright 2025 Esri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.esri.arcgismaps.sample.createandeditgeometries.components + +import android.app.Application +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.viewModelScope +import com.arcgismaps.mapping.ArcGISMap +import com.arcgismaps.mapping.BasemapStyle +import com.arcgismaps.mapping.Viewpoint +import com.esri.arcgismaps.sample.sampleslib.components.MessageDialogViewModel +import kotlinx.coroutines.launch + +class CreateAndEditGeometriesViewModel(application: Application) : AndroidViewModel(application) { + //TODO - delete mutable state when the map does not change or the screen does not need to observe changes + val arcGISMap by mutableStateOf( + ArcGISMap(BasemapStyle.ArcGISNavigationNight).apply { + initialViewpoint = Viewpoint(39.8, -98.6, 10e7) + } + ) + + // Create a message dialog view model for handling error messages + val messageDialogVM = MessageDialogViewModel() + + init { + viewModelScope.launch { + arcGISMap.load().onFailure { error -> + messageDialogVM.showMessageDialog( + "Failed to load map", + error.message.toString() + ) + } + } + } +} diff --git a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/CreateAndEditGeometriesScreen.kt b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/CreateAndEditGeometriesScreen.kt new file mode 100644 index 000000000..ea81d8bf5 --- /dev/null +++ b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/CreateAndEditGeometriesScreen.kt @@ -0,0 +1,66 @@ +/* Copyright 2025 Esri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.esri.arcgismaps.sample.createandeditgeometries.screens + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.lifecycle.viewmodel.compose.viewModel +import com.arcgismaps.toolkit.geoviewcompose.MapView +import com.esri.arcgismaps.sample.createandeditgeometries.components.CreateAndEditGeometriesViewModel +import com.esri.arcgismaps.sample.sampleslib.components.MessageDialog +import com.esri.arcgismaps.sample.sampleslib.components.SampleTopAppBar + +/** + * Main screen layout for the sample app + */ +@Composable +fun CreateAndEditGeometriesScreen(sampleName: String) { + val mapViewModel: CreateAndEditGeometriesViewModel = viewModel() + Scaffold( + topBar = { SampleTopAppBar(title = sampleName) }, + content = { + Column( + modifier = Modifier + .fillMaxSize() + .padding(it), + ) { + MapView( + modifier = Modifier + .fillMaxSize() + .weight(1f), + arcGISMap = mapViewModel.arcGISMap + ) + // TODO: Add UI components in this Column ... + } + + mapViewModel.messageDialogVM.apply { + if (dialogStatus) { + MessageDialog( + title = messageTitle, + description = messageDescription, + onDismissRequest = ::dismissDialog + ) + } + } + } + ) +} diff --git a/samples/create-and-edit-geometries/src/main/res/values/strings.xml b/samples/create-and-edit-geometries/src/main/res/values/strings.xml new file mode 100644 index 000000000..af1a89fa8 --- /dev/null +++ b/samples/create-and-edit-geometries/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + Create and edit geometries + From 8f3b6a3a016407e39cf03dd0b4286b14405ed97c Mon Sep 17 00:00:00 2001 From: Darryl Lynch Date: Fri, 10 Jan 2025 21:16:16 +0000 Subject: [PATCH 02/12] Add geometry creator option --- .../CreateAndEditGeometriesViewModel.kt | 27 +++++ .../screens/ButtonMenu.kt | 112 ++++++++++++++++++ .../screens/CreateAndEditGeometriesScreen.kt | 6 +- 3 files changed, 143 insertions(+), 2 deletions(-) create mode 100644 samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/ButtonMenu.kt diff --git a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt index e2056b00e..c08cb8ae6 100644 --- a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt +++ b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt @@ -21,10 +21,15 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.viewModelScope +import com.arcgismaps.geometry.GeometryType import com.arcgismaps.mapping.ArcGISMap import com.arcgismaps.mapping.BasemapStyle import com.arcgismaps.mapping.Viewpoint +import com.arcgismaps.mapping.view.geometryeditor.GeometryEditor +import com.arcgismaps.toolkit.geoviewcompose.MapViewProxy import com.esri.arcgismaps.sample.sampleslib.components.MessageDialogViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch class CreateAndEditGeometriesViewModel(application: Application) : AndroidViewModel(application) { @@ -38,6 +43,15 @@ class CreateAndEditGeometriesViewModel(application: Application) : AndroidViewMo // Create a message dialog view model for handling error messages val messageDialogVM = MessageDialogViewModel() + // create a MapViewProxy that will be used to identify features in the MapView and set the viewpoint + val mapViewProxy = MapViewProxy() + + // create a geometry editor + val geometryEditor = GeometryEditor() + + private val _isCreateButtonEnabled = MutableStateFlow(false) + val isCreateButtonEnabled = _isCreateButtonEnabled.asStateFlow() + init { viewModelScope.launch { arcGISMap.load().onFailure { error -> @@ -45,7 +59,20 @@ class CreateAndEditGeometriesViewModel(application: Application) : AndroidViewMo "Failed to load map", error.message.toString() ) + }.onSuccess { + _isCreateButtonEnabled.value = true } } } + + /** + * Starts the GeometryEditor using the selected [GeometryType]. + */ + fun startEditor(selectedGeometry: GeometryType) { + if (!geometryEditor.isStarted.value) { + geometryEditor.start(selectedGeometry) + _isCreateButtonEnabled.value = false + } + } + } diff --git a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/ButtonMenu.kt b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/ButtonMenu.kt new file mode 100644 index 000000000..5935a5890 --- /dev/null +++ b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/ButtonMenu.kt @@ -0,0 +1,112 @@ +/* Copyright 2025 Esri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.esri.arcgismaps.sample.createandeditgeometries.screens + +import androidx.compose.foundation.horizontalScroll +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.sizeIn +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Delete +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.unit.dp +import androidx.compose.foundation.rememberScrollState +import androidx.compose.material.icons.filled.Create +import androidx.compose.material3.Text +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.arcgismaps.geometry.GeometryType +import com.esri.arcgismaps.sample.createandeditgeometries.components.CreateAndEditGeometriesViewModel +import com.esri.arcgismaps.sample.createandeditgeometries.R + +/** + * Composable component to display the menu buttons. + */ +@Composable +fun ButtonMenu( + mapViewModel: CreateAndEditGeometriesViewModel +) { + val rowModifier = Modifier + .padding(12.dp) + .fillMaxWidth() + .horizontalScroll(rememberScrollState()) // TODO: check if this is still necessary + + val isCreateButtonEnabled by mapViewModel.isCreateButtonEnabled.collectAsStateWithLifecycle() + + Row( + modifier = rowModifier + ) { + val vector = ImageVector + var expanded by remember { mutableStateOf(false) } + Box( + modifier = Modifier + ) { + IconButton( + enabled = isCreateButtonEnabled, + onClick = { expanded = !expanded } + ) { + Icon(imageVector = Icons.Default.Create, contentDescription = "Start") + } + DropdownMenu( + expanded = expanded, + onDismissRequest = { expanded = false } + ) { + DropdownMenuItem( + text = { Text("Point") }, + onClick = { + mapViewModel.startEditor(GeometryType.Point) + expanded = false + } + ) + DropdownMenuItem( + text = { Text("Multipoint") }, + onClick = { + mapViewModel.startEditor(GeometryType.Multipoint) + expanded = false + } + ) + DropdownMenuItem( + text = { Text("Polyline") }, + onClick = { + mapViewModel.startEditor(GeometryType.Polyline) + expanded = false + } + ) + DropdownMenuItem( + text = { Text("Polygon") }, + onClick = { + mapViewModel.startEditor(GeometryType.Polygon) + expanded = false + } + ) + } + } + } +} diff --git a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/CreateAndEditGeometriesScreen.kt b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/CreateAndEditGeometriesScreen.kt index ea81d8bf5..1589dc6c4 100644 --- a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/CreateAndEditGeometriesScreen.kt +++ b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/CreateAndEditGeometriesScreen.kt @@ -47,9 +47,11 @@ fun CreateAndEditGeometriesScreen(sampleName: String) { modifier = Modifier .fillMaxSize() .weight(1f), - arcGISMap = mapViewModel.arcGISMap + arcGISMap = mapViewModel.arcGISMap, + mapViewProxy = mapViewModel.mapViewProxy, + geometryEditor = mapViewModel.geometryEditor ) - // TODO: Add UI components in this Column ... + ButtonMenu(mapViewModel) } mapViewModel.messageDialogVM.apply { From b5075a05aa0726defb684b9ea435f7abc606c5ef Mon Sep 17 00:00:00 2001 From: Darryl Lynch Date: Fri, 10 Jan 2025 21:41:52 +0000 Subject: [PATCH 03/12] Add ability to save edits --- .../CreateAndEditGeometriesViewModel.kt | 49 ++++++++++++++++--- .../screens/ButtonMenu.kt | 10 +++- .../screens/CreateAndEditGeometriesScreen.kt | 12 ++++- .../src/main/res/drawable/check_32.xml | 9 ++++ 4 files changed, 71 insertions(+), 9 deletions(-) create mode 100644 samples/create-and-edit-geometries/src/main/res/drawable/check_32.xml diff --git a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt index c08cb8ae6..175407905 100644 --- a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt +++ b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt @@ -22,10 +22,17 @@ import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.viewModelScope import com.arcgismaps.geometry.GeometryType +import com.arcgismaps.geometry.Multipoint +import com.arcgismaps.geometry.Point +import com.arcgismaps.geometry.Polygon +import com.arcgismaps.geometry.Polyline import com.arcgismaps.mapping.ArcGISMap import com.arcgismaps.mapping.BasemapStyle import com.arcgismaps.mapping.Viewpoint +import com.arcgismaps.mapping.view.Graphic +import com.arcgismaps.mapping.view.GraphicsOverlay import com.arcgismaps.mapping.view.geometryeditor.GeometryEditor +import com.arcgismaps.mapping.view.geometryeditor.GeometryEditorStyle import com.arcgismaps.toolkit.geoviewcompose.MapViewProxy import com.esri.arcgismaps.sample.sampleslib.components.MessageDialogViewModel import kotlinx.coroutines.flow.MutableStateFlow @@ -46,12 +53,12 @@ class CreateAndEditGeometriesViewModel(application: Application) : AndroidViewMo // create a MapViewProxy that will be used to identify features in the MapView and set the viewpoint val mapViewProxy = MapViewProxy() + // create a graphic, graphic overlay, and geometry editorenc + private var identifiedGraphic = Graphic() + val graphicsOverlay = GraphicsOverlay() // create a geometry editor val geometryEditor = GeometryEditor() - private val _isCreateButtonEnabled = MutableStateFlow(false) - val isCreateButtonEnabled = _isCreateButtonEnabled.asStateFlow() - init { viewModelScope.launch { arcGISMap.load().onFailure { error -> @@ -59,8 +66,6 @@ class CreateAndEditGeometriesViewModel(application: Application) : AndroidViewMo "Failed to load map", error.message.toString() ) - }.onSuccess { - _isCreateButtonEnabled.value = true } } } @@ -71,8 +76,40 @@ class CreateAndEditGeometriesViewModel(application: Application) : AndroidViewMo fun startEditor(selectedGeometry: GeometryType) { if (!geometryEditor.isStarted.value) { geometryEditor.start(selectedGeometry) - _isCreateButtonEnabled.value = false } } + /** + * Stops the GeometryEditor and updates the identified graphic or calls [createGraphic]. + */ + fun stopEditor() { + if (identifiedGraphic.geometry != null) { + identifiedGraphic.geometry = geometryEditor.stop() + identifiedGraphic.isSelected = false + } else if (geometryEditor.isStarted.value) { + createGraphic() + } + } + + /** + * Creates a graphic from the geometry and add it to the GraphicsOverlay. + */ + private fun createGraphic() { + val geometry = geometryEditor.stop() + ?: return messageDialogVM.showMessageDialog( + "Error!", + "Error stopping editing session" + ) + val graphic = Graphic(geometry) + + when (geometry) { + is Point, is Multipoint -> graphic.symbol = GeometryEditorStyle().vertexSymbol + is Polyline -> graphic.symbol = GeometryEditorStyle().lineSymbol + is Polygon -> graphic.symbol = GeometryEditorStyle().fillSymbol + else -> {} + } + graphicsOverlay.graphics.add(graphic) + graphic.isSelected = false + } + } diff --git a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/ButtonMenu.kt b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/ButtonMenu.kt index 5935a5890..f8b4c4119 100644 --- a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/ButtonMenu.kt +++ b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/ButtonMenu.kt @@ -58,7 +58,7 @@ fun ButtonMenu( .fillMaxWidth() .horizontalScroll(rememberScrollState()) // TODO: check if this is still necessary - val isCreateButtonEnabled by mapViewModel.isCreateButtonEnabled.collectAsStateWithLifecycle() + val isGeometryEditorStarted by mapViewModel.geometryEditor.isStarted.collectAsStateWithLifecycle() Row( modifier = rowModifier @@ -69,7 +69,7 @@ fun ButtonMenu( modifier = Modifier ) { IconButton( - enabled = isCreateButtonEnabled, + enabled = !isGeometryEditorStarted, onClick = { expanded = !expanded } ) { Icon(imageVector = Icons.Default.Create, contentDescription = "Start") @@ -108,5 +108,11 @@ fun ButtonMenu( ) } } + IconButton( + enabled = isGeometryEditorStarted, + onClick = { mapViewModel.stopEditor() } + ) { + Icon(vector.vectorResource(R.drawable.check_32), contentDescription = "Save Edits") + } } } diff --git a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/CreateAndEditGeometriesScreen.kt b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/CreateAndEditGeometriesScreen.kt index 1589dc6c4..26fee648d 100644 --- a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/CreateAndEditGeometriesScreen.kt +++ b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/CreateAndEditGeometriesScreen.kt @@ -49,9 +49,19 @@ fun CreateAndEditGeometriesScreen(sampleName: String) { .weight(1f), arcGISMap = mapViewModel.arcGISMap, mapViewProxy = mapViewModel.mapViewProxy, - geometryEditor = mapViewModel.geometryEditor + geometryEditor = mapViewModel.geometryEditor, + graphicsOverlays = listOf(mapViewModel.graphicsOverlay) ) ButtonMenu(mapViewModel) + mapViewModel.messageDialogVM.apply { + if (dialogStatus) { + MessageDialog( + title = messageTitle, + description = messageDescription, + onDismissRequest = ::dismissDialog + ) + } + } } mapViewModel.messageDialogVM.apply { diff --git a/samples/create-and-edit-geometries/src/main/res/drawable/check_32.xml b/samples/create-and-edit-geometries/src/main/res/drawable/check_32.xml new file mode 100644 index 000000000..f14edbd40 --- /dev/null +++ b/samples/create-and-edit-geometries/src/main/res/drawable/check_32.xml @@ -0,0 +1,9 @@ + + + From d2b3bd5c62945787bda491e80b0e9ee9546bb4a3 Mon Sep 17 00:00:00 2001 From: Darryl Lynch Date: Fri, 10 Jan 2025 21:52:15 +0000 Subject: [PATCH 04/12] Update basemap and initial viewpoint --- .../components/CreateAndEditGeometriesViewModel.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt index 175407905..95db543f4 100644 --- a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt +++ b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt @@ -41,9 +41,15 @@ import kotlinx.coroutines.launch class CreateAndEditGeometriesViewModel(application: Application) : AndroidViewModel(application) { //TODO - delete mutable state when the map does not change or the screen does not need to observe changes + // create a map with the imagery basemap style val arcGISMap by mutableStateOf( - ArcGISMap(BasemapStyle.ArcGISNavigationNight).apply { - initialViewpoint = Viewpoint(39.8, -98.6, 10e7) + ArcGISMap(BasemapStyle.ArcGISImagery).apply { + // a viewpoint centered at the island of Inis MeƔin (Aran Islands) in Ireland + initialViewpoint = Viewpoint( + latitude = 53.08230, + longitude = -9.5920, + scale = 5000.0 + ) } ) From afc9451b83a0a2f66bd92395ddde693273c8e538 Mon Sep 17 00:00:00 2001 From: Darryl Lynch Date: Wed, 15 Jan 2025 15:42:43 +0000 Subject: [PATCH 05/12] Various tidying --- .../CreateAndEditGeometriesViewModel.kt | 16 ++++++---------- .../screens/ButtonMenu.kt | 14 ++++---------- .../screens/CreateAndEditGeometriesScreen.kt | 11 ----------- 3 files changed, 10 insertions(+), 31 deletions(-) diff --git a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt index 95db543f4..6cae7b5a9 100644 --- a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt +++ b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt @@ -35,12 +35,9 @@ import com.arcgismaps.mapping.view.geometryeditor.GeometryEditor import com.arcgismaps.mapping.view.geometryeditor.GeometryEditorStyle import com.arcgismaps.toolkit.geoviewcompose.MapViewProxy import com.esri.arcgismaps.sample.sampleslib.components.MessageDialogViewModel -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch class CreateAndEditGeometriesViewModel(application: Application) : AndroidViewModel(application) { - //TODO - delete mutable state when the map does not change or the screen does not need to observe changes // create a map with the imagery basemap style val arcGISMap by mutableStateOf( ArcGISMap(BasemapStyle.ArcGISImagery).apply { @@ -59,18 +56,17 @@ class CreateAndEditGeometriesViewModel(application: Application) : AndroidViewMo // create a MapViewProxy that will be used to identify features in the MapView and set the viewpoint val mapViewProxy = MapViewProxy() - // create a graphic, graphic overlay, and geometry editorenc + // create a graphic, graphic overlay, and geometry editor private var identifiedGraphic = Graphic() val graphicsOverlay = GraphicsOverlay() - // create a geometry editor val geometryEditor = GeometryEditor() init { viewModelScope.launch { arcGISMap.load().onFailure { error -> messageDialogVM.showMessageDialog( - "Failed to load map", - error.message.toString() + title = "Failed to load map", + description = error.message.toString() ) } } @@ -98,13 +94,13 @@ class CreateAndEditGeometriesViewModel(application: Application) : AndroidViewMo } /** - * Creates a graphic from the geometry and add it to the GraphicsOverlay. + * Creates a graphic from the geometry and adds it to the GraphicsOverlay. */ private fun createGraphic() { val geometry = geometryEditor.stop() ?: return messageDialogVM.showMessageDialog( - "Error!", - "Error stopping editing session" + title = "Error!", + description = "Error stopping editing session" ) val graphic = Graphic(geometry) diff --git a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/ButtonMenu.kt b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/ButtonMenu.kt index f8b4c4119..9c46c61dc 100644 --- a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/ButtonMenu.kt +++ b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/ButtonMenu.kt @@ -16,20 +16,18 @@ package com.esri.arcgismaps.sample.createandeditgeometries.screens -import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.sizeIn import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Delete +import androidx.compose.material.icons.filled.Create import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Icon import androidx.compose.material3.IconButton +import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -38,13 +36,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.vectorResource import androidx.compose.ui.unit.dp -import androidx.compose.foundation.rememberScrollState -import androidx.compose.material.icons.filled.Create -import androidx.compose.material3.Text import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.arcgismaps.geometry.GeometryType -import com.esri.arcgismaps.sample.createandeditgeometries.components.CreateAndEditGeometriesViewModel import com.esri.arcgismaps.sample.createandeditgeometries.R +import com.esri.arcgismaps.sample.createandeditgeometries.components.CreateAndEditGeometriesViewModel /** * Composable component to display the menu buttons. @@ -56,7 +51,6 @@ fun ButtonMenu( val rowModifier = Modifier .padding(12.dp) .fillMaxWidth() - .horizontalScroll(rememberScrollState()) // TODO: check if this is still necessary val isGeometryEditorStarted by mapViewModel.geometryEditor.isStarted.collectAsStateWithLifecycle() @@ -112,7 +106,7 @@ fun ButtonMenu( enabled = isGeometryEditorStarted, onClick = { mapViewModel.stopEditor() } ) { - Icon(vector.vectorResource(R.drawable.check_32), contentDescription = "Save Edits") + Icon(vector.vectorResource(id = R.drawable.check_32), contentDescription = "Save Edits") } } } diff --git a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/CreateAndEditGeometriesScreen.kt b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/CreateAndEditGeometriesScreen.kt index 26fee648d..476c32937 100644 --- a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/CreateAndEditGeometriesScreen.kt +++ b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/CreateAndEditGeometriesScreen.kt @@ -20,7 +20,6 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.lifecycle.viewmodel.compose.viewModel @@ -63,16 +62,6 @@ fun CreateAndEditGeometriesScreen(sampleName: String) { } } } - - mapViewModel.messageDialogVM.apply { - if (dialogStatus) { - MessageDialog( - title = messageTitle, - description = messageDescription, - onDismissRequest = ::dismissDialog - ) - } - } } ) } From ebf96cafb1732154ebb3da3e3efd5f8760cda4eb Mon Sep 17 00:00:00 2001 From: Darryl Lynch Date: Wed, 15 Jan 2025 16:03:53 +0000 Subject: [PATCH 06/12] Add identify of existing geometries --- .../CreateAndEditGeometriesViewModel.kt | 36 ++++++++++++++++++- .../screens/CreateAndEditGeometriesScreen.kt | 16 +++++++-- 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt index 6cae7b5a9..35b7f2279 100644 --- a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt +++ b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt @@ -19,6 +19,7 @@ package com.esri.arcgismaps.sample.createandeditgeometries.components import android.app.Application import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf +import androidx.compose.ui.unit.dp import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.viewModelScope import com.arcgismaps.geometry.GeometryType @@ -31,13 +32,18 @@ import com.arcgismaps.mapping.BasemapStyle import com.arcgismaps.mapping.Viewpoint import com.arcgismaps.mapping.view.Graphic import com.arcgismaps.mapping.view.GraphicsOverlay +import com.arcgismaps.mapping.view.SingleTapConfirmedEvent import com.arcgismaps.mapping.view.geometryeditor.GeometryEditor import com.arcgismaps.mapping.view.geometryeditor.GeometryEditorStyle import com.arcgismaps.toolkit.geoviewcompose.MapViewProxy import com.esri.arcgismaps.sample.sampleslib.components.MessageDialogViewModel +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch -class CreateAndEditGeometriesViewModel(application: Application) : AndroidViewModel(application) { +class CreateAndEditGeometriesViewModel( + application: Application, + private val sampleCoroutineScope: CoroutineScope +) : AndroidViewModel(application) { // create a map with the imagery basemap style val arcGISMap by mutableStateOf( ArcGISMap(BasemapStyle.ArcGISImagery).apply { @@ -114,4 +120,32 @@ class CreateAndEditGeometriesViewModel(application: Application) : AndroidViewMo graphic.isSelected = false } + /** + * Identifies the graphic at the tapped screen coordinate in the provided [singleTapConfirmedEvent] + * and starts the GeometryEditor using the identified graphic's geometry. Hide the BottomSheet on + * [singleTapConfirmedEvent]. + */ + fun identify(singleTapConfirmedEvent: SingleTapConfirmedEvent) { + sampleCoroutineScope.launch { + val graphicsResult = mapViewProxy.identifyGraphicsOverlays( + screenCoordinate = singleTapConfirmedEvent.screenCoordinate, + tolerance = 10.0.dp, + returnPopupsOnly = false + ).getOrNull() + + if (!geometryEditor.isStarted.value) { + if (graphicsResult != null) { + if (graphicsResult.isNotEmpty()) { + identifiedGraphic = graphicsResult[0].graphics[0] + identifiedGraphic.isSelected = true + identifiedGraphic.geometry?.let { + geometryEditor.start(it) + } + } + } + identifiedGraphic.geometry = null + } + } + } + } diff --git a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/CreateAndEditGeometriesScreen.kt b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/CreateAndEditGeometriesScreen.kt index 476c32937..6b6d4d444 100644 --- a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/CreateAndEditGeometriesScreen.kt +++ b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/CreateAndEditGeometriesScreen.kt @@ -16,13 +16,16 @@ package com.esri.arcgismaps.sample.createandeditgeometries.screens +import android.app.Application import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier -import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.compose.ui.platform.LocalContext import com.arcgismaps.toolkit.geoviewcompose.MapView import com.esri.arcgismaps.sample.createandeditgeometries.components.CreateAndEditGeometriesViewModel import com.esri.arcgismaps.sample.sampleslib.components.MessageDialog @@ -33,7 +36,13 @@ import com.esri.arcgismaps.sample.sampleslib.components.SampleTopAppBar */ @Composable fun CreateAndEditGeometriesScreen(sampleName: String) { - val mapViewModel: CreateAndEditGeometriesViewModel = viewModel() + // coroutineScope that will be cancelled when this call leaves the composition + val sampleCoroutineScope = rememberCoroutineScope() + // get the application property that will be used to construct MapViewModel + val sampleApplication = LocalContext.current.applicationContext as Application + // create a ViewModel to handle MapView interactions + val mapViewModel = remember { CreateAndEditGeometriesViewModel(sampleApplication, sampleCoroutineScope) } + Scaffold( topBar = { SampleTopAppBar(title = sampleName) }, content = { @@ -49,7 +58,8 @@ fun CreateAndEditGeometriesScreen(sampleName: String) { arcGISMap = mapViewModel.arcGISMap, mapViewProxy = mapViewModel.mapViewProxy, geometryEditor = mapViewModel.geometryEditor, - graphicsOverlays = listOf(mapViewModel.graphicsOverlay) + graphicsOverlays = listOf(mapViewModel.graphicsOverlay), + onSingleTapConfirmed = mapViewModel::identify, ) ButtonMenu(mapViewModel) mapViewModel.messageDialogVM.apply { From 676d24de55b0ad18e32ff3841c714000620730bc Mon Sep 17 00:00:00 2001 From: Darryl Lynch Date: Wed, 15 Jan 2025 16:20:50 +0000 Subject: [PATCH 07/12] Better viewmodel handling --- .../components/CreateAndEditGeometriesViewModel.kt | 8 ++------ .../screens/CreateAndEditGeometriesScreen.kt | 11 ++--------- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt index 35b7f2279..aa37139bb 100644 --- a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt +++ b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt @@ -37,13 +37,9 @@ import com.arcgismaps.mapping.view.geometryeditor.GeometryEditor import com.arcgismaps.mapping.view.geometryeditor.GeometryEditorStyle import com.arcgismaps.toolkit.geoviewcompose.MapViewProxy import com.esri.arcgismaps.sample.sampleslib.components.MessageDialogViewModel -import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch -class CreateAndEditGeometriesViewModel( - application: Application, - private val sampleCoroutineScope: CoroutineScope -) : AndroidViewModel(application) { +class CreateAndEditGeometriesViewModel(application: Application) : AndroidViewModel(application) { // create a map with the imagery basemap style val arcGISMap by mutableStateOf( ArcGISMap(BasemapStyle.ArcGISImagery).apply { @@ -126,7 +122,7 @@ class CreateAndEditGeometriesViewModel( * [singleTapConfirmedEvent]. */ fun identify(singleTapConfirmedEvent: SingleTapConfirmedEvent) { - sampleCoroutineScope.launch { + viewModelScope.launch { val graphicsResult = mapViewProxy.identifyGraphicsOverlays( screenCoordinate = singleTapConfirmedEvent.screenCoordinate, tolerance = 10.0.dp, diff --git a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/CreateAndEditGeometriesScreen.kt b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/CreateAndEditGeometriesScreen.kt index 6b6d4d444..aa0d37a00 100644 --- a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/CreateAndEditGeometriesScreen.kt +++ b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/CreateAndEditGeometriesScreen.kt @@ -16,16 +16,13 @@ package com.esri.arcgismaps.sample.createandeditgeometries.screens -import android.app.Application import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext +import androidx.lifecycle.viewmodel.compose.viewModel import com.arcgismaps.toolkit.geoviewcompose.MapView import com.esri.arcgismaps.sample.createandeditgeometries.components.CreateAndEditGeometriesViewModel import com.esri.arcgismaps.sample.sampleslib.components.MessageDialog @@ -36,12 +33,8 @@ import com.esri.arcgismaps.sample.sampleslib.components.SampleTopAppBar */ @Composable fun CreateAndEditGeometriesScreen(sampleName: String) { - // coroutineScope that will be cancelled when this call leaves the composition - val sampleCoroutineScope = rememberCoroutineScope() - // get the application property that will be used to construct MapViewModel - val sampleApplication = LocalContext.current.applicationContext as Application // create a ViewModel to handle MapView interactions - val mapViewModel = remember { CreateAndEditGeometriesViewModel(sampleApplication, sampleCoroutineScope) } + val mapViewModel: CreateAndEditGeometriesViewModel = viewModel() Scaffold( topBar = { SampleTopAppBar(title = sampleName) }, From d0aecbe209103b0c6ef869e8fccb2a268a68bdd4 Mon Sep 17 00:00:00 2001 From: Darryl Lynch Date: Fri, 17 Jan 2025 15:32:15 +0000 Subject: [PATCH 08/12] Use .first() over [0] Cleaner syntax Co-authored-by: TADraeseke --- .../components/CreateAndEditGeometriesViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt index aa37139bb..cb33b31ff 100644 --- a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt +++ b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt @@ -132,7 +132,7 @@ class CreateAndEditGeometriesViewModel(application: Application) : AndroidViewMo if (!geometryEditor.isStarted.value) { if (graphicsResult != null) { if (graphicsResult.isNotEmpty()) { - identifiedGraphic = graphicsResult[0].graphics[0] + identifiedGraphic = graphicsResult.first().graphics.first() identifiedGraphic.isSelected = true identifiedGraphic.geometry?.let { geometryEditor.start(it) From d39856d550eed2b70d8fff659ca4f636f5e492a0 Mon Sep 17 00:00:00 2001 From: Darryl Lynch Date: Fri, 17 Jan 2025 16:47:04 +0000 Subject: [PATCH 09/12] Add more comments --- .../CreateAndEditGeometriesViewModel.kt | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt index cb33b31ff..1be69f972 100644 --- a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt +++ b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt @@ -52,19 +52,22 @@ class CreateAndEditGeometriesViewModel(application: Application) : AndroidViewMo } ) - // Create a message dialog view model for handling error messages + // create a message dialog view model for handling error messages val messageDialogVM = MessageDialogViewModel() // create a MapViewProxy that will be used to identify features in the MapView and set the viewpoint val mapViewProxy = MapViewProxy() - // create a graphic, graphic overlay, and geometry editor + // create a graphic to hold graphics identified on tap private var identifiedGraphic = Graphic() + // create a graphics overlay val graphicsOverlay = GraphicsOverlay() + // create a geometry editor val geometryEditor = GeometryEditor() init { viewModelScope.launch { + // load the map arcGISMap.load().onFailure { error -> messageDialogVM.showMessageDialog( title = "Failed to load map", @@ -87,10 +90,14 @@ class CreateAndEditGeometriesViewModel(application: Application) : AndroidViewMo * Stops the GeometryEditor and updates the identified graphic or calls [createGraphic]. */ fun stopEditor() { + // check if there was a previously identified graphic if (identifiedGraphic.geometry != null) { + // update the identified graphic identifiedGraphic.geometry = geometryEditor.stop() + // deselect the identified graphic identifiedGraphic.isSelected = false } else if (geometryEditor.isStarted.value) { + // create a graphic from the geometry that was being edited createGraphic() } } @@ -99,20 +106,26 @@ class CreateAndEditGeometriesViewModel(application: Application) : AndroidViewMo * Creates a graphic from the geometry and adds it to the GraphicsOverlay. */ private fun createGraphic() { + // stop the geometry editor and get its final geometry state val geometry = geometryEditor.stop() ?: return messageDialogVM.showMessageDialog( title = "Error!", description = "Error stopping editing session" ) + + // create a graphic to represent the new geometry val graphic = Graphic(geometry) + // give the graphic an appropriate fill based on the geometry type when (geometry) { is Point, is Multipoint -> graphic.symbol = GeometryEditorStyle().vertexSymbol is Polyline -> graphic.symbol = GeometryEditorStyle().lineSymbol is Polygon -> graphic.symbol = GeometryEditorStyle().fillSymbol else -> {} } + // add the graphic to the graphics overlay graphicsOverlay.graphics.add(graphic) + // deselect the graphic graphic.isSelected = false } @@ -123,6 +136,7 @@ class CreateAndEditGeometriesViewModel(application: Application) : AndroidViewMo */ fun identify(singleTapConfirmedEvent: SingleTapConfirmedEvent) { viewModelScope.launch { + // attempt to identify a graphic at the location the user tapped val graphicsResult = mapViewProxy.identifyGraphicsOverlays( screenCoordinate = singleTapConfirmedEvent.screenCoordinate, tolerance = 10.0.dp, @@ -132,13 +146,17 @@ class CreateAndEditGeometriesViewModel(application: Application) : AndroidViewMo if (!geometryEditor.isStarted.value) { if (graphicsResult != null) { if (graphicsResult.isNotEmpty()) { + // get the tapped graphic identifiedGraphic = graphicsResult.first().graphics.first() + // select the graphic identifiedGraphic.isSelected = true + // start the geometry editor with the identified graphic identifiedGraphic.geometry?.let { geometryEditor.start(it) } } } + // reset the identified graphic back to null identifiedGraphic.geometry = null } } From dc71387859c31a0ad9aa6ebd8b1436b4fba19929 Mon Sep 17 00:00:00 2001 From: Darryl Lynch Date: Fri, 17 Jan 2025 20:22:56 +0000 Subject: [PATCH 10/12] Avoid passing mapViewModel to ButtonMenu Implement state hoisting --- .../screens/ButtonMenu.kt | 18 ++++++++---------- .../screens/CreateAndEditGeometriesScreen.kt | 7 ++++++- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/ButtonMenu.kt b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/ButtonMenu.kt index 9c46c61dc..3528255b6 100644 --- a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/ButtonMenu.kt +++ b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/ButtonMenu.kt @@ -36,24 +36,22 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.vectorResource import androidx.compose.ui.unit.dp -import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.arcgismaps.geometry.GeometryType import com.esri.arcgismaps.sample.createandeditgeometries.R -import com.esri.arcgismaps.sample.createandeditgeometries.components.CreateAndEditGeometriesViewModel /** * Composable component to display the menu buttons. */ @Composable fun ButtonMenu( - mapViewModel: CreateAndEditGeometriesViewModel + isGeometryEditorStarted: Boolean, + onStartEditingButtonClick: (GeometryType) -> Unit, + onStopEditingButtonClick: () -> Unit ) { val rowModifier = Modifier .padding(12.dp) .fillMaxWidth() - val isGeometryEditorStarted by mapViewModel.geometryEditor.isStarted.collectAsStateWithLifecycle() - Row( modifier = rowModifier ) { @@ -75,28 +73,28 @@ fun ButtonMenu( DropdownMenuItem( text = { Text("Point") }, onClick = { - mapViewModel.startEditor(GeometryType.Point) + onStartEditingButtonClick(GeometryType.Point) expanded = false } ) DropdownMenuItem( text = { Text("Multipoint") }, onClick = { - mapViewModel.startEditor(GeometryType.Multipoint) + onStartEditingButtonClick(GeometryType.Multipoint) expanded = false } ) DropdownMenuItem( text = { Text("Polyline") }, onClick = { - mapViewModel.startEditor(GeometryType.Polyline) + onStartEditingButtonClick(GeometryType.Polyline) expanded = false } ) DropdownMenuItem( text = { Text("Polygon") }, onClick = { - mapViewModel.startEditor(GeometryType.Polygon) + onStartEditingButtonClick(GeometryType.Polygon) expanded = false } ) @@ -104,7 +102,7 @@ fun ButtonMenu( } IconButton( enabled = isGeometryEditorStarted, - onClick = { mapViewModel.stopEditor() } + onClick = { onStopEditingButtonClick() } ) { Icon(vector.vectorResource(id = R.drawable.check_32), contentDescription = "Save Edits") } diff --git a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/CreateAndEditGeometriesScreen.kt b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/CreateAndEditGeometriesScreen.kt index aa0d37a00..e80aa770c 100644 --- a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/CreateAndEditGeometriesScreen.kt +++ b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/CreateAndEditGeometriesScreen.kt @@ -22,6 +22,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel import com.arcgismaps.toolkit.geoviewcompose.MapView import com.esri.arcgismaps.sample.createandeditgeometries.components.CreateAndEditGeometriesViewModel @@ -54,7 +55,11 @@ fun CreateAndEditGeometriesScreen(sampleName: String) { graphicsOverlays = listOf(mapViewModel.graphicsOverlay), onSingleTapConfirmed = mapViewModel::identify, ) - ButtonMenu(mapViewModel) + ButtonMenu( + mapViewModel.geometryEditor.isStarted.collectAsStateWithLifecycle().value, + mapViewModel::startEditor, + mapViewModel::stopEditor + ) mapViewModel.messageDialogVM.apply { if (dialogStatus) { MessageDialog( From 297774808a3787d3d18fe11c4932edd963814f5d Mon Sep 17 00:00:00 2001 From: Darryl Lynch Date: Fri, 17 Jan 2025 20:26:51 +0000 Subject: [PATCH 11/12] Avoid repeatedly recreating GeometryEditorStyle --- .../components/CreateAndEditGeometriesViewModel.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt index 1be69f972..9fdcd1626 100644 --- a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt +++ b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/components/CreateAndEditGeometriesViewModel.kt @@ -58,6 +58,8 @@ class CreateAndEditGeometriesViewModel(application: Application) : AndroidViewMo // create a MapViewProxy that will be used to identify features in the MapView and set the viewpoint val mapViewProxy = MapViewProxy() + // create a geometryEditorStyle + private val geometryEditorStyle = GeometryEditorStyle() // create a graphic to hold graphics identified on tap private var identifiedGraphic = Graphic() // create a graphics overlay @@ -118,9 +120,9 @@ class CreateAndEditGeometriesViewModel(application: Application) : AndroidViewMo // give the graphic an appropriate fill based on the geometry type when (geometry) { - is Point, is Multipoint -> graphic.symbol = GeometryEditorStyle().vertexSymbol - is Polyline -> graphic.symbol = GeometryEditorStyle().lineSymbol - is Polygon -> graphic.symbol = GeometryEditorStyle().fillSymbol + is Point, is Multipoint -> graphic.symbol = geometryEditorStyle.vertexSymbol + is Polyline -> graphic.symbol = geometryEditorStyle.lineSymbol + is Polygon -> graphic.symbol = geometryEditorStyle.fillSymbol else -> {} } // add the graphic to the graphics overlay From 089e455fe7739d710589ef691950fae5f93af3db Mon Sep 17 00:00:00 2001 From: Darryl Lynch Date: Wed, 22 Jan 2025 18:01:55 +0000 Subject: [PATCH 12/12] Use default check icon --- .../sample/createandeditgeometries/screens/ButtonMenu.kt | 7 ++----- .../src/main/res/drawable/check_32.xml | 9 --------- 2 files changed, 2 insertions(+), 14 deletions(-) delete mode 100644 samples/create-and-edit-geometries/src/main/res/drawable/check_32.xml diff --git a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/ButtonMenu.kt b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/ButtonMenu.kt index 3528255b6..e005e2ed0 100644 --- a/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/ButtonMenu.kt +++ b/samples/create-and-edit-geometries/src/main/java/com/esri/arcgismaps/sample/createandeditgeometries/screens/ButtonMenu.kt @@ -21,6 +21,7 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Check import androidx.compose.material.icons.filled.Create import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem @@ -33,11 +34,8 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.res.vectorResource import androidx.compose.ui.unit.dp import com.arcgismaps.geometry.GeometryType -import com.esri.arcgismaps.sample.createandeditgeometries.R /** * Composable component to display the menu buttons. @@ -55,7 +53,6 @@ fun ButtonMenu( Row( modifier = rowModifier ) { - val vector = ImageVector var expanded by remember { mutableStateOf(false) } Box( modifier = Modifier @@ -104,7 +101,7 @@ fun ButtonMenu( enabled = isGeometryEditorStarted, onClick = { onStopEditingButtonClick() } ) { - Icon(vector.vectorResource(id = R.drawable.check_32), contentDescription = "Save Edits") + Icon(imageVector = Icons.Default.Check, contentDescription = "Save Edits") } } } diff --git a/samples/create-and-edit-geometries/src/main/res/drawable/check_32.xml b/samples/create-and-edit-geometries/src/main/res/drawable/check_32.xml deleted file mode 100644 index f14edbd40..000000000 --- a/samples/create-and-edit-geometries/src/main/res/drawable/check_32.xml +++ /dev/null @@ -1,9 +0,0 @@ - - -