From 7e8d79dd9f681dd646d0fdcbede18c30bd09c251 Mon Sep 17 00:00:00 2001 From: andreia Date: Wed, 18 Mar 2026 14:04:13 +0100 Subject: [PATCH] fix delete loi called on every started lifecycle event --- .../HomeScreenMapContainerFragment.kt | 2 +- .../HomeScreenMapContainerViewModel.kt | 9 ++++++--- .../HomeScreenMapContainerViewModelTest.kt | 15 ++++++++++++++- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/groundplatform/android/ui/home/mapcontainer/HomeScreenMapContainerFragment.kt b/app/src/main/java/org/groundplatform/android/ui/home/mapcontainer/HomeScreenMapContainerFragment.kt index a2d5fee41d..435a798444 100644 --- a/app/src/main/java/org/groundplatform/android/ui/home/mapcontainer/HomeScreenMapContainerFragment.kt +++ b/app/src/main/java/org/groundplatform/android/ui/home/mapcontainer/HomeScreenMapContainerFragment.kt @@ -124,7 +124,7 @@ class HomeScreenMapContainerFragment : AbstractMapContainerFragment() { /** Invoked when user clicks delete on a site. */ private fun onDeleteSite(loiData: SelectedLoiSheetData) { - launchWhenStarted { mapContainerViewModel.deleteLoi(loiData.loi) } + mapContainerViewModel.deleteLoi(loiData.loi) } override fun onCreateView( diff --git a/app/src/main/java/org/groundplatform/android/ui/home/mapcontainer/HomeScreenMapContainerViewModel.kt b/app/src/main/java/org/groundplatform/android/ui/home/mapcontainer/HomeScreenMapContainerViewModel.kt index c1704dec18..f38696b8a6 100644 --- a/app/src/main/java/org/groundplatform/android/ui/home/mapcontainer/HomeScreenMapContainerViewModel.kt +++ b/app/src/main/java/org/groundplatform/android/ui/home/mapcontainer/HomeScreenMapContainerViewModel.kt @@ -36,6 +36,7 @@ import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.launch import org.groundplatform.android.common.Constants.CLUSTERING_ZOOM_THRESHOLD import org.groundplatform.android.data.local.LocalValueStore import org.groundplatform.android.model.Survey @@ -256,9 +257,11 @@ internal constructor( /** * Deletes the given LOI and all associated data. This should only be called for free-form jobs. */ - suspend fun deleteLoi(loi: LocationOfInterest) { - loiRepository.deleteLoi(loi) - selectLocationOfInterest(null) + fun deleteLoi(loi: LocationOfInterest) { + viewModelScope.launch { + loiRepository.deleteLoi(loi) + selectLocationOfInterest(null) + } } private fun getLocationOfInterestFeatures(survey: Survey): Flow> = diff --git a/app/src/test/java/org/groundplatform/android/ui/home/mapcontainer/HomeScreenMapContainerViewModelTest.kt b/app/src/test/java/org/groundplatform/android/ui/home/mapcontainer/HomeScreenMapContainerViewModelTest.kt index 2d9e744112..dfb7811472 100644 --- a/app/src/test/java/org/groundplatform/android/ui/home/mapcontainer/HomeScreenMapContainerViewModelTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/home/mapcontainer/HomeScreenMapContainerViewModelTest.kt @@ -45,9 +45,11 @@ import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock +import org.mockito.Mockito.verify import org.mockito.Mockito.`when` import org.robolectric.RobolectricTestRunner +@OptIn(ExperimentalCoroutinesApi::class) @HiltAndroidTest @RunWith(RobolectricTestRunner::class) class HomeScreenMapContainerViewModelTest : BaseHiltTest() { @@ -59,7 +61,6 @@ class HomeScreenMapContainerViewModelTest : BaseHiltTest() { @Inject lateinit var activateSurvey: ActivateSurveyUseCase @BindValue @Mock lateinit var loiRepository: LocationOfInterestRepository - @OptIn(ExperimentalCoroutinesApi::class) @Before override fun setUp() { super.setUp() @@ -90,6 +91,18 @@ class HomeScreenMapContainerViewModelTest : BaseHiltTest() { .isEqualTo(listOf(AdHocDataCollectionButtonData(canCollectData = true, ADHOC_JOB))) } + @Test + fun `deleteLoi deletes the loi and deselects it`() = runWithTestDispatcher { + viewModel.onFeatureClicked(setOf(LOCATION_OF_INTEREST_FEATURE)) + assertThat(viewModel.featureClicked.value).isNotNull() + + viewModel.deleteLoi(LOCATION_OF_INTEREST) + advanceUntilIdle() + + verify(loiRepository).deleteLoi(LOCATION_OF_INTEREST) + assertThat(viewModel.featureClicked.value).isNull() + } + companion object { private val BOUNDS = Bounds(Coordinates(-20.0, -20.0), Coordinates(-10.0, -10.0)) val CAMERA_POSITION =