From aeb3e8dc0559aec6b5948645f992b04d62790477 Mon Sep 17 00:00:00 2001 From: Henning Hall Date: Sat, 19 May 2018 13:50:32 +0200 Subject: [PATCH] Switch between AM/PM when scrolling between forenoon and afternoon. --- README.md | 5 ++- .../henninghall/date_picker/PickerView.java | 31 ++++++++++++++----- .../date_picker/wheels/AmPmWheel.java | 6 ++++ .../henninghall/date_picker/wheels/Wheel.java | 13 +++++++- 4 files changed, 44 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 4dd956a..b70b5ef 100644 --- a/README.md +++ b/README.md @@ -59,10 +59,9 @@ The goal is to make a cross platform variant of [DatePickerIOS](https://facebook - [x] Locale support. (AM/PM, 12h/24h toggled and strings translated) - [x] Replace todays date with the string "Today" (considering locale) - [x] Animate to date when state change occur. +- [x] Switch between AM/PM when scrolling between forenoon and afternoon. - [ ] Transparent background support. (Probably need to include transparent gradient). - [ ] Align text to right. - [ ] Mode: date - [ ] Mode: time -- [ ] Support maximumDate/minimumDate. (Gray out and animate back to max/min value if exceeded). -- [ ] Switch between AM/PM when scrolling between forenoon and afternoon. - +- [ ] Support maximumDate/minimumDate. (Gray out and animate back to max/min value if exceeded). \ No newline at end of file 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 8978075..ba5b4a5 100644 --- a/android/src/main/java/com/henninghall/date_picker/PickerView.java +++ b/android/src/main/java/com/henninghall/date_picker/PickerView.java @@ -1,5 +1,6 @@ package com.henninghall.date_picker; +import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.RelativeLayout; @@ -23,6 +24,8 @@ import cn.carbswang.android.numberpickerview.library.NumberPickerView; public class PickerView extends RelativeLayout { private final RelativeLayout wheelsWrapper; + private final NumberPickerView hourPicker; + private final NumberPickerView ampmPicker; private SimpleDateFormat dateFormat; private HourWheel hourWheel; private DayWheel dayWheel; @@ -39,19 +42,20 @@ public class PickerView extends RelativeLayout { Locale locale = android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP ? Locale.forLanguageTag("en") : Locale.getDefault(); - NumberPickerView hourPicker = (NumberPickerView) rootView.findViewById(R.id.hour); - hourWheel = new HourWheel(hourPicker, onWheelChangeListener, locale); - NumberPickerView dayPicker = (NumberPickerView) rootView.findViewById(R.id.day); dayWheel = new DayWheel(dayPicker, onWheelChangeListener, locale); NumberPickerView minutePicker = (NumberPickerView) rootView.findViewById(R.id.minutes); minutesWheel = new MinutesWheel(minutePicker, onWheelChangeListener, locale); - NumberPickerView ampmPicker = (NumberPickerView) rootView.findViewById(R.id.ampm); + ampmPicker = (NumberPickerView) rootView.findViewById(R.id.ampm); ampmWheel = new AmPmWheel(ampmPicker, onWheelChangeListener, locale); + hourPicker = (NumberPickerView) rootView.findViewById(R.id.hour); + hourWheel = new HourWheel(hourPicker, onWheelChangeListener, locale); + dateFormat = new SimpleDateFormat(getDateFormatTemplate(), Locale.US); + changeAmPmWhenPassingMidnightOrNoon(); } WheelChangeListener onWheelChangeListener = new WheelChangeListener(){ @@ -59,9 +63,7 @@ public class PickerView extends RelativeLayout { public void onChange() { WritableMap event = Arguments.createMap(); try { - String dateString = getDateString(); - - Date date = dateFormat.parse(dateString); + Date date = dateFormat.parse(getDateString()); event.putDouble("date", date.getTime()); } catch (ParseException e) { e.printStackTrace(); @@ -116,4 +118,19 @@ public class PickerView extends RelativeLayout { super.requestLayout(); post(measureAndLayout); } + + private void changeAmPmWhenPassingMidnightOrNoon(){ + hourPicker.setOnValueChangeListenerInScrolling(new NumberPickerView.OnValueChangeListenerInScrolling() { + @Override + public void onValueChangeInScrolling(NumberPickerView picker, int oldVal, int newVal) { + if(Utils.usesAmPm(hourWheel.getLocale())){ + String oldValue = hourWheel.getValueAtIndex(oldVal); + String newValue = hourWheel.getValueAtIndex(newVal); + boolean passingNoonOrMidnight = (oldValue.equals("12") && newValue.equals("11")) || oldValue.equals("11") && newValue.equals("12"); + if (passingNoonOrMidnight) ampmPicker.smoothScrollToValue((ampmPicker.getValue() + 1) % 2); + } + } + }); + + } } 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 25f8994..d9e9b49 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 @@ -3,7 +3,11 @@ package com.henninghall.date_picker.wheels; import com.henninghall.date_picker.Utils; import com.henninghall.date_picker.WheelChangeListener; +import java.text.Format; +import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Calendar; +import java.util.Date; import java.util.Locale; import cn.carbswang.android.numberpickerview.library.NumberPickerView; @@ -19,6 +23,8 @@ public class AmPmWheel extends Wheel { void init() { Calendar cal = Calendar.getInstance(); + + cal.set(Calendar.HOUR_OF_DAY, 0); displayValues.add(displayFormat.format(cal.getTime())); values.add(format.format(cal.getTime())); 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 29daac4..dd331c1 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 @@ -46,7 +46,15 @@ public abstract class Wheel { public String getValue() { if(!visible()) return ""; - return values.get(picker.getValue()); + return getValueAtIndex(getIndex()); + } + + public int getIndex() { + return picker.getValue(); + } + + public String getValueAtIndex(int index) { + return values.get(index); } public void setValue(Date date) { @@ -89,4 +97,7 @@ public abstract class Wheel { picker.setVisibility(View.VISIBLE); } + public Locale getLocale() { + return locale; + } }