diff --git a/android/src/main/java/com/henninghall/date_picker/DerivedData.java b/android/src/main/java/com/henninghall/date_picker/DerivedData.java index 79e5a7e..13fb561 100644 --- a/android/src/main/java/com/henninghall/date_picker/DerivedData.java +++ b/android/src/main/java/com/henninghall/date_picker/DerivedData.java @@ -97,8 +97,17 @@ public class DerivedData { return oddShowCount; } - public boolean isIosClone() { - return state.getVariant() == Variant.iosClone; + public boolean hasNativeStyle() { + return state.getVariant() == Variant.nativeAndroid; + } + + public int getRootLayout() { + switch (state.getVariant()){ + case nativeAndroid: return R.layout.native_picker; + case iosClone: return R.layout.ios_clone; + default: return R.layout.ios_clone; + } + } } 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 ff81fdb..6996fa4 100644 --- a/android/src/main/java/com/henninghall/date_picker/PickerView.java +++ b/android/src/main/java/com/henninghall/date_picker/PickerView.java @@ -19,33 +19,21 @@ import java.util.ArrayList; public class PickerView extends RelativeLayout { -// private final View rootView = inflate(getContext(), R.layout.datepicker_view, this); - private View rootView = inflate(getContext(), R.layout.native_picker, this); - private final UIManager uiManager; - private State state; + private UIManager uiManager; + private State state = new State(); private ArrayList updatedProps = new ArrayList<>(); + private boolean initialized = false; public PickerView() { super(DatePickerManager.context); - state = new State(); - uiManager = new UIManager(state, this); } public void update() { - if(updatedProps.contains(VariantProp.name)) { - uiManager.setVariant(); -// rootView = inflate(getContext(), R.layout.native_picker, this); -// NumberPicker np = findViewById(R.id.numberPicker); -// np.setMinValue(0); -// np.setMaxValue(1); -// np.setDisplayedValues(new String[]{"Today", "Tomorrow"}); -// np.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { -// @Override -// public void onValueChange(NumberPicker numberPicker, int i, int i1) { -// Log.d("onValueChange", String.valueOf(i)); -// } -// }); + if(!initialized){ + inflate(getContext(), state.derived.getRootLayout(), this); + uiManager = new UIManager(state, this); + initialized = true; } if(updatedProps.contains(FadeToColorProp.name)) { @@ -93,10 +81,6 @@ public class PickerView extends RelativeLayout { uiManager.scroll(wheelIndex, scrollTimes); } - public View getRootView(){ - return rootView; - } - private final Runnable measureAndLayout = new Runnable() { @Override public void run() { diff --git a/android/src/main/java/com/henninghall/date_picker/pickers/AndroidNative.java b/android/src/main/java/com/henninghall/date_picker/pickers/AndroidNative.java index 3d42a9f..2f265ee 100644 --- a/android/src/main/java/com/henninghall/date_picker/pickers/AndroidNative.java +++ b/android/src/main/java/com/henninghall/date_picker/pickers/AndroidNative.java @@ -5,11 +5,17 @@ import android.graphics.Paint; import android.os.Build; import android.support.annotation.RequiresApi; import android.util.AttributeSet; +import android.util.Log; import android.view.View; import android.widget.NumberPicker; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + import cn.carbswang.android.numberpickerview.library.NumberPickerView; +import static android.widget.NumberPicker.OnScrollListener.SCROLL_STATE_IDLE; + public class AndroidNative extends NumberPicker implements Picker { public AndroidNative(Context context) { @@ -31,7 +37,6 @@ public class AndroidNative extends NumberPicker implements Picker { @Override public void smoothScrollToValue(int value) { - // TODO setValue(value); } @@ -51,16 +56,25 @@ public class AndroidNative extends NumberPicker implements Picker { } @Override - public void setOnValueChangeListenerInScrolling(OnValueChangeListenerInScrolling listener) { - + public void setOnValueChangeListenerInScrolling(final OnValueChangeListenerInScrolling listener) { + final Picker self = this; + super.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { + @Override + public void onValueChange(NumberPicker numberPicker, int from, int to) { + listener.onValueChangeInScrolling(self, from, to); + } + }); } @Override public void setOnValueChangedListener(final Picker.OnValueChangeListener listener) { - super.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { + super.setOnScrollListener(new OnScrollListener() { + int previousState = SCROLL_STATE_IDLE; @Override - public void onValueChange(NumberPicker numberPicker, int from, int to) { - listener.onValueChange(); + public void onScrollStateChange(NumberPicker numberPicker, int state) { + boolean stoppedScrolling = previousState != SCROLL_STATE_IDLE && state == SCROLL_STATE_IDLE; + if (stoppedScrolling) listener.onValueChange(); + previousState = state; } }); } @@ -68,6 +82,7 @@ public class AndroidNative extends NumberPicker implements Picker { @Override public void setShownCount(int count) { + // always 3 date rows -> nothing needs to be done here } @Override diff --git a/android/src/main/java/com/henninghall/date_picker/pickers/Picker.java b/android/src/main/java/com/henninghall/date_picker/pickers/Picker.java index 0ba7ede..3f819c8 100644 --- a/android/src/main/java/com/henninghall/date_picker/pickers/Picker.java +++ b/android/src/main/java/com/henninghall/date_picker/pickers/Picker.java @@ -18,10 +18,10 @@ public interface Picker { void setSelectedTextColor(int value); void setOnValueChangeListenerInScrolling(Picker.OnValueChangeListenerInScrolling listener); void setOnValueChangedListener(Picker.OnValueChangeListener onValueChangeListener); - void setShownCount(int count); View getView(); void setVisibility(int visibility); + void setWrapSelectorWheel(boolean wrapSelectorWheel); interface OnValueChangeListenerInScrolling { void onValueChangeInScrolling(Picker picker, int oldVal, int newVal); 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 c954156..badfc9d 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 @@ -33,7 +33,7 @@ class EmptyWheels { private ArrayList getAll() { ArrayList wheels = new ArrayList<>(); - if(!state.derived.isIosClone()) return wheels; + if(state.derived.hasNativeStyle()) return wheels; for (int id: emptyWheelIds) { NumberPickerView view = (NumberPickerView) rootView.findViewById(id); wheels.add(view); @@ -42,7 +42,7 @@ class EmptyWheels { } void add() { - if(!state.derived.isIosClone()) return; + if(state.derived.hasNativeStyle()) return; int numberOfVisibleWheels = state.derived.getVisibleWheels().size(); int emptyViewsToAdd = numberOfVisibleWheels + 1; for (int i = 0; i < emptyViewsToAdd; i++) { 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 4cbc14f..977d0b8 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 @@ -38,7 +38,7 @@ public class UIManager { } public void updateFadeToColor(){ - if(!state.derived.isIosClone()) return; + if(state.derived.hasNativeStyle()) return; fadingOverlay.updateColor(); } @@ -79,9 +79,4 @@ public class UIManager { WheelChangeListener onWheelChangeListener = new WheelChangeListenerImpl(wheels, state, this, rootView); wheels.applyOnAll(new AddOnChangeListener(onWheelChangeListener)); } - - - public void setVariant() { - - } } diff --git a/android/src/main/java/com/henninghall/date_picker/wheels/AmPmWheel.java b/android/src/main/java/com/henninghall/date_picker/wheels/AmPmWheel.java index 6e40b0d..814a65f 100644 --- a/android/src/main/java/com/henninghall/date_picker/wheels/AmPmWheel.java +++ b/android/src/main/java/com/henninghall/date_picker/wheels/AmPmWheel.java @@ -35,6 +35,11 @@ public class AmPmWheel extends Wheel { return Utils.usesAmPm() && state.getMode() != Mode.date; } + @Override + public boolean wrapSelectorWheel() { + return false; + } + @Override public String getFormatPattern() { return Utils.usesAmPm() ? " a " : ""; diff --git a/android/src/main/java/com/henninghall/date_picker/wheels/DateWheel.java b/android/src/main/java/com/henninghall/date_picker/wheels/DateWheel.java index 6595303..6cf8932 100644 --- a/android/src/main/java/com/henninghall/date_picker/wheels/DateWheel.java +++ b/android/src/main/java/com/henninghall/date_picker/wheels/DateWheel.java @@ -34,6 +34,11 @@ public class DateWheel extends Wheel return state.getMode() == Mode.date; } + @Override + public boolean wrapSelectorWheel() { + return true; + } + @Override public String getFormatPattern() { return LocaleUtils.getPatternIncluding("d", state.getLocale()); 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 60e7555..4a59532 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 @@ -110,6 +110,11 @@ public class DayWheel extends Wheel { return state.getMode() == Mode.datetime; } + @Override + public boolean wrapSelectorWheel() { + return false; + } + @Override public String getFormatPattern() { diff --git a/android/src/main/java/com/henninghall/date_picker/wheels/HourWheel.java b/android/src/main/java/com/henninghall/date_picker/wheels/HourWheel.java index 1bee710..ec42059 100644 --- a/android/src/main/java/com/henninghall/date_picker/wheels/HourWheel.java +++ b/android/src/main/java/com/henninghall/date_picker/wheels/HourWheel.java @@ -34,6 +34,11 @@ public class HourWheel extends Wheel { return state.getMode() != Mode.date; } + @Override + public boolean wrapSelectorWheel() { + return true; + } + @Override public String getFormatPattern() { return Utils.usesAmPm() ? "h": "HH"; diff --git a/android/src/main/java/com/henninghall/date_picker/wheels/MinutesWheel.java b/android/src/main/java/com/henninghall/date_picker/wheels/MinutesWheel.java index de6837b..d162a30 100644 --- a/android/src/main/java/com/henninghall/date_picker/wheels/MinutesWheel.java +++ b/android/src/main/java/com/henninghall/date_picker/wheels/MinutesWheel.java @@ -35,6 +35,11 @@ public class MinutesWheel extends Wheel { return state.getMode() != Mode.date; } + @Override + public boolean wrapSelectorWheel() { + return true; + } + @Override public String getFormatPattern() { return "mm"; diff --git a/android/src/main/java/com/henninghall/date_picker/wheels/MonthWheel.java b/android/src/main/java/com/henninghall/date_picker/wheels/MonthWheel.java index 85984a3..ef7c052 100644 --- a/android/src/main/java/com/henninghall/date_picker/wheels/MonthWheel.java +++ b/android/src/main/java/com/henninghall/date_picker/wheels/MonthWheel.java @@ -31,6 +31,11 @@ public class MonthWheel extends Wheel return state.getMode() == Mode.date; } + @Override + public boolean wrapSelectorWheel() { + return true; + } + @Override public String getFormatPattern() { return "LLLL"; diff --git a/android/src/main/java/com/henninghall/date_picker/wheels/Wheel.java b/android/src/main/java/com/henninghall/date_picker/wheels/Wheel.java index 0b86d0c..726545e 100644 --- a/android/src/main/java/com/henninghall/date_picker/wheels/Wheel.java +++ b/android/src/main/java/com/henninghall/date_picker/wheels/Wheel.java @@ -17,6 +17,7 @@ public abstract class Wheel { private Calendar userSetValue; public abstract boolean visible(); + public abstract boolean wrapSelectorWheel(); public abstract Paint.Align getTextAlign(); public abstract String getFormatPattern(); public abstract ArrayList getValues(); @@ -34,6 +35,7 @@ public abstract class Wheel { this.picker = picker; this.format = new SimpleDateFormat(getFormatPattern(), state.getLocale()); picker.setTextAlign(getTextAlign()); + picker.setWrapSelectorWheel(wrapSelectorWheel()); } private int getIndexOfDate(Calendar date){ diff --git a/android/src/main/java/com/henninghall/date_picker/wheels/YearWheel.java b/android/src/main/java/com/henninghall/date_picker/wheels/YearWheel.java index 6772678..474ea61 100644 --- a/android/src/main/java/com/henninghall/date_picker/wheels/YearWheel.java +++ b/android/src/main/java/com/henninghall/date_picker/wheels/YearWheel.java @@ -59,6 +59,11 @@ public class YearWheel extends Wheel return state.getMode() == Mode.date; } + @Override + public boolean wrapSelectorWheel() { + return false; + } + @Override public Paint.Align getTextAlign() { return Paint.Align.RIGHT; diff --git a/android/src/main/res/layout/datepicker_view.xml b/android/src/main/res/layout/ios_clone.xml similarity index 93% rename from android/src/main/res/layout/datepicker_view.xml rename to android/src/main/res/layout/ios_clone.xml index 04893b5..c5a9b0c 100644 --- a/android/src/main/res/layout/datepicker_view.xml +++ b/android/src/main/res/layout/ios_clone.xml @@ -24,7 +24,6 @@ custom:npv_TextColorSelected="#000000" custom:npv_TextSizeNormal="18dp" custom:npv_TextSizeSelected="21dp" - custom:npv_WrapSelectorWheel="true" custom:npv_ItemPaddingHorizontal="0dp" /> @@ -176,7 +166,6 @@ custom:npv_TextColorSelected="#000000" custom:npv_TextSizeNormal="18dp" custom:npv_TextSizeSelected="21dp" - custom:npv_WrapSelectorWheel="true" custom:npv_ItemPaddingHorizontal="3dp" /> diff --git a/android/src/main/res/layout/native_picker.xml b/android/src/main/res/layout/native_picker.xml index 5934f59..3c22faa 100644 --- a/android/src/main/res/layout/native_picker.xml +++ b/android/src/main/res/layout/native_picker.xml @@ -1,50 +1,44 @@ - + android:orientation="horizontal"> + > + style="@style/android_native" /> + style="@style/android_native" /> + style="@style/android_native_small" /> + style="@style/android_native" /> + style="@style/android_native_small" /> + style="@style/android_native_small" /> + android:layout_width="40dp" + style="@style/android_native_small" /> - + diff --git a/android/src/main/res/values/styles.xml b/android/src/main/res/values/styles.xml index dd946c2..0bf1fe7 100644 --- a/android/src/main/res/values/styles.xml +++ b/android/src/main/res/values/styles.xml @@ -1,10 +1,14 @@ - + \ No newline at end of file diff --git a/defaultProps.js b/defaultProps.js index 73372a3..fe7e5ed 100644 --- a/defaultProps.js +++ b/defaultProps.js @@ -1,4 +1,5 @@ export default { - mode: 'datetime', - minuteInterval: 1, -} \ No newline at end of file + mode: 'datetime', + minuteInterval: 1, + androidVariant: 'nativeAndroid', +} diff --git a/examples/detox/src/examples/Minimal.js b/examples/detox/src/examples/Minimal.js index 4686e28..6da7f4a 100644 --- a/examples/detox/src/examples/Minimal.js +++ b/examples/detox/src/examples/Minimal.js @@ -8,6 +8,7 @@ export default class MinimalExample extends Component { this.setState({ date })} + androidVariant="iosClone" androidVariant="nativeAndroid" /> )