Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Hook up back pressed dispatcher for geo poly UI
  • Loading branch information
seadowg committed Dec 17, 2025
commit 72d9667ccf2628ee8d1ce4820fc5fa72043c418d
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.odk.collect.android.widgets.utilities

import androidx.activity.ComponentDialog
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.map
import org.javarosa.core.model.Constants
Expand Down Expand Up @@ -50,6 +51,7 @@ class GeoPolyDialogFragment(viewModelFactory: ViewModelProvider.Factory) :
val inputPolygon = GeoPolyUtils.parseGeometry(answer?.value as String?)

return GeoPolyFragment(
(requireDialog() as ComponentDialog).onBackPressedDispatcher,
outputMode,
prompt.isReadOnly,
retainMockAccuracy,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import android.content.Context
import android.os.Bundle
import android.view.View
import androidx.activity.OnBackPressedCallback
import androidx.activity.OnBackPressedDispatcher
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentContainerView
Expand Down Expand Up @@ -41,6 +42,7 @@ import java.util.concurrent.TimeUnit
import javax.inject.Inject

class GeoPolyFragment @JvmOverloads constructor(
val onBackPressedDispatcher: OnBackPressedDispatcher,
val outputMode: OutputMode = OutputMode.GEOTRACE,
val readOnly: Boolean = false,
val retainMockAccuracy: Boolean = false,
Expand Down Expand Up @@ -123,7 +125,6 @@ class GeoPolyFragment @JvmOverloads constructor(
.build()

requireLocationPermissions(requireActivity())
requireActivity().onBackPressedDispatcher.addCallback(onBackPressedCallback)
}

override fun onCreate(savedInstanceState: Bundle?) {
Expand Down Expand Up @@ -157,6 +158,8 @@ class GeoPolyFragment @JvmOverloads constructor(
snackbar.dismiss()
}
}

onBackPressedDispatcher.addCallback(viewLifecycleOwner, onBackPressedCallback)
}

override fun onSaveInstanceState(state: Bundle) {
Expand Down
129 changes: 100 additions & 29 deletions geo/src/test/java/org/odk/collect/geo/geopoly/GeoPolyFragmentTest.kt
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
package org.odk.collect.geo.geopoly

import android.app.Application
import android.os.Bundle
import androidx.fragment.app.FragmentResultListener
import androidx.activity.OnBackPressedDispatcher
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.MutableLiveData
import androidx.test.core.app.ApplicationProvider
import androidx.test.espresso.Espresso
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.assertion.ViewAssertions.matches
Expand Down Expand Up @@ -105,7 +103,7 @@ class GeoPolyFragmentTest {
val scenario = fragmentLauncherRule.launchInContainer(
GeoPolyFragment::class.java,
factory = FragmentFactoryBuilder()
.forClass(GeoPolyFragment::class) { GeoPolyFragment(OutputMode.GEOTRACE) }
.forClass(GeoPolyFragment::class) { GeoPolyFragment(OnBackPressedDispatcher()) }
.build()
)
mapFragment.ready()
Expand All @@ -120,7 +118,7 @@ class GeoPolyFragmentTest {
fragmentLauncherRule.launchInContainer(
GeoPolyFragment::class.java,
factory = FragmentFactoryBuilder()
.forClass(GeoPolyFragment::class) { GeoPolyFragment(OutputMode.GEOTRACE) }
.forClass(GeoPolyFragment::class) { GeoPolyFragment(OnBackPressedDispatcher()) }
.build()
)

Expand All @@ -134,7 +132,7 @@ class GeoPolyFragmentTest {
fragmentLauncherRule.launchInContainer(
GeoPolyFragment::class.java,
factory = FragmentFactoryBuilder()
.forClass(GeoPolyFragment::class) { GeoPolyFragment(OutputMode.GEOTRACE) }
.forClass(GeoPolyFragment::class) { GeoPolyFragment(OnBackPressedDispatcher()) }
.build()
)

Expand All @@ -151,7 +149,7 @@ class GeoPolyFragmentTest {
GeoPolyFragment::class.java,
factory = FragmentFactoryBuilder()
.forClass(GeoPolyFragment::class) {
GeoPolyFragment(OutputMode.GEOTRACE, false, false, polygon)
GeoPolyFragment(OnBackPressedDispatcher(), inputPolygon = polygon)
}
.build()
)
Expand All @@ -172,7 +170,11 @@ class GeoPolyFragmentTest {
GeoPolyFragment::class.java,
factory = FragmentFactoryBuilder()
.forClass(GeoPolyFragment::class) {
GeoPolyFragment(OutputMode.GEOSHAPE, false, false, polygon)
GeoPolyFragment(
OnBackPressedDispatcher(),
OutputMode.GEOSHAPE,
inputPolygon = polygon
)
}
.build()
)
Expand All @@ -193,7 +195,11 @@ class GeoPolyFragmentTest {
GeoPolyFragment::class.java,
factory = FragmentFactoryBuilder()
.forClass(GeoPolyFragment::class) {
GeoPolyFragment(OutputMode.GEOSHAPE, false, false, emptyList())
GeoPolyFragment(
OnBackPressedDispatcher(),
OutputMode.GEOSHAPE,
inputPolygon = emptyList()
)
}
.build()
)
Expand All @@ -206,18 +212,17 @@ class GeoPolyFragmentTest {

@Test
fun whenPolygonExtraPresent_andPolyIsEmpty_pressingBack_setsCancelledResult() {
val onBackPressedDispatcher = OnBackPressedDispatcher()
val scenario = fragmentLauncherRule.launchInContainer(
GeoPolyFragment::class.java,
factory = FragmentFactoryBuilder()
.forClass(GeoPolyFragment::class) {
GeoPolyFragment(OutputMode.GEOTRACE, false, false, emptyList())
}
.forClass(GeoPolyFragment::class) { GeoPolyFragment(onBackPressedDispatcher = onBackPressedDispatcher) }
.build()
)

mapFragment.ready()

val resultListener = mock<FragmentResultListener>()
val resultListener = FragmentResultRecorder()
scenario.onFragment {
it.parentFragmentManager.setFragmentResultListener(
GeoPolyFragment.REQUEST_GEOPOLY,
Expand All @@ -226,8 +231,10 @@ class GeoPolyFragmentTest {
)
}

Espresso.pressBack()
verify(resultListener).onFragmentResult(GeoPolyFragment.REQUEST_GEOPOLY, Bundle.EMPTY)
onBackPressedDispatcher.onBackPressed()
val result = resultListener.result
assertThat(result!!.first, equalTo(GeoPolyFragment.REQUEST_GEOPOLY))
assertThat(result.second.isEmpty, equalTo(true))
}

@Test
Expand All @@ -236,7 +243,13 @@ class GeoPolyFragmentTest {
GeoPolyFragment::class.java,
factory = FragmentFactoryBuilder()
.forClass(GeoPolyFragment::class) {
GeoPolyFragment(OutputMode.GEOTRACE, false, true, emptyList())
GeoPolyFragment(
OnBackPressedDispatcher(),
OutputMode.GEOTRACE,
false,
true,
emptyList()
)
}
.build()
)
Expand All @@ -252,7 +265,13 @@ class GeoPolyFragmentTest {
GeoPolyFragment::class.java,
factory = FragmentFactoryBuilder()
.forClass(GeoPolyFragment::class) {
GeoPolyFragment(OutputMode.GEOTRACE, false, false, emptyList())
GeoPolyFragment(
OnBackPressedDispatcher(),
OutputMode.GEOTRACE,
false,
false,
emptyList()
)
}
.build()
)
Expand All @@ -267,7 +286,7 @@ class GeoPolyFragmentTest {
fragmentLauncherRule.launchInContainer(
GeoPolyFragment::class.java,
factory = FragmentFactoryBuilder()
.forClass(GeoPolyFragment::class) { GeoPolyFragment(OutputMode.GEOTRACE) }
.forClass(GeoPolyFragment::class) { GeoPolyFragment(OnBackPressedDispatcher()) }
.build()
)

Expand All @@ -284,7 +303,7 @@ class GeoPolyFragmentTest {
fragmentLauncherRule.launchInContainer(
GeoPolyFragment::class.java,
factory = FragmentFactoryBuilder()
.forClass(GeoPolyFragment::class) { GeoPolyFragment(OutputMode.GEOTRACE) }
.forClass(GeoPolyFragment::class) { GeoPolyFragment(OnBackPressedDispatcher()) }
.build()
)

Expand All @@ -303,7 +322,13 @@ class GeoPolyFragmentTest {
GeoPolyFragment::class.java,
factory = FragmentFactoryBuilder()
.forClass(GeoPolyFragment::class) {
GeoPolyFragment(OutputMode.GEOTRACE, false, false, polyline)
GeoPolyFragment(
OnBackPressedDispatcher(),
OutputMode.GEOTRACE,
false,
false,
polyline
)
}
.build()
)
Expand All @@ -323,7 +348,13 @@ class GeoPolyFragmentTest {
GeoPolyFragment::class.java,
factory = FragmentFactoryBuilder()
.forClass(GeoPolyFragment::class) {
GeoPolyFragment(OutputMode.GEOTRACE, true, false, polygon)
GeoPolyFragment(
OnBackPressedDispatcher(),
OutputMode.GEOTRACE,
true,
false,
polygon
)
}
.build()
)
Expand All @@ -343,7 +374,13 @@ class GeoPolyFragmentTest {
GeoPolyFragment::class.java,
factory = FragmentFactoryBuilder()
.forClass(GeoPolyFragment::class) {
GeoPolyFragment(OutputMode.GEOTRACE, false, false, polyline)
GeoPolyFragment(
OnBackPressedDispatcher(),
OutputMode.GEOTRACE,
false,
false,
polyline
)
}
.build()
)
Expand All @@ -360,7 +397,13 @@ class GeoPolyFragmentTest {
GeoPolyFragment::class.java,
factory = FragmentFactoryBuilder()
.forClass(GeoPolyFragment::class) {
GeoPolyFragment(OutputMode.GEOTRACE, true, false, polygon)
GeoPolyFragment(
OnBackPressedDispatcher(),
OutputMode.GEOTRACE,
true,
false,
polygon
)
}
.build()
)
Expand All @@ -375,7 +418,13 @@ class GeoPolyFragmentTest {
GeoPolyFragment::class.java,
factory = FragmentFactoryBuilder()
.forClass(GeoPolyFragment::class) {
GeoPolyFragment(OutputMode.GEOTRACE, false, true, emptyList())
GeoPolyFragment(
OnBackPressedDispatcher(),
OutputMode.GEOTRACE,
false,
true,
emptyList()
)
}
.build()
)
Expand All @@ -386,7 +435,13 @@ class GeoPolyFragmentTest {
GeoPolyFragment::class.java,
factory = FragmentFactoryBuilder()
.forClass(GeoPolyFragment::class) {
GeoPolyFragment(OutputMode.GEOTRACE, false, false, emptyList())
GeoPolyFragment(
OnBackPressedDispatcher(),
OutputMode.GEOTRACE,
false,
false,
emptyList()
)
}
.build()
)
Expand All @@ -399,7 +454,7 @@ class GeoPolyFragmentTest {
val scenario = fragmentLauncherRule.launchInContainer(
GeoPolyFragment::class.java,
factory = FragmentFactoryBuilder()
.forClass(GeoPolyFragment::class) { GeoPolyFragment(OutputMode.GEOTRACE) }
.forClass(GeoPolyFragment::class) { GeoPolyFragment(OnBackPressedDispatcher()) }
.build()
)
mapFragment.ready()
Expand All @@ -416,7 +471,12 @@ class GeoPolyFragmentTest {
fragmentLauncherRule.launchInContainer(
GeoPolyFragment::class.java,
factory = FragmentFactoryBuilder()
.forClass(GeoPolyFragment::class) { GeoPolyFragment(invalidMessage = invalidMessage) }
.forClass(GeoPolyFragment::class) {
GeoPolyFragment(
OnBackPressedDispatcher(),
invalidMessage = invalidMessage
)
}
.build()
)

Expand All @@ -433,7 +493,12 @@ class GeoPolyFragmentTest {
val scenario = fragmentLauncherRule.launchInContainer(
GeoPolyFragment::class.java,
factory = FragmentFactoryBuilder()
.forClass(GeoPolyFragment::class) { GeoPolyFragment(OutputMode.GEOTRACE) }
.forClass(GeoPolyFragment::class) {
GeoPolyFragment(
OnBackPressedDispatcher(),
OutputMode.GEOTRACE
)
}
.build()
)

Expand Down Expand Up @@ -472,7 +537,12 @@ class GeoPolyFragmentTest {
val scenario = fragmentLauncherRule.launchInContainer(
GeoPolyFragment::class.java,
factory = FragmentFactoryBuilder()
.forClass(GeoPolyFragment::class) { GeoPolyFragment(OutputMode.GEOSHAPE) }
.forClass(GeoPolyFragment::class) {
GeoPolyFragment(
OnBackPressedDispatcher(),
OutputMode.GEOSHAPE
)
}
.build()
)

Expand Down Expand Up @@ -521,6 +591,7 @@ class GeoPolyFragmentTest {
factory = FragmentFactoryBuilder()
.forClass(GeoPolyFragment::class) {
GeoPolyFragment(
OnBackPressedDispatcher(),
inputPolygon =
listOf(
MapPoint(0.0, 0.0),
Expand Down