diff --git a/samples/identify-graphics/src/main/java/com/esri/arcgismaps/sample/identifygraphics/components/IdentifyGraphicsViewModel.kt b/samples/identify-graphics/src/main/java/com/esri/arcgismaps/sample/identifygraphics/components/IdentifyGraphicsViewModel.kt index da59743f6..166f53f89 100644 --- a/samples/identify-graphics/src/main/java/com/esri/arcgismaps/sample/identifygraphics/components/IdentifyGraphicsViewModel.kt +++ b/samples/identify-graphics/src/main/java/com/esri/arcgismaps/sample/identifygraphics/components/IdentifyGraphicsViewModel.kt @@ -37,6 +37,7 @@ import com.arcgismaps.mapping.view.Graphic import com.arcgismaps.mapping.view.GraphicsOverlay import com.arcgismaps.mapping.view.ScreenCoordinate import com.arcgismaps.toolkit.geoviewcompose.MapViewProxy +import com.esri.arcgismaps.sample.identifygraphics.screens.MessageDialogState import com.esri.arcgismaps.sample.sampleslib.components.MessageDialogViewModel import kotlinx.coroutines.launch @@ -76,14 +77,14 @@ class IdentifyGraphicsViewModel(app: Application) : AndroidViewModel(app) { val graphicsOverlays = listOf(graphicsOverlay) - // Dialog view model to present error messages. - val messageDialogVM = MessageDialogViewModel() + // Dialog state to present error messages. + val messageDialogState = MessageDialogState() init { // Load the map and handle any load failures. viewModelScope.launch { arcGISMap.load().onFailure { error -> - messageDialogVM.showMessageDialog(error) + messageDialogState.showError(error) } } } @@ -109,12 +110,12 @@ class IdentifyGraphicsViewModel(app: Application) : AndroidViewModel(app) { "No graphics at tapped location." } // Show an alert dialog with the identify result. - messageDialogVM.showMessageDialog( + messageDialogState.showMessage( title = "Identify Result", description = message ) }.onFailure { error -> - messageDialogVM.showMessageDialog(error) + messageDialogState.showError(error) } } } diff --git a/samples/identify-graphics/src/main/java/com/esri/arcgismaps/sample/identifygraphics/screens/IdentifyGraphicsScreen.kt b/samples/identify-graphics/src/main/java/com/esri/arcgismaps/sample/identifygraphics/screens/IdentifyGraphicsScreen.kt index 5dc60afb5..e51eaf16e 100644 --- a/samples/identify-graphics/src/main/java/com/esri/arcgismaps/sample/identifygraphics/screens/IdentifyGraphicsScreen.kt +++ b/samples/identify-graphics/src/main/java/com/esri/arcgismaps/sample/identifygraphics/screens/IdentifyGraphicsScreen.kt @@ -19,9 +19,19 @@ package com.esri.arcgismaps.sample.identifygraphics.screens import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Info +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Icon import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector import androidx.lifecycle.viewmodel.compose.viewModel import com.arcgismaps.toolkit.geoviewcompose.MapView import com.esri.arcgismaps.sample.identifygraphics.components.IdentifyGraphicsViewModel @@ -52,16 +62,58 @@ fun IdentifyGraphicsScreen(sampleName: String) { ) } - // Show a dialog if the sample encounters an error. - viewModel.messageDialogVM.apply { - if (dialogStatus) { - MessageDialog( - title = messageTitle, - description = messageDescription, - onDismissRequest = ::dismissDialog - ) - } - } + // Show a dialog if the sample needs to show a message or error. + MessageDialog( + viewModel.messageDialogState, + onDismiss = viewModel.messageDialogState::hide + ) } ) } + + +@Composable +fun MessageDialog( + state: MessageDialogState, + icon: ImageVector = Icons.Filled.Info, + onDismiss: (() -> Unit)? = null, +) { + if (!state.dialogStatus) { + return + } + AlertDialog( + onDismissRequest = { onDismiss?.invoke() }, + icon = { Icon(imageVector = icon, contentDescription = null) }, + title = { Text(state.title) }, + text = { Text(state.description) }, + confirmButton = { + TextButton(onClick = { onDismiss?.invoke() }) { + Text("Dismiss") + } + }, + ) +} + +class MessageDialogState() { + var dialogStatus by mutableStateOf(false) + + var title by mutableStateOf("") + + var description by mutableStateOf("") + + fun showError(error: Throwable) { + title = error.message ?: "Unknown error" + description = error.cause.toString() + dialogStatus = true + } + + fun showMessage(title: String, description: String = "") { + this@MessageDialogState.title = title + this@MessageDialogState.description = description + dialogStatus = true + } + + fun hide() { + dialogStatus = false + } +}