Browse Source

fix: incorrect minute interval rounding (#646)

master
Henning Hall 2 years ago
committed by GitHub
parent
commit
8a37e03730
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 36 additions and 23 deletions
  1. +18
    -1
      .maestro/display-text.yml
  2. +15
    -3
      android/src/main/java/com/henninghall/date_picker/State.java
  3. +1
    -1
      android/src/main/java/com/henninghall/date_picker/ui/UIManager.java
  4. +2
    -18
      android/src/main/java/com/henninghall/date_picker/wheels/DayWheel.java

+ 18
- 1
.maestro/display-text.yml View File

@ -7,8 +7,25 @@ appId: com.rn069
GMT: GMT+01:00
STATE: ''
# test: can have initial date in past
- runFlow: utils/launch.yml
# test: minuteInterval rounding should round with floor
- runFlow:
file: utils/change-prop.yml
env:
PROP: minuteInterval
VALUE: 5
- runFlow:
file: utils/change-prop.yml
env:
PROP: date
VALUE: '2000-01-01T00:34:00+01:00'
- runFlow: utils/swipe-wheel-1.yml
- assertVisible: '2000-01-02 00:30:00'
- runFlow: utils/reset.yml
# test: can have initial date in past
- runFlow:
file: utils/change-prop.yml
env:

+ 15
- 3
android/src/main/java/com/henninghall/date_picker/State.java View File

@ -19,8 +19,7 @@ import com.henninghall.date_picker.props.Prop;
import com.henninghall.date_picker.props.TextColorProp;
import com.henninghall.date_picker.props.TimezoneOffsetInMinutesProp;
import net.time4j.tz.Timezone;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Locale;
@ -116,10 +115,23 @@ public class State {
return (String) dateProp.getValue();
}
public Calendar getDate() {
private Calendar getDate() {
return Utils.isoToCalendar(getIsoDate(), getTimeZone());
}
// The date the picker is suppose to display.
// Includes minute rounding to desired minute interval.
public Calendar getPickerDate() {
Calendar cal = getDate();
int minuteInterval = getMinuteInterval();
if(minuteInterval <= 1) return cal;
SimpleDateFormat minuteFormat = new SimpleDateFormat("mm", getLocale());
int exactMinute = Integer.parseInt(minuteFormat.format(cal.getTime()));
int minutesSinceLastInterval = exactMinute % minuteInterval;
cal.add(Calendar.MINUTE, -minutesSinceLastInterval);
return (Calendar) cal.clone();
}
public Integer getHeight() {
return (Integer) heightProp.getValue();
}

+ 1
- 1
android/src/main/java/com/henninghall/date_picker/ui/UIManager.java View File

@ -56,7 +56,7 @@ public class UIManager {
}
public void setWheelsToDate(){
wheels.applyOnAll(new SetDate(state.getDate()));
wheels.applyOnAll(new SetDate(state.getPickerDate()));
}
public void scroll(int wheelIndex, int scrollTimes) {

+ 2
- 18
android/src/main/java/com/henninghall/date_picker/wheels/DayWheel.java View File

@ -11,7 +11,6 @@ import com.henninghall.date_picker.Utils;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
@ -54,7 +53,7 @@ public class DayWheel extends Wheel {
cal = (Calendar) max.clone();
cal.add(Calendar.DATE, -cal.getActualMaximum(Calendar.DAY_OF_YEAR) / 2);
} else {
cal = getInitialDate();
cal = state.getPickerDate();
cal.add(Calendar.DATE, -defaultNumberOfDays / 2);
}
return cal;
@ -70,7 +69,7 @@ public class DayWheel extends Wheel {
cal = (Calendar) min.clone();
cal.add(Calendar.DATE, cal.getActualMaximum(Calendar.DAY_OF_YEAR) / 2);
} else {
cal = getInitialDate();
cal = state.getPickerDate();
cal.add(Calendar.DATE, defaultNumberOfDays / 2);
}
return cal;
@ -131,20 +130,5 @@ public class DayWheel extends Wheel {
: todayString;
}
// Rounding cal to closest minute interval
private Calendar getInitialDate() {
Calendar cal = state.getDate();
int minuteInterval = state.getMinuteInterval();
if(minuteInterval <= 1) return cal;
SimpleDateFormat minuteFormat = new SimpleDateFormat("mm", state.getLocale());
int exactMinute = Integer.valueOf(minuteFormat.format(cal.getTime()));
int diffSinceLastInterval = exactMinute % minuteInterval;
int diffAhead = minuteInterval - diffSinceLastInterval;
int diffBehind= -diffSinceLastInterval;
boolean closerToPrevious = minuteInterval / 2 > diffSinceLastInterval;
int diffToExactValue = closerToPrevious ? diffBehind : diffAhead;
cal.add(Calendar.MINUTE, diffToExactValue);
return (Calendar) cal.clone();
}
}

Loading…
Cancel
Save