Skip to content

Commit 54ff05b

Browse files
authored
Merge pull request #7142 from seadowg/range-picker-decimal
Fix decimal range picker
2 parents 0fd4026 + 1509663 commit 54ff05b

File tree

3 files changed

+70
-55
lines changed

3 files changed

+70
-55
lines changed

collect_app/src/main/java/org/odk/collect/android/widgets/range/RangePickerWidget.java

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
import static org.odk.collect.android.fragments.dialogs.RangePickerDialogFragment.ARG_DECIMAL;
44
import static org.odk.collect.android.fragments.dialogs.RangePickerDialogFragment.ARG_FORM_INDEX;
5-
import static org.odk.collect.android.fragments.dialogs.RangePickerDialogFragment.ARG_VALUES;
65
import static org.odk.collect.android.fragments.dialogs.RangePickerDialogFragment.ARG_SELECTED;
6+
import static org.odk.collect.android.fragments.dialogs.RangePickerDialogFragment.ARG_VALUES;
77

88
import android.app.Activity;
99
import android.content.Context;
@@ -13,7 +13,6 @@
1313

1414
import androidx.fragment.app.FragmentActivity;
1515

16-
import org.javarosa.core.model.RangeQuestion;
1716
import org.javarosa.core.model.data.IAnswerData;
1817
import org.javarosa.form.api.FormEntryPrompt;
1918
import org.odk.collect.android.databinding.RangePickerWidgetAnswerBinding;
@@ -23,17 +22,10 @@
2322
import org.odk.collect.android.widgets.utilities.RangeWidgetUtils;
2423
import org.odk.collect.androidshared.ui.DialogFragmentUtils;
2524

