Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.odk.collect.androidshared.system

import android.os.Bundle
import android.os.Parcelable
import androidx.core.os.BundleCompat

object BundleExt {

inline fun <reified T : Parcelable> Bundle.getParcelableExtraCompat(name: String): T? {
return BundleCompat.getParcelable(this, name, T::class.java)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,7 @@
import org.odk.collect.android.widgets.datetime.DateTimeWidget;
import org.odk.collect.android.widgets.datetime.pickers.CustomDatePickerDialog;
import org.odk.collect.android.widgets.datetime.pickers.CustomTimePickerDialog;
import org.odk.collect.android.widgets.geo.GeoPointMapDialogFragment;
import org.odk.collect.android.widgets.interfaces.WidgetDataReceiver;
import org.odk.collect.android.widgets.items.SelectOneFromMapDialogFragment;
import org.odk.collect.android.widgets.utilities.ExternalAppRecordingRequester;
Expand Down Expand Up @@ -451,6 +452,7 @@ public void onCreate(Bundle savedInstanceState) {
.forClass(BackgroundAudioPermissionDialogFragment.class, () -> new BackgroundAudioPermissionDialogFragment(viewModelFactory))
.forClass(SelectOneFromMapDialogFragment.class, () -> new SelectOneFromMapDialogFragment(viewModelFactory))
.forClass(GeoPolyDialogFragment.class, () -> new GeoPolyDialogFragment(viewModelFactory, scheduler))
.forClass(GeoPointMapDialogFragment.class, () -> new GeoPointMapDialogFragment(viewModelFactory))
.forClass(RangePickerDialogFragment.class, () -> new RangePickerDialogFragment(viewModelFactory))
.build());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ protected View onCreateWidgetView(Context context, FormEntryPrompt prompt, int a

binding.geoAnswerText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, answerFontSize);

binding.simpleButton.setOnClickListener(v -> geoDataRequester.requestGeoPoint(prompt, answerText, waitingForDataRegistry));
binding.simpleButton.setOnClickListener(v -> geoDataRequester.requestGeoPoint(prompt, waitingForDataRegistry));

answerText = prompt.getAnswerText();
String answerToDisplay = GeoWidgetUtils.getGeoPointAnswerToDisplay(getContext(), answerText);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ protected View onCreateWidgetView(Context context, FormEntryPrompt prompt, int a
if (prompt.isReadOnly()) {
binding.simpleButton.setVisibility(GONE);
} else {
binding.simpleButton.setOnClickListener(v -> geoDataRequester.requestGeoPoint(prompt, answerText, waitingForDataRegistry));
binding.simpleButton.setOnClickListener(v -> geoDataRequester.requestGeoPoint(prompt, waitingForDataRegistry));
}

answerText = prompt.getAnswerText();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package org.odk.collect.android.widgets.geo

import androidx.lifecycle.ViewModelProvider
import org.javarosa.core.model.data.GeoPointData
import org.javarosa.form.api.FormEntryPrompt
import org.odk.collect.android.utilities.Appearances
import org.odk.collect.android.utilities.FormEntryPromptUtils
import org.odk.collect.android.widgets.interfaces.SelectChoiceLoader
import org.odk.collect.android.widgets.utilities.BindAttributes
import org.odk.collect.android.widgets.utilities.WidgetAnswerDialogFragment
import org.odk.collect.geo.GeoUtils.parseGeometryPoint
import org.odk.collect.geo.GeoUtils.toMapPoint
import org.odk.collect.geo.geopoint.GeoPointMapFragment

class GeoPointMapDialogFragment(
viewModelFactory: ViewModelProvider.Factory
) :
WidgetAnswerDialogFragment<GeoPointMapFragment>(
GeoPointMapFragment::class,
viewModelFactory
) {

override fun onCreateFragment(
prompt: FormEntryPrompt,
selectChoiceLoader: SelectChoiceLoader
): GeoPointMapFragment {
childFragmentManager.setFragmentResultListener(
GeoPointMapFragment.REQUEST_GEOPOINT,
this
) { _, result ->
val geoPoint = result.getString(GeoPointMapFragment.RESULT_GEOPOINT)

if (geoPoint != null) {
onAnswer(geoPoint)
} else {
dismiss()
}
}

val retainMockAccuracy =
FormEntryPromptUtils.getBindAttribute(prompt, BindAttributes.ALLOW_MOCK_ACCURACY)
.toBoolean()

val inputPoint = when (val answer = prompt.answerValue) {
is GeoPointData -> answer.toMapPoint()
null -> null
else -> throw IllegalArgumentException()
}

val draggable = Appearances.hasAppearance(prompt, Appearances.PLACEMENT_MAP)
return GeoPointMapFragment(
inputPoint,
draggable,
prompt.isReadOnly,
retainMockAccuracy
)
}

private fun onAnswer(geoString: String) {
val answer = if (geoString.isBlank()) {
null
} else {
GeoPointData(parseGeometryPoint(geoString))
}

onAnswer(answer)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import org.odk.collect.android.widgets.utilities.WaitingForDataRegistry
interface GeoDataRequester {
fun requestGeoPoint(
prompt: FormEntryPrompt,
answerText: String?,
waitingForDataRegistry: WaitingForDataRegistry
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,14 @@ import org.javarosa.form.api.FormEntryPrompt
import org.odk.collect.android.utilities.Appearances
import org.odk.collect.android.utilities.ApplicationConstants
import org.odk.collect.android.utilities.FormEntryPromptUtils
import org.odk.collect.android.widgets.geo.GeoPointMapDialogFragment
import org.odk.collect.android.widgets.geo.GeoPolyDialogFragment
import org.odk.collect.android.widgets.interfaces.GeoDataRequester
import org.odk.collect.android.widgets.utilities.BindAttributes.ALLOW_MOCK_ACCURACY
import org.odk.collect.androidshared.ui.DialogFragmentUtils
import org.odk.collect.geo.Constants.EXTRA_DRAGGABLE_ONLY
import org.odk.collect.geo.Constants.EXTRA_READ_ONLY
import org.odk.collect.geo.Constants.EXTRA_RETAIN_MOCK_ACCURACY
import org.odk.collect.geo.geopoint.GeoPointActivity
import org.odk.collect.geo.geopoint.GeoPointMapActivity
import org.odk.collect.geo.geopoly.GeoPolyUtils.parseGeometry
import org.odk.collect.permissions.PermissionListener
import org.odk.collect.permissions.PermissionsProvider
import java.lang.Boolean.parseBoolean
Expand All @@ -29,7 +27,6 @@ class ActivityGeoDataRequester(

override fun requestGeoPoint(
prompt: FormEntryPrompt,
answerText: String?,
waitingForDataRegistry: WaitingForDataRegistry
) {
permissionsProvider.requestEnabledLocationPermissions(
Expand All @@ -38,50 +35,49 @@ class ActivityGeoDataRequester(
override fun granted() {
waitingForDataRegistry.waitForData(prompt.index)

val bundle = Bundle().also {
val parsedGeometry = parseGeometry(answerText)
if (parsedGeometry.isNotEmpty()) {
it.putParcelable(
GeoPointMapActivity.EXTRA_LOCATION,
parsedGeometry[0]
if (isMapsAppearance(prompt)) {
DialogFragmentUtils.showIfNotShowing(
GeoPointMapDialogFragment::class.java,
bundleOf(WidgetAnswerDialogFragment.ARG_FORM_INDEX to prompt.index),
activity.supportFragmentManager
)
} else {
val bundle = Bundle().also {
val accuracyThreshold =
FormEntryPromptUtils.getAdditionalAttribute(
prompt,
"accuracyThreshold"
)
val unacceptableAccuracyThreshold =
FormEntryPromptUtils.getAdditionalAttribute(
prompt,
"unacceptableAccuracyThreshold"
)

it.putFloat(
GeoPointActivity.EXTRA_ACCURACY_THRESHOLD,
accuracyThreshold?.toFloatOrNull() ?: DEFAULT_ACCURACY_THRESHOLD
)
}

val accuracyThreshold =
FormEntryPromptUtils.getAdditionalAttribute(prompt, "accuracyThreshold")
val unacceptableAccuracyThreshold =
FormEntryPromptUtils.getAdditionalAttribute(
prompt,
"unacceptableAccuracyThreshold"
it.putFloat(
GeoPointActivity.EXTRA_UNACCEPTABLE_ACCURACY_THRESHOLD,
unacceptableAccuracyThreshold?.toFloatOrNull()
?: DEFAULT_UNACCEPTABLE_ACCURACY_THRESHOLD
)

it.putFloat(
GeoPointActivity.EXTRA_ACCURACY_THRESHOLD,
accuracyThreshold?.toFloatOrNull() ?: DEFAULT_ACCURACY_THRESHOLD
)

it.putFloat(
GeoPointActivity.EXTRA_UNACCEPTABLE_ACCURACY_THRESHOLD,
unacceptableAccuracyThreshold?.toFloatOrNull()
?: DEFAULT_UNACCEPTABLE_ACCURACY_THRESHOLD
)
it.putBoolean(EXTRA_RETAIN_MOCK_ACCURACY, getAllowMockAccuracy(prompt))
it.putBoolean(EXTRA_READ_ONLY, prompt.isReadOnly)
}

it.putBoolean(EXTRA_RETAIN_MOCK_ACCURACY, getAllowMockAccuracy(prompt))
it.putBoolean(EXTRA_READ_ONLY, prompt.isReadOnly)
it.putBoolean(EXTRA_DRAGGABLE_ONLY, hasPlacementMapAppearance(prompt))
}
val intent = Intent(activity, GeoPointActivity::class.java).also {
it.putExtras(bundle)
}

val intent = Intent(
activity,
if (isMapsAppearance(prompt)) GeoPointMapActivity::class.java else GeoPointActivity::class.java
).also {
it.putExtras(bundle)
activity.startActivityForResult(
intent,
ApplicationConstants.RequestCodes.LOCATION_CAPTURE
)
}

activity.startActivityForResult(
intent,
ApplicationConstants.RequestCodes.LOCATION_CAPTURE
)
}
}
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ public void buttonClick_requestsGeoPoint() {
FormEntryPrompt prompt = promptWithAnswer(answer);
GeoPointMapWidget widget = createWidget(prompt);
widget.binding.simpleButton.performClick();
verify(geoDataRequester).requestGeoPoint(prompt, answer.getDisplayText(), waitingForDataRegistry);
verify(geoDataRequester).requestGeoPoint(prompt, waitingForDataRegistry);
}

@Test
Expand All @@ -196,7 +196,7 @@ public void buttonClick_requestsGeoPoint_whenAnswerIsCleared() {
widget.clearAnswer();
widget.binding.simpleButton.performClick();

verify(geoDataRequester).requestGeoPoint(prompt, null, waitingForDataRegistry);
verify(geoDataRequester).requestGeoPoint(prompt, waitingForDataRegistry);
}

@Test
Expand All @@ -206,7 +206,7 @@ public void buttonClick_requestsGeoPoint_whenAnswerIsUpdated() {
widget.setData(answer);
widget.binding.simpleButton.performClick();

verify(geoDataRequester).requestGeoPoint(prompt, answer.getDisplayText(), waitingForDataRegistry);
verify(geoDataRequester).requestGeoPoint(prompt, waitingForDataRegistry);
}

private GeoPointMapWidget createWidget(FormEntryPrompt prompt) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ public void buttonClick_requestsGeoPoint() {
FormEntryPrompt prompt = promptWithAnswer(answer);
GeoPointWidget widget = createWidget(prompt);
widget.binding.simpleButton.performClick();
verify(geoDataRequester).requestGeoPoint(prompt, answer.getDisplayText(), waitingForDataRegistry);
verify(geoDataRequester).requestGeoPoint(prompt, waitingForDataRegistry);
}

@Test
Expand All @@ -186,7 +186,7 @@ public void buttonClick_requestsGeoPoint_whenAnswerIsCleared() {
widget.clearAnswer();
widget.binding.simpleButton.performClick();

verify(geoDataRequester).requestGeoPoint(prompt, null, waitingForDataRegistry);
verify(geoDataRequester).requestGeoPoint(prompt, waitingForDataRegistry);
}

@Test
Expand All @@ -196,7 +196,7 @@ public void buttonClick_requestsGeoPoint_whenAnswerIsUpdated() {
widget.setData(answer);
widget.binding.simpleButton.performClick();

verify(geoDataRequester).requestGeoPoint(prompt, answer.getDisplayText(), waitingForDataRegistry);
verify(geoDataRequester).requestGeoPoint(prompt, waitingForDataRegistry);
}

private GeoPointWidget createWidget(FormEntryPrompt prompt) {
Expand Down
Loading