Skip to content

Commit

Permalink
fix: min/max dates not always correct when timezoneOffsetInMinutes is…
Browse files Browse the repository at this point in the history
… set
  • Loading branch information
henninghall committed Apr 10, 2023
1 parent 407ba22 commit be7bb33
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 33 deletions.
Original file line number Diff line number Diff line change
@@ -1,18 +1,10 @@
package com.henninghall.date_picker;


import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

import com.facebook.react.bridge.Dynamic;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.common.MapBuilder;
import com.facebook.react.uimanager.SimpleViewManager;
Expand All @@ -29,7 +21,7 @@
import com.henninghall.date_picker.props.MinuteIntervalProp;
import com.henninghall.date_picker.props.ModeProp;
import com.henninghall.date_picker.props.TextColorProp;
import com.henninghall.date_picker.props.UtcProp;
import com.henninghall.date_picker.props.TimezoneOffsetInMinutesProp;


import java.lang.reflect.Method;
Expand All @@ -54,7 +46,7 @@ public PickerView createViewInstance(ThemedReactContext context) {
}

@ReactPropGroup(names = { DateProp.name, ModeProp.name, LocaleProp.name, MaximumDateProp.name,
MinimumDateProp.name, FadeToColorProp.name, TextColorProp.name, UtcProp.name, MinuteIntervalProp.name,
MinimumDateProp.name, FadeToColorProp.name, TextColorProp.name, TimezoneOffsetInMinutesProp.name, MinuteIntervalProp.name,
VariantProp.name, DividerHeightProp.name, Is24hourSourceProp.name
})
public void setProps(PickerView view, int index, Dynamic value) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import com.henninghall.date_picker.props.MaximumDateProp;
import com.henninghall.date_picker.props.MinimumDateProp;
import com.henninghall.date_picker.props.MinuteIntervalProp;
import com.henninghall.date_picker.props.UtcProp;
import com.henninghall.date_picker.props.TimezoneOffsetInMinutesProp;
import com.henninghall.date_picker.props.VariantProp;
import com.henninghall.date_picker.props.DateProp;
import com.henninghall.date_picker.props.FadeToColorProp;
Expand Down Expand Up @@ -77,7 +77,7 @@ public void update() {

if (didUpdate(DateProp.name, HeightProp.name, LocaleProp.name,
MaximumDateProp.name, MinimumDateProp.name, MinuteIntervalProp.name, ModeProp.name,
UtcProp.name, VariantProp.name
TimezoneOffsetInMinutesProp.name, VariantProp.name
)) {
uiManager.updateDisplayValues();
}
Expand Down
21 changes: 12 additions & 9 deletions android/src/main/java/com/henninghall/date_picker/State.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import com.henninghall.date_picker.props.ModeProp;
import com.henninghall.date_picker.props.Prop;
import com.henninghall.date_picker.props.TextColorProp;
import com.henninghall.date_picker.props.UtcProp;
import com.henninghall.date_picker.props.TimezoneOffsetInMinutesProp;

import java.util.Calendar;
import java.util.HashMap;
Expand All @@ -35,7 +35,7 @@ public class State {
private final MinuteIntervalProp minuteIntervalProp = new MinuteIntervalProp();
private final MinimumDateProp minimumDateProp = new MinimumDateProp();
private final MaximumDateProp maximumDateProp = new MaximumDateProp();
private final UtcProp utcProp = new UtcProp();
private final TimezoneOffsetInMinutesProp timezoneOffsetInMinutesProp = new TimezoneOffsetInMinutesProp();
private final HeightProp heightProp = new HeightProp();
private final VariantProp variantProp = new VariantProp();
private final DividerHeightProp dividerHeightProp = new DividerHeightProp();
Expand All @@ -50,7 +50,7 @@ public class State {
put(MinuteIntervalProp.name, minuteIntervalProp);
put(MinimumDateProp.name, minimumDateProp);
put(MaximumDateProp.name, maximumDateProp);
put(UtcProp.name, utcProp);
put(TimezoneOffsetInMinutesProp.name, timezoneOffsetInMinutesProp);
put(HeightProp.name, heightProp);
put(VariantProp.name, variantProp);
put(DividerHeightProp.name, dividerHeightProp);
Expand Down Expand Up @@ -91,18 +91,21 @@ public Locale getLocale() {
}

public Calendar getMinimumDate() {
DateBoundary db = new DateBoundary(getTimeZone(), (String) minimumDateProp.getValue());
return db.get();
return Utils.isoToCalendar(minimumDateProp.getValue(), getTimeZone());
}

public Calendar getMaximumDate() {
DateBoundary db = new DateBoundary(getTimeZone(), (String) maximumDateProp.getValue());
return db.get();
return Utils.isoToCalendar(maximumDateProp.getValue(), getTimeZone());
}

public TimeZone getTimeZone() {
boolean utc = (boolean) utcProp.getValue();
return utc ? TimeZone.getTimeZone("UTC") : TimeZone.getDefault();
int totalOffsetMinutes = Math.abs(timezoneOffsetInMinutesProp.getValue());
char offsetDirection = timezoneOffsetInMinutesProp.getValue() < 0 ? '-' : '+';
int offsetHours = (int) Math.floor(totalOffsetMinutes / 60f);
int offsetMinutes = totalOffsetMinutes - offsetHours * 60;
String timeZoneId = "GMT" + offsetDirection + offsetHours + ":" + Utils.toPaddedMinutes(offsetMinutes);
TimeZone zone = TimeZone.getTimeZone(timeZoneId);
return zone;
}

public String getIsoDate() {
Expand Down
6 changes: 6 additions & 0 deletions android/src/main/java/com/henninghall/date_picker/Utils.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

import net.time4j.PrettyTime;

import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
Expand Down Expand Up @@ -110,4 +111,9 @@ public static String getLocalisedStringFromResources(Locale locale, String tagNa
public static int toDp(int pixels){
return (int) (pixels * DatePickerPackage.context.getResources().getDisplayMetrics().density);
}

public static String toPaddedMinutes(int minutes){
DecimalFormat df = new DecimalFormat("00");
return df.format(minutes);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.henninghall.date_picker.props;

import com.facebook.react.bridge.Dynamic;

public class TimezoneOffsetInMinutesProp extends Prop<Integer> {
public static final String name = "timezoneOffsetInMinutes";

@Override
Integer toValue(Dynamic value) {
return value.asInt();
}
}

This file was deleted.

0 comments on commit be7bb33

Please sign in to comment.