26-
import java.math.BigDecimal;
27-
2825
public class RangePickerWidget extends QuestionWidget {
2926

3027
private final boolean decimal;
3128
RangePickerWidgetAnswerBinding binding;
32-
private String[] displayedValuesForNumberPicker;
33-
34-
private BigDecimal rangeStart;
35-
private BigDecimal rangeEnd;
36-
private BigDecimal rangeStep;
3729

3830
private int progress;
3931

@@ -53,9 +45,7 @@ protected View onCreateWidgetView(Context context, FormEntryPrompt prompt, int a
5345

5446
binding.widgetAnswerText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, answerFontSize);
5547

56-
setUpWidgetParameters();
57-
displayedValuesForNumberPicker = RangePickerWidgetUtils.getNumbersFromRangeAsc(
58-
rangeStart, rangeStep, rangeEnd, true);
48+
String[] displayedValuesForNumberPicker = RangePickerWidgetUtils.getNumbersFromRangeAsc(prompt);
5949
RangeWidgetUtils.setUpRangePickerWidget(context, binding, prompt);
6050

6151
progress = RangePickerWidgetUtils.getProgressFromPrompt(prompt, displayedValuesForNumberPicker);
@@ -88,13 +78,6 @@ public void clearAnswer() {
8878
widgetValueChanged();
8979
}
9080

91-
private void setUpWidgetParameters() {
92-
RangeQuestion rangeQuestion = (RangeQuestion) getFormEntryPrompt().getQuestion();
93-
rangeStart = rangeQuestion.getRangeStart();
94-
rangeEnd = rangeQuestion.getRangeEnd();
95-
rangeStep = rangeQuestion.getRangeStep().abs();
96-
}
97-
9881
private void setUpNullValue() {
9982
answer = null;
10083
progress = 0;

collect_app/src/main/java/org/odk/collect/android/widgets/range/RangePickerWidgetUtils.kt

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,26 @@
11
package org.odk.collect.android.widgets.range
22

3+
import org.javarosa.core.model.Constants.DATATYPE_INTEGER
4+
import org.javarosa.core.model.RangeQuestion
35
import org.javarosa.form.api.FormEntryPrompt
46
import java.math.BigDecimal
57

68
object RangePickerWidgetUtils {
79

810
@JvmStatic
9-
fun getNumbersFromRangeAsc(
10-
rangeStart: BigDecimal,
11-
rangeStep: BigDecimal,
12-
rangeEnd: BigDecimal,
13-
isIntegerDataType: Boolean
14-
): Array<String> {
15-
val displayedValuesForNumberPicker = mutableListOf<String>()
11+
fun getNumbersFromRangeAsc(formEntryPrompt: FormEntryPrompt): Array<String> {
12+
val rangeQuestion = formEntryPrompt.question as RangeQuestion
13+
val rangeStart = rangeQuestion.rangeStart
14+
val rangeEnd = rangeQuestion.rangeEnd
15+
val rangeStep = rangeQuestion.rangeStep.abs()
1616

17+
val displayedValuesForNumberPicker = mutableListOf<String>()
1718
var index = 0
18-
1919
var firstElement = if (rangeStart.compareTo(rangeEnd) < 1) rangeStart else rangeEnd
2020
val lastElement = if (rangeStart.compareTo(rangeEnd) < 1) rangeEnd else rangeStart
21-
2221
while (firstElement.compareTo(lastElement) < 1) {
2322
displayedValuesForNumberPicker.add(
24-
if (isIntegerDataType) {
23+
if (formEntryPrompt.dataType == DATATYPE_INTEGER) {
2524
firstElement.toInt().toString()
2625
} else {
2726
firstElement.toDouble().toString()
@@ -30,8 +29,7 @@ object RangePickerWidgetUtils {
3029
index++
3130
firstElement = firstElement.plus(rangeStep.abs())
3231
}
33-
34-
return displayedValuesForNumberPicker.toTypedArray()
32+
return displayedValuesForNumberPicker.toTypedArray<String>()
3533
}
3634

3735
@JvmStatic

collect_app/src/test/java/org/odk/collect/android/widgets/range/RangePickerWidgetUtilsTest.kt

Lines changed: 58 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,83 +2,117 @@ package org.odk.collect.android.widgets.range
22

33
import org.hamcrest.MatcherAssert.assertThat
44
import org.hamcrest.Matchers.equalTo
5+
import org.javarosa.core.model.Constants
6+
import org.javarosa.core.model.DataType
7+
import org.javarosa.core.model.RangeQuestion
58
import org.javarosa.core.model.data.IntegerData
69
import org.javarosa.form.api.FormEntryPrompt
710
import org.junit.Test
811
import org.mockito.kotlin.mock
912
import org.mockito.kotlin.whenever
13+
import org.odk.collect.android.support.MockFormEntryPromptBuilder
1014
import java.math.BigDecimal
1115

1216
class RangePickerWidgetUtilsTest {
1317

1418
@Test
1519
fun `list of numbers should contain only rangeStart when range has equal start and end`() {
16-
val rangeStart = BigDecimal(5.0)
17-
val rangeEnd = BigDecimal(5.0)
18-
val rangeStep = BigDecimal(1.0)
20+
val rangeQuestion = RangeQuestion()
21+
rangeQuestion.rangeStart = BigDecimal(5.0)
22+
rangeQuestion.rangeEnd = BigDecimal(5.0)
23+
rangeQuestion.rangeStep = BigDecimal(1.0)
24+
val prompt = MockFormEntryPromptBuilder()
25+
.withQuestion(rangeQuestion)
26+
.withDataType(Constants.DATATYPE_DECIMAL)
27+
.build()
1928

2029
assertThat(
21-
RangePickerWidgetUtils.getNumbersFromRangeAsc(rangeStart, rangeStep, rangeEnd, false),
30+
RangePickerWidgetUtils.getNumbersFromRangeAsc(prompt),
2231
equalTo(arrayOf("5.0"))
2332
)
2433
}
2534

2635
@Test
2736
fun `list of numbers should contain only rangeStart when step is bigger than range`() {
28-
val rangeStart = BigDecimal(-5)
29-
val rangeEnd = BigDecimal(5)
30-
val rangeStep = BigDecimal(100)
37+
val rangeQuestion = RangeQuestion()
38+
rangeQuestion.rangeStart = BigDecimal(-5)
39+
rangeQuestion.rangeEnd = BigDecimal(5)
40+
rangeQuestion.rangeStep = BigDecimal(100)
41+
val prompt = MockFormEntryPromptBuilder()
42+
.withQuestion(rangeQuestion)
43+
.withDataType(Constants.DATATYPE_INTEGER)
44+
.build()
3145

3246
assertThat(
33-
RangePickerWidgetUtils.getNumbersFromRangeAsc(rangeStart, rangeStep, rangeEnd, true),
47+
RangePickerWidgetUtils.getNumbersFromRangeAsc(prompt),
3448
equalTo(arrayOf("-5"))
3549
)
3650
}
3751

3852
@Test
3953
fun `list of numbers should contain numbers in ascending order when range is increasing`() {
40-
val rangeStart = BigDecimal(-5.0)
41-
val rangeEnd = BigDecimal(5.0)
42-
val rangeStep = BigDecimal(1.5)
54+
val rangeQuestion = RangeQuestion()
55+
rangeQuestion.rangeStart = BigDecimal(-5.0)
56+
rangeQuestion.rangeEnd = BigDecimal(5.0)
57+
rangeQuestion.rangeStep = BigDecimal(1.5)
58+
val prompt = MockFormEntryPromptBuilder()
59+
.withQuestion(rangeQuestion)
60+
.withDataType(Constants.DATATYPE_DECIMAL)
61+
.build()
4362

4463
assertThat(
45-
RangePickerWidgetUtils.getNumbersFromRangeAsc(rangeStart, rangeStep, rangeEnd, false),
64+
RangePickerWidgetUtils.getNumbersFromRangeAsc(prompt),
4665
equalTo(arrayOf("-5.0", "-3.5", "-2.0", "-0.5", "1.0", "2.5", "4.0"))
4766
)
4867
}
4968

5069
@Test
5170
fun `list of numbers should contain numbers in ascending order when range is decreasing`() {
52-
val rangeStart = BigDecimal(5)
53-
val rangeEnd = BigDecimal(-5)
54-
val rangeStep = BigDecimal(1)
71+
val rangeQuestion = RangeQuestion()
72+
rangeQuestion.rangeStart = BigDecimal(5)
73+
rangeQuestion.rangeEnd = BigDecimal(-5)
74+
rangeQuestion.rangeStep = BigDecimal(1)
75+
val prompt = MockFormEntryPromptBuilder()
76+
.withQuestion(rangeQuestion)
77+
.withDataType(Constants.DATATYPE_INTEGER)
78+
.build()
5579

5680
assertThat(
57-
RangePickerWidgetUtils.getNumbersFromRangeAsc(rangeStart, rangeStep, rangeEnd, true),
81+
RangePickerWidgetUtils.getNumbersFromRangeAsc(prompt),
5882
equalTo(arrayOf("-5", "-4", "-3", "-2", "-1", "0", "1", "2", "3", "4", "5"))
5983
)
6084
}
6185

6286
@Test
6387
fun `list of numbers should contain numbers in ascending order when range is decreasing and step is a negative number`() {
64-
val rangeStart = BigDecimal(5.0)
65-
val rangeEnd = BigDecimal(-5.0)
66-
val rangeStep = BigDecimal(-1.5)
88+
val rangeQuestion = RangeQuestion()
89+
rangeQuestion.rangeStart = BigDecimal(5.0)
90+
rangeQuestion.rangeEnd = BigDecimal(-5.0)
91+
rangeQuestion.rangeStep = BigDecimal(-1.5)
92+
val prompt = MockFormEntryPromptBuilder()
93+
.withQuestion(rangeQuestion)
94+
.withDataType(Constants.DATATYPE_DECIMAL)
95+
.build()
6796

6897
assertThat(
69-
RangePickerWidgetUtils.getNumbersFromRangeAsc(rangeStart, rangeStep, rangeEnd, false),
98+
RangePickerWidgetUtils.getNumbersFromRangeAsc(prompt),
7099
equalTo(arrayOf("-5.0", "-3.5", "-2.0", "-0.5", "1.0", "2.5", "4.0"))
71100
)
72101
}
73102

74103
@Test
75104
fun `list of numbers should contain numbers in ascending order when step is bigger than 1`() {
76-
val rangeStart = BigDecimal(-5)
77-
val rangeEnd = BigDecimal(5)
78-
val rangeStep = BigDecimal(2)
105+
val rangeQuestion = RangeQuestion()
106+
rangeQuestion.rangeStart = BigDecimal(-5)
107+
rangeQuestion.rangeEnd = BigDecimal(5)
108+
rangeQuestion.rangeStep = BigDecimal(2)
109+
val prompt = MockFormEntryPromptBuilder()
110+
.withQuestion(rangeQuestion)
111+
.withDataType(Constants.DATATYPE_INTEGER)
112+
.build()
79113

80114
assertThat(
81-
RangePickerWidgetUtils.getNumbersFromRangeAsc(rangeStart, rangeStep, rangeEnd, true),
115+
RangePickerWidgetUtils.getNumbersFromRangeAsc(prompt),
82116
equalTo(arrayOf("-5", "-3", "-1", "1", "3", "5"))
83117
)
84118
}

0 commit comments

Comments
 (0)