From accb576ff2496012d3a139f4e058bf42ce48d23a Mon Sep 17 00:00:00 2001 From: Henning Hall Date: Mon, 17 Feb 2020 21:23:13 +0100 Subject: [PATCH] cleanup --- .../date_picker/DatePickerManager.java | 19 +-- .../henninghall/date_picker/DerivedData.java | 99 ++++++++++++++++ .../henninghall/date_picker/PickerView.java | 4 +- .../com/henninghall/date_picker/State.java | 112 +----------------- .../com/henninghall/date_picker/Utils.java | 8 -- .../date_picker/ui/EmptyWheels.java | 47 +++++--- .../date_picker/ui/FadingOverlay.java | 4 +- .../date_picker/ui/PickerWrapper.java | 23 ++++ .../henninghall/date_picker/ui/UIManager.java | 30 ++--- .../ui/WheelChangeListenerImpl.java | 2 +- .../henninghall/date_picker/ui/Wheels.java | 84 ++++++------- .../date_picker/wheels/DayWheel.java | 21 +++- .../src/main/res/layout/datepicker_view.xml | 2 +- examples/detox/src/examples/Advanced.js | 54 ++++----- .../detox/src/propPickers/MinMaxDateChange.js | 2 +- examples/detox/src/utils.js | 18 +++ 16 files changed, 285 insertions(+), 244 deletions(-) create mode 100644 android/src/main/java/com/henninghall/date_picker/DerivedData.java create mode 100644 android/src/main/java/com/henninghall/date_picker/ui/PickerWrapper.java create mode 100644 examples/detox/src/utils.js diff --git a/android/src/main/java/com/henninghall/date_picker/DatePickerManager.java b/android/src/main/java/com/henninghall/date_picker/DatePickerManager.java index 800583e..f08a0d8 100644 --- a/android/src/main/java/com/henninghall/date_picker/DatePickerManager.java +++ b/android/src/main/java/com/henninghall/date_picker/DatePickerManager.java @@ -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; diff --git a/android/src/main/java/com/henninghall/date_picker/DerivedData.java b/android/src/main/java/com/henninghall/date_picker/DerivedData.java new file mode 100644 index 0000000..a1ea1e3 --- /dev/null +++ b/android/src/main/java/com/henninghall/date_picker/DerivedData.java @@ -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 getVisibleWheels() { + ArrayList 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 getOrderedVisibleWheels() { + ArrayList orderedWheels = getOrderedWheels(); + ArrayList visibleWheels = getVisibleWheels(); + ArrayList visibleOrderedWheels = new ArrayList<>(); + for (WheelType wheel : orderedWheels){ + if(visibleWheels.contains(wheel)) visibleOrderedWheels.add(wheel); + } + return visibleOrderedWheels; + } + + private ArrayList getOrderedWheels() { + String dateTimePattern = LocaleUtils.getDateTimePattern(state.getLocale()); + ArrayList unorderedTypes = new ArrayList(Arrays.asList(WheelType.values())); + ArrayList 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; + } + +} diff --git a/android/src/main/java/com/henninghall/date_picker/PickerView.java b/android/src/main/java/com/henninghall/date_picker/PickerView.java index cb34194..725aa6f 100644 --- a/android/src/main/java/com/henninghall/date_picker/PickerView.java +++ b/android/src/main/java/com/henninghall/date_picker/PickerView.java @@ -49,12 +49,12 @@ public class PickerView extends RelativeLayout { uiManager.updateWheelOrder(); } - ArrayList nonRefreshingProps = new ArrayList(){{ + ArrayList noDisplayValueChangeProps = new ArrayList(){{ add(DateProp.name); add(FadeToColorProp.name); add(TextColorProp.name); }}; - updatedProps.removeAll(nonRefreshingProps); + updatedProps.removeAll(noDisplayValueChangeProps); if(updatedProps.size() != 0) { uiManager.updateDisplayValues(); diff --git a/android/src/main/java/com/henninghall/date_picker/State.java b/android/src/main/java/com/henninghall/date_picker/State.java index ebc2bdf..5aab547 100644 --- a/android/src/main/java/com/henninghall/date_picker/State.java +++ b/android/src/main/java/com/henninghall/date_picker/State.java @@ -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 getOrderedWheels() { - String dateTimePattern = LocaleUtils.getDateTimePattern(getLocale()); - ArrayList unorderedTypes = new ArrayList(Arrays.asList(WheelType.values())); - ArrayList 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 getVisibleWheels() { - ArrayList 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 getOrderedVisibleWheels() { - ArrayList orderedWheels = getOrderedWheels(); - ArrayList visibleWheels = getVisibleWheels(); - ArrayList 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); - } } diff --git a/android/src/main/java/com/henninghall/date_picker/Utils.java b/android/src/main/java/com/henninghall/date_picker/Utils.java index 1dc2195..66d49c9 100644 --- a/android/src/main/java/com/henninghall/date_picker/Utils.java +++ b/android/src/main/java/com/henninghall/date_picker/Utils.java @@ -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(); } diff --git a/android/src/main/java/com/henninghall/date_picker/ui/EmptyWheels.java b/android/src/main/java/com/henninghall/date_picker/ui/EmptyWheels.java index 69867ee..0500a63 100644 --- a/android/src/main/java/com/henninghall/date_picker/ui/EmptyWheels.java +++ b/android/src/main/java/com/henninghall/date_picker/ui/EmptyWheels.java @@ -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 views; - private final Wheels wheels; + private final ArrayList 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 getViews() { - HashMap views = new HashMap<>(); - for (int id: Utils.emptyWheelIds) { + private ArrayList getAll() { + ArrayList 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); } } diff --git a/android/src/main/java/com/henninghall/date_picker/ui/FadingOverlay.java b/android/src/main/java/com/henninghall/date_picker/ui/FadingOverlay.java index b604767..35389ac 100644 --- a/android/src/main/java/com/henninghall/date_picker/ui/FadingOverlay.java +++ b/android/src/main/java/com/henninghall/date_picker/ui/FadingOverlay.java @@ -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); diff --git a/android/src/main/java/com/henninghall/date_picker/ui/PickerWrapper.java b/android/src/main/java/com/henninghall/date_picker/ui/PickerWrapper.java new file mode 100644 index 0000000..60aace6 --- /dev/null +++ b/android/src/main/java/com/henninghall/date_picker/ui/PickerWrapper.java @@ -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(); + } +} diff --git a/android/src/main/java/com/henninghall/date_picker/ui/UIManager.java b/android/src/main/java/com/henninghall/date_picker/ui/UIManager.java index 7e6dfe6..657e0e7 100644 --- a/android/src/main/java/com/henninghall/date_picker/ui/UIManager.java +++ b/android/src/main/java/com/henninghall/date_picker/ui/UIManager.java @@ -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)); } diff --git a/android/src/main/java/com/henninghall/date_picker/ui/WheelChangeListenerImpl.java b/android/src/main/java/com/henninghall/date_picker/ui/WheelChangeListenerImpl.java index 7b6df4c..ef91e35 100644 --- a/android/src/main/java/com/henninghall/date_picker/ui/WheelChangeListenerImpl.java +++ b/android/src/main/java/com/henninghall/date_picker/ui/WheelChangeListenerImpl.java @@ -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; diff --git a/android/src/main/java/com/henninghall/date_picker/ui/Wheels.java b/android/src/main/java/com/henninghall/date_picker/ui/Wheels.java index ccf24d7..d7e649a 100644 --- a/android/src/main/java/com/henninghall/date_picker/ui/Wheels.java +++ b/android/src/main/java/com/henninghall/date_picker/ui/Wheels.java @@ -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 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 getVisible() { - ArrayList wheelTypes = state.getVisibleWheels(); + ArrayList wheelTypes = state.derived.getVisibleWheels(); Collection 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 wheels = state.getOrderedVisibleWheels(); + String getDateString() { + ArrayList 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 wheels = state.derived.getOrderedVisibleWheels(); for (WheelType wheelType : wheels) { Wheel wheel = getWheel(wheelType); - addWheel(wheel.picker); + pickerWrapper.addPicker(wheel.picker); } } - private ArrayList getOrderedWheels(){ + private ArrayList getOrderedVisibleWheels(){ ArrayList 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 wheels = getOrderedWheels(); + ArrayList 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 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 getWheelPerType(){ return new HashMap() {{ put(WheelType.DAY, dayWheel); @@ -180,7 +173,8 @@ public class Wheels { }}; } - void addEmpty() { + private void addEmpty() { emptyWheels.add(); } + } diff --git a/android/src/main/java/com/henninghall/date_picker/wheels/DayWheel.java b/android/src/main/java/com/henninghall/date_picker/wheels/DayWheel.java index 63cdc5e..06075e9 100644 --- a/android/src/main/java/com/henninghall/date_picker/wheels/DayWheel.java +++ b/android/src/main/java/com/henninghall/date_picker/wheels/DayWheel.java @@ -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(); + } + } diff --git a/android/src/main/res/layout/datepicker_view.xml b/android/src/main/res/layout/datepicker_view.xml index 558068b..a1c60d2 100644 --- a/android/src/main/res/layout/datepicker_view.xml +++ b/android/src/main/res/layout/datepicker_view.xml @@ -7,7 +7,7 @@ android:layout_height="match_parent" > 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 ( this.setState({ [propName]: propValue })} + changeProp={({ propName, propValue }) => + this.setState({ [propName]: propValue }) + } /> 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} /> - {readableDate(this.state.date)} + {readableDate(this.state.date)} Change prop: this.setState({ date: getInitialDate() })} /> + this.setState({ date: getInitialDate() })} + /> ), }, { @@ -148,7 +136,7 @@ export default class Advanced extends Component { component: ( this.setState({ minDate })} + onChange={minimumDate => this.setState({ minimumDate })} defaultDate={defaultMinDate} /> ), @@ -158,7 +146,11 @@ export default class Advanced extends Component { component: ( 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', diff --git a/examples/detox/src/propPickers/MinMaxDateChange.js b/examples/detox/src/propPickers/MinMaxDateChange.js index f29df7b..ba00772 100644 --- a/examples/detox/src/propPickers/MinMaxDateChange.js +++ b/examples/detox/src/propPickers/MinMaxDateChange.js @@ -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() { diff --git a/examples/detox/src/utils.js b/examples/detox/src/utils.js new file mode 100644 index 0000000..42f34b7 --- /dev/null +++ b/examples/detox/src/utils.js @@ -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) +}