diff --git a/samples/cut-geometry/README.md b/samples/cut-geometry/README.md index dbeb3c7c0..ac77ddade 100644 --- a/samples/cut-geometry/README.md +++ b/samples/cut-geometry/README.md @@ -23,6 +23,10 @@ Tap the "Cut" button to cut the polygon with the polyline and see the resulting * Polygon * Polyline +## Additional information + +This sample uses the GeoView-Compose Toolkit module to be able to implement a composable MapView. + ## Tags -cut, geometry, split +cut, geometry, geoview-compose, split, toolkit diff --git a/samples/cut-geometry/README.metadata.json b/samples/cut-geometry/README.metadata.json index c01cbc609..f6884727d 100644 --- a/samples/cut-geometry/README.metadata.json +++ b/samples/cut-geometry/README.metadata.json @@ -1,30 +1,34 @@ { - "category": "Edit and Manage Data", - "description": "Cut a geometry along a polyline.", - "formal_name": "CutGeometry", - "ignore": false, - "images": [ - "cut-geometry.png" - ], - "keywords": [ - "cut", - "geometry", - "split", - "GeometryEngine", - "Polygon", - "Polyline" - ], - "language": "kotlin", - "redirect_from": [ - "/android/latest/sample-code/cut-geometry.htm" - ], - "relevant_apis": [ - "GeometryEngine", - "Polygon", - "Polyline" - ], - "snippets": [ - "src/main/java/com/esri/arcgismaps/sample/cutgeometry/MainActivity.kt" - ], - "title": "Cut geometry" + "category": "Edit and Manage Data", + "description": "Cut a geometry along a polyline.", + "formal_name": "CutGeometry", + "ignore": false, + "images": [ + "cut-geometry.png" + ], + "keywords": [ + "cut", + "geometry", + "geoview-compose", + "split", + "toolkit", + "GeometryEngine", + "Polygon", + "Polyline" + ], + "language": "kotlin", + "redirect_from": [ + "/android/latest/sample-code/cut-geometry.htm" + ], + "relevant_apis": [ + "GeometryEngine", + "Polygon", + "Polyline" + ], + "snippets": [ + "src/main/java/com/esri/arcgismaps/sample/cutgeometry/components/CutGeometryViewModel.kt", + "src/main/java/com/esri/arcgismaps/sample/cutgeometry/MainActivity.kt", + "src/main/java/com/esri/arcgismaps/sample/cutgeometry/screens/CutGeometryScreen.kt" + ], + "title": "Cut geometry" } diff --git a/samples/cut-geometry/build.gradle.kts b/samples/cut-geometry/build.gradle.kts index b422decad..b0c4815fa 100644 --- a/samples/cut-geometry/build.gradle.kts +++ b/samples/cut-geometry/build.gradle.kts @@ -1,5 +1,6 @@ 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) } @@ -11,9 +12,7 @@ secrets { android { namespace = "com.esri.arcgismaps.sample.cutgeometry" - // For view based samples buildFeatures { - dataBinding = true buildConfig = true } } diff --git a/samples/cut-geometry/cut-geometry.png b/samples/cut-geometry/cut-geometry.png index 832094832..c33f3f59d 100644 Binary files a/samples/cut-geometry/cut-geometry.png and b/samples/cut-geometry/cut-geometry.png differ diff --git a/samples/cut-geometry/src/main/java/com/esri/arcgismaps/sample/cutgeometry/MainActivity.kt b/samples/cut-geometry/src/main/java/com/esri/arcgismaps/sample/cutgeometry/MainActivity.kt index e14dbaa53..25a85a03f 100644 --- a/samples/cut-geometry/src/main/java/com/esri/arcgismaps/sample/cutgeometry/MainActivity.kt +++ b/samples/cut-geometry/src/main/java/com/esri/arcgismaps/sample/cutgeometry/MainActivity.kt @@ -17,182 +17,37 @@ package com.esri.arcgismaps.sample.cutgeometry import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.databinding.DataBindingUtil +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.arcgismaps.Color -import com.arcgismaps.geometry.GeometryEngine -import com.arcgismaps.geometry.Point -import com.arcgismaps.geometry.PolygonBuilder -import com.arcgismaps.geometry.Polyline -import com.arcgismaps.geometry.PolylineBuilder -import com.arcgismaps.geometry.SpatialReference -import com.arcgismaps.mapping.ArcGISMap -import com.arcgismaps.mapping.BasemapStyle -import com.arcgismaps.mapping.Viewpoint -import com.arcgismaps.mapping.symbology.SimpleFillSymbol -import com.arcgismaps.mapping.symbology.SimpleFillSymbolStyle -import com.arcgismaps.mapping.symbology.SimpleLineSymbol -import com.arcgismaps.mapping.symbology.SimpleLineSymbolStyle -import com.arcgismaps.mapping.view.Graphic -import com.arcgismaps.mapping.view.GraphicsOverlay -import com.arcgismaps.mapping.view.MapView -import com.esri.arcgismaps.sample.cutgeometry.databinding.CutGeometryActivityMainBinding +import com.esri.arcgismaps.sample.sampleslib.theme.SampleAppTheme +import com.esri.arcgismaps.sample.cutgeometry.screens.CutGeometryScreen -class MainActivity : AppCompatActivity() { - - private val lakeSuperiorPolygon by lazy { - PolygonBuilder(SpatialReference.webMercator()) { - addPoint(Point(-10254374.668616, 5908345.076380)) - addPoint(Point(-10178382.525314, 5971402.386779)) - addPoint(Point(-10118558.923141, 6034459.697178)) - addPoint(Point(-9993252.729399, 6093474.872295)) - addPoint(Point(-9882498.222673, 6209888.368416)) - addPoint(Point(-9821057.766387, 6274562.532928)) - addPoint(Point(-9690092.583250, 6241417.023616)) - addPoint(Point(-9605207.742329, 6206654.660191)) - addPoint(Point(-9564786.389509, 6108834.986367)) - addPoint(Point(-9449989.747500, 6095091.726408)) - addPoint(Point(-9462116.153346, 6044160.821855)) - addPoint(Point(-9417652.665244, 5985145.646738)) - addPoint(Point(-9438671.768711, 5946341.148031)) - addPoint(Point(-9398250.415891, 5922088.336339)) - addPoint(Point(-9419269.519357, 5855797.317714)) - addPoint(Point(-9467775.142741, 5858222.598884)) - addPoint(Point(-9462924.580403, 5902686.086985)) - addPoint(Point(-9598740.325877, 5884092.264688)) - addPoint(Point(-9643203.813979, 5845287.765981)) - addPoint(Point(-9739406.633691, 5879241.702350)) - addPoint(Point(-9783061.694736, 5922896.763395)) - addPoint(Point(-9844502.151022, 5936640.023354)) - addPoint(Point(-9773360.570059, 6019099.583107)) - addPoint(Point(-9883306.649729, 5968977.105610)) - addPoint(Point(-9957681.938918, 5912387.211662)) - addPoint(Point(-10055501.612742, 5871965.858842)) - addPoint(Point(-10116942.069028, 5884092.264688)) - addPoint(Point(-10111283.079633, 5933406.315128)) - addPoint(Point(-10214761.742852, 5888134.399970)) - addPoint(Point(-10254374.668616, 5901877.659929)) - }.toGeometry() - } - - private val borderPolyline by lazy { - PolylineBuilder(SpatialReference.webMercator()) { - addPoint(Point(-9981328.687124, 6111053.281447)) - addPoint(Point(-9946518.044066, 6102350.620682)) - addPoint(Point(-9872545.427566, 6152390.920079)) - addPoint(Point(-9838822.617103, 6157830.083057)) - addPoint(Point(-9446115.050097, 5927209.572793)) - addPoint(Point(-9430885.393759, 5876081.440801)) - addPoint(Point(-9415655.737420, 5860851.784463)) - }.toGeometry() - } +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) - // set up data binding for the activity - val activityMainBinding: CutGeometryActivityMainBinding = - DataBindingUtil.setContentView(this, R.layout.cut_geometry_activity_main) - val mapView = activityMainBinding.mapView - lifecycle.addObserver(mapView) - val cutButton = activityMainBinding.cutButton - val resetButton = activityMainBinding.resetButton - - // set the map to be displayed in this view - mapView.map = ArcGISMap(BasemapStyle.ArcGISTopographic) - - // create a graphic overlay - val graphicsOverlay = GraphicsOverlay() - mapView.graphicsOverlays.add(graphicsOverlay) - - val (polygonGraphic, polylineGraphic) = createGraphics(graphicsOverlay, mapView) - - cutButton.setOnClickListener { - // cut the graphic along the polyline to create 2 graphic parts - polygonGraphic.geometry?.let { graphicGeometry -> - val parts = GeometryEngine.tryCut( - graphicGeometry, - polylineGraphic.geometry as Polyline - ) - - // create graphics for the US and Canada sides - val canadaSide = Graphic( - parts[0], SimpleFillSymbol( - SimpleFillSymbolStyle.BackwardDiagonal, - Color.green, SimpleLineSymbol(SimpleLineSymbolStyle.Null, Color.blue, 0F) - ) - ) - val usSide = Graphic( - parts[1], SimpleFillSymbol( - SimpleFillSymbolStyle.ForwardDiagonal, - Color.yellow, SimpleLineSymbol(SimpleLineSymbolStyle.Null, Color.blue, 0F) - ) - ) - // add the graphics to the graphics overlay - graphicsOverlay.graphics.addAll(listOf(canadaSide, usSide)) - - // swap button state - cutButton.isEnabled = false - resetButton.isEnabled = true + setContent { + SampleAppTheme { + CutGeometryApp() } } - - resetButton.setOnClickListener { - // clear existing graphics - graphicsOverlay.graphics.clear() - - // recreate original graphics - createGraphics(graphicsOverlay, mapView) - - // swap button state - cutButton.isEnabled = true - resetButton.isEnabled = false - } - } - /** - * Create polygon and polyline graphics. - * - * @return polygon and polyline graphics - */ - private fun createGraphics( - graphicsOverlay: GraphicsOverlay, - mapView: MapView - ): Pair { - // create a blue polygon graphic to cut - val polygonGraphic = Graphic( - lakeSuperiorPolygon, - SimpleFillSymbol( - SimpleFillSymbolStyle.Solid, Color(R.color.transparentBlue), - SimpleLineSymbol(SimpleLineSymbolStyle.Solid, Color.blue, 2F) - ) - ) - graphicsOverlay.graphics.add(polygonGraphic) - - // create a red polyline graphic to cut the polygon - val polylineGraphic = Graphic( - borderPolyline, SimpleLineSymbol( - SimpleLineSymbolStyle.Dot, - Color.red, 3F + @Composable + private fun CutGeometryApp() { + Surface(color = MaterialTheme.colorScheme.background) { + CutGeometryScreen( + sampleName = getString(R.string.cut_geometry_app_name) ) - ) - graphicsOverlay.graphics.add(polylineGraphic) - // zoom to show the polygon graphic - polygonGraphic.geometry?.let { graphicGeometry -> - mapView.setViewpoint(Viewpoint(graphicGeometry)) } - return Pair(polygonGraphic, polylineGraphic) } - - private val Color.Companion.blue: Color - get() { - return fromRgba(0, 0, 255, 255) - } } diff --git a/samples/cut-geometry/src/main/java/com/esri/arcgismaps/sample/cutgeometry/components/CutGeometryViewModel.kt b/samples/cut-geometry/src/main/java/com/esri/arcgismaps/sample/cutgeometry/components/CutGeometryViewModel.kt new file mode 100644 index 000000000..c7a213596 --- /dev/null +++ b/samples/cut-geometry/src/main/java/com/esri/arcgismaps/sample/cutgeometry/components/CutGeometryViewModel.kt @@ -0,0 +1,252 @@ +/* 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.cutgeometry.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.Color +import com.arcgismaps.geometry.GeometryEngine +import com.arcgismaps.geometry.Point +import com.arcgismaps.geometry.Polygon +import com.arcgismaps.geometry.PolygonBuilder +import com.arcgismaps.geometry.Polyline +import com.arcgismaps.geometry.PolylineBuilder +import com.arcgismaps.geometry.SpatialReference +import com.arcgismaps.mapping.ArcGISMap +import com.arcgismaps.mapping.BasemapStyle +import com.arcgismaps.mapping.Viewpoint +import com.arcgismaps.mapping.symbology.SimpleFillSymbol +import com.arcgismaps.mapping.symbology.SimpleFillSymbolStyle +import com.arcgismaps.mapping.symbology.SimpleLineSymbol +import com.arcgismaps.mapping.symbology.SimpleLineSymbolStyle +import com.arcgismaps.mapping.view.Graphic +import com.arcgismaps.mapping.view.GraphicsOverlay +import com.arcgismaps.toolkit.geoviewcompose.MapViewProxy +import com.esri.arcgismaps.sample.cutgeometry.R +import com.esri.arcgismaps.sample.sampleslib.components.MessageDialogViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch + +class CutGeometryViewModel(application: Application) : AndroidViewModel(application) { + + // create a map with the topographic basemap style + val arcGISMap by mutableStateOf( + ArcGISMap(BasemapStyle.ArcGISTopographic).apply { + initialViewpoint = Viewpoint( + latitude = 39.8, + longitude = -98.6, + scale = 10e7 + ) + } + ) + + // create a MapViewProxy to interact with the MapView + val mapViewProxy = MapViewProxy() + + // get a polygon corresponding to Lake Superior + private val lakeSuperiorPolygon = makeLakeSuperior() + + // get a polyline that divides Lake Superior into a Canada side and US side + private val borderPolyline = makeBorderPolyline() + + // create a graphic for the polygon representing Lake Superior + private val polygonGraphic = Graphic( + geometry = lakeSuperiorPolygon, + symbol = SimpleFillSymbol( + style = SimpleFillSymbolStyle.Solid, + color = Color(R.color.transparentBlue), + outline = SimpleLineSymbol( + style = SimpleLineSymbolStyle.Solid, + color = Color.blue, + width = 2F + ) + ) + ) + + // create a graphic for the cut line + private val polylineGraphic = Graphic( + geometry = borderPolyline, + symbol = SimpleLineSymbol( + style = SimpleLineSymbolStyle.Dot, + color = Color.red, + width = 3F + ) + ) + + // create a state flow to handle the reset button + private val _isResetButtonEnabled = MutableStateFlow(false) + val isResetButtonEnabled = _isResetButtonEnabled.asStateFlow() + + // create a state flow to handle the cut button + private val _isCutButtonEnabled = MutableStateFlow(false) + val isCutButtonEnabled = _isCutButtonEnabled.asStateFlow() + + // create a graphic overlay + val graphicsOverlay = GraphicsOverlay() + + // create a message dialog view model for handling error messages + val messageDialogVM = MessageDialogViewModel() + + init { + viewModelScope.launch { + arcGISMap.load().onFailure { error -> + messageDialogVM.showMessageDialog( + title = "Failed to load map", + description = error.message.toString() + ) + }.onSuccess { + graphicsOverlay.graphics.add(polygonGraphic) + graphicsOverlay.graphics.add(polylineGraphic) + polygonGraphic.geometry?.let { polygonToCut -> + mapViewProxy.setViewpoint(Viewpoint(polygonToCut)) + } + _isCutButtonEnabled.value = true + } + } + } + + /** + * Clear the current graphics, then re-add the graphics for Lake Superior and the cut polyline. + */ + fun resetGeometry() { + graphicsOverlay.graphics.clear() + graphicsOverlay.graphics.add(polygonGraphic) + graphicsOverlay.graphics.add(polylineGraphic) + polygonGraphic.geometry?.let { polygonToCut -> + mapViewProxy.setViewpoint(Viewpoint(polygonToCut)) + } + + _isResetButtonEnabled.value = false + _isCutButtonEnabled.value = true + } + + /** + * Cut the Lake Superior graphic into a US side and Canada side using the cut polyline + * and then add the resulting graphics to the graphics overlay. + */ + fun cutGeometry() { + polygonGraphic.geometry?.let { graphicGeometry -> + val parts = GeometryEngine.tryCut( + geometry = graphicGeometry, + cutter = polylineGraphic.geometry as Polyline + ) + + // create graphics for the US and Canada sides + val canadaSide = Graphic( + geometry = parts[0], + symbol = SimpleFillSymbol( + style = SimpleFillSymbolStyle.BackwardDiagonal, + color = Color.green, + outline = SimpleLineSymbol( + style = SimpleLineSymbolStyle.Null, + color = Color.blue, + width = 0F + ) + ) + ) + val usSide = Graphic( + geometry = parts[1], + symbol = SimpleFillSymbol( + style = SimpleFillSymbolStyle.ForwardDiagonal, + color = Color.yellow, + outline = SimpleLineSymbol( + style = SimpleLineSymbolStyle.Null, + color = Color.blue, + width = 0F + ) + ) + ) + // add the graphics to the graphics overlay + graphicsOverlay.graphics.addAll(listOf(canadaSide, usSide)) + + // update button state + _isCutButtonEnabled.value = false + _isResetButtonEnabled.value = true + } + } + + /** + * Define a blue color for polygon boundary. + */ + private val Color.Companion.blue: Color + get() { + return fromRgba( + r = 0, + g = 0, + b = 255, + a = 255 + ) + } + + /** + * Create a polygon corresponding to Lake Superior. + */ + private fun makeLakeSuperior() : Polygon { + return PolygonBuilder(SpatialReference.webMercator()) { + addPoint(Point(x = -10254374.668616, y = 5908345.076380)) + addPoint(Point(x = -10178382.525314, y = 5971402.386779)) + addPoint(Point(x = -10118558.923141, y = 6034459.697178)) + addPoint(Point(x = -9993252.729399, y = 6093474.872295)) + addPoint(Point(x = -9882498.222673, y = 6209888.368416)) + addPoint(Point(x = -9821057.766387, y = 6274562.532928)) + addPoint(Point(x = -9690092.583250, y = 6241417.023616)) + addPoint(Point(x = -9605207.742329, y = 6206654.660191)) + addPoint(Point(x = -9564786.389509, y = 6108834.986367)) + addPoint(Point(x = -9449989.747500, y = 6095091.726408)) + addPoint(Point(x = -9462116.153346, y = 6044160.821855)) + addPoint(Point(x = -9417652.665244, y = 5985145.646738)) + addPoint(Point(x = -9438671.768711, y = 5946341.148031)) + addPoint(Point(x = -9398250.415891, y = 5922088.336339)) + addPoint(Point(x = -9419269.519357, y = 5855797.317714)) + addPoint(Point(x = -9467775.142741, y = 5858222.598884)) + addPoint(Point(x = -9462924.580403, y = 5902686.086985)) + addPoint(Point(x = -9598740.325877, y = 5884092.264688)) + addPoint(Point(x = -9643203.813979, y = 5845287.765981)) + addPoint(Point(x = -9739406.633691, y = 5879241.702350)) + addPoint(Point(x = -9783061.694736, y = 5922896.763395)) + addPoint(Point(x = -9844502.151022, y = 5936640.023354)) + addPoint(Point(x = -9773360.570059, y = 6019099.583107)) + addPoint(Point(x = -9883306.649729, y = 5968977.105610)) + addPoint(Point(x = -9957681.938918, y = 5912387.211662)) + addPoint(Point(x = -10055501.612742, y = 5871965.858842)) + addPoint(Point(x = -10116942.069028, y = 5884092.264688)) + addPoint(Point(x = -10111283.079633, y = 5933406.315128)) + addPoint(Point(x = -10214761.742852, y = 5888134.399970)) + addPoint(Point(x = -10254374.668616, y = 5901877.659929)) + }.toGeometry() + } + + /** + * Create a polyline corresponding to the US/Canada border over Lake Superior. + */ + private fun makeBorderPolyline() : Polyline { + return PolylineBuilder(SpatialReference.webMercator()) { + addPoint(Point(x = -9981328.687124, y = 6111053.281447)) + addPoint(Point(x = -9946518.044066, y = 6102350.620682)) + addPoint(Point(x = -9872545.427566, y = 6152390.920079)) + addPoint(Point(x = -9838822.617103, y = 6157830.083057)) + addPoint(Point(x = -9446115.050097, y = 5927209.572793)) + addPoint(Point(x = -9430885.393759, y = 5876081.440801)) + addPoint(Point(x = -9415655.737420, y = 5860851.784463)) + }.toGeometry() + } + +} diff --git a/samples/cut-geometry/src/main/java/com/esri/arcgismaps/sample/cutgeometry/screens/CutGeometryScreen.kt b/samples/cut-geometry/src/main/java/com/esri/arcgismaps/sample/cutgeometry/screens/CutGeometryScreen.kt new file mode 100644 index 000000000..6ca1d0bff --- /dev/null +++ b/samples/cut-geometry/src/main/java/com/esri/arcgismaps/sample/cutgeometry/screens/CutGeometryScreen.kt @@ -0,0 +1,105 @@ +/* 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.cutgeometry.screens + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Button +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import androidx.lifecycle.viewmodel.compose.viewModel +import com.arcgismaps.toolkit.geoviewcompose.MapView +import com.esri.arcgismaps.sample.cutgeometry.R +import com.esri.arcgismaps.sample.cutgeometry.components.CutGeometryViewModel +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 CutGeometryScreen(sampleName: String) { + val mapViewModel: CutGeometryViewModel = viewModel() + val isResetButtonEnabled by mapViewModel.isResetButtonEnabled.collectAsStateWithLifecycle() + val isCutButtonEnabled by mapViewModel.isCutButtonEnabled.collectAsStateWithLifecycle() + Scaffold( + topBar = { SampleTopAppBar(title = sampleName) }, + content = { + Column( + modifier = Modifier + .fillMaxSize() + .padding(it), + ) { + MapView( + modifier = Modifier + .fillMaxSize() + .weight(1f), + arcGISMap = mapViewModel.arcGISMap, + graphicsOverlays = listOf(mapViewModel.graphicsOverlay), + mapViewProxy = mapViewModel.mapViewProxy + ) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.Center + ) { + Button( + modifier = Modifier.padding(12.dp), + enabled = isResetButtonEnabled, + onClick = { + mapViewModel.resetGeometry() + } + ) { + Text( + text = stringResource(R.string.reset_button_text) + ) + } + Button( + modifier = Modifier.padding(12.dp), + enabled = isCutButtonEnabled, + onClick = { + mapViewModel.cutGeometry() + } + ) { + Text( + text = stringResource(R.string.cut_geometry_button_text) + ) + } + } + + mapViewModel.messageDialogVM.apply { + if (dialogStatus) { + MessageDialog( + title = messageTitle, + description = messageDescription, + onDismissRequest = ::dismissDialog + ) + } + } + } + } + ) +} diff --git a/samples/cut-geometry/src/main/res/layout/cut_geometry_activity_main.xml b/samples/cut-geometry/src/main/res/layout/cut_geometry_activity_main.xml deleted file mode 100644 index 719791393..000000000 --- a/samples/cut-geometry/src/main/res/layout/cut_geometry_activity_main.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/samples/cut-geometry/src/main/res/values/strings.xml b/samples/cut-geometry/src/main/res/values/strings.xml index 6e2a36af5..6611c2449 100644 --- a/samples/cut-geometry/src/main/res/values/strings.xml +++ b/samples/cut-geometry/src/main/res/values/strings.xml @@ -1,5 +1,5 @@ Cut geometry - Cut geometry Reset + Cut geometry