Browse Source

cleanup

master
Henning Hall 5 years ago
parent
commit
accb576ff2
16 changed files with 285 additions and 244 deletions
  1. +10
    -9
      android/src/main/java/com/henninghall/date_picker/DatePickerManager.java
  2. +99
    -0
      android/src/main/java/com/henninghall/date_picker/DerivedData.java
  3. +2
    -2
      android/src/main/java/com/henninghall/date_picker/PickerView.java
  4. +6
    -106
      android/src/main/java/com/henninghall/date_picker/State.java
  5. +0
    -8
      android/src/main/java/com/henninghall/date_picker/Utils.java
  6. +31
    -16
      android/src/main/java/com/henninghall/date_picker/ui/EmptyWheels.java
  7. +2
    -2
      android/src/main/java/com/henninghall/date_picker/ui/FadingOverlay.java
  8. +23
    -0
      android/src/main/java/com/henninghall/date_picker/ui/PickerWrapper.java
  9. +11
    -19
      android/src/main/java/com/henninghall/date_picker/ui/UIManager.java
  10. +1
    -1
      android/src/main/java/com/henninghall/date_picker/ui/WheelChangeListenerImpl.java
  11. +39
    -45
      android/src/main/java/com/henninghall/date_picker/ui/Wheels.java
  12. +19
    -2
      android/src/main/java/com/henninghall/date_picker/wheels/DayWheel.java
  13. +1
    -1
      android/src/main/res/layout/datepicker_view.xml
  14. +22
    -32
      examples/detox/src/examples/Advanced.js
  15. +1
    -1
      examples/detox/src/propPickers/MinMaxDateChange.js
  16. +18
    -0
      examples/detox/src/utils.js

+ 10
- 9
android/src/main/java/com/henninghall/date_picker/DatePickerManager.java View File

