diff --git a/geo/src/main/java/org/odk/collect/geo/geopoly/GeoPolyFragment.kt b/geo/src/main/java/org/odk/collect/geo/geopoly/GeoPolyFragment.kt index 073e0779bdb..4c04cea44e8 100644 --- a/geo/src/main/java/org/odk/collect/geo/geopoly/GeoPolyFragment.kt +++ b/geo/src/main/java/org/odk/collect/geo/geopoly/GeoPolyFragment.kt @@ -242,7 +242,6 @@ class GeoPolyFragment @JvmOverloads constructor( map!!.setRetainMockAccuracy(retainMockAccuracy) map!!.setDragEndListener { viewModel.update(map!!.getPolyPoints(it)) - setChangeResult() } if (!map!!.hasCenter()) { @@ -280,6 +279,7 @@ class GeoPolyFragment @JvmOverloads constructor( } updateUi() + setChangeResult() } } @@ -395,7 +395,6 @@ class GeoPolyFragment @JvmOverloads constructor( private fun onClick(point: MapPoint) { if (inputActive && !recordingEnabled) { viewModel.add(point) - setChangeResult() } } @@ -417,7 +416,6 @@ class GeoPolyFragment @JvmOverloads constructor( private fun recordPoint(point: MapPoint?) { if (point != null && isLocationAcceptable(point)) { viewModel.add(point) - setChangeResult() } } @@ -438,14 +436,12 @@ class GeoPolyFragment @JvmOverloads constructor( private fun removeLastPoint() { if (featureId != -1) { viewModel.removeLast() - setChangeResult() } } private fun clear() { inputActive = false viewModel.update(emptyList()) - setChangeResult() } /** Updates the state of various UI widgets to reflect internal state. */ diff --git a/geo/src/test/java/org/odk/collect/geo/geopoly/GeoPolyFragmentTest.kt b/geo/src/test/java/org/odk/collect/geo/geopoly/GeoPolyFragmentTest.kt index 2a0602686df..92b1eb42f19 100644 --- a/geo/src/test/java/org/odk/collect/geo/geopoly/GeoPolyFragmentTest.kt +++ b/geo/src/test/java/org/odk/collect/geo/geopoly/GeoPolyFragmentTest.kt @@ -15,6 +15,7 @@ import androidx.test.espresso.matcher.ViewMatchers.withContentDescription import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.ext.junit.runners.AndroidJUnit4 +import kotlinx.coroutines.flow.MutableStateFlow import org.hamcrest.Matchers.equalTo import org.hamcrest.Matchers.not import org.junit.Before @@ -26,6 +27,7 @@ import org.mockito.kotlin.any import org.mockito.kotlin.eq import org.mockito.kotlin.mock import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever import org.odk.collect.androidshared.ui.FragmentFactoryBuilder import org.odk.collect.androidtest.FragmentScenarioExtensions.setFragmentResultListener import org.odk.collect.async.Scheduler @@ -36,6 +38,7 @@ import org.odk.collect.geo.R import org.odk.collect.geo.geopoly.GeoPolyFragment.OutputMode import org.odk.collect.geo.support.FakeMapFragment import org.odk.collect.geo.support.RobolectricApplication +import org.odk.collect.location.Location import org.odk.collect.location.tracker.LocationTracker import org.odk.collect.maps.MapFragment import org.odk.collect.maps.MapFragmentFactory @@ -701,6 +704,29 @@ class GeoPolyFragmentTest { ) } + @Test + fun recordingPoints_usingAutomaticMode_setsChangeResult() { + val locations = MutableStateFlow(null) + whenever(locationTracker.getLocation()).thenReturn(locations) + + val scenario = fragmentLauncherRule.launchInContainer { + GeoPolyFragment({ OnBackPressedDispatcher() }) + } + val resultListener = FragmentResultRecorder() + scenario.setFragmentResultListener(GeoPolyFragment.REQUEST_GEOPOLY, resultListener) + + startInput(R.id.automatic_mode) + locations.value = Location(1.0, 1.0, 1.0, 1f) + locations.value = Location(2.0, 2.0, 1.0, 1f) + + val result = resultListener.getAll().last() + assertThat(result.first, equalTo(GeoPolyFragment.REQUEST_GEOPOLY)) + assertThat( + result.second.getString(GeoPolyFragment.RESULT_GEOPOLY_CHANGE), + equalTo("1.0 1.0 1.0 1.0;2.0 2.0 1.0 1.0") + ) + } + private fun startInput(mode: Int? = null) { onView(withId(R.id.play)).perform(click())