@ -43,17 +43,12 @@ public class DatePickerManager extends SimpleViewManager {
@ReactPropGroup(names = { DateProp.name, ModeProp.name, LocaleProp.name, MaximumDateProp.name,
MinimumDateProp.name, FadeToColorProp.name, TextColorProp.name, UtcProp.name, MinuteIntervalProp.name})
public void setProps(PickerView view, int index, Dynamic value) {
String[] propNames = getMethodAnnotation("setProps").names();
String propName = propNames[index];
view.updateProp(propName, value);
updateProp("setProps", view, index, value);
}
@ReactPropGroup(names = {}, customType = "Style")
public void setStyle(PickerView view, int index, Integer style) {
if(index == 0) {
view.updateProp("height", null);
}
@ReactPropGroup(names = {"height"}, customType = "Style")
public void setStyle(PickerView view, int index, Dynamic value) {
updateProp("setStyle", view, index, value);
}
@Override
@ -88,6 +83,12 @@ public class DatePickerManager extends SimpleViewManager {
).build();
}
private void updateProp(String methodName, PickerView view, int index, Dynamic value){
String[] propNames = getMethodAnnotation(methodName).names();
String propName = propNames[index];
view.updateProp(propName, value);
}
private ReactPropGroup getMethodAnnotation(String methodName) {
Method[] methods = this.getClass().getMethods();
Method method = null;

+ 99
- 0
android/src/main/java/com/henninghall/date_picker/DerivedData.java View File

@ -0,0 +1,99 @@
package com.henninghall.date_picker;
import android.util.Log;
import com.henninghall.date_picker.models.Mode;
import com.henninghall.date_picker.models.WheelType;
import java.util.ArrayList;
import java.util.Arrays;
public class DerivedData {
private final State state;
DerivedData(State state) {
this.state = state;
}
public ArrayList<WheelType> getVisibleWheels() {
ArrayList<WheelType> visibleWheels = new ArrayList<>();
Mode mode = state.getMode();
switch (mode){
case datetime: {
visibleWheels.add(WheelType.DAY);
visibleWheels.add(WheelType.HOUR);
visibleWheels.add(WheelType.MINUTE);
break;
}
case time: {
visibleWheels.add(WheelType.HOUR);
visibleWheels.add(WheelType.MINUTE);
break;
}
case date: {
visibleWheels.add(WheelType.YEAR);
visibleWheels.add(WheelType.MONTH);
visibleWheels.add(WheelType.DATE);
break;
}
}
if((mode == Mode.time || mode == Mode.datetime) && Utils.usesAmPm()){
visibleWheels.add(WheelType.AM_PM);
}
return visibleWheels;
}
public ArrayList<WheelType> getOrderedVisibleWheels() {
ArrayList<WheelType> orderedWheels = getOrderedWheels();
ArrayList<WheelType> visibleWheels = getVisibleWheels();
ArrayList<WheelType> visibleOrderedWheels = new ArrayList<>();
for (WheelType wheel : orderedWheels){
if(visibleWheels.contains(wheel)) visibleOrderedWheels.add(wheel);
}
return visibleOrderedWheels;
}
private ArrayList<WheelType> getOrderedWheels() {
String dateTimePattern = LocaleUtils.getDateTimePattern(state.getLocale());
ArrayList<WheelType> unorderedTypes = new ArrayList(Arrays.asList(WheelType.values()));
ArrayList<WheelType> orderedWheels = new ArrayList<>();
// Always put day wheel first
unorderedTypes.remove(WheelType.DAY);
orderedWheels.add(WheelType.DAY);
for (char ch : dateTimePattern.toCharArray()){
try {
WheelType wheelType = Utils.patternCharToWheelType(ch);
if (unorderedTypes.contains(wheelType)) {
unorderedTypes.remove(wheelType);
orderedWheels.add(wheelType);
}
} catch (Exception e) {
// ignore unknown pattern chars that not correspond to any wheel type
}
}
// If AM/PM wheel remains it means that the locale does not have AM/PM by default and it
// should be put last.
if(unorderedTypes.contains(WheelType.AM_PM)){
unorderedTypes.remove(WheelType.AM_PM);
orderedWheels.add(WheelType.AM_PM);
}
if(!unorderedTypes.isEmpty()) {
Log.e(
"RNDatePicker",
unorderedTypes.size() + " wheel types cannot be ordered. Wheel type 0: " + unorderedTypes.get(0));
}
return orderedWheels;
}
public int getShownCount() {
int DP_PER_SHOW_SHOW_COUNT = 35;
int showCount = state.getHeight() / DP_PER_SHOW_SHOW_COUNT;
int oddShowCount = showCount % 2 == 0 ? showCount + 1 : showCount;
return oddShowCount;
}
}

+ 2
- 2
android/src/main/java/com/henninghall/date_picker/PickerView.java View File

@ -49,12 +49,12 @@ public class PickerView extends RelativeLayout {
uiManager.updateWheelOrder();
}
ArrayList<String> nonRefreshingProps = new ArrayList<String>(){{
ArrayList<String> noDisplayValueChangeProps = new ArrayList<String>(){{
add(DateProp.name);
add(FadeToColorProp.name);
add(TextColorProp.name);
}};
updatedProps.removeAll(nonRefreshingProps);
updatedProps.removeAll(noDisplayValueChangeProps);
if(updatedProps.size() != 0) {
uiManager.updateDisplayValues();

+ 6
- 106
android/src/main/java/com/henninghall/date_picker/State.java View File

@ -1,10 +1,7 @@
package com.henninghall.date_picker;
import android.util.Log;
import com.facebook.react.bridge.Dynamic;
import com.henninghall.date_picker.models.Mode;
import com.henninghall.date_picker.models.WheelType;
import com.henninghall.date_picker.props.DateProp;
import com.henninghall.date_picker.props.FadeToColorProp;
import com.henninghall.date_picker.props.HeightProp;
@ -17,9 +14,6 @@ import com.henninghall.date_picker.props.Prop;
import com.henninghall.date_picker.props.TextColorProp;
import com.henninghall.date_picker.props.UtcProp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Locale;
@ -48,7 +42,13 @@ public class State {
put(MinimumDateProp.name, minimumDateProp);
put(MaximumDateProp.name, maximumDateProp);
put(UtcProp.name, utcProp);
put(HeightProp.name, heightProp);
}};
public DerivedData derived;
public State(){
derived = new DerivedData(this);
}
private Prop getProp(String name){
return (Prop) props.get(name);
@ -102,105 +102,5 @@ public class State {
return (Integer) heightProp.getValue();
}
public int getShownCount() {
int DP_PER_SHOW_SHOW_COUNT = 35;
int showCount = getHeight() / DP_PER_SHOW_SHOW_COUNT;
int oddShowCount = showCount % 2 == 0 ? showCount + 1 : showCount;
return oddShowCount;
}
public ArrayList<WheelType> getOrderedWheels() {
String dateTimePattern = LocaleUtils.getDateTimePattern(getLocale());
ArrayList<WheelType> unorderedTypes = new ArrayList(Arrays.asList(WheelType.values()));
ArrayList<WheelType> orderedWheels = new ArrayList<>();
// Always put day wheel first
unorderedTypes.remove(WheelType.DAY);
orderedWheels.add(WheelType.DAY);
for (char ch : dateTimePattern.toCharArray()){
try {
WheelType wheelType = Utils.patternCharToWheelType(ch);
if (unorderedTypes.contains(wheelType)) {
unorderedTypes.remove(wheelType);
orderedWheels.add(wheelType);
}
} catch (Exception e) {
// ignore unknown pattern chars that not correspond to any wheel type
}
}
// If AM/PM wheel remains it means that the locale does not have AM/PM by default and it
// should be put last.
if(unorderedTypes.contains(WheelType.AM_PM)){
unorderedTypes.remove(WheelType.AM_PM);
orderedWheels.add(WheelType.AM_PM);
}
if(!unorderedTypes.isEmpty()) {
Log.e(
"RNDatePicker",
unorderedTypes.size() + " wheel types cannot be ordered. Wheel type 0: " + unorderedTypes.get(0));
}
return orderedWheels;
}
public ArrayList<WheelType> getVisibleWheels() {
ArrayList<WheelType> visibleWheels = new ArrayList<>();
Mode mode = getMode();
switch (mode){
case datetime: {
visibleWheels.add(WheelType.DAY);
visibleWheels.add(WheelType.HOUR);
visibleWheels.add(WheelType.MINUTE);
break;
}
case time: {
visibleWheels.add(WheelType.HOUR);
visibleWheels.add(WheelType.MINUTE);
break;
}
case date: {
visibleWheels.add(WheelType.YEAR);
visibleWheels.add(WheelType.MONTH);
visibleWheels.add(WheelType.DATE);
break;
}
}
if((mode == Mode.time || mode == Mode.datetime) && Utils.usesAmPm()){
visibleWheels.add(WheelType.AM_PM);
}
return visibleWheels;
}
public ArrayList<WheelType> getOrderedVisibleWheels() {
ArrayList<WheelType> orderedWheels = getOrderedWheels();
ArrayList<WheelType> visibleWheels = getVisibleWheels();
ArrayList<WheelType> visibleOrderedWheels = new ArrayList<>();
for (WheelType wheel : orderedWheels){
if(visibleWheels.contains(wheel)) visibleOrderedWheels.add(wheel);
}
return visibleOrderedWheels;
}
// Rounding cal to closest minute interval
public Calendar getInitialDate() {
Calendar cal = Calendar.getInstance();
int minuteInterval = getMinuteInterval();
if(minuteInterval <= 1) return cal;
SimpleDateFormat minuteFormat = new SimpleDateFormat("mm", 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();
}
public WheelType getVisibleWheel(int index) {
return getOrderedVisibleWheels().get(index);
}
}

+ 0
- 8
android/src/main/java/com/henninghall/date_picker/Utils.java View File

@ -22,14 +22,6 @@ public class Utils {
return !DateFormat.is24HourFormat(DatePickerManager.context);
}
public static int[] emptyWheelIds = {
R.id.emptyStart,
R.id.empty1,
R.id.empty2,
R.id.empty3,
R.id.emptyEnd
};
public static String printToday(Locale locale) {
return PrettyTime.of(locale).printToday();
}

+ 31
- 16
android/src/main/java/com/henninghall/date_picker/ui/EmptyWheels.java View File

@ -2,42 +2,57 @@ package com.henninghall.date_picker.ui;
import android.view.View;
import com.henninghall.date_picker.PickerView;
import com.henninghall.date_picker.R;
import com.henninghall.date_picker.State;
import com.henninghall.date_picker.Utils;
import java.util.HashMap;
import java.util.ArrayList;
import cn.carbswang.android.numberpickerview.library.NumberPickerView;
public class EmptyWheels {
class EmptyWheels {
private final HashMap<Integer, NumberPickerView> views;
private final Wheels wheels;
private final ArrayList<NumberPickerView> views;
private final PickerWrapper pickerWrapper;
private View rootView;
private State state;
EmptyWheels(View rootView, Wheels wheels, State state) {
this.wheels = wheels;
private int[] emptyWheelIds = {
R.id.emptyStart,
R.id.empty1,
R.id.empty2,
R.id.empty3,
R.id.emptyEnd
};
EmptyWheels(View rootView, PickerWrapper pickerWrapper, State state) {
this.pickerWrapper = pickerWrapper;
this.rootView = rootView;
this.state = state;
this.views = getViews();
this.views = getAll();
}
private HashMap<Integer, NumberPickerView> getViews() {
HashMap<Integer, NumberPickerView> views = new HashMap<>();
for (int id: Utils.emptyWheelIds) {
private ArrayList<NumberPickerView> getAll() {
ArrayList<NumberPickerView> wheels = new ArrayList<>();
for (int id: emptyWheelIds) {
NumberPickerView view = (NumberPickerView) rootView.findViewById(id);
views.put(id, view);
wheels.add(view);
}
return views;
return wheels;
}
void add() {
int numberOfVisibleWheels = state.getVisibleWheels().size();
int numberOfVisibleWheels = state.derived.getVisibleWheels().size();
int emptyViewsToAdd = numberOfVisibleWheels + 1;
for (int i = 0; i < emptyViewsToAdd; i++) {
int index = i * 2;
wheels.addWheel(views.get(Utils.emptyWheelIds[i]), index);
pickerWrapper.addPicker(views.get(i), index);
}
}
void setShownCount(int shownCount) {
for (int id : emptyWheelIds) {
NumberPickerView view = (NumberPickerView) rootView.findViewById(id);
if(view != null) view.setShownCount(shownCount);
}
}

+ 2
- 2
android/src/main/java/com/henninghall/date_picker/ui/FadingOverlay.java View File

@ -14,7 +14,7 @@ public class FadingOverlay {
private final GradientDrawable gradientBottom;
private final State state;
public FadingOverlay(State state, View rootView) {
FadingOverlay(State state, View rootView) {
this.state = state;
ImageView overlayTop = (ImageView) rootView.findViewById(R.id.overlay_top);
ImageView overlayBottom = (ImageView) rootView.findViewById(R.id.overlay_bottom);
@ -22,7 +22,7 @@ public class FadingOverlay {
gradientBottom = (GradientDrawable) overlayBottom.getDrawable();
}
public void updateColor(){
void updateColor(){
String color = state.getFadeToColor();
int alpha = validColor(color) ? 255 : 0;
gradientTop.setAlpha(alpha);

+ 23
- 0
android/src/main/java/com/henninghall/date_picker/ui/PickerWrapper.java View File

@ -0,0 +1,23 @@
package com.henninghall.date_picker.ui;
import android.view.View;
import android.widget.LinearLayout;
import com.henninghall.date_picker.R;
class PickerWrapper {
private final LinearLayout view;
PickerWrapper(View rootView) {
view = (LinearLayout) rootView.findViewById(R.id.pickerWrapper);
view.setWillNotDraw(false);
}
void addPicker(View wheel) { view.addView(wheel); }
void addPicker(View wheel, int index) { view.addView(wheel,index); }
void removeAll() {
view.removeAllViews();
}
}

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

@ -3,11 +3,10 @@ package com.henninghall.date_picker.ui;
import android.view.View;
import com.henninghall.date_picker.State;
import com.henninghall.date_picker.Utils;
import com.henninghall.date_picker.wheelFunctions.AddOnChangeListener;
import com.henninghall.date_picker.wheelFunctions.AnimateToDate;
import com.henninghall.date_picker.wheelFunctions.Refresh;
import com.henninghall.date_picker.wheelFunctions.SetDate;
import com.henninghall.date_picker.wheelFunctions.SetShowCount;
import com.henninghall.date_picker.wheelFunctions.TextColor;
import com.henninghall.date_picker.wheelFunctions.UpdateVisibility;
import com.henninghall.date_picker.wheels.Wheel;
@ -15,8 +14,6 @@ import com.henninghall.date_picker.wheels.Wheel;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import cn.carbswang.android.numberpickerview.library.NumberPickerView;
public class UIManager {
private final State state;
private final View rootView;
@ -25,10 +22,11 @@ public class UIManager {
private WheelScroller wheelScroller = new WheelScroller();
public UIManager(State state, View rootView){
this.rootView = rootView;
this.state = state;
wheels = new Wheels(state, rootView, this);
this.rootView = rootView;
wheels = new Wheels(state, rootView);
fadingOverlay = new FadingOverlay(state, rootView);
addOnChangeListener();
}
public void updateWheelVisibility(){
@ -44,15 +42,11 @@ public class UIManager {
}
public void updateHeight(){
int shownCount = state.getShownCount();
wheels.applyOnAll(new SetShowCount(shownCount));
setShownCountOnEmptyWheels(shownCount);
wheels.updateHeight();
}
public void updateWheelOrder() {
wheels.removeAll();
wheels.addInOrder();
wheels.addEmpty();
wheels.updateWheelOrder();
}
public void updateDisplayValues(){
@ -64,8 +58,8 @@ public class UIManager {
}
public void scroll(int wheelIndex, int scrollTimes) {
Wheel wheel = wheels.getWheel(state.getOrderedVisibleWheels().get(wheelIndex));
wheelScroller.scroll(wheel,scrollTimes);
Wheel wheel = wheels.getWheel(state.derived.getOrderedVisibleWheels().get(wheelIndex));
wheelScroller.scroll(wheel, scrollTimes);
}
SimpleDateFormat getDateFormat() {
@ -76,11 +70,9 @@ public class UIManager {
wheels.applyOnVisible(new AnimateToDate(date));
}
private void setShownCountOnEmptyWheels(int shownCount) {
for (int id : Utils.emptyWheelIds) {
NumberPickerView view = (NumberPickerView) rootView.findViewById(id);
if(view != null) view.setShownCount(shownCount);
}
private void addOnChangeListener(){
WheelChangeListener onWheelChangeListener = new WheelChangeListenerImpl(wheels, state, this, rootView);
wheels.applyOnAll(new AddOnChangeListener(onWheelChangeListener));
}

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

@ -24,7 +24,7 @@ public class WheelChangeListenerImpl implements WheelChangeListener {
private final UIManager uiManager;
private final View rootView;
public WheelChangeListenerImpl(Wheels wheels, State state, UIManager uiManager, View rootView) {
WheelChangeListenerImpl(Wheels wheels, State state, UIManager uiManager, View rootView) {
this.wheels = wheels;
this.uiManager = uiManager;
this.state = state;

+ 39
- 45
android/src/main/java/com/henninghall/date_picker/ui/Wheels.java View File

@ -1,14 +1,13 @@
package com.henninghall.date_picker.ui;
import android.view.View;
import android.widget.LinearLayout;
import com.henninghall.date_picker.R;
import com.henninghall.date_picker.State;
import com.henninghall.date_picker.Utils;
import com.henninghall.date_picker.models.WheelType;
import com.henninghall.date_picker.models.Mode;
import com.henninghall.date_picker.wheelFunctions.AddOnChangeListener;
import com.henninghall.date_picker.wheelFunctions.SetShowCount;
import com.henninghall.date_picker.wheelFunctions.WheelFunction;
import com.henninghall.date_picker.wheels.AmPmWheel;
import com.henninghall.date_picker.wheels.DateWheel;
@ -38,18 +37,15 @@ public class Wheels {
private MonthWheel monthWheel;
private YearWheel yearWheel;
private View rootView;
private final LinearLayout wheelsWrapper;
private final PickerWrapper pickerWrapper;
private final EmptyWheels emptyWheels;
private HashMap<WheelType, Wheel> wheelPerWheelType;
private UIManager uiManager;
Wheels(State state, View rootView, UIManager uiManager){
Wheels(State state, View rootView){
this.state = state;
this.rootView = rootView;
this.uiManager = uiManager;
wheelsWrapper = (LinearLayout) rootView.findViewById(R.id.wheelsWrapper);
wheelsWrapper.setWillNotDraw(false);
pickerWrapper = new PickerWrapper(rootView);
yearWheel = new YearWheel(getPickerWithId(R.id.year), state);
monthWheel = new MonthWheel(getPickerWithId(R.id.month), state);
@ -60,14 +56,8 @@ public class Wheels {
hourWheel = new HourWheel(getPickerWithId(R.id.hour), state);
wheelPerWheelType = getWheelPerType();
emptyWheels = new EmptyWheels(rootView, pickerWrapper, state);
changeAmPmWhenPassingMidnightOrNoon();
addOnChangeListener();
emptyWheels = new EmptyWheels(rootView,this,state);
}
private void addOnChangeListener(){
WheelChangeListener onWheelChangeListener = new WheelChangeListenerImpl(this, state, uiManager, rootView);
applyOnAll(new AddOnChangeListener(onWheelChangeListener));
}
private NumberPickerView getPickerWithId(int id){
@ -75,7 +65,7 @@ public class Wheels {
}
private Collection<Wheel> getVisible() {
ArrayList<WheelType> wheelTypes = state.getVisibleWheels();
ArrayList<WheelType> wheelTypes = state.derived.getVisibleWheels();
Collection<Wheel> wheels = new ArrayList<>();
for (WheelType type: wheelTypes){
wheels.add(getWheel(type));
@ -91,34 +81,51 @@ public class Wheels {
for (Wheel wheel: getVisible()) function.apply(wheel);
}
void updateHeight() {
int shownCount = state.derived.getShownCount();
applyOnAll(new SetShowCount(shownCount));
emptyWheels.setShownCount(shownCount);
}
void updateWheelOrder() {
pickerWrapper.removeAll();
addInOrder();
addEmpty();
}
Wheel getWheel(WheelType type){
return wheelPerWheelType.get(type);
}
void addInOrder(){
ArrayList<WheelType> wheels = state.getOrderedVisibleWheels();
String getDateString() {
ArrayList<Wheel> wheels = getOrderedVisibleWheels();
String dateString = (state.getMode() == Mode.date)
? wheels.get(0).getValue() + " "
+ wheels.get(1).getValue() + " "
+ wheels.get(2).getValue()
: dayWheel.getValue();
return dateString
+ " " + hourWheel.getValue()
+ " " + minutesWheel.getValue()
+ ampmWheel.getValue();
}
private void addInOrder(){
ArrayList<WheelType> wheels = state.derived.getOrderedVisibleWheels();
for (WheelType wheelType : wheels) {
Wheel wheel = getWheel(wheelType);
addWheel(wheel.picker);
pickerWrapper.addPicker(wheel.picker);
}
}
private ArrayList<Wheel> getOrderedWheels(){
private ArrayList<Wheel> getOrderedVisibleWheels(){
ArrayList<Wheel> list = new ArrayList<>();
for (WheelType type : state.getOrderedVisibleWheels()) {
for (WheelType type : state.derived.getOrderedVisibleWheels()) {
list.add(getWheel(type));
}
return list;
}
void addWheel(View wheel) { wheelsWrapper.addView(wheel); }
void addWheel(View wheel, int index) { wheelsWrapper.addView(wheel,index); }
void removeAll() {
wheelsWrapper.removeAllViews();
}
private void changeAmPmWhenPassingMidnightOrNoon() {
hourWheel.picker.setOnValueChangeListenerInScrolling(new NumberPickerView.OnValueChangeListenerInScrolling() {
@Override
@ -138,7 +145,7 @@ public class Wheels {
}
private String getDateFormatPattern(){
ArrayList<Wheel> wheels = getOrderedWheels();
ArrayList<Wheel> wheels = getOrderedVisibleWheels();
if(state.getMode() == Mode.date){
return wheels.get(0).getFormatPattern() + " "
+ wheels.get(1).getFormatPattern() + " "
@ -154,20 +161,6 @@ public class Wheels {
+ ampmWheel.getFormatPattern();
}
String getDateString() {
ArrayList<Wheel> wheels = getOrderedWheels();
String dateString = (state.getMode() == Mode.date)
? wheels.get(0).getValue() + " "
+ wheels.get(1).getValue() + " "
+ wheels.get(2).getValue()
: dayWheel.getValue();
return dateString
+ " " + hourWheel.getValue()
+ " " + minutesWheel.getValue()
+ ampmWheel.getValue();
}
private HashMap<WheelType, Wheel> getWheelPerType(){
return new HashMap<WheelType, Wheel>() {{
put(WheelType.DAY, dayWheel);
@ -180,7 +173,8 @@ public class Wheels {
}};
}
void addEmpty() {
private void addEmpty() {
emptyWheels.add();
}
}

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

@ -9,6 +9,7 @@ import com.henninghall.date_picker.models.Mode;
import com.henninghall.date_picker.PickerView;
import com.henninghall.date_picker.Utils;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
@ -53,7 +54,7 @@ public class DayWheel extends Wheel {
resetToMidnight(cal);
cal.add(Calendar.DATE, -cal.getActualMaximum(Calendar.DAY_OF_YEAR) / 2);
} else {
cal = (Calendar) state.getInitialDate().clone();
cal = (Calendar) getInitialDate().clone();
cal.add(Calendar.DATE, -defaultNumberOfDays / 2);
}
return cal;
@ -71,7 +72,7 @@ public class DayWheel extends Wheel {
resetToMidnight(cal);
cal.add(Calendar.DATE, cal.getActualMaximum(Calendar.DAY_OF_YEAR) / 2);
} else {
cal = (Calendar) state.getInitialDate().clone();
cal = (Calendar) getInitialDate().clone();
cal.setTime(new Date());
cal.add(Calendar.DATE, defaultNumberOfDays / 2);
}
@ -129,4 +130,20 @@ public class DayWheel extends Wheel {
return TextUtils.join(" ", pieces);
}
// Rounding cal to closest minute interval
private Calendar getInitialDate() {
Calendar cal = Calendar.getInstance();
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();
}
}

+ 1
- 1
android/src/main/res/layout/datepicker_view.xml View File

@ -7,7 +7,7 @@
android:layout_height="match_parent"
>
<LinearLayout
android:id="@+id/wheelsWrapper"
android:id="@+id/pickerWrapper"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"

+ 22
- 32
examples/detox/src/examples/Advanced.js View File

@ -12,35 +12,18 @@ import PropSlider from '../PropSlider'
import MinuteInterval from '../propPickers/MinuteInterval'
import Scroll from '../propPickers/Scroll'
import CustomPropValue from '../CustomPropValue'
import { readableDate } from '../utils'
Date.prototype.addHours = function (h) {
Date.prototype.addHours = function(h) {
this.setTime(this.getTime() + h * 60 * 60 * 1000)
return this
}
const getInitialDate = () => new Date(2000, 0, 1, 0, 0);
const getInitialDate = () => new Date(2000, 0, 1, 0, 0)
export const defaultMinDate = getInitialDate().addHours(-24 * 5)
export const defaultMaxDate = getInitialDate().addHours(24 * 5)
export const readableUtcDate = date =>
date
? date
.toISOString()
.substr(0, 19)
.replace('T', ' ')
: 'undefined'
export const readableDate = (d) => {
if (!d) return undefined
return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())} ${pad2(d.getHours())}:${pad2(d.getMinutes())}:${pad2(d.getSeconds())}`
}
function pad2(string) {
return (`0${string}`).slice(-2)
}
export default class Advanced extends Component {
state = {
date: getInitialDate(),
@ -59,10 +42,12 @@ export default class Advanced extends Component {
return (
<View style={styles.container}>
<CustomPropValue
changeProp={({ propName, propValue }) => this.setState({ [propName]: propValue })}
changeProp={({ propName, propValue }) =>
this.setState({ [propName]: propValue })
}
/>
<DatePicker
ref={ref => this.ref = ref}
ref={ref => (this.ref = ref)}
date={this.state.date}
onDateChange={this.setDate}
locale={this.state.locale}
@ -74,12 +59,12 @@ export default class Advanced extends Component {
mode={this.state.mode}
timeZoneOffsetInMinutes={this.state.timeZoneOffsetInMinutes}
/>
<Text testID={"dateOutput";}>{readableDate(this.state.date)}</Text>
<Text testID={'dateOutput';}>{readableDate(this.state.date)}</Text>
<Text />
<Text>Change prop: </Text>
<Text />
<PropSlider
testID={"props";}
testID={'props';}
selectedProp={this.state.selectedProp}
onSelect={this.onSelect}
data={this.propertyList()}
@ -94,7 +79,10 @@ export default class Advanced extends Component {
{
name: 'scroll',
component: (
<Scroll scroll={this.scroll} reset={() => this.setState({ date: getInitialDate() })} />
<Scroll
scroll={this.scroll}
reset={() => this.setState({ date: getInitialDate() })}
/>
),
},
{
@ -148,7 +136,7 @@ export default class Advanced extends Component {
component: (
<MinMaxDateChange
value={this.state.minimumDate}
onChange={minDate => this.setState({ minDate })}
onChange={minimumDate => this.setState({ minimumDate })}
defaultDate={defaultMinDate}
/>
),
@ -158,7 +146,11 @@ export default class Advanced extends Component {
component: (
<MinMaxDateChange
value={this.state.maximumDate}
onChange={maxDate => this.setState({ maxDate })}
onChange={maximumDate => {
console.log({ maximumDate })
this.setState({ maximumDate })
}}
defaultDate={defaultMaxDate}
/>
),
@ -191,14 +183,12 @@ export default class Advanced extends Component {
if (!this.ref) return
UIManager.dispatchViewManagerCommand(
findNodeHandle(this.ref),
UIManager.getViewManagerConfig("DatePickerManager";).Commands.scroll,
[wheelIndex, scrollTimes],
);
UIManager.getViewManagerConfig('DatePickerManager';).Commands.scroll,
[wheelIndex, scrollTimes]
)
}
}
const styles = StyleSheet.create({
container: {
alignItems: 'center',

+ 1
- 1
examples/detox/src/propPickers/MinMaxDateChange.js View File

@ -1,7 +1,7 @@
import React, { Component } from 'react'
import { Text, Button, View, StyleSheet } from 'react-native'
import { readableDate } from '../examples/Advanced'
import { PropButton } from '../PropButton'
import { readableDate } from '../utils'
export default class extends Component {
render() {

+ 18
- 0
examples/detox/src/utils.js View File

@ -0,0 +1,18 @@
export const readableUtcDate = date =>
date
? date
.toISOString()
.substr(0, 19)
.replace('T', ' ')
: 'undefined'
export const readableDate = d => {
if (!d) return undefined
return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(
d.getDate()
)} ${pad2(d.getHours())}:${pad2(d.getMinutes())}:${pad2(d.getSeconds())}`
}
function pad2(string) {
return `0${string}`.slice(-2)
}

Loading…
Cancel
Save